vim+ctags+cscope+Taglist+NERDTree打造成SourceInsight

参考:Vim神器 | vim+ctags+cscope+Taglist+Nerdtree打造成sourceinsight
   vim+ctags+cscope+taglist+nerdtree
   将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete(有图有真相)

听说vim很强大?是的,最近笔者需要在Linux下编写一些C代码和查看一些C源码,但是默认的vim并不支持函数之间的跳转、查看函数的定义等等,所以笔者就将vim打造成了一个IDE(可以勉强称得上吧)。首先我们来看一下搭建完成之后的样子:
在这里插入图片描述

再来看一段简单的操作:
在这里插入图片描述
那么下面我们通过ctags+cscope+Taglist+Nerdtree将vi/vim打造成一个IDE。

0. 环境描述

Linux版本:ubuntu 16.04_64 LTS

vi版本:vi/vim v7.4

所用用户:root

1. 安装vim和vim基本插件

1)首先安装好vim和vim的基本插件:

这些使用apt-get安装即可:

sudo apt-get install vim vim-scripts vim-doc

其中vim-scripts是vim的一些基本插件,包括语法高亮的支持、缩进等等。

扫描二维码关注公众号,回复: 12929823 查看本文章

vim中文帮助文档tar包下载地址:http://sourceforge.net/projects/vimcdoc/files/vimcdoc/

解压后其中有个doc文件夹,将其中的内容全部复制到~/.vim/doc,或者vim安装目录下的doc目录中,此时vim中的help信息已经是中文的了。

网页版中文帮助文档网址http://vimcdoc.sourceforge.net/doc/help.html,首页就是vim帮助文档的目录,阅读起来更方便有效、更有针对性!

2)vim配置文件

vim强大的功能,其来源基本上就两个地方:Vim插件以及Vim配置文件。

vim本身的系统配置文件夹是在/usr/share/vim//etc/vim/两个文件夹下。一般情况下,我们不会去改变这两个文件夹下的配置文件,而是在用户文件夹/home/user(其中,user为用户名,我的用户名是lingd)下建立自己的配置文件。进入用户文件夹(/home/user/)之后,用gedit新建一个名叫.vimrc的文件:

cd ~
gedit .vimrc

注:使用gedit主要是为了方便大段大段的文字粘贴!

然后把下面的文字拷贝进这个文件之后保存:

" This line should not be removed as it ensures that various options are
" properly set to work with the Vim-related packages available in Debian.
debian.vim

" Uncomment the next line to make Vim more Vi-compatible
" NOTE: debian.vim sets 'nocompatible'. Setting 'compatible' changes numerous
" options, so any other options should be set AFTER setting 'compatible'.
set nocompatible

" Vim5 and later versions support syntax highlighting. Uncommenting the
" following enables syntax highlighting by default.
if has("syntax")
syntax on " 语法高亮
endif
colorscheme ron " elflord ron peachpuff default 设置配色方案,vim自带的配色方案保存在/usr/share/vim/vim72/colors目录下

" detect file type
filetype on
filetype plugin on

" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
set background=dark

" Uncomment the following to have Vim jump to the last position when
" reopening a file
if has("autocmd")
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
"have Vim load indentation rules and plugins according to the detected filetype
filetype plugin indent on
endif

" The following are commented out as they cause vim to behave a lot
" differently from regular Vi. They are highly recommended though.

"set ignorecase " 搜索模式里忽略大小写
"set smartcase " 如果搜索模式包含大写字符,不使用 'ignorecase' 选项。只有在输入搜索模式并且打开 'ignorecase' 选项时才会使用。
set autowrite " 自动把内容写回文件: 如果文件被修改过,在每个 :next、:rewind、:last、:first、:previous、:stop、:suspend、:tag、:!、:make、CTRL-] 和 CTRL-^命令时进行;用 :buffer、CTRL-O、CTRL-I、'{
    
    A-Z0-9} 或 `{
    
    A-Z0-9} 命令转到别的文件时亦然。
set autoindent " 设置自动对齐(缩进):即每行的缩进值与上一行相等;使用 noautoindent 取消设置
"set smartindent " 智能对齐方式
set tabstop=4 " 设置制表符(tab键)的宽度
set softtabstop=4 " 设置软制表符的宽度
set shiftwidth=4 " (自动) 缩进使用的4个空格
set cindent " 使用 C/C++ 语言的自动缩进方式
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s "设置C/C++语言的具体缩进方式
"set backspace=2 " 设置退格键可用
set showmatch " 设置匹配模式,显示匹配的括号
set linebreak " 整词换行
set whichwrap=b,s,<,>,[,] " 光标从行首和行末时可以跳到另一行去
"set hidden " Hide buffers when they are abandoned
set mouse=a " Enable mouse usage (all modes) "使用鼠标
set number " Enable line number "显示行号
"set previewwindow " 标识预览窗口
set history=50 " set command history to 50 "历史记录50条


"--状态行设置--
set laststatus=2 " 总显示最后一个窗口的状态行;设为1则窗口数多于一个的时候显示最后一个窗口的状态行;0不显示最后一个窗口的状态行
set ruler " 标尺,用于显示光标位置的行号和列号,逗号分隔。每个窗口都有自己的标尺。如果窗口有状态行,标尺在那里显示。否则,它显示在屏幕的最后一行上。

"--命令行设置--
set showcmd " 命令行显示输入的命令
set showmode " 命令行显示vim当前模式

"--find setting--
set incsearch " 输入字符串就显示匹配点
set hlsearch

注:配置文件中,以单个双引号开头的文字为注释。

保存文件之后,启动vim。此时,vim已经是这种效果了(语法高亮挺漂亮的–这个是由vim-scripts中的插件支持的)。

3)管理vim插件------vim-addons

通过vim-addons,我们可以管理vim插件。我们在sudo apt-get install vim vim-scripts vim-doc时,一般会自动安装上vim-addons。若未安装可通过sudo apt-get install vim-addon-manager手动安装。安装完成后,就可以用vim-addons管理vim插件了。

系统中已有的vim-scripts中包含的插件及其状态:
在这里插入图片描述

上面我们介绍了如何独立于系统配置文件之外,建立自己的vim配置文件。当我们自己下载安装vim插件的时候,也可以另外建立目录,放置我们自己的插件。这个目录一般为/home/user/.vim,另外还需要建立一个插件子目录,一个插件文档子目录,以上的可以进入/home/user目录下通过下面的命令执行:

mkdir .vim
cd .vim
mkdir plugin
mkdir doc

vim官方插件的安装,xxxx是要安装的插件名,以status中显示的名称为准。安装插件xxxx时使用以下命令(前提是在目录/home/user/.vim/下建立好了plugin和doc两个文件夹)

vim-addons install xxxx

关于vim-addons命令的详细用法,可以通过“man vim-addons”查看其帮助文档。

4)vim自动补全------OmniCppComplete

vim的自动补全功能可通过其插件OmniCppComplete实现。

① 安装OmniCppComplete:

vim-addons install omnicppcomplete

② 配置OmniCppComplete:

在vim配置文件/home/user/.vimrc中加入如下的配置:

"-- omnicppcomplete setting --
" 按下F3自动补全代码,注意该映射语句后不能有其他字符,包括tab;否则按下F3会自动补全一些乱码
imap <F3> <C-X><C-O>
" 按下F2根据头文件内关键字补全
imap <F2> <C-X><C-I>
set completeopt=menu,menuone " 关掉智能补全时的预览窗口
let OmniCpp_MayCompleteDot = 1 " autocomplete with .
let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)
let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files
let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window
let OmniCpp_GlobalScopeSearch=1 " enable the global scope search
let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members
"let OmniCpp_DefaultNamespaces=["std"]
let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column
let OmniCpp_ShowAccess=1

(前几行就是提供了C++中的./->/::等操作符的提示和自动完成)

OmniCppComplete是基于ctags数据库即tags文件实现的(基于ctags生成的索引信息来实现自动补全的),所以在ctags -R生成tags时还需要一些额外的选项,这样生成的tags文件才能与OmniCppComplete配合运作。使用下列命令生成tags文件,就可以与OmniCppComplete配合运作:

ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
  • –c+±kinds=+p : 为C++文件增加函数原型的标签
  • –fields=+iaS : 在标签文件中加入继承信息(i)、类成员的访问控制信息(a)、以及函数的指纹(S)
  • –extra=+q : 为标签增加类修饰符。注意,如果没有此选项,将不能对类成员补全

③ vim自动补全功能的测试

为了测试自动补全功能,我们先打开一个.c文件,如下图:
在这里插入图片描述

用vim打开前面的play_media_file.c文件,在43行中,输入eLI,然后按下Ctrl+X Ctrl+O,此时vim会弹出一个窗口,所有以eLI开头的tag都会出现在这个窗口中。

当自动补全下拉窗口弹出后,一些可用的快捷键:

快捷键 含义
Ctrl+P 向前切换成员
Ctrl+N 向后切换成员
Ctrl+E 表示退出下拉窗口, 并退回到原来录入的文字
Ctrl+Y 表示退出下拉窗口, 并接受当前选项
Ctrl+X Ctrl+L 整行补全
Ctrl+X Ctrl+N 根据当前文件里关键字补全
Ctrl+X Ctrl+K 根据字典补全
Ctrl+X Ctrl+T 根据同义词字典补全
Ctrl+X Ctrl+I 根据头文件内关键字补全
Ctrl+X Ctrl+] 根据标签补全
Ctrl+X Ctrl+F 补全文件名
Ctrl+X Ctrl+D 补全宏定义
Ctrl+X Ctrl+V 补全vim命令
Ctrl+X Ctrl+U 用户自定义补全方式
Ctrl+X Ctrl+S 拼写建议

帮助文档 :help omnicppcomplete

5)提示函数原型echofunc

echofunc可以在命令行中提示当前输入函数的原型。

echofunc下载地址:http://www.vim.org/scripts/script.php?script_id=1735

下载完成后,把echofunc.vim文件放到 ~/.vim/plugin文件夹中,当你在vim插入(insert)模式下紧接着函数名后输入一个"("的时候,这个函数的声明就会自动显示在命令行中。如果这个函数有多个声明,则可以通过按键"Alt+-""Alt+="向前和向后翻页,这两个键可以通过设置g:EchoFuncKeyNextg:EchoFuncKeyPrev参数来修改。这个插件需要tags文件的支持,并且在创建tags文件的时候要加选项"--fields=+lS"(OmniCppComplete创建的tag文件也能用), 整个创建tags文件的命令如下:

$ ctags -R --fields=+lS

其他插件说明详见echofunc.vim

在这里插入图片描述
如果你在编译vim时加上了"+balloon_eval"特性,那么当你把鼠标放在函数名上的时候会有一个tip窗口弹出,该窗口中也会有函数的声明。

2. 安装配置ctags

ctags可以实现找到这个函数的定义处,也可以退回到上一步。那么要想使用ctags,

1)首先使用下面的命令安装:

$ sudo apt-get install ctags

当然也可以选择源码包方式进行安装,https://sourceforge.net/projects/ctags/files/,解压缩之后,在源代码目录中依次执行下述命令即可:

$ ./configure
$ make 
$ make install

安装完成之后,想要使用ctags,那么必须在你想要调试或者查看的代码目录中有tags文件,使用如下语句即可生成tags文件,当用户在当前目录中运行vi时,会自动载入此tags文件。

2)生成tags文件

在源码根目录下执行以下命令来为程序源代码生成标签文件,其-R选项表示递归操作,同时为子目录也生成标签文件,vim利用生成的标签文件,可以进行检索,并在不同的文件、元素之间来回切换。

ctags -R

也可以用ctags file_name1.c filename2.c filename3.h来产生ctags文件或者ctags *.c *.h

字段补全:

为了使得字段补全有效,在生成tags时需要一些额外的参数,推荐的c++参数主要是:

$ ctags -R --c++-kinds=+px --fields=+iaS --extra=+q

① 选项-R 表示递归创建,也就包括源代码根目录(当前目录)下的所有子目录;
② 选项c+±kinds 用于指定C++语言的 tags记录类型, --c-kinds用于指定c语言的,通用格式是 --{language}-kinds。–c+±kinds=+px 是为c/c+语言添加函数原型信息;
③ 选项fileds 用于指定每条标记的扩展字段域。–fields=+iaS 是为标签添加继承信息(inheritance),访问控制信息(access)和函数特征(Signature)如参数表或原型等;
④ 选项extra用于增加额外的条目: f表示为每个文件增加一个条目, q为每个类增加一个条目。–extra=+q 是为类成员添加标签;

3)指定tags文件位置

(a)假如你想让你当前目录文件中的函数名在其他目录中打开vim时也能被定位到的话,那么可以把当前目录的tags文件路径添加到~/.vimrc中,如下所示:

set tags+=/root/mit6.828/jos/tags

如果要引用多个不同目录的tags文件,可以用逗号隔开,set tags=path1, path2...,或者

set tags+=path1
set tags+=path2

(b)如果经常在不同工程里查阅代码,那么可以在~/.vimrc中添加:

set tags=tags;
set autochdir

第一个命令里的分号是必不可少的,这个命令让vim首先在当前目录里寻找tags文件,如果没有找到tags文件,就到父目录中查找,一直向上递归。因为tags文件中记录的路径总是相对于tags文件所在的路径,所以要使用第二个设置项来改变vim的当前目录。

4)配置

"--ctags setting--
" 按下F5重新生成tag文件,并更新taglist
map <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>

tags包括以下文件:

  • #define定义的宏
  • 枚举型变量的值
  • 函数的定义、原型和声明
  • 名字空间(namespace)
  • 类型定义(typedefs)
  • 变量(包括定义和声明)
  • 类(class)、结构(struct)、枚举类型(enum)和联合(union)类
  • 结构和联合中成员变量或函数

个人的理解,ctags能定位函数主要是将上述的信息存储到了tags文件中,当我们使用ctags一些命令时,它都会从设置tags路径中查找相应的值,然后跳转过去。下面的cscope同理。

3. 安装配置cscope

cscope可以说是ctags的升级版,他可以在代码中实现快速切换到函数的定义处、查找某个函数被使用的情况等等。

1)假如没有安装cscope可以使用下述命令先安装:

$ sudo apt-get install cscope 

同样也可以使用源码包进行安装,https://sourceforge.net/projects/cscope/files/,安装命令同上。接下去就是配置cscope,因为使用cscope查找函数定义等,需要用到cscope.out数据库,通过下面命令即可递归所有源码文件生成.out文件。

2)生成索引文件:

$ cscope -Rbkq

当然我们也可以将相关文件汇集到某一个文件(如cscope.files),然后再使用cscope -bkq -i cscope.files生成out文件,如下:
在这里插入图片描述
生成.out文件之后,我们需要在当前用户的用户目录中的.vimrc文件中把.out数据库的路径配置进去,假如不配置的话,cscope无法查找.out所在目录文件中的函数等。

3)添加索引文件位置:

使用cs add命令添加.out的路径,即在~/.vimrc文件中添加下面这些内容即可:

cs add /home/jackie/fragmetation/linux-4.12.1/linux/cscope.out

当然我们也可以在vim打开的文件中,在底线命令模式下输入上述内容,但是底线命令模式的话,重新打开vim之后,要想再次使用该路径下的cscope.out,那么得再次添加。同ctags,假如将当前目录A中的.out文件的路径添加到了~/.vimrc文件中的话,那么在其他地方打开vim,也可以定位目录A中文件的内容了。

.vimrc文件不存在的话,那么自己创建一下;
当前用户的用户目录:比如root用户那么就是在/root目录下

4)在~/.vimrc中添加set cscopequickfix=s-,c-,d-,i-,t-,e-

这样通过:cs find xxx查找某个符号后,会立即跳转到第一个找到该符号出现的位置,然后可以通过:copen来打开quickfix窗口,在quickfix窗口中显示所有出现的位置。

下面配置可使vim 向前自动查找并加载cscope.out

if has("cscope")
    set csprg=/usr/bin/cscope
    set csto=0
    set cst
    set csverb
    set cspc=3
    "add any database in current dir
    if filereadable("cscope.out")
        cs add cscope.out
    "else search cscope.out elsewhere
    else
       let cscope_file=findfile("cscope.out", ".;")
       let cscope_pre=matchstr(cscope_file, ".*/")
       if !empty(cscope_file) && filereadable(cscope_file)
           exe "cs add" cscope_file cscope_pre
       endif      
     endif
endif

4. 安装配置Taglist

Taglist其实是一个vim的插件,能将当前vim打开的文件中函数名、变量名等在一个窗口中列出来,并支持通过列出的函数名实现跳转。

1)安装taglist

(a)从http://vim-taglist.sourceforge.net/index.html 下载taglist安装包。

(b)进入~/.vim目录,将taglist安装包解压,将解压后的/doc/plugin目录复制到.vim目录下

(c)进入~/.vim/doc目录,在vim下运行helptag .命令。这个步骤是将doc下的帮助文档加入到vim的帮助主题中,这样我们就可以通过在vim中运行help taglist.txt查看taglist帮助。

(d)打开配置文件~/.vimrc,加入以下两行:

let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1

到此安装已经完成。

接下来是使用Taglist,在vim打开的文件中,切换到底线命令模式,输入Tlist即可使用该插件了。在vim命令行下运行:Tlist(:TlistOpen, :TlistToggle)打开Taglist窗口,运行:Tlist(:TlistClose, :TlistToggle)关闭Taglist窗口。

2)配置

当然你想设置快捷键也可以,如下就是将F2设置为打开Taglist的快捷键了:

 " Tlist 的快捷键
 map <F2> :Tlist <CR>

其他一些选项可在~/.vimrc脚本中添加。如:

"设置ctags路径
let Tlist_Ctags_Cmd = '/usr/bin/ctags'

"启动vim后自动打开taglist窗口
let Tlist_Auto_Open = 1

"不同时显示多个文件的tag,仅显示一个
let Tlist_Show_One_File = 1

"taglist为最后一个窗口时,退出vim
let Tlist_Exit_OnlyWindow = 1

"非当前文件,函数列表折叠隐藏
let Tlist_File_Fold_Auto_Close=1 

"taglist窗口显示在右侧,缺省为左侧
let Tlist_Use_Right_Window = 1

"设置taglist窗口大小
"let Tlist_WinHeight = 100
let Tlist_WinWidth = 40

"是否一直处理tags.1:处理;0:不处理
let Tlist_Process_File_Always=1 "实时更新tags
let Tlist_Inc_Winwidth=0

"设置taglist打开关闭的快捷键F8
noremap <F8> :TlistToggle<CR>

"更新ctags标签文件快捷键设置
noremap <F6> :!ctags -R<CR>

我们可以通过ctrl+w快捷键或者鼠标点击在Taglist窗口和编辑区之间切换焦点,在Taglist窗口用鼠标选择某个符号并点击或者用键盘选择某个符号并回车,就可以跳转到该符号定义的位置。

附:Taglist下载地址:https://www.vim.org/scripts/script.php?script_id=273

5. 安装配置Nerdtree

Nerdtree其实也是一个vim插件,他是列出当前目录的文件结构,同安装Taglist类似。

1)安装Nerdtree

(a)先下载压缩包(下载地址:http://www.vim.org/scripts/script.php?script_id=1658

(b)解压得到doc/,nerdtree_plugin/,plugin/,syntax/

将后面3个文件夹的xxx.vim结尾的插件复制到./vim/plugin/目录下,并chmod a+x权限,将doc/目录下的NERD_tree.txt复制到./vim/doc目录下并在当前目录下执行vim,在vim命令行中:helptags .,这样以后就能在vim中通过:help NERD_tree.txt来查看对应的帮助文档。

Nerdtree使用方式也跟Taglist一样,在vim打开的文件中,切换到底线命令模式,输入:NERDTree 或 :NERDTreeToggle ,回车就可以了,当然你也可以设置快捷键方式。

2)配置

考虑到Nerdtree和Taglist共同显示的问题,我们可以将NERDTree设置到vim窗口的右侧(默认为左侧),在~/.vimrc文件中添加如下内容

let NERDTreeWinPos="right"

当你想打开NERDTree窗口的时候,自动显示书签,那么在~/.vimrc文件中添加如下内容

let NERDTreeShowBookmarks=1

当你想在vim启动的时候默认开启NERDTree,那么在~/.vimrc文件中添加如下内容,其中autocmd可以缩写为au

autocmd VimEnter * NERDTree

设置NERDTree打开关闭的快捷键F2

noremap <F2> :NERDTreeToggle<CR>

这样以后在vim中直接按F2就能在右边显示文件列表栏了。

附:Nerdtree的下载地址:https://www.vim.org/scripts/script.php?script_id=1658

6. 上述工具的简单使用

这篇先讲一下上述工具的简单基本的使用,更加详细的工具介绍以后还会推出。

6.1. ctags的简单使用

当前目录生成tags文件之后,在当前目录vim一个文件,这样就可以操作了:

命令 意义
:ta x(ta是tag的缩写) 跳转到符号x的定义处,如果有多个符号,直接跳转到第一处(该命令是在当前窗口显示标签)
:stag x 新窗口显示符号x,光标跳到符号处
:ts x 列出符号x的定义
:tj x 可以看做上面两个命令的合并,如果只找到一个符号定义,那么直接跳转到符号定义处,如果有多个,则让用户自行选择
:tn/:tp 在符号的多个定义之间跳转
Ctrl+] 跳转到当前光标下符号的定义处,和ta类似
Ctrl+t 退到跳转之前
Ctrl+W+] 新窗口显示当前光标下单词的标签,光标跳到标签处
:tfirst (简写 :tf 到第一个匹配(在各匹配的标签间移动)
:[count]tprevious (简写 :tp 向前 [count] 个匹配
:[count]tnext ((简写 :tn 向后 [count] 个匹配
:tlast (简写 :tl 到最后一个匹配
:tselect TagName 选择要跳转到哪一个
:ptag TagName 预览窗口显示TagName标签,光标跳到标签处
Ctrl+W + } 预览窗口显示当前光标下单词的标签,光标跳到标签处
:pclose 关闭预览窗口
:pedit file.h 在预览窗口中编辑文件file.h(在编辑头文件时很有用)
:psearch atoi 查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配,在使用没有标签文件的库函数时十分有用

6.2. cscope的简单使用

cscope用的比较多的是在vim底线命令模式中输入如下格式的内容:

:cs find {
    
    querytype} {
    
    name}

其中{querytype}内容如下:

querytype 含义
0或者s 查找这个C符号
1或者g 查找这个定义
2或者d 查找被这个函数调用的函数(们 )
3或者c 查找调用这个函数的函数(们)
4或者t 查找这个字符串
6或者e 查找这个egrep匹配模式
7或者f 查找这个文件
8或者i 查找#include这个文件的文件(们)

比如我想查找main这个函数的定义,那么在底线命令行中输入:

cs find g main

6.3. Taglist使用

在Vim命令行下运行“:Tlist”就可以打开Taglist窗口,再次运行“:Tlist”则关闭。

左右窗口切换Ctrl+ww

在taglist窗口中,可以使用下面的快捷键:

快捷键 含义
<CR> 跳到光标下tag所定义的位置,用鼠标双击此tag功能也一样
o 在一个新打开的窗口中显示光标下tag
<Space> 显示光标下tag的原型定义
u 更新taglist窗口中的tag
s 更改排序方式,在按名字排序和按出现顺序排序间切换
x taglist窗口放大和缩小,方便查看较长的tag
+ 打开一个折叠,同zo
- 将tag折叠起来,同zc
* 打开所有的折叠,同zR
= 将所有tag折叠起来,同zM
[[ 跳到前一个文件
]] 跳到后一个文件
q 关闭taglist窗口
显示帮助

6.4. vim使用

1)高亮所有搜索模式匹配

  • shift + * 向后搜索光标所在位置的单词
  • shift + # 向前搜索光标所在位置的单词
  • n和N可以继续向后或者向前搜索匹配的字符串
  • :set hlsearch 高亮所有匹配的字符串
  • :nohlsearch 临时关闭
  • :set nohlsearch 彻底关闭,只有重新:set hlsearch才可以高亮搜索

2)语法高亮

  • syntax on
  • syntax off

3)vimgrep

vimgrep /匹配模式/[g][j] 要搜索的文件/范围

g: 表示是否把每一行的多个匹配结果都加入

j: 表示是否搜索完后定位到第一个匹配的位置

  • :vimgrep /pattern/% 在当前打开文件中查找
  • :vimgrep /pattern/ * 在当前目录下查找所有
  • :vimgrep /pattern/ ** 在当前目录及其子目录下查找所有
  • :vimgrep /pattern/ *.c 查找当前目录下所有的.c文件
  • :vimgrep /pattern/ **/* 只查找子目录
  • :cn 查找下一个
  • :cp 查找上一个
  • :copen 打开quickfix
  • :cw 打开quickfix
  • :cclose 关闭quickfix
  • :help vimgrep 查看vimgrep帮助

通过:vimgrep /pattern/gj path来查找字符串,最好将右边的文件列表显示栏关闭,这样quickfix窗口显示比较方便查看。

4)修改了配置文件.vimrc并保存后,如果希望不重启vim而让配置立即生效,可以在打开的vim中执行:

source ~HOME/.vimrc

5)vim颜色配置方案

  • :highlight 可以查看具体的颜色配置
  • :highlight LineNr term=underline,bold ctermfg=3 guifg=Brown
  • :set colorcolumn=80 设置边界线为80列
  • :set colorcolumn=0 取消边界线设置
  • :highlight colorcolumn ctermbg=4 guibg=Blue
  • :help cterm-colors可以查看颜色对应的值

6)vim打开多个文件

vim file1 file2 file3 file4

或者进入vim后使用:e文档名来打开文档

  • :n 跳到后面那个文件
  • :N 跳到前面那个文件
  • :files查看打开了哪些文件
  • :file 查看当前的文件名

7)vim自动补全

ctrl + n或者ctrl + p

http://jingyan.baidu.com/article/76a7e409b5d525fc3b6e15fc.html

8)复制vim文件中所有内容

  • gg 回到文件首
  • shift + v 进入VISUAL LINE模式
  • shift + g 全选所有内容
  • ctrl + insert 复制所选的内容

9)[[跳到函数头部,]]跳到函数尾部

10)quickfix是vim的标准插件,本身就带有quickfix功能将编译过程中产生的错误信息保存到文件中,然后vim利用这些信息跳转到源文件的对应位置,我们就可以进行错误的修正,之后跳到下一个错误重复上述操作,从而极大地提高编译错误的修改效率

quick常用命令:

  • :cc 显示详细错误信息
  • :cp 跳到上一个错误
  • :cn 跳到下一个错误
  • :cl 列出所有的错误
  • :copen 打开quickfix窗口,可以在后面添加窗口高度参数,如10行,:copen 10
  • :cclose 关闭quickfix窗口

11)按v进入可视化界面,然后通过左右键选择文本,再按y进行复制,p就可以进行粘帖了

12)不退出vim,直接在vim中执行":!gcc file.c -o file"就可以编译程序了

13)vim常用快捷键

快捷键 含义
% 跳转到配对的括号去
[[ 跳转到当前或者上一代码块(函数定义、类定义等)的开头去(但要求代码块中’{'必须单独占一行)
][ 跳转到当前代码块(函数定义、类定义等)的结尾去(但要求代码块中’{'必须单独占一行)
]] 跳转到下一代码块(函数定义、类定义等)的开头去(但要求代码块中’{'必须单独占一行)
[/ 跳到注释开头(只对/* */注释有效)
]/ 跳到注释结尾(只对/* */注释有效)
gD 跳转到当前文件内标识符首次出现的位置,可用于跳转到全部变量的定义处;查找局部变量时,要是多个函数中定义了该局部变量,使用gD进行查找,找到的变量定义可能不是你需要的
gd 跳转到当前函数内标识符首次出现的位置,可用于跳转到局部变量的定义处
‘’ 跳转到光标上次停靠的地方, 是两个’, 而不是一个"
mx 设置书签,x只能是a-z的26个字母
`x 跳转到书签处
> 增加缩进,"x>"表示增加以下x行的缩进
< 减少缩进,"x<"表示减少以下x行的缩进

附录:

vim 官网:http://www.vim.org/sponsor/index.php

ctags 官网:http://ctags.sourceforge.net/

cscope官网:http://cscope.sourceforge.net/

taglist 官网:http://vim-taglist.sourceforge.net/download.html

nerdtree 官网:http://www.vim.org/scripts/script.php?script_id=1658

猜你喜欢

转载自blog.csdn.net/houxiaoni01/article/details/103568409