Vim实用小技巧

插入递增数字

let i=0 | g/toPlaced/s//\=i/ |let i=i+1
这条命令由三部分组成:
let i=1 和 let i=i+1 构成了一个变量递增的循环。
g命令用于全局查找一个字符串,并对此字符串施加一个命令。
比如:
g/\(12\)3/s//\14/  #查找123,并将3替换成4

共享寄存器

set clipboard=unnamed
复制到匿名寄存器中,可以在多个vim中共享寄存器

键盘映射模式

map : 正常模式,可视化模式和运算符模式可用
nmap :正常模式可用
vmap :可视化模式可用
omap :运算符模式可用
map! :插入模式和命令行模式可用
imap :插入模式可用
cmap :命令行模式可用

绑定了ctrl+c
vmap <c-c> "+y

80个字符规范

" 超过80个字符时加下划线强调(Underlined)
au BufWinEnter * let w:m2=matchadd('Underlined', '\%>' . 80 . 'v.\+', -1)

" 设置超过80长度提示
set colorcolumn=80

" 设置77-81列提示高亮显示, (*)所有文件配置高亮
:au BufWinEnter * let w:m1=matchadd('Search', '\%<81v.\%>77v', -1)

" 设置超过80字符视错误信息提示
:au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>80v.\+', -1)

" 设置颜色blue
hi Over80 guifg=fg guibg=Blue
" 在BufNewFile和BufRead事件发生时对于*.*的文件执行命令match Over80 ‘\%&gt;80v.*’
au BufNewFile,BufRead *.* match Over80 '\%&gt;80v.*'

E492不是编辑器命令 ^M

执行命令保存即可
:set ff=unix

替换行尾^M字符
vim命令行中字符 ^M 要使用 CTRL-V CTRL-M 生成,而不是直接键入 ^M

:%s/^M$//g # 去掉行尾的^M。
:%s/^M//g # 去掉所有的^M。
:%s/^M/[ctrl-v]+[enter]/g # 将^M替换成回车。
:%s/^M/\r/g # 将^M替换成回车。

使用sed命令。和vim的用法相似
$ sed -e 's/^M/\n/g' myfile.txt

vimgrep 批量文件查找内容

当前目录下查找带有“abc”字符的后缀为txt的文件, 不包括子目录
vimgrep /abc/ ./*.txt
如果包含子目录,命令如下:
vimgrep /abc/ ./**/*.txt
vimgrep 支持正则, 所以注意正则的关键符号, 必要的时候需要转义,转义符'\'

将当前文件所有匹配的abc字符替换成123,如果没有"g"选项,则替换当前位置。
%s/abc/123/g

多文件替换

打开所有需要操作的文件
args ./**/*.txt
对所有打开的文件执行替换并更新到文件
argdo %s/abc/123/g | update

:argdo %s/a_value/b_value/ge | update
argdo:arg中包含了vim所编辑的文件列表,命令:args可以显示当前的列表,
:argadd file增加文件file到arg列表中,argdo可以对args中的所有文件执行操作
%s/a_value/b_value/ge:全局替换,e的作用是不提示错误消息,使命令继续执行下去,具体参见:h s_flags
update:修改缓冲区后写入

保存只读文件

:w !sudo tee%
w:vim中的保存
!sudo:执行外部命令sudo
tee:从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件
%:在vim中表示当前文件的文件名

插入shell命令的输出结果

:r ! date
r:read的缩写,读取文件或者命令的输出
! date:执行命令date

在vim中格式化json数据

:execute '%!python -m json.tool' | w

在新标签中打开当前的分屏文件

Ctrl-W T

搜索

使用[I来显示搜索结果列表
在搜索模式下(即/中),按Ctrl-r Ctrl-w来快速输入当前光标所在的单词