综述
vim是一个功能非常强大, 可以高度定制的编辑器. vim的操作方式由于历史的原因, 和绝大多数windows上的编辑器迥异, 并且会有正常/插入多种编辑模式, 不符合用户习惯, 从而初接触会觉得很难. 可惜涉及到服务端开发的同学常常需要在终端上编辑文件, 而vim又是服务器标配编辑器, 这时候熟悉vim的基本操作, 了解vim的使用技巧, 有助于我们提高工作效率.
基本操作
基本操作单看手册是没办法记住的, 只能通过反复的使用形成手指上的条件反射. 建议可以从vimtutor这个教学程序开始熟悉. 这里只列一些补偿提到, 但是实际上很常用的操作:
正常模式下
u/Ctrl+r
撤销/恢复前次编辑内容Ctrl-d/Ctrl-u
GG/g
<line>G
跳转等相关操作=
相关操作, 格式化用
插入模式下
Ctrl+p/Ctrl+n
强烈推荐!!!根据上下文内容自动补全, 尤其是在用vim做开发的时候非常好用Ctrl+w
删除前面的一个词元, 再也不用死命敲回车, 或者跳出插入模式做删除操作了- (注: shell命令行下Ctrl+W也有删除前面单词的功能, 帮助快速修改命令; Ctrl+A/E 跳转到行首/尾; 如果是emacs用户会觉得很熟悉, 因为sh默认的编辑模式就是emacs的)
快速从正常模式作简单编辑
- C 删除该列光标后内容并进入插入模式
- cw 删除光标下字元并进入插入模式, 适用于需要快速替换几个单词的操作场景
- I/A 跳转到改行首/尾并进入插入模式
正常模式/插入模式快速切换: vim最被emacs用户吐槽的就是其区分正常/插入模式了, 不过个人觉得vim提供的正常模式极大的方便了阅读代码的操作, 也不用担心误操作导致不小心在代码中某个地方留下了奇奇怪怪的字符串. 在编辑文件的时候始终保持插入模式, 不要每改一处就切换一次模式, 造成了诸多无效的操作.
另外, 在需要粘贴外部内容的时候, 常常由于自动缩进, 会把格式搞乱. 可以通过使用:set paste
命令来临时屏蔽自动缩进.
保存退出
vim经常需要临时编辑一些配置文件保存退出, 这种频繁编辑保存的时候会觉得:wq
命令敲起来指尖上的动作过多, 感觉很繁琐. 其实可以用ZZ
命令来实现同样的功能, 但是操作感觉上简单不少.
也可以打开自动写的选项:set autowrite
, 这样编辑一个文件时Ctrl-Z切换到后台时就自动保存下来了, 这是可以在shell里面测试编辑的配置是否正确, 如不OK呼出后台的vim程序继续编辑, 从而避免了反复“打开-保存-关闭”的操作.
强大的列操作
因为绝大部分编辑器都是面向行操作的, 在对于类csv格式文件, 要对多列批量操作就比较麻烦, vim提供了C-V的“块选择”模式, 从而帮助我们把文本内容像积木一样编辑组合.
应用比较多的场景:
- 多行注释: C-V -> 第一列选择多行 -> I (插入) -> 行注释标记
- 列选择移动: C-V -> 选择制定列全部内容 -> x (剪切) -〉移动到目标列起始位置 -> p (粘贴)
多标签和分屏操作:
绝大部分windows下的编辑器都是支持多标签同事编辑多个文件的, vim自然也提供类似的功能 :tabe FileName 打开一个新标签页编辑FileName文件 gt 在多个打开的文件标签页间跳转
此外vim还提供了同一视图下多窗口操作, 这样同时对照编辑两个文件, 减少跳转的次数 Ctrl+W, Ctrl+V 垂直切分出一个窗口 Ctrl+W, Ctrl+W 在打开的窗口中跳转
用户配置和插件的使用
个人不推荐对vim做过多的深度配置, 加载过多的插件, 主要原因是会使用户习惯于自己配置出来的vim环境以及相关的插件快捷键, 从而反而忘记了vim内置的操作方式, 一旦换一台机器使用时会很不习惯; 此外vim本身设计风格也是符合unix工具小而精的思路, 即一个工具专注做好一件事情, 把多种工具组合起来使用, 而不需要把vim本身打造成一个复杂的IDE.
vim配置文件是~/.vimrc
. 一般而言vimrc_example.vim已经足够使用, 拷贝一份即可:r $VIMRUNTIME/vimrc_example.vim
vim插件目录~/.vim
. 功能细分:
- ~/.vim/plugins/*.vim 插件代码文件
- ~/.vim/doc/*.txt 插件帮助文件
推荐插件:
- taglist, 提供类似于eclipse的outline支持, 用于帮助正常代码
- netrw (vim已内置), 提供了文件夹导航, 跳转, 书签标记等功能 (:help netrw 看帮助)
自定义命令
除了依赖插件外, 我们还可以根据文件扩展名做不同的设定, 从而打造自己的编辑调试环境. 例如:
autocmd FileType php call SetupPHP()
function SetupPHP()
nmap <F5> :!php %<CR> " 执行当前脚本
endfunction
之后当我们编辑一个php脚本时, 只要在正常模式下按