感谢支持
我们一直在努力

Vim实战手册

1VIM是什么?




    VIMVi IMproved,是编辑器Vi的一个加强版,一个极其强大并符合SESoftware Engineer,软件工程师)习惯的编辑器。如果你是一名职业的SE,那么一定在寻找一款出色的能够自由定制、满足灵活编辑功能的编辑器。那么答案,就是VIM或者Emacs。而这一套连续的博文,就为您介绍VIM编辑器。至于另一款强大的编辑器Emacs,我们会在今后的一个系列博文中看到。






2、配置文件在哪?




    如果你使用的是Windows,那么配置文件是你的Vim安装目录下的vimrc文件。


    如果你使用的是Linux系统,并且是使用apt-get来默认安装的,那么你的配置文件是/usr/share/vim/vimrc


    如果你使用的是Mac OS X,那么配置文件是/usr/share/vim/vimrc文件。






3VIMRC中的RC是什么意思?




   为什么把这么个没有意义的问题也列出来?原因很简单,就是我在接触VIM之初第二个想问的问题就是这个(第一个就是上面的“1”)。一般在运行某个软件、环境或工具之初,要初始执行的一些命令,称为Run Commands,即RC。根据Wikipedia.org的记载,RC缩写的用法源自MIT的相容分时操作系统(Compatible Time-Sharing SystemCTSS[参考1]。所以以后如果你看到了SystemRC或者ScreenRC,也就知其缘由了。






4、三种基本模式




    在《大家来学Vim》中提到Vim6+5种模式,但除了细分程度不同外,实际上常用的只有3种模式:Normal ModeInsert ModeCommand-line Mode


    Normal Mode进入Insert Mode,可以按iIaAoOrR即可。其中iI表示插入(Insert),rR表示替换(replace)。


    Insert Mode进入Normal Mode,只需要按ESC键即可。


    Normal Mode进入Command-line Mode,可以按“:”“/”“?”。其中“:”表示输入Vim命令,“/”表示后面输入要向下搜索的字符串,“?”表示后面输入要向上搜索字符串。


    Command-line Mode进入Normal Mode,只需要按ESC键即可了。


   你可以把Normal Mode理解为常态,进入其他任何一种模式,需要某种特殊方式,而从其他特殊模式回到Normal Mode,就按ESC键即可。




5VIM中那些最最常用的配置




   当你尝试去google一些其他人的vimrc配置时,你一定会找到一篇叫做《The ultimate Vim configuration》的文章,不过它的作者,Amix后来在他的博客上提到[参考2],这份在google搜索vimrc会排在前十的Vim配置文件,如今已经过时了,所以他提供了一些更新信息。




1)颜色设置


[plain] view plaincopyprint?


  1. syntax on       “开启代码高亮  
  2. syntax off      “关闭代码高亮  
  3. syntax enable   “开启代码高亮  

2)搜索设置



[plain]


  1. set hlsearch    “开启搜索高亮  
  2. set nohlsearch  “关闭搜索高亮  
  3. set incsearch   “输入搜索字符串的同时进行搜索  
  4. set ignorecase  “搜索时忽略大小写  

3)用户界面



[plain]


  1. set showmode        “开启模式显示  
  2. set ruler           “开启光标位置提示  
  3. set number      “显示行号  
  4. set nonu            “不显示行号  
  5. set cursorline      “强调光标所在行  
  6. set cmdheight=1 “命令部分高度为1  

4)编辑辅助配置



[plain]


  1. set autoindent      “自动缩进  
  2. set noautoindent    “不自动缩进  
  3. set smartindent     “智能缩进  
  4. set autoread        “当文件在外部被改变时,Vim自动更新载入  
  5. set showmatch       “显示匹配的括号  

i小写字母i,在光标位置插入


a小写字母a,在光标的下一个位置插入




I大写字母I,在光标所在行的第一个非空格处插入


A大写字母A,在光标所在行的最后一个字符处插入




o小写字母o,在光标所在行的下一行处插入新行


O大写字母O,在光标所在行的上一行处插入新航




r小写字母r,替换光标所在处的字符一次


R大写字母R,持续替换光标所在处的字符,直到按下ESC




2Normal Mode -> Command-line Mode




:w保存文件


:w!强制保存文件(前提是用户有修改文件访问权限的权限)




:q退出缓冲区


:q!强制退出缓冲区而不保存




:wq保存文件并退出缓冲区


:wq!强制保存文件并退出缓冲区(前提是用户有修改文件访问权限的权限)




:w <filename>另存为名为filename文件


:n1,n2 w <filename>n1行到n2行的数据另存为名为filename文件




😡如果文件有更改,则保存后退出。否则直接退出。




3Insert Mode -> Normal Mode


按下ESC




4Command-line -> Normal Mode


按下ESC

1、光标字符操作




j向下


k向上


h向左


l向右




$光标移动到行尾(End),注意要按Shift


0光标移动到行首(Home


^光标移动到行首第一个非空白字符(Home),注意要按Shift




2、光标词操作


w光标移动到后一词的词首


W光标移动到后一词的词首且忽略标点符号


e光标移动到后一词的词尾


E光标移动到后一词的词尾且忽略标点符号


b光标移动到前一词的词首


B光标移动到前一词的词首且忽略标点符号




3、光标句操作


)光标移动到后一句的句首


(光标移动到前一句的句首


%配合“(”“)”使用,寻找相匹配的另一半




4、光标行操作




G光标移动到文档的最后一行的第一个非空白字符


nG光标移动到文档的第n行,相当于“:n”


gg光标移动到文档的第1行的第一个非空白字符,相当于“1G”,也相当于“:1”


<N>光标向下移动N




5、光标段操作


}光标移动到下一段的段首


{光标移动到上一段的段首


%配合“(”“)”使用,寻找相匹配的另一半




6、光标页操作




Ctrl+f向下翻页(Pagedown


Ctrl+b向上翻页(Pageup




Ctrl+d向下翻半页


Ctrl+u向上翻半页




H光标移动到目前显示页的第一行


M光标移动到目前显示页的中间行


L光标移动到目前显示页的最后一行




7、光标自由操作


Ctrl+o回到光标的上一位置

1、删除操作(delete




dd删除光标所在行


ndd删除从光标所在行开始,向下的n




d1G删除从光标所在行开始,到第一行的所有行


dG删除从光标所在行开始,到最后一行的所有行




d$删除从光标所在位置,到行尾的所有字符


d0删除从光标所在位置,到行首的所有字符




2、复制操作(yank




yy复制光标所在行


nyy复制从光标所在行开始,向下的n




y1G复制从光标所在行开始,到第一行的所有行


yG复制从光标所在行开始,到最后一行的所有行




y$复制从光标所在位置,到行尾的所有字符


y0复制从光标所在位置,到行首的所有字符




3、粘贴操作(paste




p小写字母p,粘贴剪贴板中的数据,从光标所在行的下一行开始


P大写字母P,粘贴剪贴板中的数据,从光标所在行的上一行开始




4、撤销与重做操作(undoredo




uUndo)撤销上一个操作


Ctrl+rRedo)重做上一个操作




5、重复操作




.重复上一操作




6、替换操作(replace


r替换光标所在处字符


R进入替换模式,直至按ESC退出


cc替换光标所在行


cw替换光标所在的英文单词


~转换大小写




7、排版操作


:le<ft>光标所在行左对齐


:ri<ght>光标所在行右对齐


:ce<nter>光标所在行居中

1、多文件编辑模式


1argument list模式,就是在打开Vim编辑器时,携带多个文件路径参数。


2buffer list模式,就是在进入Vim编辑器后,打开多个缓冲区进行编辑。




2、单一缓冲区打开多个文件


:files显示目前打开了哪些文件


:n切换到下一个缓冲区内容


:N切换到上一个缓冲区内容


:2n切换到下下个缓冲区内容


:bn下一个缓冲区内容(buffer next


:bp上一个缓冲区内容(buffer previous




3、多个缓冲区打开多个文件


:sp [filename]打开一个新的缓冲区,如果有filename则内容为该文件,否则为当前文件




Ctrl+w n新建一个缓冲区


Ctrl+w q退出光标所在的缓冲区




Ctrl+w j光标移动到下一缓冲区


Ctrl+w k光标移动到上一缓冲区


Ctrl+w l光标移动到右一缓冲区


Ctrl+w h光标移动到左一缓冲区




Ctrl+w v左右切割窗口新建缓冲区


Ctrl+w s上下切割窗口新建缓冲区




Ctrl+w o使光标所在缓冲区最大化,其他缓冲区隐藏

1、搜索字符串




/string向下搜索字符串“string”


?string向上搜索字符串“string”




2、重复上次搜索




n根据上次搜索条件找到下一个匹配的字符串


N根据上次搜索条件找到上一个匹配的字符串




3、搜索单词




*向下搜索光标所在处的单词(完全匹配)


#向上搜索光标所在处的单词(完全匹配)


g*向下搜索光标所在处的单词(部分匹配)


g#向上搜索光标所在处的单词(部分匹配)




4、标记书签(mark




maa为小写字母,为光标所在处设定文档书签a


mAA为大写字母,为光标所在处设定全局书签A




5、使用书签(mark




`a到文档书签a处,Tab键上方


‘a到文档书签a所在行行首处,Enter键左边




`A到全局书签A处,Tab键上方


‘A到全局书签A所在行行首处,Enter键左边




`n如果n=0,缓冲区将打开上一次的文档,且光标在上次编辑最后的位置,1-9以此类推


‘n如果n=0,缓冲区将打开上一次的文档,且光标在上次编辑最后的位置所在行的行首,1-9以此类推




6、查看书签列表




:marks查看当前所有书签

1、加密你的文本文件


当你用Vim打开或新建一个文件时,如果加上-x参数,即:


vim -x filename


那么Vim会提示你:


Enter entryption key:


当你输入了密码后,Vim会提示你重复输入以确认:


Enter same key again:


你在设置密码的时候,是以*来显示的,非明文。当下次有人(包括你自己)打开该文件的时候,Vim就会提示:


Need encryption key for “main.cpp”


Enter encryption key:


这时你只要输入你之前所设置的密码就可以了。如果你输入的密码是错误的,Vim并不会提示你密码错误,而是显示一堆无意义的垃圾代码。


2、解除加密与重设密码


打开你已经加密的文件,然后输入:


:set key= 


这样,你的密码就被设置为空了,今后进入就不再需要输入密码了。而如果你向重设密码的话,你可以输入:


:X


注意是个大写字母X。这时Vim会提示你,只要反复输入两次新的密码就可以了:


Enter entryption key: *****


Enter sanme key again: *****


3、加密引起的问题


(1)如果密码输入错误,Vim不会拒绝访问者编辑文件。在这种显示乱码的情况下编辑文件并保存,整个文件就会变得混乱不堪,无法辨识。今后即使使用正确的密码打开文件,也看不到正确的文档了。


(2)如果对一个需要编译的源代码文件进行了加密,则无法通过编译器的语法检查。


(3)交换文件是无法加密的。这样引起什么问题?问题就是如果其他用户想办法读取到了你的交换文件,就可以绕过解密环节,你的加密也就无意义了。解决的办法就是,不使用交换文件。方法有三个,一是修改你的vimrc文件(Vim配置文件):


set noswapfile


二是在用vim打开文件之初就输入命令:


vim -x -n filename


(注意-x是加密参数,与我们所说的swap没有关系,不要搞混)


三是在进入vim编辑该文件后,输入:


:setlocal noswapfile


不过不使用交换文件的坏处就是,你可能会面临数据丢失而无法找回的悲剧。所以又想用加密,又想不丢失文件的朋友们,就勤按“:w”吧。

就让我姑且称它为VIM-IDE吧,这样听起来好像和EclipseVisual StudioXcode之流的IDE有一拼,更好玩一点,你可以叫它Vimide,是不是更像🙂



   言归正传,把你的Vim打造成IDE,首先要熟悉一些基本的Vim使用。




1ctags的安装


   首先下载ctags插件,地址为[参考1](目前最新版本为5.8


    然后使用如下命令安装:


[plain]


  1. tar zxvf ctags-5.8.tar.gz  
  2. cd ctags-5.8  
  3. ./configure  
  4. make  
  5. sudo make install  

    一般来说以默认方式安装完ctags后,ctags文件是/usr/local/bin/ctags,如果你的系统里还默认安装了ctags或者你装其他软件的时候给戴上了ctags,那么你就要记住你自己装的这个ctags的路径,一会写到vimrc中,就可以让Vim不会蒙圈了。




2、简单地体验下ctags


1)准备工作:创建几个源文件


    创建如下三个文件,假设你在/home/michael/testspace/test_ctags目录下创建。


[cpp]


  1. //main.cpp   
  2. #include “obj.h”   
  3. int main(void)  
  4. {  
  5.     obj 0(2);  
  6.     o.out();  
  7.     return 0;  
  8. }  


 

[cpp]


  1. //obj.h   
  2. #ifndef _OBJ_H_   
  3. #define _OBJ_H_   
  4. class obj  
  5. {  
  6. public:  
  7.     obj(int x);  
  8.     void out();  
  9. private:  
  10.     int m;  
  11. };  

[cpp]


  1. //obj.cpp   
  2. #include <iostream>   
  3. #incude “obj.h”   
  4. obj::obj(int x)  
  5. {  
  6.     m = x;  
  7. }  
  8.   
  9. void obj::out()  
  10. {  
  11.     std::cout << “member = “ << m << std::endl;  
  12. }  




2)生成ctags


    创建完这三个文件后,输入如下命令:


[plain]


  1. cd /home/michael/testspace/test_ctags  
  2. ctags *  

3)体验ctags


[plain]


  1. cd /home/michael/testspace/test_ctags  
  2. vim main.cpp  

    然后输入如下命令:


[plain]


  1. :set tags=/home/michael/testspace/test_ctags/tags  

    再将光标移动到obj o(2);这一行,且光标位于obj上,按“Ctrl+]”,你发现了什么?哈哈,是不是缓冲区已经切换到了obj.c文件的obj::obj(int x)定义处?帅气吧!


   那怎么再切换回去呢?按“Ctrl+T”键即可。所以这里的记忆成本就是“Ctrl+]”���Ctrl+T”两个喽!




3、安装taglist


1)安装taglist


    与其说是安装,不如说是移动。从站点下载tag list[参考2],然后解压并移动到你的vim目录下。


[plain]


  1. unzip taglist_45.zip  
  2. cp taglist_45/doc/taglist.txt /usr/share/vim/vim73/doc/  
  3. cp taglist_45/doc/taglist.vim /usr/share/vim/vim73/plugin  

    然后进入vim,输入命令查看taglist帮助文件,来测试下你是否安装taglist成功了。


[plain]


  1. :help taglist  

2)可能出现的问题及解决方案


[plain]


  1. Taglist: Failed to generate tags for /your/path/to/file  
  2. Press ENTER or type command to continue  
  3. /usr/bin/ctags: illegal option — -^@usage: crags [-BFadtuwvx] [-f tagsfile] [-f tagsfile] file …^@  
  4. Press ENTER or type command to continue  
    官方对其给出了解释,可参见下面的[参考3]这说明你使用了GNUctags或者Unix ctagstaglist并不支持这两类ctags。我在安装时一开始使用的是Unixctags,所以遇到了这个问题。只要再安装一下[参考1]Ctags就可以了。


    这时候你的VIM应该配置成下面这个样子了吧?






4、还要做什么呢?


    到目前为止,我们的Vimide还没有配置完。因为我本人从来不喜欢读较长的博文,真的是耐心不足呀(惭愧 – –)所以,我会在下一篇博文中继续介绍 : )




5、后记


    当我刚刚写完这篇文章的时候,我发现已经有了一个叫做Vimide的东东了??这是链接[参考4]: )




参考


[1] 下载Ctagshttp://ctags.sourceforge.net


[2] 下载TagListhttp://sourceforge.net/projects/vim-taglist/files/ 


[3] TagListFAQhttp://vim-taglist.sourceforge.net/faq.html


[4] Vimide Homepage, http://code.google.com/p/vimide/

经过《Vim实战手册 Vimide——打造你自己的IDE(A)http://www.linuxidc.com/Linux/2012-01/52538p8.htm》之后,我们都知道了如果使用Tags来提高生产力。这一篇文章将向大家介绍WinManager,可以让你的Vim看起来更像Vimide : )




1、下载WinManager插件




你暂时先不需要了解什么是WinManager,一会就一目了然了。相信经过上一篇博文的了解后,你的Vim应该配置成这个样子了:








不过现在仅仅是有tags可以用,要是能够像Visual Studio或者Eclipse中那样有一个File Explorer或者Package Manager之类的东东就好了。那么就引出了WinManager,首先下载该插件,下载地址是:winmanager.zip 。下载后解压,将其中的doc下的winmanager.txt文件放入vim/vim73中(由于版本号和系统的不同,名称可能略有不同,这里我使用的是Vim 7.3的Mac版本)的doc下,plugin中的winmanager.vim放到vim/vim73中的plugin中。




2、修改VimRC




加入如下两句:




1 let g:winManagerWindowLayout=‘FileExplorer|TagList’


2 nmap wm :WMToggle<cr>




其中第1行代码的作用,是设置窗口布局为FileExplorer和TagList上下排列。


第2行代码的作用,是将wm快捷键映射到:WMToggle<cr>,:WMToggle<cr>相当于开启WinManager的开关键。简单映射后可以更快地开关。




然后重新进入Vim,输入命令:




1 wm




我相信你一定看到了这样类似的布局:








更多详细用法你可以使用这个命令来查看:




1 :help winmanager






3、左上角的类似File Explorer的东东是什么?




你一定发现左下角还是TagList,而左上角貌似有点眼熟。是的,就是你用Vim打开某一目录时看到的。比如有一个名为test_dir的目录,在Shell下输入:




1 vim test_dir




则一定看到类似情景:








这其实是Vim内置的netrw.vim插件的功能,主要用来编辑目录。我们正是利用WinManager来管理布局,而那个类似File Explorer的东东就是netrw了。在netrw中可以做如下操作(并附上快捷键):




(1)光标移动:与文件编辑时的光标移动快捷键相同,可参考《Vim实战手册(3)常用光标移动操作》一文。




(2)展开目录:回车键,即<cr>。




(3)收起目录:也是回车键。




(4)创建目录:按d键,然后输入目录名后回车。




(5)删除目录:按D键删除光标所在的目录。




(6)切换显示方式:按i键。有平铺、树、列表、详细四种模式。




(7)重命名目录:按R键。




(8)改变排序方式:按s键。




(9)到更高一层目录:按-号。




更多用法你可以使用这条命令来查看:




1 :help netrw


 经过《Vim实战手册(8Vimide——打造你自己的IDE(A)见 http://www.linuxidc.com/Linux/2012-01/52538p8.htm 》和《Vim实战手册(9Vimide——打造你自己的IDE(B)》见 http://www.linuxidc.com/Linux/2012-01/52538p9.htm 两篇博文,你可能还不满足。因为当我们用Visual StudioEclipseXcode等编辑器时,有一些非常强大的功能,比如:

   1)查看某一函数都在哪些函数中被调用过;


   2)查看某一函数都调用了哪些函数;


   3)查看某一文件被哪些文件包含;


   4)查看某一变量都在哪里被引用过;


    ……






1Linux安装CscopeMac用户可以直接跳过)




    首先要下载地址:http://sourceforge.net/projects/cscope/files/


   如果你是在Linux平台上安装Cscope,那么可以直接:


   1./configure


   2make


   3sudo make install






2Mac安装CscopeLinux用户不需要关注)




   如果你使用的是Mac平台,需要先编辑src/constants.h,找到这段代码:


   1#if (BSD || V9) && !__NetBSD__ && !__FreeBSD__




    修改为:


   1#if (BSD || V9) && !__NetBSD__ && !__FreeBSD__ && !__APPLE__




   然后再编译:


   1./configure


   2make


   3sudo make install






3、在VimRC中配置Cscope




   1 setcscopequickfix=s-,c-,d-,i-,t-,e-






4、生成cscope文件




   在你的工程根目录下,输入以下命令:


   1cscope-bqR




   则会自动生成如下三个文件:








5、在Vim中导入Cscope文件




    cscope文件都已经被生成了,但是还没有与你的工程关联起来。这时候你可以进入Vim,输入命令:








   其中cs表示scopeadd是将scope源文件导入到工程中,第一个参数是scopeout文件,第二个参数是工程的根目录。如果你经常编辑该工程,你可以将这个命令写入到VimRC




6、体验Cscope




   尝试查询conn_set_state函数被调用过多少次以及分别在哪里调用。输入命令:




    :cs find c conn_set_state




   结果为:








    如果结果很多,你可以使用命令“cw”来打开QuickFix窗口,来切换搜索结果。




7Cscope的快捷键




(1)索指定符号


    cs find s <symbol>




(2)搜索定义


    cs find g <var_name|func_name>




(3)搜索函数所调用的函数


    cs find d <functions_invoked>




(4)搜索调用此函数的函数


    cs find c <functions_invoking>




(5)搜索指定字符串


    cs find t <text>




(6)搜索egrip指定的模式


    cs find e <egrip>




(7)搜索文件


    cs find f <filename>




(8)搜索包含本文件的文件


    cs find i <including_files>




8、映射Cscope快捷键




    你可以自定义Cscope这些快捷键,方法可以类似参照我们在使用WinManager时自定义的“wm”。

赞(0) 打赏
转载请注明出处:服务器评测 » Vim实战手册
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏