转自:http://blog.csdn.net/skydreamer01/article/details/4228264
《 Hacking Vim 》读书笔记: Vim 中高级技巧
《 Hacking Vim 》读书笔记: Vim 中高级技巧
1. 引言
如果你已经使用 Vim 超过一年半载,对 hjkl,i,a,yy,dd,p,u 等命令已经滚瓜烂熟,但是还基本没有自己写过 .vimrc 文件,又觉得需要将使用 Vim 的程度提到一个新的高度,看《 Hacking Vim 》这本书最合适不过了。
我给这本书打 4 分。觉得很不错是因为这本书中提到了许多我原来没有掌握的技巧或命令。没有打 5 分是因为这其中也夹杂着好些没有多大用处的部分,又有一些部分选材不是很精要。比如说, Vim 插件部分,我以为一本好的书应该为读者挑选一些最常见也最有用的插件对作者进行介绍。这部分作者似乎还没有 SMTH BBS Vim 版的 FAQ 写得好。
2. 常用技巧
下面总结一下我从这本书和其它地方学到的一些常见的设置和技巧(我自认为是中高级的,可是有些读者可能认为某些部分是初级的)。
2.1 全局替换
%s/old/new/g
2.2 多文件替换
多文件替换,比如要替换所有 .c 文件中 a_value 为 a_value ,可以使用如下方法:
vi *.c
:argdo %s/a_value/b_value/ge | update
其中 update 是直接替换覆盖原文件,若需要确认,则可使用
:argdo %s/a_value/b_value/gec | update
2.3 增加多行注释
方法一:
Ctrl+v; 选定所需行 ; I; #|//; Esc 两次
比如需要增加 # 或者是 // 这种注释。 Ctrl + v 定位到开始行,然后选定需要的行,然后执行 I 命令,然后输入 # 或 // ,然后按 Esc 键两次,即可把注释操作应用到所有选定的行,记住选定不能使用 v 指令,而应该使用 Ctrl + v (清除注释请参考上面的方法) (v 是按行选定, Ctrl + v 是按照列选定 )
方法二:
: 起始行 , 终止行 s/ 要替换字符 / 替换为新字符 /g
比如: :1,20s/^//////g
2.4 ab 技巧
: ab 替代符 原始信息
比如::ab mail abc@gmail.com
2.5 分割窗口功能
分割窗口:
:split [filename] ( 水平分割)
:vsplit [filename] ( 垂直分割)
:new ( 打开一个窗口编辑新文件)
窗口跳转:
CTRL+W w (循环跳转)
CTRL+W (h|j|k|l) (上下左右)
关闭(当前)窗口:
:close
关闭所有其它窗口:
:only
增减窗口大小
CTRL+W +/-
缓冲区跳转:
:bnext ( 下一缓冲区)
:blast (上一缓冲区)
退出所有窗口
:qall
保存所有窗口:
:wall
保存并退出所有窗口:
:wqall
2.6 改变颜色配置
:colorscheme mycolors
Vim 自带多种配色方案,可以根据需要自己选用。若不知道系统有哪些配色方案,可以在输入 :colorscheme( 空格 ) 后用 Shift+Tab 键选择。
2.7 显示和不显示行号
显示行号: set nu[mber]
取消显示行号: set nonu
2.8 更好的状态行
通过设置 statusline 可以设置更好的状态行,我选择的设置是:
set statusline=%F%m%r%h%w/ [FORMAT=%{&ff}]/ [ASCII=/%03.3b]/
[POS=%4l,%3v][%p%%]/ [LEN=%L]
它可以显示当前文件的路径和文件名以及整个文件的长度。
2.9 光标行和光标列
:set cursorline ( 设置光标行 )
:set cursorcolumn ( 设置光标列 )
其中我觉得光标行更有用些。 Vim 默认设置,要找到光标所在位置不是很方便。
2.10 语言拼写检查
set spell
set spelllang=en,de,it
中文需要语言包支持,不过最常用的还是英文检查吧
2.11 键绑定
map 对 Normal, Insert, Visual 和 Command-line 模式均有效
imap Insert 模式有效
cmap Command-line 模式有效
nmap Normal 模式有效
vmap Visual 模式有效
键绑定可以定义一些键的组合为一个快捷键,如:
imap <C-s> <ESC>:w<CR>a
2.12 定位功能
{ 段首
} 段尾
g, 前一修改处
g; 后一修改处
( 句首
) 句尾
w 下一单词头
b 前一单词头
% 跳至匹配括号
[[ 和 ][ 向后 | 前至下一区段开始
[] 和 ]] 向后 | 前至下一区段结束
[{ 跳至块开始
]} 跳至块结束
[/ 跳至注释块开始
]/ 跳至注释块结束
gd (Goto Declaration) 跳至定义处
gD 跳至全局变量定义处
gj 跳至长行下一段
gk 跳至长行上一段
gf (Goto File) 打开文件
?向前查找
/ 向后查找
?? 重复上一向前查找
// 重复上一向后查找
# 向前查找光标下词 ( 整词匹配 )
* 向后查找光标下词(整词匹配)
g# 向前查找光标下字符串(不必是整词)
g* 向后查找光标下字符串(不必是整词)
vimgrep /pattern/[j][g] file file2 … fileN 多文件查找
使用标志 (mark) 定位:
0~9 系统自用
a-z 本文件 mark ( 使用方法: 标志: ma, 调至标志 `a)
A-Z 跨文件的 mark
:marks 查看所有标志
:delmarks 删除标志
2.13 自动补全
Ctrl+p 自动补全单词
Ctrl+n 自动补全单词(向前查找)两者一般感觉不到区别
Ctrl+x Ctrl+k 通过字典补全单词
Ctrl+x Ctrl+t 从同义词典 (thesaurus) 补全
Ctrl+x Ctrl+f 文件名自动完成(很有用)
Ctrl+x Ctrl+l 自动完成整行
Ctrl+x Ctrl+i 从当前和包含文件补全
Ctrl+x Ctrl+o 全能自动补全,需要 set omnifunc
2.14 使用宏
qx ( 开始录制宏至寄存器 x , x 可以为任何字母,但是最常见的是 q)
command1
…
q ( 结束录制 )
@x ( 引用宏 )
@@ ( 重复上次宏使用 )
2.15 读写文件或命令内容
:r filename ( 读入文件内容 )
:m,nw filename ( 将 m~n 行内容写入文件 )
r!command ( 插入 command 命令结果 )
2.16 使用寄存器
无名寄存器 “”
数字寄存器 “0 “1 … “9
有名寄存器 (Named Registers) “a~”z “A~”Z ( 大写寄存器内容追加,而不是覆盖 )
只读寄存器:
“% 当前活动缓冲区文件名
“# 前一文件的文件名,替换文件
“. 最后插入的文本
“: 最后命令行运行的命令
黑洞寄存器: “- 进入的永远消失
搜索模式寄存器 “/
表达式寄存器: “= ( 使用:输入表达式后 ENTER, p 粘贴 )
2.17 折叠
zfa{ 创建折叠
zc 折叠
zo 打开折叠
zM 折叠所有
zR 打开所有折叠
2.18 文件比较 vimdiff
:vimdiff file1 file2
:diffsplit filename
或命令行下 vim –d file1 file2 可进行文件比较
[c 前一差别
]c 后一差别
2.19 缩进
>% 缩进块中内容
<% 反缩进块中内容
>i{ { 内部缩进(不包括 {} )
>a{ { 内容缩进(包括 {} )
<i{ 反缩进
<a{ 反缩进
2.20 使用文件模板
:autocmd BufNewFile *.html 0r $VIMHOME/template/html.tpl
可以在创建新的 .html 文件时读入模板( html.tpl 中内容)
2.21 识别中文字体
你的 Vim 在打开中文文件时都是乱码吗?若是这样,在 .vimrc 中加入以下几行就可以了:
set fileencodings=utf-8,gb2312,gbk,gb18030
set termencoding=utf-8
set encoding=prc
3. 常用插件
Vim 中的插件有许多,上 Vim.org 自己查吧,不过我自己使用以下几个,也觉得是用有用的。以下只说明这些插件的用途,具体用法不做详细介绍。有了这些插件,足以形成一个可以与 VC 媲美的集成开发环境了。
3.1 ctags
实现标签跳转, C/C++/Java 编程时很有用。命令行下 ctags –R * 创立标签, Ctrl+]/Ctrl+O 跳转, Ctrl+T 返回
3.2 taglist
生成文件纲要,包括函数、关键字等。安装后使用 :Tlist
3.3 A
实现头文件跳转。 ctags 不能查找头文件
3.4 NERDtree
目录浏览功能。可以用 o 命令打开目录或文件,非常好用
3.5 MiniBuffer
打开多个文件时,生成一个类似标签页的导航菜单,可以用 Ctrl+w w 命令跳转至该部分并用 Tab 选择不同文件
3.6 calendar
日历插件