0. 最终效果
安装的插件清单(前两个在系统安装 vim 时,已自动安装完成)
- ctags
- cscope
- taglists.vim
- winmanager.vim
- winfileexplorer.vim
- wintagexplorer.vim
- miniBufexpl.vim
1. 使用 ctags
1.1 生成tags
文件
ctags -R #终端下运行如下命令
1.2 关联 vim,我这里打开 vim 后,已自动关联,于是转 1.3 步
1.3 vim 打开源文件,移动光标于任一函数或结构体等上,可用快捷键
ctrl + ] #跳到该函数或结构体等的定义处 ctrl + t 或 ctrl + o #返回原位置
1.4 附:
- 跳转操作可嵌套使用
- :help ctags
2. 使用cscope
2.1 终端下运行如下命令
cscope -Rbq
生成名为cscope.in.out
,cscope.out
,cscope.po.out
的三个文件
2.2 关联 cscope.out 到 vim,一劳永逸的方法是在 .vimrc 中设置, 详情见 附录部分 的配置文件中相应部分
2.3 将光标置于相应符号上,使用如下组合键操作
ctrl + _ + s #查找本 C 符号ctrl + _ + g #查找本定义ctrl + _ + d #查找本函数调用的函数ctrl + _ + c #查找调用本函数的函数ctrl + _ + t #查找本字符串ctrl + _ + e #查找本 egrep 模式ctrl + _ + f #查找本文件ctrl + _ + i #查找本包含本文件的文件
2.4 附:
ctrl + _
组合须由ctrl + shift + -
组合实现- :help cscope
3. taglist 插件
3.1 安装
将 taglist.vim
文件置于 ./vim/after/plugin/
目录下( 没有就 mkdir -p ./vim/after/plugin
),安装过程结束。
插件获取地址:
3.2 使用设置
详情见 附录部分 的配置文件中相应部分
4. winmanager
4.1 安装
将winmanager.vim
,winfileexplorer.vim
,wintagexplorer.vim
三个文件 置于./vim/after/plugin/
目录下(没有就mkdir -p ./vim/after/plugin
), 安装过程结束。
插件获取地址:
4.2 使用设置
详情见 附录部分 的配置文件中相应部分
4.3 普通模式下,按 wm
在左侧显示相应 Explorer
4.4 附:
- 在到 FileExplorer 和 Taglist列表 窗口中,
h
,j
,k
,l
移动光标 到选择的元素上面,回车打开文件(或目录)或跳转源文件相应部分 - Ctrl + w + {h | j | k | l} #向"左,下,上,右"切换窗口
5. miniBufExplorer 插件
5.1 安装
将 minibufexpl.vim
文件置于 ./vim/after/plugin/
目录下( 没有就 mkdir -p ./vim/after/plugin
),安装过程结束
插件获取地址:
5.2 使用设置
详情见 附录部分 的配置文件中相应部分
5.3 附:
- 移动到 miniBufExplorer 窗口,
tab
键在不同文件间切换,回车键确定并打开;d
键,删除当前选择文件 - 帮助文档在 minibufexpl.vim 文件头部
- Ctrl + {h | j | k | l} #向"左,下,上,右"切换窗口
6. 自动补全(借助一定的 tags 插件功能)
ctrl + { p | n | e | y }
ctrl + { x + o }
打开补全列表情况下用ctrl + { p | n | e | y }
进行选择
7. 待解决的问题
7.1 miniBufExplorer 弹出条件:编辑的文档 >= 2。 设置始终为弹出状态情境下,退出 vim 会产生一些问题 :-(
7.2 miniBufExplorer 弹出时,会将 FileExplorer 压缩为更小, 此时通过 wm
快捷键重启(先关闭再打开)winmanager 来解决问题 :-)
7.3 当开启 autochdir 功能后,用 vim 打开的多个文件位于不同的目录下时, miniBufExporer 会出现不好的效果(当这多个文件均在相同目录下时, 不好的效果消失) :-(
附:我的.vimrc
""=============================> 我的设置 <================================="set nocompatible " 强烈建议放在配置文件的首部, " 因为作为负面效应,它会改变其它选项的效果 " 详见:help compatible"-----------------------> 编码设置 <-----------------------"set encoding=utf-8 " 设置正在编辑的文档所采用的编码( " 默认采用当前系统 locale )set fileencodings=utf8,prc,ansi" set fileencoding= " 设置写入文件时采用的编码(vim 打开文件时 " 自动识别其编码(依据 fileencodings 的值, " 顺序匹配),并设置为其为该匹配值; " 如果匹配失败,则置为空,此时采用 encoding 值)set termencoding=prc " 设置输出到客户终端(terminal)采用的编码( " 默认为空值,即输出到终端时不进行编码转换。)""----------------------------------------------------------" set autochdir " 开启自动切换到正在编辑文件的目录功能 " 开启后,对 miniBufExpolorer " 造成部分影响(相同目录下的多个文件,正常; " 不同目录下的多个文件,则出现异常。 " 不知什么原因???????set autoread " 开启自动更新文件功能(文件被其他编辑器修改)" set fillchars=stl:^,stlnc:-,vert:\|,fold:-,diff:- " 设置状态栏、垂直分割、折叠标记等的样式。 " 详见:help fillcharsset history=70 " 命令行的历史记录数 set number " 显示行号" set numberwidth=4 " 用于显示行号的列宽,默认值 4set ruler " 状态栏中显示光标的位置坐标(右下角)" set cursorline " 下划线显示光标所在行,默认关闭set backspace=indent,eol,start " 设置退格键可用set autoindent " 开启自动缩进功能" set cindent " 开启 C 语言缩进功能,默认关闭set smartindent " 开启对 C 等类似语言的的智能缩进功能, " 较 cindent 选项更出色,且在 cindent 关闭情况下 " 起作用,建议配合 autoindent 使用set tabstop=8 " tab键宽度(占用的 space 数,默认值 8 )set shiftwidth=8 " 每次缩进的宽度(占用的 space 数,默认值 8 )" set expandtab " 将 tab 键转换为空格,默认关闭set smarttab " 根据 shiftwidth 设置行前的 tab (插入的空白)" set list " 显示制表符,默认关闭" set listchars=tab:>-,trail:- " 将制表符显示为 >- 将行尾空格显示为 - " 详见:help listcharsset textwidth=78 " 一行被允许插入的最大字符数,0 值表示禁用此功能" set wrap " 自动换行,默认开启set linebreak " 整词换行filetype plugin indent onsyntax enablesyntax oncolorscheme desertset showmatch " 类似当输入一个左括号是会匹配相应的那个右括号的功能set ignorecase " 搜索时,忽略大小写set smartcase " 当搜索模式中含有大些时,会覆盖 ignorecase 选项, " 且只在此时(/,?,n,N,:g,:s 命令下, " 且 ignorecase 处于开启状态)使用set hlsearch " 高亮显示搜索结果set incsearch " 查询时非常方便,如要查找book单词,当输入到/b时, " 会自动找到第一个b开头的单词,当输入到/bo时, " 会自动找到第一个bo开头的单词,依次类推,进行查找时, " 使用此设置会快速找到答案,当你找要匹配的单词时, " 别忘记回车set foldmethod=marker " 使用 marker 方法来折叠set completeopt=longest,menu " 关掉智能补全时的预览窗口"--------------------> cscope 设置 <-----------------------"set cscopequickfix=s-,c-,d-,i-,t-,e-if has("cscope") " set csprg=/usr/local/bin/cscope set csprg=/usr/bin/cscope set csto=0 set cst set nocsverb " add any database in current directory if filereadable("cscope.out") cs add cscope.out " else add database pointed to by environment elseif $CSCOPE_DB != "" cs add $CSCOPE_DB endif set csverbendifnmaps :cs find s =expand(" ") nmap g :cs find g =expand(" ") nmap c :cs find c =expand(" ") nmap t :cs find t =expand(" ") nmap e :cs find e =expand(" ") nmap f :cs find f =expand(" ") nmap i :cs find i ^ =expand(" ") $ nmap d :cs find d =expand(" ") "0 or s: Find this C symbol"1 or g: Find this definition"2 or d: Find functions called by this function"3 or c: Find functions calling this function"4 or t: Find this text string"6 or e: Find this egrep pattern"7 or f: Find this file"8 or i: Find files #including this file""----------------------------------------------------------"----------------------> Taglist 设置 <--------------------"let Tlist_Show_One_File=1let Tlist_Exit_OnlyWindow=1" map tl :TlistToggle ""----------------------------------------------------------"-------------------> winManager 设置 <--------------------"let g:winManagerWindowLayout='FileExplorer,TagsExplorer|TagList'map wm :WMToggle ""----------------------------------------------------------"----------------------> miniBuf 设置 <--------------------"let g:miniBufExplMapWindowNavVim=1" 设置 ^-h,j,k,l 即可左下上右移动到不同窗口" let g:miniBufExplMapWindowNavArrows=1" 设置 ^-{上下左右箭头} 即可上下左右移动到不同窗口" let g:miniBufExplMapCTabSwitchBufs=1" let g:miniBufExplModSelTarget=1""----------------------------------------------------------