<< Back to man.ChinaUnix.net

VISUAL

*visual.txt*    For Vim version 6.3.  最后更新:2005年3月

                     VIM 用户手册 - Bram Moolenaar 著
                  (译者: quhongjun http://vimcdoc.sf.net )


可视化模式                 *Visual* *Visual-mode* *visual-mode*

可视化模式提供一种灵活易用的方法选择一块文本供操作符使用。它也是选择一个文本块
的唯一方法。

关于本章的介绍包含在用户手册的 |04.4| 节中。

1. 使用可视化模式                        |visual-use|
2. 进入和退出可视化模式                       |visual-start|
3. 改变可视化区域                        |visual-change|
4. 操作可视化区域                        |visual-operators|
5. 列块操作                         |blockwise-operators|
6. 重复                                       |visual-repeat|
7. 示例                                       |visual-examples|
8. 选择模式                         |Select-mode|

(Vi不包含可视化模式。"可视化模式"这个名称专指普通模式,以区别于Ex模式)
(要使用可视化模式,必须在编译vim的时候打开 |+visual| 选项)


1. 使用可视化模式                                        *visual-use*

使用可视化模式包含三个部分:
1. 用 "v"、"V" 或 CTRL-V 标记文本的开始。
   当前光标下的字符将被作为标记的起始点。
2. 把光标移到要标记的文本末尾。
   起始点和光标之间的文本(包括当前光标下的字符)将被高亮显示。
3. 键入操作命令。
   操作命令将被应用到高亮显示的字符。

'highlight' 选项用来设置可视化模式下的高亮显示方式。
'virtualedit' 选项用来设置是否允许光标停留在没有字符的位置。

通常高亮显示的文本包括当前光标下的字符。
然而,如果 'selection' 选项被设置为 "exclusive",并且当前光标位于可视化区域之
外,那么光标下的字符将不被包括。

使用 "v" 命令,被高亮的文本将不包括起始点之前和结束点之后的字符。然而,所有的
大写命令和非字母命令("~"和"U"除外)仍将作用在整行上。请参考下面的操作命令列表。

                                                        *visual-block*
使用 CTRL-V (列块可视模式),高亮区域是从开始点到光标之间的一个矩形区域。然而,
有些操作符仍将作用在整行上(参见下面的列表)。修改和替换操作将删除高亮区域的文
本,然后从左上角开始插入。


2. 进入和退出可视化模式                                       *visual-start*

                                                *v* *characterwise-visual*
v                       进入可视化模式,以字符为单位选择。

                                                *V* *linewise-visual*
V                       进入可视化模式,以行为单位选择。

                                                *CTRL-V* *blockwise-visual*
CTRL-V                  进入列块可视化模式。 备注: 在Windows环境中,CTRL-V 可
                        能被映射为粘贴操作,所以可能无法用来进入列块可视模式。
                        参见 |CTRL-V-alternative|。

在可视模式下,按 <Esc>、点击鼠标左键或键入任意一个跳转到另外一个缓冲区的命令,
将取消当前选择区的高亮显示,不影响任何文本。同时,在字符可视化模式按 "v"、列块
可视化模式按 "CTRL-V" 以及行可视化模式按 "V" 将起到同样效果。按 CTRL-Z 键将终
止可视化高亮显示,当前编辑器被挂起或者一个新的shell将被启动。 |CTRL-Z|

当键入"v"、"CTRL-V" 和 "V" 时的模式转换:             *v_v* *v_CTRL-V* *v_V*
原有模式         "v"              "CTRL-V"               "V"        

Normal              Visual         blockwise Visual       linewise Visual
Visual              Normal         blockwise Visual       linewise Visual
blockwise Visual    Visual         Normal                 linewise Visual
linewise Visual     Visual         blockwise Visual       Normal

                                                        *gv* *v_gv*
gv                      重新选择上一次的选择区。在可视模式下,该命令将交换当前
                        和上一次选择区。

                                                        *<LeftMouse>*
<LeftMouse>             设置当前光标位置。 如果处在可视化模式,则退出可视化模
                        式。此功能只有在 'mouse' 选项包含 'n' 或 'a' 才可用。
                        如果点击位置与屏幕最后一行的距离在 'so' 选项设置的范围
                        之内,屏幕文本将会上卷。如果点击位置与屏幕第一行的距离
                        在 'so' 选项设置的范围之内,屏幕文本将会下卷。

                                                        *<RightMouse>*
<RightMouse>            如果当前不是可视化模式,则进入可视化模式。光标位置和鼠
                        标点击位置之间的文本将被高亮显示。如果当前已经处于可视
                        化模式,文本高亮选择区的起点或终点将被置为鼠标点击的位
                        置。起点或终点的选择取决于谁离点击位置更近。此功能只有
                        在 'mouse' 选项包含 'n' 或 'a' 时才可用。

                        备注: 当 'mousemodel' 被设为 "popup", 本操作将引发
                        <S-LeftMouse> 动作,而不是 <RightMouse>*<LeftRelease>*
<LeftRelease>           如果 <LeftRelease> 的位置与 <LeftMouse> 不同,那么它的
                        作用等同于 <LeftMouse>。在旧版本的xterm中,鼠标释放之
                        前是看不到所选择的区域的,除非可以改变xterm所运行主机
                        的显示设置(通过DISPLAY环境变量或 -display 参数)。 此功
                        能只有在 'mouse' 选项包含 'n' 或 'a' 时才可用。

如果可视化模式没有激活,同时 "v", "V" 或 CTRL-V 命令之前包含一个计数 count,那
么上一次选择区的大小将被作为本次选择操作的参考值。然后你可以移动选择区的结束点
并对选择区进行操作。选择区类型与上次相同(字符选择,行选择,或列块选择)。
- 行选择模式: 行的数目与 count 相乘。
- 列块模式: 行和列的数目分别与 count 相乘。
- 普通模式,选择区在一行以内: 选择区的字符数与 count 相乘。
- 普通模式,选择区包含多行: 行的数目与 count 相乘,最后一行的字符数目与上一次
  选择区相同。
文本的起始点在光标位置。如果上一次命令中使用了 "$" 命令,那么选择区将扩展到最
长行的最后一列。

如果你想选取和上一次完全一样的选择区,请使用 "gv" |gv| |v_gv| 命令。

                                                        *v_CTRL-C*
CTRL-C                  停止可视化模式。当处在等待插入模式时(编辑模式显示为
                        "-- (插入) 可视 --"),可视化模式也将停止。


3. 改变可视化区域                                        *visual-change*

                                                        *v_o*
o                       跳到高亮文本的另一端: 当前光标位置变成高亮文本的起点,
                        光标移动到高亮文本的另一端。高亮区域保持不变。

                                                        *v_O*
O                       跳到高亮文本的另一端。同 "o" 命令,但是在列块模式下,
                        光标移动到水平方向的另一个角。如果这个角上的字符占据了
                        多个屏幕位置(例如一个 <Tab>),那么高亮的文本区域会被改
                        变。

                                                        *v_$*
如果 "$" 命令和列块模式同时使用,那么高亮文本区域的右边界将取决于高亮区域中最
长的行。如果遇到一个不是直上直下的移动命令,那么这个规则将终止。

有很多命令可以移动块的结束点。但是不能使用 Ex 命令,以及其它可能改变或丢弃文件
的命令。下面这些命令(或者以它们开始的命令): ".pPiIaAO&", CTRL-^, "Z", CTRL-],
CTRL-T, CTRL-R, CTRL-ICTRL-O 将会引起一个beep,但可视化模式保持不变。

当切换到同一缓冲区的另外一个窗口时,目标窗口中的光标位置会被调整,以便可视化区
域会保持选中。这一点特别适合在一个窗口查看可视化区域的起点,而在另一个窗口查看
它的终点。这时候可以用鼠标右键 <RightMouse> 来移动可视化区域的结束点。(或者用
<S-LeftMouse>,当 'mousemodel' 选项置为 "popup"时)。


4. 操作可视化区域                                        *visual-operators*

对可视区域可以使用的操作符包括:
        ~       切换大小写                                 |v_~|
        d       删除                                          |v_d|
        c       修改 (4)                                      |v_c|
        y       复制                                          |v_y|
        >       右移 (4)                                      |v_>|
        <       左移 (4)                                      |v_<|
        !       过滤外部命令输出 (1)                            |v_!|
        =       过滤 'equalprg' 选项的命令输出 (1)             |v_=|
        gq      按照 'textwidth' 指定的宽度格式化行 (1)              |v_gq|

可用的对象包括:
        aw      一个狭义单词(包括空格)                                |v_aw|
        iw      内部狭义单词                                      |v_iw|
        aW      一个广义单词(包括空格)                                |v_aW|
        iW      内部广义单词                                      |v_iW|
        as      一个句子(包括空格)                              |v_as|
        is      内部句子                                    |v_is|
        ap      一个段落(包括空格)                              |v_ap|
        ip      内部段落                                    |v_ip|
        ab      一个()块(包括括号)                               |v_ab|
        ib      一个内部()块                                       |v_ib|
        aB      一个{}块(包括大括号)                            |v_aB|
        iB      一个内部{}块                                       |v_iB|
        a<      一个<>块(包括<>)                           |v_a<|
        i<      内部<>块                                     |v_i<|
        a[      一个[]块(包括[])                           |v_a[|
        i[      内部[]块                                     |v_i[|

其它可以使用的命令:
        :       开始为高亮的行使用ex命令                     |v_:|
        r       修改 (4)                                      |v_r|
        s       修改                                          |v_s|
        C       修改 (2)(4)                                   |v_C|
        S       修改 (2)                                      |v_S|
        R       修改 (2)                                      |v_R|
        x       删除                                          |v_x|
        D       删除 (3)                                      |v_D|
        X       删除 (2)                                      |v_X|
        Y       复制 (2)                                      |v_Y|
        p       粘贴                                          |v_p|
        J       连接 (1)                                      |v_J|
        U       变成大写                                    |v_U|
        u       变成小写                                    |v_u|
        ^]      查找标签                                    |v_CTRL-]|
        I       块插入                                               |v_b_I|
        A       块添加                                               |v_b_A|

(1): 总是应用到整行, see |:visual_example|。
(2): 如果不是使用 CTRL-V,应用到整行。
(3): 如果不是使用 CTRL-V,应用到整行。如果使用 CTRL-V,删除到行尾。
(4): 如果使用 CTRL-V,只对块操作。

注意 ":vmap"可以进行可视模式下的键盘映射。例如,如果你不想让"/"命令扩展选择区,
而是将高亮的文本作为关键字进行搜索,可以这样映射:>
        :vmap / y/<C-R>"<CR>

(<>|<>|中的内容必须逐字符键入。同时必须在 'cpoptions' 选项中移去'B'和'<'标志)

如果你想用"""命令指定一个寄存器,只须将寄存器命令加在操作符之前:
"v{move-around}"xd"

如果你想给命令加上计数,只须将数字加在操作符之前:
"v{move-around}3>" (向右缩进3次).

                                                        *{move-around}*
{move-around} 是任何移动命令的组合。 注意 它与 {motion} 的区别,后者只代表
一个移动命令。


5. 列块操作                                         *blockwise-operators*

{如果编译时 |+visualextra| 选项没有打开,本功能将不可用}

提醒: 尝试打开 'virtualedit' 选项,以便列块选择的起点和终点可以超越一行的结尾,
或位于tab的中间。

列块插入                                                    *v_b_I*
对一个列块可视模式下的选择区,I{string}<ESC>命令将会从选择区开始的位置在每一行
插入字符串{string}。但是只有那些包含在选择区的行才会被插入,因此过短的行将不受
影响。如果选择区包含制表符,那么制表符将会被分开,以保持选择区的列。
See |v_b_I_example|.

列块添加                                                    *v_b_A*
对一个列块可视模式下的选择区,A{string}<ESC>命令将会从选择区结束处开始在每一行
插入字符串{string}。当行的长短不同的时候,将导致选择区的右边界不是直线,这时候
列块添加操作的行为就会有所不同:
1. 如果列块是用<C-v>$命令产生的:
    这种情况下字符串被附加到每一行的结尾。
2. 如果列块是用<C-v>{move-around}命令产生的:
    这种情况下字符串将被附加到列块的结尾。对于比较短的行,行的尾部和列块结尾之
    间将以空格填充。
See |v_b_A_example|.
备注: 对于那些由于过短而没有包含在选择区的行,"I" 和 "A" 的操作结果是不同的。
这是故意这样设计的,以便你能够选择自己所希望的操作。

列块修改                                                    *v_b_c*
选择区的所有文本将被键入的字符串代替。当使用"c"命令的时候选择区的文本将被删除,
然后进入插入模式。这时候你可以键入不带回车的文本。当你按 <Esc> 的时候所键入的
文本将被插入选择区的每一行。

列块修改                                                    *v_b_C*
同"c"命令,但是选择区将扩展到每一行的结尾。

                                                                *v_b_<*
列块平移                                                    *v_b_>*
列块按照 'shiftwidth' 指定的单位移动。与块的右边界无关。块的左边界决定了从哪一
点开始右移,并且根据 'ts' 和 'et' 设置的宽度进行填充。块的左边界决定了左移的终
止点。
    备注: 当块的起始点和结束点在一个 TAB 内,v_< 的填充方法存在BUG。(Vim 5.4c)
See |v_b_>_example|.
See |v_b_<_example|.

列块替换                                                    *v_b_r*
高亮区域的每个字符被同一个字符代替。制表符将被分割,虚拟空白字符也将被替换,以
保持屏幕布局。
See |v_b_r_example|.



6. 重复                                                       *visual-repeat*

当重复一个可视化模式操作时,该操作将被应用到与上次操作相同数量的文本上:
- 行选择可视模式: 相同数量的行。
- 列块可视模式: 相同数量的行和列。
- 选择区在一行之内的普通可视模式: 相同数量的字符。
- 跨越多行的普通可视模式: 相同数量的行,最后一行的字符数与上次相同。
重复操作的起始点在当前光标位置。如果重复的命令中包含 "$" 命令来扩展选择区,那
么重复操作将应用到最长行的最右一列。



7. 示例                                                       *visual-examples*

                                                        *:visual_example*
目前 ":" 命令只能作用在一整行。当你选择某一行的一部分,执行一个类似 ":!date"
的命令,命令输出将替换当前行的全部。如果你只想让它替换行的一部分,则必须做一个
映射。在将来的版本中 ":" 命令将能够作用在部分行上。

下面这个示例能够用"date"命令的输出替换所选择的文本:>
        :vmap _a <Esc>`>a<CR><Esc>`<i<CR><Esc>!!date<CR>kJJ

(<>|<>|中的内容必须逐字符键入。同时必须在 'cpoptions' 选项中移去'B'和'<'标志)

它所做的是:
<Esc>           停止可视化模式
`>              移动到可视区域的结尾
a<CR><Esc>      在可视区域的结尾断行
`<              跳到可视区域的开始
i<CR><Esc>      在可视区域的起点断行
!!date<CR>      过滤date命令的文本
kJJ             把行重新连接接起来

                                                        *visual-search*
下面这个键盘映射能够将当前的选择区作为关键字进行搜索:
        :vmap X y/<C-R>"<CR>

(<>|<>|中的内容必须逐字符键入。同时必须在 'cpoptions' 选项中移去'B'和'<'标志)

注意 某些特殊字符(例如 '.' 和 '*') 可能会引起问题。

列块可视模式示例                                        *blockwise-examples*
在下面的示例中,我将指明列块操作命令以及命令所执行的结果。在所有的示例中,光标
起始点位于第一行的'a'字符上。
modeline设置为: ":ts=8:sw=4:"。

另外,进行这样的设置将有助于显示操作细节:
:set hls
/<TAB>
这里的<TAB>是一个真正的TAB(即按下Tab键)。

测试用的文本是:

abcdefghijklmnopqrstuvwxyz
abc             defghijklmnopqrstuvwxyz
abcdef  ghi             jklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

1. fo<C-v>3jISTRING<ESC>                                        *v_b_I_example*

abcdefghijklmnSTRINGopqrstuvwxyz
abc           STRING  defghijklmnopqrstuvwxyz
abcdef  ghi   STRING    jklmnopqrstuvwxyz
abcdefghijklmnSTRINGopqrstuvwxyz

2. fo<C-v>3j$ASTRING<ESC>                                       *v_b_A_example*

abcdefghijklmnopqrstuvwxyzSTRING
abc             defghijklmnopqrstuvwxyzSTRING
abcdef  ghi             jklmnopqrstuvwxyzSTRING
abcdefghijklmnopqrstuvwxyzSTRING

3. fo<C-v>3j3l<..                                               *v_b_<_example*

abcdefghijklmnopqrstuvwxyz
abc           defghijklmnopqrstuvwxyz
abcdef  ghi   jklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

4. fo<C-v>3j>..                                                 *v_b_>_example*

abcdefghijklmn            opqrstuvwxyz
abc                         defghijklmnopqrstuvwxyz
abcdef  ghi                         jklmnopqrstuvwxyz
abcdefghijklmn            opqrstuvwxyz

5. fo<C-v>5l3jrX                                                *v_b_r_example*

abcdefghijklmnXXXXXXuvwxyz
abc           XXXXXXhijklmnopqrstuvwxyz
abcdef  ghi   XXXXXX    jklmnopqrstuvwxyz
abcdefghijklmnXXXXXXuvwxyz


8. 选择模式                                         *Select* *Select-mode*

选择模式看起来与可视化模式非常相似,但是在选择模式所接受的命令与可视化模式有很
大不同。它类似于Microsoft Windows中的选择模式。如果 'showmode' 选项打开,处于
选择模式的时候在屏幕底端会显示 "-- 选取 --"。

进入选择模式的几种方法:
- 使用鼠标选择一片区域,同时 'selectmode' 选项包含 "mouse"。
  'mouse' must also contain a flag for the current mode.
- 在按下Shift键的同时,键入不可打印的光标移动命令,同时 'selectmode' 选项包含
  "key"。 例如: <S-Left><S-End>。 'keymodel' 选项也必须包含"startsel"。
- 键入"v", "V" 或 CTRL-V 命令,同时 'selectmode' 选项包含 "cmd"。
- 在普通模式键入 "gh", "gH" 或 "g_CTRL-H" 命令。
- 在可视化模式,键入 CTRL-G*v_CTRL-G*

选择模式的命令:
- 所有可打印字符、<NL><CR> 将删除当前的选择区,然后进入插入模式。所键入的
  字符被插入文本中。
- 在按下Shift键的同时键入不可打印的移动命令,将扩展当前的选择区。
  'keymodel' 选项必须包含 "startsel"。
- 键入不可打印移动命令的同时,如果Shift键没有按下,则退出选择模式。
  'keymodel' 选项必须包含 "stopsel"。
- 按ESC键退出选择模式。
- CTRL-O 临时切换到可视化模式执行一个命令。 *v_CTRL-O*
- CTRL-G 切换到可视化模式。

除此之外,所有键入字符的处理方式与可视化模式相同。

如果选择模式是按行选择,那么在选择模式进行命令操作时,所选中的行将被作为操作对
象,但是作用的方式与按字符选择相同。举例来说:如果一整行被删除,那么它可以在稍
后被粘贴到另一行的中间。

选择模式中的键盘映射和菜单                         *Select-mode-mapping*

在选择模式中使用可视化模式的键盘映射和菜单。在这些动作被执行之前,Vim首先切换
到可视化模式,以便执行与可视化模式相同的动作。

当键盘映射或菜单命令执行完毕,Vim回到选择模式,选择区被重新激活。除非选择区域
已被删除,或切换到了另外一个buffer,或者窗口布局已被改变。

当键入一个字符,将引起当前选择区被删除从而进入插入模式。插入模式的键盘映射将应
用到这个刚刚键入的字符。这可能会引起一些混淆,因为它意味着在选择模式的键盘动作
在插入模式被执行。语言的映射与此相同。

                                                        *gV* *v_gV*
gV                      当一个选择模式的键盘映射或菜单命令被执行完毕后,不再自
                        动选择可视化区域。把gV放在键盘映射或菜单命令的结尾即可。
                        或者至少它应该在任何选择区操作的命令之后。

                                                        *gh*
gh                      启动字符方式的选择模式。同"v"命令类似,但是启动的是选
                        择模式,而不是可视化模式。
                        助记: "get highlighted".

                                                        *gH*
gH                      启动按行选择的选择模式。同"V"命令类似,但是启动的是选
                        择模式,而不是可视化模式。
                        助记: "get Highlighted".

                                                        *g_CTRL-H*
g CTRL-H                启动列块方式的选择模式。同CTRL-V命令类似,但是启动的是
                        选择模式,而不是可视化模式。
                        助记: "get Highlighted".

 vim:tw=78:ts=8:ft=help:norl:

Generated by vim2html on Wed Mar 2 23:11:18 GMT 2005