1、(motion)
fx 向后 移动到搜索字母上,x 可以是任意一个字母
tx 向后 移到搜索字母的左边 (这真的很有用)
Fx 向前 移到搜索字母上
Tx 向前 移到搜索字母的左边
; 重复上面四种命令 ,也是重复命令 不过方向取反
. 重复上一个操作
以上命令都是在本行移动
,. 当前行 ,%当前文件
gd to definition of the current word

w:上一个词。  b:下一个词。(以nonword的特殊字符作为word的边界,如.,-等
W 上一个词 B 下一个词 (以空格作为word的边界)又称长单词
e: 下个词的最后一个字母 ge 上个词的最后一个字母
0:移动光标到当前行首。
gm 移动到行正中
$:移动光标到行尾。
2$ 下一行行尾
^:移动光标到当前行的第一个字母位置。
) ( 移动光标到上/下一个句子。
{ } pre/next paragraph
[{ ]} begin/end of block
[[ ][ 代码块的开头和结尾 假设{和}位于第一列的情况下成立
[( ]) 括号范围内前后移动
gD 跳转到局部变量的定义处

+ - 下一行的开始 上一行的开始(非空)
% matching parenthesis

5、在整个文件里面有效移动光标
gg:到文件首 G:到文件尾
numG:移动光标到指定的行(num)。(比如 10G 就是到第 10 行)
H:移动光标到屏幕上面  M:移动光标到屏幕中间  L:移动光标到屏幕下面 当前屏幕的操作
nH 光标到当前屏幕的第n行
nL 光标到当前屏幕的倒数第n行
zt scroll to top
zz scroll to middle 有用 把当前编辑行置于屏幕中间
zb scroll to bottom
ctr+B/b ctr+F/f pre/next page
ctr+U/u ctr+D/d pre/next half page
ctr+e ctr+y 上/下滚一行
*:读取光标处的单词,并且移动光标到它再次出现的地方。
#:读取光标处的单词,并且移动光标到它上次出现的地方。
g* 它不完全匹配光标所在处的单词,而是匹配包含该单词的所有字符串
g# 它不完全匹配光标所在处的单词,而是匹配包含该单词的所有字符串

/text:从当前光标处开始搜索字符串 text,并且到达 text 出现的地方。必须使用回车来开始这个搜索命令。如果想重复上次的搜索的话,按 n
?text:和上面类似,但是是反方向。
/\<text\> 搜索完整的text单词
/ab\{3,5} 对b匹配3-5次
\{0,1}匹配0或1次 跟\=一样
\{0,} 匹配0次或多次 跟\*一样
\{1,} 匹配1次或多次 跟\+一样
\{3} 匹配3次
/ab\{-1,3} 将会匹配abbb中的ab 意思是尽可能的避免重复
/a.\{-}b 其中{-}匹配前面的项一次或0次 尽可能地少 一般这个模式本身只可能匹配到0次
因此 这个命令 只会匹配到axbxb中的axb
/a.*b 则会尽可能多的匹配 因而对于axbxb 会匹配整个的axbxb
/the\nword 匹配以the结束而且下一行以word开始的行
\_s 匹配空格或断行
/the\_sword the 与word 之间有空格或断行
/\d\u{3}\d\{3} 匹配一个数字 三个大写字母 单个数字

/joe/s-2 所查找之处往前两个字符

搜索完按n重复上次查找 N逆向上次查找
3n 向下搜索第三个

ma `a mark/jump to a 'a 转到标记所在的行头(行头)
`.:到你上次编辑文件的修改点。这个命令很有用,而且你不用自己去标记它
'. 到上次修改的行
`` 在上次编辑的地方与本次的地方来回跳转(仅限使用命令的跳转)
`0 上次编辑的地方
ctr+O ctr+I 往前或往后跳 编辑的地方

:s/old/new 将当前行中old替换为new 只替换一次
:s/old/new/n search and replace n times
:s/old/new/g 将当前行中的old替换为new,全部替换
:.,$ s/old/new/g 将当前行至文件末尾中的old替换为new,全部替换
:.,$ s/old/new 将当前行中至文件末尾中的old替换为new,每行至替换一次
:1,$ s/old/new 或 :% s/old/new 将文件所有行中的old替换为new,每行只替换一次
:1,$ s/old/new/g 或 :% s/old/new/g 将文件中的所有行的old替换为new,全部替换
%是目前编辑的文章 #是前一次编辑的文章
:?^chapter?-1,/^chapter/+2 s=grey=gray=g 将上个chapter与下一个chapter之间的所有的grey替换为gray,用=替换/ 来避免过多的/
:g/foobar/s/bar/baz/g 搜索foobar 然后替换为foorbaz 不会影响到jailbars
:g/\(foo\)\(bar\)/s/\2/\1baz/g
特殊的序列 & 所有查找时匹配到的东西
\[1-9] 1到9号用\(\)括起来的东西
\u 下一个字符被变成大写
\U 以后 所有的字符都 变成大写 知道遇到\e
\l 下一个字符变成小写
\L 以后的字符都变成小写


:.,.+4 从当前行到下面第四行
:`t,`b 从上一个标记t到下一个标记b
~ 改变当前字母的大小写类型
ggguG : 将当前编辑文件内容全部转换成小写
g~m 切换大小写 动作m跨越的行
guw 变小写
gUw 变大写
xp 当前字母和后一个字母的位置进行替换
ddp 两行互换位置

2.高效的输入
1、使用关键词自动完成
输入一个长词的一部分,按住 Ctrl,再按 N或n)如果 VIM 会一直循环它找到的匹配的字符串。
2、聪明的进入插入模式
i:在当前字符的左边插入   I:在当前行首(第一个非空字符)插入
gI 在第一列插入文本
a:在当前字符的右边插入   A:在当前行尾插入
o:在当前行下面插入一个新行   O:在当前行上面插入一个新行
R ENTER REPLACE MODE 替换
S 替换掉光标所在行 再进入编辑模式
:> 本行缩进
:< 取消本行缩进
<< >> 左移或右移当前段落一个移动宽度(shiftwidth)
:>n 缩进连本行在内的n行
:<n 取消连本行在内的n行的缩进
c{motion}:删除 motion 命令跨过的字符,并且进入插入模式。比如:c$,这将会删除从光标位置到行尾的字符并且进入插入模式。ct!,这会删除从光标位置到下一个叹号(但不包 括),然后进入插入模式。被删除的字符被存在了剪贴板里面,并且可以再粘贴出来。
d{motion}:和上面差不多,但是不进入插入模式。
3、有效的移动大段的文本
模式:
v:按字符选择。经常使用的模式,所以亲自尝试一下它。
V:按行选择。这在RGB(0x20,0x6a,0x4f)多行的文本的时候特别有用。
CTR+v:按块选择。采用xbeta的_Vimrc文件时
ctr+q 按块选择。
4、在可视选择模式下剪切和拷贝
一旦你高亮了选区,你或许想进行一些操作:
d:剪贴选择的内容到剪贴板。
y:拷贝选择的内容到剪贴板。
c:剪贴选择的内容到剪贴板并且进入插入模式。
在非可视选择模式下剪切和拷贝
如果你很清楚的知道你想拷贝或者剪切什么,那你根本就不需要进入可视选择模式。这样也会节省时间:
d{motion}:剪切 motion 命令跨过的字符到剪贴板。比如,dw 会剪切一个词而 dfS 会将从当前光标到下一个 S 之间的字符剪切至剪贴板。
y{motion}:和上面类似,不过是拷贝。
y2fa 表示拷贝从当前光标到光标后面的第二个a 字符之间的内容。
:12,y 表示拷贝第12 行到光标所在行之间的内容。
:,24y 表示拷贝光标所在行到第24 行之间的内容。
c{motion}:和 d{motion} 类似,不过最后进入插入模式。 cw 改变一个词
cc change line d$ 删除从现在光标所在位置 (包括)至行尾
cw change word cw 与 dw 由区别 前者不去最后的一个空格 后者去
rc 将光标下的字符替换为c
R replace beginning at cursor
dd:剪切当前行。 yw 复制的内容包括word之后的空白字符
ndd delete n lines
ndw delete n words
dw delete a word
yy拷贝当前行。
Y 拷贝当前行。
Vyp 复制一行
cc 剪切当前行并且进入插入模式。
D 代表 d$ 删除到行尾的内容
C 代表 d$ 修改到到行尾的内容。
x 代表dl 删除当前光标下的字符
X 代表dh 删除当前光标左边的字符
daw 删除一个单词 (包括其后的空格
cis 删除一个句子
cas 删除一个句子 (包括后面的空白
diw 删除光标上的单词
daw 删除光标上的单词 (包括空白字符
用d或x删除时 同时被删除的内容被保存起来
s 代表cl 修改当前光标下的字符
S 代表cc 修改当行
J jion two lines
r 替换之后 不进入插入模式
gum gUm 小写/大写 动作m跨越的文本
<m >m 左移/右移 动作m跨越的行
n<< n>> 将n行左移或右移一个缩进位
5、粘贴
p 粘贴到光标后
大写P 粘贴到光标前
6、使用多重剪贴板
很多编辑器都只提供了一个剪贴板。VIM 有很多。剪贴板在 VIM 里面被称为寄存器(Registers)。你可以列出当前定义的所有寄存器名和它们的内容,命令为“:reg”。最好使用小写字母来作为寄存器的名称,因为大写的有些被 VIM 占用了。
使用寄存器的命令为双引号 “。
比如:我们要拷贝当前行到寄存器 k。你应该按 “kyy。(你也可以使用 V”ky。为什么这样也可以呢?)现在当前行应该已经存在了寄存器 k 里面直到你又拷贝了一些东西进入寄存器 k。现在你可以使用命令 “kp 来粘贴寄存器 k 里面的内容到你想要的位置。
7、避免重复
. (小数点符号), 需要在normal下去执行 将会重复上一个修改命令。
u 撤销上次操作
U 撤销一行的操作 不管几次
ctr+R 恢复撤销
CTR+Y 重做

8、使用数字
3j 将会把光标向下移动三行。
10dd 将会删除十行。
y3″ 将会拷贝从当前光标到第三个出现的引号之间的内容到剪贴板。
:w save(:wq save and quit) ZZ保存后退出
:q quit(:q! quit anyway)
:only 关闭除当前窗口外的其它窗口
:qall 关闭所有的窗口 如果有为保存的文件 则自动跳到为保存的文件
:wall 全部保存
:e x edit file x
:e x 放弃修改重新载入当前的文件x
:n new window
:h vim help
:xx jump to line #xx
ctr+N CTR+P auto-complete next/prev keyword 插入模式下的单词自动完成
ctr+x+l 自动补全整行内容
ctr+x+f auto-complete file name 搜索可匹配的文件名并完成
缩写:
:abbr sprt system.out.println
在编辑状态下输入sprt后再输入其他非字母符号会自动扩展
ctr+W 在多个窗口间切换
:set nu 或 :set number 显示行号
:set nonu 或 :set nonumber 消除行号
:set ruler 设置vim在右下角显示光标的位置
:set incsearch 自动匹配
:set hlsearch 搜索时自动匹配
:set nohlsearch
:set ignorecase 忽略大小写
:set wrapscan 设置循环搜索
:set textwidth=30 设置自动换行 并将 最大长度设为30
:set background=dark
:set background=light
:set patchmode=.org 编辑data.txt 时 保存原始文件为data.txt.org
:reg 查看剪切板中的内容
gf 打开光标处的文件名
pwd 获取当前工作目录
多窗口:
:vsp :sp vertically/horizontally split 纵向或横向分屏
:ctrl+w-w 切换窗口
:close 关闭窗口 可以阻止关闭最后一个VIM窗口
:only 关闭除了当前窗口之外的所有的窗口
ctrl+w++ 增加当前窗口的高度
:diffs split and diff 分屏比较
ctr+W p to last accessed window 移动到上个屏幕
ctr+W w to next window
:12 go to 12th line
:r file append file into vim/vi
:f file change current filename to file
:w save changes and stay in file
:q quit and ignore changes
:q! force quit and ignore changes `
:wq quit and save
:nw file write file to the nth lines
:e filename edit new file
:r filename insert the new file to the position of the current cursor
:0r filename 将文件filename的内容插入到文件的开头
:.,$w filename 将当前正在编辑的文件中的当前行至最后一行写到新的文件filename中
:.,$w >>filename 将当前正在编辑的文件中的当前行至最后一行写到追加到已有的文件filename中
z redraw the screen
zz put the cursor to middle
zt 光标到所在行到屏幕顶端
zb 光标所在行到屏幕下端
qm 录制宏到寄存器m
@m 执行寄存器中的宏
一些设置
:set go=
隐藏菜单
:set shiftwidth=4 一次移动4个单位 用于<和>命令 移动的宽度
5>> 光标后5行向右移动一个tab
:12,24> 将12至24行的数据都向右移动一个tab
:12,24>> 将12至24行的数据都向右移动两个tab
<% or >% 来将({[等括号之间的文本都左移一个tab单位
shiftwidth(缩进的空格数,设置自动缩进时 会自动缩进4空格
tabstop(制表符的宽度)tab的宽度
expandtab(是否在缩进和遇到Tab键时使用空格替代;使用noexpandtab取消设置);
softtabstop(软制表符宽度,设置为非零数值后使用Tab键和Backspace时光标移动的格数等于该数值,
但实际插入的字符仍受tabstop和expandtab控制);
autoindent(自动缩进,即每行的缩进值与上一行相等;使用noautoindent取消设置);
shiftwidth=4 tabstop=4:很多Windows出身的程序员会习惯这样的设置,让缩进等于制表符宽度。
/* vim: set tabstop=4 shiftwidth=4 expandtab: */
模式行有好几种形式。本文只介绍上面的这种形式(其它形式类似,请自行参考“:help
modeline”):行首的“/*”和尾部的“*/”告诉C 编译器这是一行注释,不是代码的一部分;而
Vim可通过后面的“vim:”识别出模式行的开始(必须出现在行首或前面有一个空白字符);后面则是
“set”和空格间隔开的一串Vim选项;“:”表示模式行结束。

:set softtabstop=4 使得在第一列按下一个制表符 光标就会向前移动4个空格 再次按下时
会增加一个制表符 总共8列
:set expandtab 只使用空格 制表符会被相应宽度的空格代替
:colo evening 背景变黑
语法高亮:
:syntax keyword xType int long char 将int long char定义为组xType
:highlight link xType Type 将xType与Type联系起来 使得他们有相同的语法高亮
定义自己的映射键
在normal下: 用:map <F2> ggVG
在insert下: 用:imap <F2> ggVG

组合命令:
:%s/ /^M/g 将所有的空格替换为换行
ggVG 全选
:%s/$/!/g 所有行末尾加!
:%s/old/\r&/gc 表示将old替换为前面加换行在加old
:s/fred/<c-r>a/g : 将fred 替换为寄存器a 里的内容,<c-r>为按下Ctrl与r,
然后输入a 后,寄存器a 的内容会出现在命令行
:s/fred/<c-r>asome_text<c-r>s/g
:s/fred/\=@a/g : 与第一条的作用相同,但是更优雅一些,
因为不会在命令行显示寄存器的内容
:%/为../&\r 将”为**“ 替换为 ”为**“加回车
编辑命令时:<left>代表向左一个字符
<right>代表向左一个字符
<shift+left>代表向左一个单词
<shift+right>代表向右一个单词
home 至命令行首
end 至命令行尾
ctrl+w 删除光标前的整个单词
ctrl+u 删除光标之前的所有内容
tab键自动补齐所输入的较长的单词或者文件路径
1. 去掉所有的行尾空格:“:%s/\s\+$//”。
“%”表示在整个文件范围内进行替换,
“\s”表示空白字符(空格和制表符),
“\+”对前面的字符匹配一次或多次(越多越好),
“$”匹配行尾(使用“\$”表示单纯的“$”字符);
被替换的内容为空;由于一行最多只需替换一次,不需要特殊标志。这个还是比较简单的。
2.去掉所有的空白行:“:%s/\(\s*\n\)\+/\r/”。
这回多了“\(”、“\)”、“\n”、“\r”和“*”。
“*”代表对前面的字符(此处为“\s”)匹配零次或多次(越多越好;使用“\*”表示单纯的“*”字符),
“\n”代表换行符,“\r”代表回车符,“\(”和“\)”对表达式进行分组,使其被视作一个不可分割的整体。因此,这个表达式的完整意义是,把连续的换行符
(包含换行符前面可能有的连续空白字符)替换成为一个单个的换行符。唯一很特殊的地方是,
在模式中使用的是“\n”,而被替换的内容中却不能使用“\n”,而只能使用“\r”。原因是
历史造成的,详情如果有兴趣的话可以查看“:help NL-used-for-Nul”。
3. 去掉所有的“//”注释:“:%s!\s*//.*!!”。首先可以注意到,这儿分隔符改用了“!”,原
因是在模式或字符串部分使用了“/”字符,不换用其他分隔符的话就得在每次使用“/”字符
本身时写成“\/”,上面的命令得写成“:%s/\s*\/\/.*//”,可读性较低。命令本身倒是相
当简单,用过正则表达式的人估计都知道“.”匹配表示除换行符之外的任何字符吧。
4.去掉所有的“/* */”注释:“:%s!\s*/\*\_.\{-}\*/\s*! !g”。这个略有点复杂了,用到
了几个不太常用的Vim正则表达式特性。“\_.”匹配包含换行在内的所有字符;“\{-}”表示
前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越
少越好;标志“g”表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像
“int/* space not necessary around comments */main()”这样的表达式在替换之后
仍然是合法的。
5、:g/./,/^$/join
:g/./ 一个全局命令, 查找那些至少有一个字符的行.
,/^$/ 指定一个范围, 从当前行开始(非空行)直到一个空行.
join ":join"命令把指定范围内的行连为一行.
6.对多个文件进行改动 例如把所有的c文件中的x_cnt变量替换为x_counter变量
先将所要修改的文件放到参数列表上 :args *.c
再执行命令 :argdo %s/\<x_cnt\>/x_counter/ge |update
解释::argdo 命令已另一个命令为参数
g是对每行中的所有的x_cnt进行替换
e是避免某些 文件中没有一个x_cnt可供替换 那就不进行下面的替换的情况
| 用来分隔两个命令 后面的update 命令会在文件有所改变时保存 没改变的则不进行操作
类似于argdo 命令:windo 会对所有的窗口都执行同样的操作
:buffer 则是对所有的缓冲区进行操作
:ls 可以查看缓冲区情况
:args 显示目前打开的文件
% 当前编辑文件
# 上次编辑文件
:previous 编辑上一个文件
:next 编辑下一个文件
:wprevious 保存并编辑上一个文件
:last 编辑最后一个文件
:first 编辑第一个文件
:lcd%:p:h 更改到当前文件所在的目录
lcd是仅仅改变当前窗口的工作路径 %表示当前文件的文件名
加上:p扩展为全名(带路径) 加上 :h 析出路径

8. :g/^\s*$/d 删除所有空行
恢复机制:
正在编辑一个文件help.txt时死机 则下次启用vim时用 :vim -r help.txt 来恢复
然后先存储在另一个文件:write help.txt.recovered 再比较这两个文件
如果正在编辑的文件没有名字 则用 :vim -r "" 来恢复所有可能的文件
:echo 3+8*9 会计算出值
一些组合命令:
:g/^/m 0 依此将每行移动到第0行的下一行 实现倒序功能
:g/^/+1 d 删除偶数行
:s/\n\n\@!// \n\n\@!是查找后面不跟回车的回车 然后替换为空格
:g/./,/^$/j /./标记非空行 /^$/查找后面的行直到出现空行 然后对二者进行合并
:v/ccc\|ddd/s/aaa/bbb/g 将aaa替换成bbb 条件是行中有ccc但不能有ddd
:g/ccc/if getline('.')!~'ddd'|s/aaa/bbb/g 首先标记匹配的ccc行 然后执行if命令 getline函数
则取得当前行 然后判断是否匹配ddd
如果不匹配(!~的求值为true)则执行替换
:g/^/,+2 d|,+6 m -1 每十行删除前后三行
:g/^/,+6 m -1|+1,+3 d 每十行删除前后三行
:g/if/+1,/elsif\|else/-1 t $ 将if与elsif或else之间的内容 复制到末尾
:g/^/put_ : 双倍行宽 (pu = put)
:g/^/m0 : 颠倒文件 (m = move)
:'a,'bg/^/m'b : 颠倒选中的 a 到 b
:g/^/t. : 重复行
:g/fred/t$ : 拷贝行从fred 到结尾
:g/stage/t'a : 拷贝行从stage 到 marker a(a 为标记的位置)
隔行替换
:g/^/ if line('.')%2|s/^/zz /
查找标记a 与b 间所有包含"somestr"的行,并全部复制到第一个包含"otherstr"的行后
:'a,'bg/somestr/co/otherstr/ 其中 co(py) or mo(ve)
用文件中的内容替换字符串,-d 表示删除上面的一行
:g/^MARK$/r tmp.ex | -d
:g/<pattern>/z#.5 : 带有上下文一并显示
:g/<pattern>/z#.5|echo "==========" : 优雅地显示
将g//和普通模式下的命令结合起来
:g/|/norm 2f|r* : 将第二个|替换为*号
全局命令和替换命令联姻 (强大的编辑能力)
:'a,'bg/fred/s/joe/susan/gic : 可以使用反向引用来匹配
:g/fred/,/joe/s/fred/joe/gic : 非行模式
:/fred/;/joe/-2,/sid/+3s/sally/alley/gIC 先找fred,然后找joe
:g/^/exe ".w ".line(".").".txt"
为每一行生成一个文件,文件名从1.txt 开始,依次为1.txt,2.txt,3,txt
xy\{2,}表示x后接至少两个y 相当于xyy\+或xyyy*
"ayy 将当前行复制到a缓冲区 "的作用是注释,以免当成插入
"ap 粘贴刚才复制的行
缓冲区在wim中的术语是registers 具体可以看:h registers
d,c,s,x,y等指令改变或删除的内容都是放在registers中的
:reg 命令可以查看缓冲区的内容 然后可以根据前面的标记加p复制需要的内容
冒号命令支持tab键补全功能
. 重复上一次的编辑动作(移动游标和冒号命令除外)、
:marks 可以得到所有的标签列表
vim+ 档案名 可以打开档案 并且游标会落在最后一行的行尾
vim+n 档案名 游标会落在第n行的行首
vim+/string 档案名 进入档案后游标会进入第一个要找到的string上 按n可以继续寻找
多当编辑有两种形式:
argument list 进入vim前所用的参数就是多档
buffer list 进入vim后另外再开其它的档
:n 编辑下一个档案
:2n 编辑下二个档案
:N 编辑前一个档案 适用于argument list
:sp(:vsp) filename 分割出一个窗口并打开文件filename
:rew 回到首文件
:e 档案名 在不离开vim的情形下再开其它档案 只要要编辑的档案在目前的目录下即可
:e# 或CTR+^ 编辑前一个档案 用于两档互相编辑时相当好用 #表示前一次编辑的档案
:ls 会列出目前buffer中的所有档案
编号后边有#的代表是前一个文件,可以通过:e#来进入,
%a 的代表是当前文件,
什么也没有的可以通过:bn 来进入,这里的n 代表文件编号。
:b 文件名或编号移至该文件。
:args 查看当前打开的所有的文件
:h pattern 可以查看regexp内容
:changes 列出改变列表 :h changelist 查看‘改变表转跳帮助’
:ju(mps) 列出跳转轨迹
:history 列出历史记录
:his c 命令行历史
:his s 搜索历史
"ayy@a : 把当前行作为命令执行
yy@" : 上面的匿名寄存器
u@. : 只执行键入的命令

使用外部sort 排序
:%!sort -u : 用sort 排序整个文件(结果覆盖整个文件)
:'a,'b!sort -u : 从mark a 到mark b 之间的内容进行排序
!1} sort -u : 排序一个段落
:g/^$/;,/^$/-1!sort : 将每个块排序(注意这个关键的;)
:badd file.c : 添加file.c 到buffer 列表
:b 3 : 前往第三个 buffer
:b main : 前往含有main的buffer 中 比如说 main.c
:sav php.html : 把当前文件存为php.html并打开
:sav! %<.bak : 换一个后缀名保存 (旧方法)
:sav! %:r.cfm : 同上
:sav %:s/fred/joe/ : 替换文件名
:sav %:s/fred/joe/:r.bak2 : 替换文件和后缀
:!mv % %:r.bak : 重命名当前文件
:e! : 打开未修改之前的文件
:w c:/aaa/% : 存储文件到指定位置
:e # : 编辑标记为#的文件在buffer 中
:rew : 返回到第一个可编辑的文件
:brew : 回到第一个buffer
:sp fred.txt : 分割窗口打开fred.txt
:sball,:sb : 把所有的 buffers 分割显示在一个窗口中 (超有用)
:scrollbind : 让每个分离的窗口,同步滚动
:map <F5> :ls<CR>:e # : 按F5 显示所有buffer, 并显示行号
:set hidden : 允许不保存当前buffer 而进行切换
V : 进入可视化行选择模式
gv : 重新选择
:s/.\{,69\};\s*\|.\{,69\}\s\+/&\r/g 在70 列的时候换行
vim -c "%s/ABC/DEF/ge | update" file1.c 在打开一个文件时执行多条命令
vim -c "argdo %s/ABC/DEF/ge | update" *.c 在一组文件上执行多条命令
vim -c "argdo /begin/+1,/end/-1g/^/d | update" *.c 从一系列文件中删除一块区域
在文件中插入行号
:g/^/exec "s/^/".strpart(line(".")." ", 0, 4)
:%s/^/\=strpart(line(".")." ", 0, 5)
:%s/^/\=line('.'). ' '
命令使用于多个文件
:argdo %s/foo/bar/e : 在所有文件上操做 :args
:bufdo %s/foo/bar/e
:windo %s/foo/bar/e
:argdo exe '%!sort'|w! : 包含外部命令
REGEXP:
* 0次以及多次
+ 一次以及以上
= 0或1次
| or的意思
:%s/\([a-z]\)\1/test/g 将aa,bb,cc,……zz替换为test
:%s/[a-z][a-z]/test/g 不是一个意思 会将aa,ab,ac,等都替换为test
mastering regular expressions(o'reilly&asscociate) 书里详细介绍了正则表达式
\{m,n\} 前面部分的从m次至n次出现
\{m\} 精确m次出现
\{m,\} 大于等于m次出现
/\(foo\|bar\)\+ 匹配 foo foobar foofoo barfoobar
/.*fred\&.*joe 搜索同时包括fred 跟joe的行
/\<\d\d\d\d\> 搜索独立的4位数字
/\D\d\d\d\d\D 搜索恰好4位的数字
/<\zs[^>]*\ze> 匹配<与>所包含的内容 但不包含<>
/<\@<=[^>]*>\@= 查找<与>所包含的内容
/<\@<=\_[^>]*>\@= 多行匹配<与>所包含的内容
/<!--\_p\{-}--> 匹配<与>所包含的所有内容 {-}是非贪婪匹配
:%s/^\n\+/\r/ 压缩空行,多个替换为一个
/<\zs[^>]*\ze> 匹配<>之间的内容
/<\@<=[^>]*>\@= search for tag contents, ignoring chevrons 匹配<>标签中的内容,而忽略<和>本身
/<\@<=\_[^>]*>\@= search for tags across possible multiple lines
:%s/\r//g delete dos returns ?M
:%s/\r/\r/g turn dos returns ?M into real returns (fixes joined lines)
在一个模式中的“或”操作符是\| 例如 /foo\|bar 他匹配到foo 或着是bar
/\(foo\|bar\)\+ 它匹配到foo foofoo foobvar barfoobar
/end\(if\|while\|for\) 匹配的是endif endwhile endfor
/forever\&... 只会匹配到forever中的for 而不会匹配到fortuin的for
/[a-z]可以匹配a到z中的一个字母
/[0123456789abc] 可以匹配0123456789abc中的任意一个字母
/[0-9a-c] 与上面等价
/[^a] 匹配除a之外的任意字符
/"[^"]*" 其中[^"]表示除双引号之外的任意一个字符 总的命令将会匹配到“foo”或“3!x”
\d 数字 等价于[0-9]
\D 非数字 等价于[^0-9]
\s 空白字符 等价于[ ]包含<tab><space>
\S 非空白字符 等价于[^ ]
\l 小写字母 等价于[a-z]
\L 非小写字母 等价于[^a-z]
\u 大写字母 等价于[A-Z]
\U 非大写字母 等价于[^A-Z]
\i 匹配标识符字符[a-zA-Z0-9]
\I 匹配[a-zA-Z]
\w 匹配一个字母、数字、或下划线[a-zA-Z0-9_]
\_s* 任何空白字符包括换行
\_.* 任何字符包括换行