vi/vim使用进阶

本文属于vim系列第二篇:

1 vim基础

vim基本操作

https://blog.csdn.net/u012906122/article/details/103662316

2 vi/vim使用进阶

vim进阶,插件配置

https://blog.csdn.net/u012906122/article/details/111460432

3 vim-config

根据[vi/vim使用进阶]写的软件包

https://blog.csdn.net/u012906122/article/details/111460468

转载于https://blog.easwy.com/archives/advanced-vim-skills-catalog/

3 * vi/vim使用进阶: vimrc初步
4 * vi/vim使用进阶: 保存项目相关配置
5 * vi/vim使用进阶: 使用标签(tag)文件
6 * vi/vim使用进阶: 使用taglist插件
7 * vi/vim使用进阶: 文件浏览和缓冲区浏览
8 * vi/vim使用进阶: lookupfile插件
9 * vi/vim使用进阶: 开启文件类型检测
10 * vi/vim使用进阶: 乱花渐欲迷人眼 – 语法高亮
11 * vi/vim使用进阶: 程序员的利器 – cscope
13 * vi/vim使用进阶: 智能补全
14 * vi/vim使用进阶: 自动补全
15 * vi/vim使用进阶: 指随意动,移动如飞 (一)
 
 
3 vi/vim使用进阶:  vimrc初步
键映射(map):
"Set mapleader                                                              在vimrc中,双引号开头的行,将被当作注释
let mapleader = ","
"Fast editing of .vimrc                                            
map <silent> <leader>ee :e ~/.vimrc<cr>                     将e ~/.vimrc<cr>设置快捷键为 ,ee
"When .vimrc is edited, reload it
autocmd! bufwritepost .vimrc source ~/.vimrc
"Fast editing of .vimrc                                                    vim下使用快捷键,ee,则会打开另一个标签页,打开~/.vimrc.
map <silent> <leader>ee :call SwitchToBuf("~/.vimrc")<cr>
 
 
vi/vim使用进阶: 保存项目相关配置
set path=.,/usr/include,,~/src/vim70/**
.            在当前文件所在目录中搜索
/usr/include          在/usr/include目录中搜索
,,              在当前工作路径中搜索
~/src/vim70/ **         在~/src/vim70的 所有子目录树中进行搜索
 
我们把光标定位到src/main.c文件第22行的" fcntl.h"单词上,
Normal模式下 gf         vim打开了/usr/include/fcntl.h文件
ctrl+^                          回到刚才的位置,光标仍旧定位在第22行的"fcntl.h"单词上。
ctrl+w+f                      vim打开了一个水平分隔窗口,在此窗口中打开了/usr/include/fcntl.h。
:find xxx                     在path路径下搜索xxx文件
 
如何把本项目相关的配置保存起来,下次打开本项目时自动恢复这些配置呢?
我们在/home/xxx/src_study/vim_study/目录下建立一个文件,假定文件名为workspace.vim,文件内容为:
"set project path
set path+=/home/xxx/src_study/vim_study/** 
接下来,在你的.vimrc文件中加入下面的语句:
" execute project related configuration in current directory
if filereadable("/home/xxx/src_study/vim_study/workspace.vim")  
    source /home/xxx/src_study/vim_study/workspace.vim
endif 
以后,每次你在/home/xxx/src_study/vim_study/目录中启动vim时,vim都会自动载入workspace.vim,恢复项目的配置信息。
 
 
vi/vim使用进阶: 使用标签tag文件
ctags -R *
vim -t process_events
ctrl+]
ctrl+t
如果想了解更多命令,可以”:help 29.1“(强烈建议程序员完整的阅读usr_29.txt和usr_30.txt)。
 
 
 
vi/vim使用进阶: 使用taglist插件
我们到 http://www.vim.org/scripts/script.php?script_id=273下载最新版本的taglist plugin,目前版本是4.3。
下载后,把该文件在~/.vim/目录中解压缩,这会在你的~/.vim/plugin和~/.vim/doc目录中各放入一个文件:
plugin/taglist.vim                 taglist插件
doc/taglist.txt                       taglist帮助文件 
 
.vimrc中配置Taglist:
let Tlist_Ctags_Cmd = '/usr/bin/ctags'
let Tlist_Show_One_File = 1            "不同时显示多个文件的tag,只显示当前文件的
let Tlist_Exit_OnlyWindow = 1         "如果taglist窗口是最后一个窗口,则退出vim
如果你想在启动vim后,自动打开taglist窗口,设置Tlist_Auto_Open为1
缺省是按tag在文件中出现的顺序进行排序
 
vim打开文件才会显示taglist窗口,vim通过目录打开文件时不会显示taglist窗口,vim test再打开test.c不能显示taglist窗口,vim test/test.c可以显示taglist窗口
在taglist窗口中,可以使用下面的快捷键:
<CR>              跳到光标下tag所定义的位置,和用鼠标双击此tag功能也一样      //Enter键
o                     在一个 新打开的窗口中显示光标下tag                                     
<Space>         显示光标下tag的原型定义
u                     更新taglist窗口中的tag
s                      更改排序方式,在按名字排序和按出现顺序排序间切换
x                      taglist窗口放大和缩小,方便查看较长的tag
+                     打开一个折叠
-                      将tag折叠起来
*                      打开所有的折叠
=                     将所有tag折叠起来
q                     关闭taglist窗口
:TlistOpen       打开taglist窗口
<F1>              显示帮助 
Taglist插件还可以与winmanager插件协同使用,这将在下篇文章中介绍。
 
 
 
vi/vim使用进阶: 文件浏览和 winmanager
[文件浏览]
本节介绍vim的文件浏览插件。netrw.vim插件是vim的标准插件,它已经伴随vim而发行不需要安装。当你使用vim尝试打开目录时,vim会自动调用netrw.vim插件打开该目录
 
我们可以使用":Explore"命令来打开文件浏览器。我的vimrc中这样配置:
" netrw setting
let g:netrw_winsize = 30
map <silent> <leader>fe :Sexplore!<cr> 
这样,在我输入",fe"时,就会打开一个垂直分隔的窗口浏览当前文件所在的目录,窗口的宽度为30。
 
netrw插件文件浏览快捷键:
<cr>                 如果光标下为目录,则进入该目录;如果光标下是文件,则用vim打开该文件               //Enter按键进入,ctrl+^返回
-                       返回上级目录
c                       切换vim当前工作目录为正在浏览的目录
d                       创建目录 
D                      删除文件或目录
R                      改名文件或目录
s                       选择排序方式
<F1>                显示帮助
 
[winmanager]
[bufexplorer]        依赖bufexplorer插件, winmanager插件需要与bufexplorer 插件一起才能使用
下载后,把该文件在~/.vim/目录中解压缩,这会把winmanager插件解压到~/.vim/plugin和~/.vim/doc目录中:
plugin/winmanager.vim             winmanager插件
plugin/winfileexplorer.vim         改良的Explorer插件
plugin/wintagexplorer.vim         winmanager提供的tag插件,用处不大
doc/winmanager.txt                   帮助文件 
仍然用":helptags ~/.vim/doc"命令来生成帮助标签,然后就可以使用":help winmanager"来查看帮助了。
 
" winmanager 
let g:winManagerWindowLayout = "BufExplorer,FileExplorer|TagList"
let g:winManagerWidth = 30
let g:defaultExplorer = 0
nmap <C-W><C-F> :FirstExplorerWindow<cr>                    ctrl+w+f
nmap <C-W><C-B> :BottomExplorerWindow<cr>              ctrl+w+b
nmap <silent> <leader>wm :WMToggle<cr>                       ,wm
 
g:winManagerWindowLayout变量的值定义winmanager的窗口布局,这里打开了BufExploer和FileExplorer|TagList。 左边有两个窗口,上面的是BufExplorer窗口,下面是taglist窗口。FileExplorer窗口和BufExplorer共用一个窗口,在BufExplorer窗口中使用” CTRL-N “可以切换到FileExplorer窗口,再使用一次则又切换回BufExplorer窗口。也就是说,在变量g:winManagerWindowLayout中,使用”,”分隔的插件,在同一个窗口中显示,使用” CTRL-N “在不同插件间切换;使用”|”分隔的插件,则在另外一个窗口中显示。
上面的vimrc设置中,定义了三个键映射,分别用于跳到左上窗口、左下窗口,以及显示/关闭winmanager窗口。
使用时先用",wm"打开winmanager窗口!!!
 
 
 
vi/vim使用进阶: lookupfile插件查询 文件
用来方便查找一个已知名字(或知道部分名字)的 文件!!!
 
Lookupfile插件可以在下面的链接下载: http://www.vim.org/scripts/script.php?script_id=1581
下载该插件后,把它解压到你的~/.vim目录中,就完成了安装。
Lookupfile插件还需要最新的genutils支持,因此,需要下载genutils:
这个插件提供了一些通用的函数,可供其它的脚本使用。
 
[在项目文件中查找]
Lookupfile在查找文件时,需要使用tag文件。它可以使用ctags命令生成的tag文件,不过查找效率会比较低。
现在我们需要让lookupfile插件知道到哪去找文件名tag文件。
:let g:LookupFile_TagExpr = '"/home/hanyuhang/github/vim-config-install/test/tags"'
 
现在我们就可以使用lookupfile来打开文件了,按" <F5>"或输入":LookupFile"在当前窗口上方打开一个lookupfile小窗口
需要vim -t test1这种方式打开文件时才生效
注意:如果要查找test.c, lookupfile小窗口中输入test,不是test.c!!!
你可以用 "CTRL-N"和"CTRL-P"(或者用上、下光标键)来在下拉列表中选择你所需的文件。选中文件后,按回车就可以在之前的窗口中打开此文件。
文件名可以使用vim的正则表达式,这大大方便了文件的查找。例如process_events----->process*events
 
[Lookupfile配置]
" lookupfile setting
let g:LookupFile_MinPatLength = 2                     "最少输入2个字符才开始查找
let g:LookupFile_PreserveLastPattern = 0            "不保存上次查找的字符串
let g:LookupFile_PreservePatternHistory = 1       "保存查找历史
let g:LookupFile_AlwaysAcceptFirst = 1               "回车打开第一个匹配项目
let g:LookupFile_AllowNewFiles = 0                     "不允许创建不存在的文件
 
if filereadable("./filenametags")                           "设置tag文件的名字
let g:LookupFile_TagExpr = '"./filenametags"'
endif
 
"映射LookupFile为,lk
nmap <silent> <leader>lk :LUTags<cr>
"映射LUWalk为,lw
nmap <silent> <leader>lw :LUWalk<cr>
 
有了上面的定义,当我输入",lk"时,就会在tag文件中查找指定的文件;当输入",lw"时,就会在指定目录中查找文件。
在用lookupfile插件查找文件时,是区分文件名的大小写的, 如果想进行忽略大小写的匹配,可以使用vim忽略大小写的正则表达式,即在文件名的前面加上"\c"字符。
举个例子,当你输入"\cab.c"时,你可能会得到"ab.c"、"Ab.c"、"AB.c"
 
 
 
vi/vim使用进阶: 开启文件类型检测
打开文件类型检测功能
:filetype plugin indent on
你也可以输入":filetype"命令查看你的文件类型检测功能有没有打开。
上面这一条命令,可以分为三条命令:
:filetype on
:filetype plugin on
:filetype indent on 
 
自动缩进:
每次在编辑c文件时,它的自动缩进为4个空格;当你在插入模式下使用 CTRL-D、CTRL-T缩进时,它也会调整4个空格的缩进;当你按TAB键时,它将会插入8个空格
autocmd FileType c,cpp,h,hpp set shiftwidth=4 | set expandtab 
 
 
 
 
10  vi/vim使用进阶: 语法高亮
首先,把下面的Ex命令加入你的vimrc,打开vim的语法高亮功能:
syntax enable
记得Source Insight中有一个功能,按SHIFT+F8可以把光标下的词高亮出来,在看代码时非常有用。
vim下也有一个插件可以完成此功能,mark.vim,把此插件直接拷贝到你的.vim/plugin目录就行了。
在vimrc中这样设置:
" mark setting
nmap <silent> <leader>hl <Plug>MarkSet
vmap <silent> <leader>hl <Plug>MarkSet
nmap <silent> <leader>hh <Plug>MarkClear
vmap <silent> <leader>hh <Plug>MarkClear
nmap <silent> <leader>hr <Plug>MarkRegex
vmap <silent> <leader>hr <Plug>MarkRegex 
 
当我输入" ,hl"时,就会把光标下的单词高亮,在此单词上按" ,hh"会清除该单词的高亮。如果在高亮单词外输入",hh",会清除所有的高亮。
你也可以使用 virsual模式选中一段文本,然后按" ,hl",会高亮你所选中的文本;
virsual模式即v...y v...d这种!!!!
在使用了",hl"后,就可以直接输入" #"或" *"来继续查找该高亮文本
 
或者你可以用" ,hr"来输入一个正则表达式,这会高亮所有符合这个正则表达式的文本。
,hr
@test*
 
 
 
11  vi/vim使用进阶: cscope
在前面的文章中介绍了利用ctags生成的tag文件,跳转到标签定义的地方。
但如果 想查找函数在哪里被调用,或者标签在哪些地方出现过,ctags就无能为力了,这时需要使用更为强大的cscope。
 
安装cscope
aptitude install cscope
 
cscope的用法很简单,首先需要为你的代码生成一个cscope数据库。在你的项目根目录运行下面的命令:
cd /home/xxx
cscope -Rbq 
(有些时候ctags -R *不全(虚函数),用 cscope -Rbq补充 )
这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。
其中cscope.out是基本的符号索引,后两个文件是使用"-q"选项生成的,可以加快cscope的索引速度。
在缺省情况下,cscope在生成数据库后就会进入它自己的查询界面,我们一般不用这个界面,所以使用了" -b"选项。如果你已经进入了这个界面,按CTRL-D退出。
Cscope在生成数据库中,在你的项目目录中未找到的头文件,会自动到/usr/include目录中查找。如果你想阻止它这样做,使用" -k"选项。
 
Cscope缺省只解析C文件(.c和.h)、lex文件(.l)和yacc文件(.y),虽然它也可以支持C++以及Java,但它在扫描目录时会跳过C++及Java后缀的文件。
如果你希望cscope解析C++或Java文件,需要把这些文件的名字和路径保存在一个名为cscope.files的文件。
当cscope发现在当前目录中存在cscope.files时,就会为cscope.files中列出的所有文件生成索引数据库。通常我们使用find来生成cscope.files文件:
cd /home/xxx
find . -regex '.*\.c\|.*\.h\|.*\.cpp\|.*\.hpp\|.*\.java ' > cscope.files             //注意以后可以加入.xml文件
cscope -Rbq
 
下表中列出了cscope的常用选项:
-R: 在生成索引文件时,搜索子目录树中的代码
-b: 只生成索引文件,不进入cscope的界面
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
-k: 在生成索引文件时,不搜索/usr/include目录
-i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪儿去找源文件列表。可以使用"-",表示由标准输入获得文件列表。
-Idir: 在-I选项指出的目录中查找头文件
-u: 扫描所有文件,重新生成交叉索引文件
-C: 在搜索时忽略大小写
-Ppath: 在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了。
 
在vim中使用cscope非常简单,首先调用" cscope add"命令添加一个cscope数据库,然后就可以调用" cscope find"命令进行查找了。
vim支持8种cscope的查询功能,如下:
s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找egrep模式,但查找速度快多了
f: 查找并打开文件,方便打开头文件
i: 查找包含本文件的文件
 
vim提供了一些选项可以调整它的cscope功能:
cscopecscopeprg 选项用于设置cscope程序的位置。
cscopecscopequickfix 设定是否使用quickfix窗口来显示cscope的结果,详情请":help cscopequickfix";
如果你想vim同时搜索tag文件以及cscope数据库,设置cscopecscopetag选项;
cscopecscopetagorder 选项决定是先查找tag文件还是先查找cscope数据库。
设置为0则先查找cscope数据库,设置为1先查找tag文件。我通常设置为1,因为在tag文件中查找到的结果,会把最佳匹配列在第一位。
 
下面是我的vimrc中关于cscope接口的设置:
" cscope setting
if has("cscope")
  set csprg=/usr/bin/cscope
  set csto=1
  set cst
  set nocsverb
  " add any database in current directory
  if filereadable("cscope.out")
      cs add cscope.out
  endif
  set csverb
endif
//,fs    s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
nmap  <silent> <leader>fs :cs find s <C-R>=expand("<cword>")<CR><CR>
//,fg   g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
nmap  <silent> <leader>fg :cs find g <C-R>=expand("<cword>")<CR><CR>
//,fd   d: 查找本函数调用的函数
nmap  <silent> <leader>fd :cs find d <C-R>=expand("<cword>")<CR><CR>
//,fc    c: 查找调用本函数的函数
nmap  <silent> <leader>fc :cs find c <C-R>=expand("<cword>")<CR><CR>
//,ft    t: 查找指定的字符串出现的所有位置
nmap  <silent> <leader>ft :cs find t <C-R>=expand("<cword>")<CR><CR>
//,fp   e: 查找egrep模式,但查找速度快多了 和,ft有重复
nmap  <silent> <leader>fp :cs find e <C-R>=expand("<cword>")<CR><CR>
//,ff    f: 查找并打开文件,方便打开头文件
nmap  <silent> <leader>ff :cs find f <C-R>=expand("<cfile>")<CR><CR>
 
下面的两个链接是cscope主页提供的cscope使用方法,也可以作为参考:
在大项目中使用cscope: http://cscope.sourceforge.net/large_projects.html
 
 
 
13  vi/vim使用进阶: 智能补全
vim实现的补全功能并不仅仅限于对程序的补全,它可以对文件名补全、根据字典进行补全、根据本缓冲区或其它缓冲区类似的内容进行补全、根据文件语法补全等等。
本文将分为两篇,第一篇主要介绍vim的OMNI补全(全能补全),下一篇简要介绍其它的补全方式,以及SuperTab插件。
vim的OMNI补全(全能补全)可以支持多种程序语言,在本文中,主要介绍C及C++的全能补全。对C及C++代码的全能补全需要使用ctags生成的标签文件
注意: 使用"ctags –R *"可以更新标签文件
 
我们输入要补全的字符"process",然后按下 "CTRL-X CTRL-O"(手动打开全能补全),在vim的状态行会显示"Omni Completeion",表明现在进行的是全能补全,同时会弹出一个下拉菜单,显示所有匹配的标签。你可以使用来 "CTRL-P"和"CTRL-N"(或上下按键)上下选择,在选择的同时,所选中的项就被放在光标位置,不需要再按回车来把它放在光标位置。 "CTRL-P"和"CTRL-N"可以不按回车, 上下按键需要按回车。
 
打开预览窗口会导致下拉菜单抖动,因此我一般都去掉预览窗口的显示,这需要改变'completeopt'的值,我的设置如下:
set completeopt=longest,menu
 
如果要支持C++的全能补全,需要到vim主页下载OmniCppComplete插件
下载后,把它解压到你的.vim目录(在windows下是vimfiles目录),它会安装以下文件:
after\ftplugin\cpp.vim
                      \c.vim  
autoload\omni\common\debug.vim
                                        \utils.vim
autoload\omni\cpp\complete.vim
                                \includes.vim
                                \items.vim
                                \maycomplete.vim
                                \namespaces.vim
                                \settings.vim
                                \tokenizer.vim
                                \utils.vim
doc\omnicppcomplete.txt 
确保你已关闭了vi兼容模式set nocp
 
接下来, 使用下面的命令,为C++文件生成标签文件!!!
cd /home/xxx
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q  ./
在对C++文件进行补全时,OmniCppComplete插件需要tag文件中包含C++的额外信息,因此上面的ctags命令不同于以前我们所使用的,它专门为C++语言生成一些额外的信息,上述选项的含义如下:
--c++-kinds=+p  : 为C++文件增加函数原型的标签
--fields=+iaS   : 在标签文件中加入继承信息(i)、类成员的访问控制信息(a)、以及函数的指纹(S)
--extra=+q      : 为标签增加类修饰符。注意,如果没有此选项,将不能对类成员补全 
现在,进入vim,设置好tag文件路径。
我写了一个简单的例子,来演示C++的自动补全功能,如下图所示,在输入”t.“后,OmniCppComplete插件会自动弹出struct test1的成员供选择,而在输入”b->“后,又会自动弹出class base的成员供选择,非常方便,连”CTRL-X CTRL-O“都不必输入。
问题:
v im智能补全 不支持 sp指针!!!
 
 
 
14  vi/vim使用进阶: 自动补全
除智能补全外,最常用的补全方式应该是 CTRL-NCTRL-P补全了。它们会在当前缓冲区、其它缓冲区,以及当前文件所包含的头文件中查找以光标前关键字开始的单词。智能补全不能对局部变量进行补全,而CTRL-N和CTRL-P补全则可以很好的胜任。
CTRL-P补全是向上查找以进行补全,而CTRL-N是向下查找以进行补全
 
SuperTab插件会记住你上次所使用的补全方式,下次再补全时,直接使用TAB,就可以重复这种类型的补全。
比如,上次你使用CTRL-X CTRL-F进行了文件名补全,接下来,你就可以使用TAB来继续进行文件名补全,直到你再使用上面列出的补全命令进行了其它形式的补全。这个插件在下面的链接下载: http://www.vim.org/scripts/script.php?script_id=1643
下载后,把它放到.vim/plugin目录就可以了。
注意:使用supertab.vim,不要使用supertab.vmb
 
可以在vimrc中设置这两个变量:
let g:SuperTabRetainCompletionType = 2
let g:SuperTabDefaultCompletionType = "<C-N>" 
对下面两个选项进行配置,以调整SuperTab的缺省行为:
g:SuperTabRetainCompletionType的值缺省为1,意味着记住你上次的补全方式,直到使用其它的补全命令改变它;如果把它设成2,意味着记住上次的补全方式,直到按ESC退出插入模式为止;如果设为0,意味着不记录上次的补全方式。
g:SuperTabDefaultCompletionType的值设置缺省的补全方式,缺省为CTRL-N。
现在你可以使用TAB来进行补全了,就像在shell中那样,方便了很多!
 
 
 
15  vi/vim使用进阶: 指随意动,移动如飞 (一)
我们下面介绍的命令,如果没有特别说明,都是在Normal模式下使用的命令。
[ 在文件中移动 ]
命令”gg“移动到文件的第一行,而命令”G“则移动到文件的最后一行。
命令”G“前可以加上数字,在这里,数字的含义并不是倍数,而是你打算跳转的行号。例如,你想跳转到文件的第1234行,只需输入”1234G“。
在文件中移动,你可能会迷失自己的位置,这时使用”CTRL-G“命令,查看一下自己位置。
[ 移动到指定字符 ]
“f“命令移动到光标右边的指定字符上,例如,”fx“,会把移动到光标右边的第一个’x’字符上。”F“命令则反方向查找,也就是移动到光标左边的指定字符上。
“t“命令和”f“命令的区别在于,它移动到光标右边的指定字符之前。例如,”tx“会移动到光标右边第一个’x’字符的前面。”T“命令是”t“命令的反向版本,它移动到光标左边的指定字符之后。
可以在命令前面使用数字,表示倍数。例如,”3fx“表示移动到光标右边的第3个’x’字符上。
[ 相对于光标滚屏 ]
在阅读代码时,有时我们需要根据光标所在的位置滚屏,把光标所在行移动窗口的顶端、中间或底部,这时就可以用到”zt“、”zz“和”zb“。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/u012906122/article/details/111460432