前面曾经简单的介绍过我现在使用的一些计算机工具,接下来我希望对于这些工具进行更加细致的介绍。这篇文章首先来介绍我目前使用频率最高的文本编辑器vim,也算是对于我所知道的vim的一个小小总结。
作为一个流行的文本编辑工具,关于vim使用的文章有很多,很多专门的书籍介绍它,还有其自带强大的文档。如果逐条的去查看它所有的特性,很可能会被其灵活而强大的功能所吸引。但是我觉得作为一个工具的使用者,并不一定需要掌握工具所提供的全部功能,重要的是找到其适合自己的特性。当然,作为一名资深装逼爱好者,我也能深深的体会到那些为了装逼炫耀而刻苦学习各种奇淫异巧的同胞的良苦用心,毕竟使用Emacs烧咖啡会让人(特别是女孩子)感觉很酷 ^_^
回归正题,本文虽然是在讲vim,但其实我是想通过他来总结一下日常工作中比较有用的文本编辑器的特性,只是通过vim把这些特性表现出来。
首先介绍其适合的人群,我介绍的这些特性并不一定适合于所有人。工作中,我主要用vim来编辑C/C++,Python,PHP程序以及Linux系统当中的一些配置文件,所以我介绍的这些特性更多的是与程序员有关。
作为一个编辑器,首先当然需要具有普通记事本一样的编辑功能。vim当然可以覆盖所有记事本可以完成的文本编辑功能,而且他的设计思路当中蕴涵着一条信念:键盘比鼠标更高效。所以,vim希望使用者永远不要把双手从字符键盘上移开。即使是方向键都会让你慢下来,因为你必须再次回到键盘主排来输入字符。
vim分为三种模式:插入,可视,命令。
进行文本编辑需要进入插入模式。我经常会用到如下几个命令进入插入模式:i,o,O,a,A。
其中i为在当前光标处进行插入,o为在光标的上一行插入,O为在光标的下一行插入,a为在光标之后插入,A为在光标之前插入。
我们一定要坚持使用尽可能少的时间处于插入模式,最佳的状态是在插入模式下仅做一件事情—输入文本。所以,我们要尽量在进入插入模式之前把光标调整到需要编辑的位置,上面介绍的几个进入插入模式的命令会帮助我们更加高效的编辑。
接下来说说如何控制光标的位置。下面的这些命令将可以替代鼠标,快速的确定光标的位置。
xw—向前移动x个单词,不输入x默认为一个单词,将符号和标点当符号处理。
xW—同上,但是不将符号和标点当符号处理。
xb—向后移动x个单词,不输入x默认为一个单词,将符号和标点当符号处理。
xB—同上,但不将符号和标点当符号处理。
0—移动光标到行首。
$–移动光标到行尾。
gg—移动光标到页首。
G—移动光标到页尾。
x+G—移动光标到第x行。
%–跳到配对的括号。
[[--跳转到代码块的开头。
gd—跳转到局部变量的定义处。
''—跳到光标上次停靠的位置。
x>--增加以下x行的缩进。
x<--减少以下x行的缩进。
fx—向右跳到本行字符x出(x可为任意字符)
tx--同上,区别是跳到x前
Fx—向左跳到本行字符x处
Tx—同上,区别是跳到x后
ctrl+U 上翻页
ctrl+D 下翻页
ZZ—保存并退出vim
ctrl+z--强制退出(实际上这个快捷键是linux中强制进程挂起,适用于任何进程)
)--移动光标到下一个句子
(--移动光标到上一个句子
H—移动到屏幕上面
M—移动到屏幕中间
L—移动到屏幕下面
*--读取光标处的字符串并且移动光标到它再次出现的位置
#--与上面类似,但是方向相反
对了,还有更重要的是使用hjkl作为调整光标位置的方向键,不去使用箭头。上面的这些命令组合使用,可以完全代替鼠标的定位功能,而且如果熟练掌握效率高于鼠标。
除了定位光标,鼠标的另外一个特性就是选中文本。要代替鼠标的这个功能,我们需要切换到vim的可视模式下(在命令模式下按v)。这时就可以通过各种移动光标的方式来选中文本了,例如按w就是向前选中一个单词,按)就是向前选中一个句子。
之后,我们还需要之道如何删除、复制、粘帖文本。
vim当中,d代表删除,它可以和很多命令一起使用。如:
dd—删除当前行
dw—向前删除一个单词
db—向后删除一个单词
d$--光标之后该行的剩余部分
使用d命令删除之后,所删除的文本将自动保存在寄存器当中,之后使用p就可以重新粘帖刚刚删除的文本。在可视模式下,选中文本之后,按d命令可以删除选中的文本。
y为复制命令,它同样可以与很多命令一同使用,这一点与d差不多。如:
yy—复制当前行
yw—向前复制一个单词
yb—向后复制一个单词
其它的一些编辑中所必要的命令有:
U—undo
ctrl+R—redo
/x—查找文档中的x,相当于记事本中的ctrl+f
s/old/new/g—替换old为new,如果没有g则表示只替换一个,若每次替换都需要向用户询问,则用gc。
n1,n2 s/p1/p2/g—将第n1到第n2行中所有的p1用p2替代。
vs filename—在同一个窗口中打开另外一个文件,这样可以在同一个终端下同时查看两个或多个文件。
ctrl+w+w—使用vs命令打开新文本后,用此命令来进行切换
熟练使用上面的这些命令已经可以非常方便的进行文本编辑了,其编辑效率将超过普通记事本。但是,仅仅把vim但做一个普通的记事本确实有点委屈他了,他拥有非常丰富的插件,根据自己不同的需求,我们可以定制适合自己的更加高效的编辑器。网上有很多介绍vim各种插件的文章,这里我简单的介绍下我自己常用的插件。
语法着色是程序员编写代码时非常需要的一种功能,是任何一款IDE所必备的特性。我喜欢在vim当中使用各种妖艳的语法着色,所以配置文件~/.vimrc当中需要加入如下两句:
syntax enable
colorscheme zellner
这两句是说开启语法着色,并且采用zellner着色方案,当然你可以配置属于自己的语法着色方案。
这里顺便再插一句,vim也带有自动的语法检查功能,例如要实现对于php语法的检查,可以加上:
map <F5> :!/usr/bin/php5 -l %<CR>
这样按下F5,vim就可以自动的帮助检测你的php代码当中是否存在语法错误了。
在编辑任何程序的时候,我们一般都会需要查看或者直接跳转到某些函数的定义处。所以我们需要一个函数列表浏览器。同时,我们可能会打开工程中其它的源文件进行编辑,这就需要一个文件列表浏览器。在vim当中,我们可以使用TagList以及WinManager来实现对于上面两个功能。
下载这两个插件,并将其放在~/.vim/plugin文件夹当中,同时在~/.vimrc当中加入如下代码:
"add TagList
let Tlist_Show_One_File=1
let Tlist_OnlyWindow=1
let Tlist_Use_Right_Window=0
let Tlist_Sort_Type='name'
let Tlist_Exit_OnlyWindow=1
let Tlist_Show_Menu=1
let Tlist_Max_Submenu_Items=10
let Tlist_Max_Tag_length=20
let Tlist_Use_SingleClick=0
let Tlist_Auto_Open=0
let Tlist_Close_On_Select=0
let Tlist_File_Fold_Auto_Close=1
let Tlist_GainFocus_On_ToggleOpen=0
let Tlist_Process_File_Always=1
let Tlist_WinHeight=10
let Tlist_WinWidth=18
let Tlist_Use_Horiz_Window=0
filetype plugin on
let g:winManagerWindowLayout='FileExplorer|TagList'
nmap wm :WMToggle<cr>
使用起来其实很简单,用vim打开任意源代码,然后按wm,屏幕就会出现如下图的侧边栏。
如果想通过ctrl+hjkl的方式在不同的窗口之间进行切换,而不需要多次按ctrl+w+w进行依次切换,需要在~/.vimrc中加入如下代码:
map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l
如果你在函数列表当中,只需要将光标停留在函数列表的某函数上,然后按回车就可以自动跳转到该函数的定义处。下面是文件浏览器当中一些常见的命令:
- 返回上一级目录
d 创建目录
D 删除目录或文件
i 切换显示方式
R 文件或目录的重命名
s 选择排序方式
这个功能是让我怀念Visual Stdio的最大理由。因为VS强大的智能代码补全功能不仅可以快速的响应,而且还提供了非常准确的智能补全。相比起来,vim当中的智能补全要差得多了,虽然二者相应的速度相仿,但从补全排序的准确性的角度而言,感觉VS要远远强于vim。有谁能为vim开发一个更加强大的智能补全插件吗?
第一个要介绍的补全插件名叫SuperTab。下载该插件,然后在~/.vimrc中加入如下代码:
let g:SuperTabRetainCompletionType=2
let g:SuperTabDefaultCompletionType="<C-X><C-O>"
这样,在代码编辑的过程中按tab,vim就会自动进行代码补全。
另外一种方式叫new-omni-completion,你需要在~/.vimrc中加入如下两句:
filetype plugin indent on
set completeopt=longest,menu
这个功能需要ctags(这个东东很有用,我随后介绍)的辅助,设置好后,进入插入模式,在一个函数写到一半时按Ctrl+X Ctrl+O,就会弹出相应的补全列表。
一些有用的命令:
ctrl+p 向前切换
ctrl+n 向后切换
ctrl+e 退出下拉窗口,并退回到原来录入的文字
ctrl+y 退出下拉窗口,并接受当前选项
如果编辑python代码还可以使用pydict插件,不过我个人感觉这个插件远远不如supertab好用,后来果断的抛弃掉了,所以在这里就不介绍了,有兴趣的童鞋可以google一下。
很多时候,我们需要频繁的在两个文件之间切换进行编辑,例如在写C++程序的时候,我们需要在.h与.cpp之间进行切换。这样插件MiniBufExplorer就显得很有用了。
当你编辑一个文件的时候,这个插件派不上用场,当你在同一次vim对话中编辑第二个文件时,MiniBufExplorer就起作用了。如下图所示,可以通过左右箭头来切换并选择要编辑的文件。
需要在~/.vimrc中加入代码
set g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
先来看看ctags,下面这段话是其官网上的介绍:
Ctags generates an index (or tag) file of language objects found in source files that allows these items to be quickly and easily located by a text editor or other utility. A tag signifies a language object for which an index entry is available (or, alternatively, the index entry created for that object).
其实ctags就是为文件当中出现的单词建立的一种类似于索引文件一样的程序。这个程序对于我们阅读代码是非常有帮助的。在读一段程序的过程中,我们往往需要之道一个函数的定义,传统的IDE通常会提供给我们跳转到函数定义的方式,我们使用ctags可以实现同样的作用。
安装好ctags之后,在源代码文件的顶级目录下运行ctags -R,然后打开vim,键入命令:
:set tag=/your project directory/tags
之后将光标放在某个被调用的函数上,按ctrl+],光标就会自动跳转到该函数的定义处。查看完后,再按ctrl+t,即可退回到刚刚编辑的位置。
此外,你还可能在调用某些函数的时候忘记这个函数的参数列表,这样就不得不跳到这个函数的定义处然后再跳回来,很麻烦。Ctags可以帮助我们在调用函数的时候显示函数的声明信息。
首先需要安装一个插件,名叫echofunc。然后在源代码的顶级目录下运行命令ctags -R –fields=+lS,打开vim,键入命令:
:set tag=/your project directory/tags
然后当你编辑完函数名,按(后,下面就会自动显示该函数的声明信息。如果这个函数存在重载,可以使用“Alt+-”和”Alt+=”来进行上下选择。
首先同样是先介绍下cscope的features,官网上是这样说的:
你可以在代码中检索:
所有引用某符号的位置
全局定义
所有调用某函数的函数
某函数被调用的所有函数
文本字符串
正则表达
一个文件
一个文件在目录中的位置
哪些文件包含了这个头文件
安装好cscope之后,在源代码的顶级目录下运行命令cscope -Rbq。进入vim后,将刚刚生成的cscope文件导入vim::cs add /your_project_directory/cscope.out /your_project_directory。cscope的具体用法如下:cs find c|d|e|f|g|i|s|t name
s–查找本 C 符号(可以跳过注释)
g—查找本定义
d—查找本函数定义的函数
c—查找调用本函数的函数
t—查找本字符串
e–查找本 egrep 模式
f—查找本文件
i—查找包含本文件的文件
cs reset—重新初始化所有连接
Oh, my gad!居然已经写了这么多了,可累死我了。这些基本上就是我最常用到的vim了,我觉得如果能够熟练掌握这些技巧,使用vim编辑代码将会获得很高的效率。当然,你需要花一点时间去熟悉这些使用方式,而且一开始速度可能会有点慢^_^。
好吧,先写到这里,如果你看到我的文字有什么好的建议请留言回复我,这篇文字我会不断的更新,打造更加适合自己的强大编辑利器!