最近开始迷上Vim,喜欢它的操作模式,更喜欢它花花绿绿的样子。下面分享一下自己的学习体会吧。
一.模式
Vim与其他文本编辑器最大的不同是模式的概念,Vim定义了三种模式:normal, insert以及visual。Vim利用不同模式的划分,不同的操作隶属于不同的模式,也就是说某种操作只能在某个模式下发生,这样在某种程度上简化了 操作。模式的概念对于刚接触Vim的人来说可能有些不适应,不过一旦熟悉之后,我保证你会喜欢上它,渐渐的你会成为Vimmer。下面看一下这三种模式的 具体定义:
不同模式间的切换非常简单。从Normal到Insert只需按i或I,而从回到Normal只需按<Esc>。从Normal到 Visual只需按v或V,而回到Normal也只需要按<Esc>。当然Vim还提供的更多的模式间切换的方式,见下图,图片来自《A Byte of Vim》(http://www.swaroopch.com/notes/Vim)。
二.丢掉鼠标——移动光标
在Vim上工作你可以完全抛弃鼠标,只用键盘就可以完成全部工作,因为Vim提供了一种多种利用键盘移动光标的方式。下面来看看其中的几种。这部分涉及的操作在Normal模式下完成。
酷不酷?下面还有更酷的!
三.学会help
Vim中的操作及命令有很多,不可能全都几下来,这是我们就要求助于Vim内置的:help了,如:help various-motions 。或者你去google或stackoverflow提问。
参考资料:
1.http://www.vim.org/
2.http://www.swaroopch.com/notes/Vim
3.http://code.google.com/p/macvim/
在Vim初探(一)中介绍了Vim中模式的概念,以及如何在Vim中以多种方式移动光标。在本节中将介绍拷贝、剪切及黏贴,Undo/Redo,以及搜索的操作。闲话少说,我们开始吧!
一.拷贝、剪切及黏贴
拷贝(Copy)、剪切(Cut)及黏贴(Paste) 是我们在做文本编辑时最常用的操作。Vim中也有相应的操作,只不过在Vim中它们的命名方式有所变化:Vim将cut称为delete,将copy称为 yank,将paste仍称为paste。在用Vim编辑文本时Vim会在内存中开辟一块缓存将文本放入其中,所有对文本的编辑都将写入这块缓存中直至使 用:write或:w保存编辑状态才将保存的结果写入硬盘。在进行剪切操作时,Vim将文本从缓存中"删除"(delete)并将其存入寄存器。在进行拷 贝操作时,Vim从缓存中“拉出”(yank)相应的文本并将其存入寄存器中。
在Normal模式下Vim中剪切(delete),拷贝(yank)及黏贴(Paste)操作的相应命令为:d, y, p。在Vim中你可以将剪切和拷贝的操作分别应用于一个字符,一个词,一行文本,以及一段文本。相应的命令分别为:
操作对象 | 剪切 | 拷贝
----------|-------|----------
一个字符 | dl | yl (注意是小写字母L,而不是数字1)
----------|-------|-----------
一个词 | dw | yw
----------|-------|-----------
一行文本 | dd | yy
----------|-------|-----------
一段文本 | dap | yap
----------|-------|----------
例如若要剪切某个词并将其黏贴到另一个位置,只需将光标移动到该词,按下dw,然后将光标移动到需要黏贴的位置并按下p。同时在黏贴时Vim提供两种方式:
p(小写) 黏贴在当前光标位置之后
P(大写) 黏贴在当前光标位置之前
二.Undo/Redo
与拷贝,剪切和黏贴类似,Undo/Redo也是我们在编辑文本时常用的操作。在Vim中按u进行Undo操作,按ctrl-r进行Redo操 作 。非常简单!理论上在Vim中可以进行无限层级的Undo/Redo操作。同时Vim提供了一些高级的Undo/Redo操作,即earlier和 later命令。例如我想回到四分钟以前的状态,只需执行命令:earlier 4m 。然后我又想前进到30秒后的状态,则执行命令:later 30s 。刚才的两个例子用时间点做参考,那么如果我想回到之前五次修改之前的状态,则执行命令:undo 5 .Vim以树形结构的方式组织undo list,可以用命令:undolist查看。所以从某种意义上讲,Vim不仅是一个文本编辑器,而且还是一台时光机(time machine)。
三.搜索操作
Vim中内置了一个强大的搜索引擎。搜索时只需在Normal模式下按/键,键入所要搜索的词并按回车键即可,例如要搜索文本中是否含有 hello,只需执行/hello<cr>即可。若文本中含有多个要搜索的词,按n跳转到该词下一处出现的位置,按N跳转到该词前一处出现的 位置。在Vim中搜索时可以通过一些参数的设置来定制搜索的方式,下面介绍三个搜索相关的参数。
set incsearch 如果你只是模糊的记得要搜索的词,可以打开incsearch,那么你在键入要搜索的词过程中Vim就进行搜索
set ignorecase 搜索时忽略大小写
set smartcase 如果你键入的要搜索的词只含小写字母,则搜索时忽略大小写。否则搜索时考虑大小写。
另外如果我想确切的搜索某个词,则需求助转义字符\。如我想确切的搜索hello这个词,需要执行/\<hello\>并按回车。 若搜索文本中的数字,则执行\/d命令。/\d\+ 命令搜索一个或多个数字。/\d\*搜索零个或多个数字。我想熟悉正则表达式的同学应该对此不陌生。
参考文献
1.http://www.swaroopch.com/notes/Vim
在 Vim初探(一)和 Vim初探(二)中分别介绍了Vim中模式的概念及一些简单的文本编辑命令,如光标的移动、编辑区域的选取、拷贝、剪切、黏贴等。接下来我想介绍一下在Vim中如何折叠和展开已设定好缩进的文本,以及如何同时查看和编辑多个文本。作为程序员对于代码的缩进肯定是再熟悉不过了。同时现在很多IDE提供了将已经缩进好的一段代码折叠起来或者展开的功能。在Vim中我们也能做 到这一点:首先需要先设置折叠方法,:set foldmethod=indent,然后将光标移动到一段已经具备缩进的文本上(如通过<Tab>键设置),按下zc将缩进折叠起来,按下 zo展开缩进。这只是缩进的折叠与展开一个很简单的例子,还有很多相关的内容,在这里不做赘述,用到时可以通过:help folding来查看详情。
二.多文档的查看与编辑
很多时候我们需要同时打开多个文档进行编辑,Vim为这类操作提供了三种方式:
1.在不同窗口中打开多个文档
通常情况下在Vim中打开多个文档时每个文档会出现在一个单独的窗口中。可以通过命令:b n在不同文档窗口间进行切换,其中n表示你想切换到的第几个打开的文档,如当前的活动窗口是第三个打开的文档,如果我想切换到第一个打开的文档只需执 行:b 1即可。如果你还记得的话,上一节中提到了Vim将编辑的文档会读取到缓存中,事实上b代表的就是buffer,所以这个命令可以解读为buffer number 1。可以通过命令:buffers或:ls来查看当前打开了多少个buffers。下面举个例子来直观的说明一下:
2.在同一窗口中打开多个文档
如果你想在同一窗口中打开多个文档,只需在当前打开的窗口中执行命令:new即可,当前的窗口就会一分为二,然后在新的子窗口中打开相关文件即 可。在不同子窗口间切换只需按ctrl-w < h,j,k,l>或连续按ctrl-w两次。在一个窗口中打开多个文件的一种特殊情况是将一个文档在两个子窗口中呈现,分为两种方式:在 两个水平子窗口:sp,在两个竖直子窗口:vsp。其中sp代表split.执行:q命令关掉其中的某个子窗口。
3.在不同Tab中打开多个文档
这个特性是我很喜欢的一个特性,因为浏览器已是我生活中不可或缺的东西,总是要在浏览器中打开多个Tab(ctrl/cmd-t)。在Vim中 命令 :tabnew就可以打开一个新Tab,然后就可以在这个Tab中打开并编辑文档了。通过gt命令可以在不同的Tab间切换。关掉一个Tab可以使 用:tabc或:q命令。还有一个命令要提一下就是:tabmove,该命令将Tab移动到指定的位置。
参考文献
1.http://www.swaroopch.com/notes/Vim
之所以说Vim是一款强大的文本编辑软件我觉得很大程度上是因为Vim支持以插件(plugin)的形式进行功能扩展。很多Vim爱好者自己写插件来实现需要的功能,定制自己专属的Vim。Vim支持以下几种类型的插件:下面介绍一些常用的vimrc的设置命令。
set nocompatible " explictly get out of vi-compatible mode set background = dark " we plan to use a dark background syntax on " syntax highlighting on set number " turn on line numbers set ruler " always show current position along the bottom set incsearch " do highlight as you type you search phrase set ignorecase " case insensitive by default set smartcase " if there are caps, go case-sensitive colorscheme macvim " the color scheme I am using now
这里仅列出一些对于Vim初学者最常用的设置命令。还有很多你想象不到的Vim设置命令,我相信你可以在网上找到它们。在这里推荐两个模板,从 中找到你喜欢的用来定制专属于你自己的Vim吧:http://www.vi-improved.org/vimrc.php和http: //amix.dk/vim/vimrc.html。
最后做一下预告:在下期内容中我想介绍如何利用本节中介绍的各种插件打造一个Python IDE。
参考文献:
1.http://www.swaroopch.com/notes/Vim
2.http://www.vi-improved.org/vimrc.php
3.http://amix.dk/vim/vimrc.html
在Vim初探(四)中介绍了Vim的插件技术,本节将利用这些技术打造一个Python IDE。
1.文法高亮
为了能在Vim中支持Python文法需要用到插件python.vim,该插件默认位于<Vim安装目录>/<$VIMRUNTIME>/syntax/下,如果你在该路径下没有找到这个插件,需要到python.vim : Enhanced version of the python syntax highlighting script下载。然后为了能让Vim识别Python文法需要在vimrc中添加:
set filetype = python au BufNewFile,BufRead * .py, * .pyw setf python
2.缩进
在vimrc中添加如下缩进相关的代码:
set autoindent " same level indent set smartindent " next level indent set expandtab set tabstop = 4 set shiftwidth = 4 set softtabstop = 4
3.项目视图
像Visual Studio或Eclipse之类的IDE都会提供项目视图(位于左侧或右侧),程序员利用该视图在文件间或类间跳转。利用Ctags和插件Tasklist可以在vim中实现此功能。
. / configure && sudo make install
let Tlist_Ctags_Cmd = ' /usr/local/bin/ctags '
4.MiniBufExplorer
在Visual Studio或Eclipse中你打开的缓存会以tab的形式列在窗口的顶端或底部,在Vim中插件MiniBufExplorer来实现此功能。下载 minibufexpl.vim并将其放在plugin目录下。接着在vimrc中添加如下命令:
let g:miniBufExplMapWindowNavVim = 1 let g:miniBufExplMapWindowNavArrows = 1 let g:miniBufExplMapCTabSwitchBufs = 1 let g:miniBufExplModSelTarget = 1
下图展示了MiniBufExplorer的使用效果:
5.Omnicompletion
Vim7中添加了对文法提示和自动完成的支持,对于python来说需下载pythoncomplete.vim并将其放在<Vim安装目录>/<$VIMRUNTIME>/autoload/目录下,接着在vimrc中添加如下命令:
filetype plugin on set ofu = syntaxcomplete # Complete autocmd FileType python set omnifunc = pythoncomplete # Complete autocmd FileType python runtime! autoload / pythoncomplete.vim
最后在编写代码时通过ctrl-x ctrl-o来打开文法提示上下文菜单,如下图所示:
参考文献
1.http://www.swaroopch.com/notes/Vim
2.http://blog.dispatched.ch/2009/05/24/vim-as-python-ide/
3.http://www.phacks.net/macvim-code-completion-syntax-highlighting-for-python-pyqt4-twisted-on-mac-osx-snow-leopard/
4.http://vim.wikia.com/wiki/Omni_completion