vim列块操作就是在可是模式下操作选择的行中的某一些列的操作,比如常见的我们需要在很多行都需要做一些重复的工作,比如在行头和行尾加相应的标签,或者需要删除行中间某一些特殊的列,那么块操作就是很好的帮手了。
#vim→^v→I→#→ESC |
#vim→set nu→^v→(100G:当前行到第100行)→I→#→ESC |
一.进入和退出可视模式 visual-start
1.三种可视模式(:help blockwise-visual关于列块操作的信息)
*v* *characterwise-visual*——v 进入普通可视模式,以字符为单位选择。 |
*V* *linewise-visual*——V 进入行可视模式,以行为单位选择。 |
*CTRL-V* *blockwise-visual*——CTRL-V (在 Windows中为CTRL-q)进入列块可视模式。 |
2.当键入 "v"."CTRL-V" 和 "V" 时的模式转换:*
原有模式 | "v" | "CTRL-V" | "V" |
普通 | 可视 | 列块可视 | 行可视 |
可视 | 普通 | 列块可视 | 行可视 |
列块可视 | 可视 | 普通 | 行可视 |
行可视 | 可视 | 列块可视 | 普通 |
3.使用可视模式 visual-use包含三个部骤
a.用 "v"."V" 或CTRL-V 标记文本的开始 当前光标下的字符将被作为标记的起始点。 |
b.把光标移到要标记的文本末尾 起始点和光标间的文本 (含当前光标下的字符) 将被高亮显示。 |
c.键入操作符命令 操作符命令将被应用到高亮显示的字符。 |
二.改变可视区域 visual-change
*v_O* O 跳到高亮文本的另一端。同 "o" 命令相似,但是在列块模式下,光标移动到水平方向的另一个角。如果这个角上的字符占据了多个屏幕位置 (例如一个<Tab>),那么高亮的文本区域会被改变。 |
*v_$* 如果 "$" 命令和列块模式同时使用,那么高亮文本区域的右边界将取决于高亮区域中最长的行。如果遇到一个不是直上直下的移动命令,那么这个规则将终止。 |
三.操作可视区域 visual-operators
1.对可视区域可以使用的操作符包括:
d 删除所选中的部分。 D 没有把一行都选中,也把一行删除。 | ~ 切换大小写 |v_~| ! 通过外部命令过滤 |v_!| |
Y yank抽出 |v_Y| p put放置 |v_p| | = 通过 'equalprg' 选项的命令过滤 |v_=| gq 按 'textwidth' 指定的宽度排版行|v_gq| |
> 右移1Tab |v_>| < 左移1Tab |v_<| | x delete X delete J 连接 |v_J| |
r 替换 |v_r| R替换 |v_R| | s 修改 |v_s| S 修改 |v_S| |
U 变成大写 u 变成小写 ~ 大小反转 | ^] 查找标签 |v_CTRL-]| : 为高亮的行启动 ex 命令 |v_:| |
I(大写)+字符串+ESC block insert会在每一行所选中内容的开始前添加”字符串” A(大写)+字符串+ESC block append会在选中的块后面添加文本。 在选中块紧接每行末尾添加内容,则需用$来指定选择到行尾,而不是简单地用光标。 | |
c+字符串+ESC 删除并进入输入模式。只需要在选中的第一行输入一个字符串,当按下esc后所有行的选中部分都会和第一行一样。 C(大写) +字符串+ESC 会直接删除到行尾,其它与c一样。 |
2.可用的标记方法包括(h.j.k.l进行块选择合作):
o 移动光标至标记区域的另一边 O 移动光标至标记区域的另一端点 | 按:进入ex,并给出选择的范围'<,'> 正则中选择中区域用\%V表示 |
aw 一个单词 (包括空格) |v_aw| aW 一个字串 (包括空格) |v_aW| | ab 一个 () 块 (包括小括号) |v_ab| ib 内含 () 块 |v_ib| |
iw 内含单词 |v_iw| iW 内含字串 |v_iW| | aB 一个{} 块 (包括大括号) |v_aB| iB 内含{} 块 |v_iB| |
as a sentencewith white space is inner sentence句子 |v_is| | a< 一个 <> 块 (包括<>) |v_a<| i< 内含 <> 块 |v_i<| |
ap a paragraph |v_ap| ip inner paragraph |v_ip| | a[ 一个 [] 块 (包括 []) |v_a[| i[ 内含 [] 块 |v_i[| |
四.列块操作 blockwise-operators
列块插入*v_b_I* 对一个列块可视模式下的选择区,I{string}<ESC> 命令将会从选择区开始的位置在每一行插入字符串{string}。 |
列块添加*v_b_A* 对一个列块可视模式下的选择区,A{string}<ESC> 命令将会从选择区结束处开始在每一行插入字符串{string}。当行的长短不同的时候,将导致选择区的右边界不是直线,这时候列块添加操作的行为就会有所不同: 列块是用<C-v>$产生的:这种情况下字符串被附加到每一行的结尾。 列块是用<C-v>{move-around}产生的:这种情况下字符串将被附加到每一行列块结尾。 |
列块修改 (c) *v_b_c* 选择区的所有文本将被相同的字符串代替。当使用 "c" 命令的时候选择区的文本将被删除,然后进入插入模式。这时候你可以键入不带回车的文本。当你按<Esc> 的时候所键入的文本将被插入选择区的每一行。 |
列块修改 (C) *v_b_C* 同 "c" 命令,但是选择区将扩展到每一行的结尾。 |
*v_b_<*或*v_b_>*列块平移 列块按照 'shiftwidth' 指定的单位移动。 |
列块替换*v_b_r* 高亮区域的每个字符被同一个字符代替。 |