VIM的插件配置 - githubusrcontent被墙后如何实现
从16日到23日,终于成功配置好我个人喜欢的VIM。
自从安装好Linux Ubuntu16.04.06 desktop和server版本后,就进行了一些简单的vi操作。发现键入【】,()很是麻烦,还需要不停地在几个模式下切换进行操作。所以决定安装vim,且配置好自动键入括号,引号等功能,最好还能提示语法。因此,有了这一周的实践和配置。
2020年后githubusrcontent被墙了,导致很多网页介绍的方法不能适用,这里把我这几天的实践方法,记录并分享大家。
准备工作
由于大多数vim插件都可以在github上找到,而且通过git安装、删除、升级插件都异常简单,因此我们需要首先安装git工具
$sudo apt-get install git
一:插件管理软件pathogen的下载及配置
1. pathogen 插件
- pathogen让每个插件占有一个单独的目录。
- 安装完 pathogen之后,只需要在~/.vim/目录下新建一个目录~/.vim/bundle/,并将要安装的所有插件放在~/.vim/bundle /目录下即可以使用(直接在~/.vim/bundle目录下 git clone xxx.git 即可)。
- 要删除某个插件,只需要将~/.vim/bundle/目录下对应的插件目录删除即可。
- 如果想保持某个插件为最新版本,直接从插 件的仓库checkout一份代码到bundle目录即可。
2. 安装 pathogen,从 github上获得pathogen,解压到~/.vim 目录下,将pathogen中的autoload目录拷贝到 ~/.vim 目录下
$mkdir -p ~/.vim/autoload ~/.vim/bundle && cd ~/.vim/bundle && git clone https://github.com/tpope/vim-pathogen.git
$cp -r pathogen/autoload ~/.vim
3. 在.vimrc中配置调用 pathogen
$vim ~/.vimrc
在vimrc文件里,
- execute pathogen#infect()
- syntax on
- filetype plugin indent on
保存退出,这个插件的安装配置就完成了,怎么验证插件有没有生效呢,别急,后面有的是机会验证。我们先来讲讲vim插件是个什么东西。此时你的~/.vim目录结构应该是这样的
可见~/.vim目录下是有两个目录,其中autoload放的是pathogen插件,所谓的插件其实就是一个脚本,当vim启动时,它会自动加载~/.vim/autoload目录下的脚本,由于你~/.vimrc里配置了execute pathogen#infect()
,所以它会去自动的执行脚本里这个函数,至于这个函数是怎么实现的,我们不用管它,总之这个函数的功能就是去加载~/.vim/bundle目录下你安装的所有插件,pathogen的管理方法大致就是这样,而我们也看到,vim的插件其实就是一个脚本文件,丰富一点的还会带有说明文档等其它内容,后面我们碰到了再讲解。
二、实用插件的配置
auto-pairs
项目地址
https://github.com/jiangmiao/auto-pairs(感兴趣的可以看)
功能
自动匹配括号、引号等
安装
git clone git://github.com/jiangmiao/auto-pairs.git ~/.vim/bundle/auto-pairs
这样就将auto-pairs在github上的项目文件下载到了~/.vim/bundle/auto-pairs目录下
测试
随便打开一个文件,输入左括号‘(‘,看右括号是不是自动出现了,然后删除左括号,看右括号是不是也被删除了。当然功能远不止这些,但常用的就这几点。
NERDTree
项目地址
https://github.com/scrooloose/nerdtree
功能
显示目录树
安装
git clone https://github.com/scrooloose/nerdtree.git ~/.vim/bundle
此时~/.vim/bundle/nerdtree下应该有如下几个目录和文件
这几个目录是vim默认的插件目录,如果我们不是通过pathogen加载插件,就需要在~/.vim目录下创建对应的这几个目录,并将NERDTree对应的文件拷到相应的目录,这样每个目录下会放置多个插件的内容,比如~/.vim/doc下就会放置所有插件的帮组文档,而我们通过pathogen来管理,每个插件的所有内容都放在同一个目录中,比如这里的NERDTree插件的内容我们下载到了~/.vim/bundle/nerdtree下,直接删除这个目录即可删除插件,如果后续插件有更新,在该目录下通过git命令也可以很容易更新到最新版本。
打开vim,在命令行模式下输入:Helptags载入插件的帮组文档,或者用:helptags help_dir载入指定目录的帮组文档,其中help_dir是你需要加载的插件帮组文档所在的目录,比如这里是~/.vim/bundle/nerdtree/doc
测试
用vim打开一个文件,在命令行模式下输入:NERDTree,然后回车,窗口左侧就出现了vim工作目录的目录树,如下图所示
将光标置于NERDTree窗口,按‘?‘可查看帮助,NERDTree的操作很简单,通常是将光标置于一个目录/文件上,通过一个按键来操作,下面列出几个常用按键及其对应的操作
为了方便打开NERDTree,我们可以设置快捷键,打开~/.vimrc,插入如下一行
map <C-n> :NERDTree<CR>
这样,当打开vim时,只要输入ctrl+n即可打开NERDTree
MiniBufExplorer
项目地址
http://www.vim.org/scripts/script.php?script_id=159
功能
显示已打开的buffer
安装
以6.3.2版本为例,根据项目地址可以找到对应版本的下载链接
mkdir -p ~/.vim/bundle/minibufexplorer/plugin && wget "http://www.vim.org/scripts/download_script.php?src_id=3640" -O ~/.vim/bundle/minibufexplorer/plugin/minibufexpl.vim
测试
用vim打开一个文件,此时看不到minibufexplorer窗口,因为默认是只有一个buffer时不显示窗口的,在命令行模式下通过:vsp filename
打开另一个文件(或者用NERDTree浏览打开其它文件),看看此时窗口上方是不是出现了MiniBufExplorer的窗口,如下所示
我们先来解释一下什么叫buffer,vim为每个打开的文件都创建了一个buffer,这个buffer存储在内存中,为了下次打开文件时快速加载,比如我们通过NERDTree浏览并打开了多个文件,即便某些文件你退出了编辑,它的buffer仍旧是存在的,在命令模式下,我们输入:ls
可以查看打开的buffer列表,每一行前面的数字对应buffer的编号,通过输入:b N
,其中N代表buffer编号,可以打开对应的buffer。对应上面的截图,我们打开了两个文件,此时minibufexplorer窗口显示有两个buffer,即便我们关闭一个文件,这两个buffer仍然存在,将光标移到某个buffer的名称上,回车可打开对应的buffer,按d
可删除buffer,具体的操作可以直接阅读插件文件,路径为~/.vim/bundle/minibufexplorer/plugin/minibufexpl.vim
配置
在~/.vimrc文件中加入如下命令
let g:miniBufExplMaxSize = 2
该配置含义为minibufexplorer窗口最大高度为2行,默认是没有上限的,你打开的buffer足够多,一会一直增长下去,为了方便阅读我一般将它设为2,其它配置不怎么用到,需要用的时候可以参考插件文件,并在~/.vimrc中添加配置
ctags+taglist+omnicppcomplete
接下来就到了重磅戏了,前面还只是一些窗口相关的基本操作,是为了方便浏览文件,我们阅读C++代码时希望能快速定位函数、变量,类似于VS等其它IDE提供的功能
ctags
这个并不是插件,而是可执行程序,是用来对代码建索引,方便查找的,有些Linux版本是自带ctags的,如果没有,按如下方式安装
sudo yum install ctags
ubuntu安装方式
sudo apt-get install ctags
mac也是自带ctags的,但是那个不好用,可以重新安装
brew install ctags
如果安装失败,看是不是因为/usr/bin/ctags文件已经存在,可以先mv走,然后再执行
创建索引:在你代码的根目录执行如下命令,会生成一个tags文件,此时在代码根目录下打开一个文件(vim默认只加载工作目录下的tags文件),将光标置于一个函数或结构体名字上,按ctr+]
即可跳转到该名称的定义处,如果出现多个选项,可以输入编号选择对应跳转的地方,按ctr+o
可回到光标之前的位置
ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++
taglist
taglist是vim的一个插件,可以将代码内的函数、变量等按规律列出来,方便查找
下载地址
http://www.vim.org/scripts/script.php?script_id=273,或者直接按如下方式下载并安装
cd ~/.vim/bundle && wget "http://www.vim.org/scripts/download_script.php?src_id=19574" -O taglist.zip && unzip taglist.zip -d taglist
这样就生成了~/.vim/bundle/taglist目录,该目录的结构为
其中plugin目录下为插件文件,doc目录下为说明文档。打开vim,在命令行模式下输入:helptags ~/.vim/bundle/taglist/doc
可以加载说明文档,然后输入help taglist.txt
则可以显示说明文档
配置
打开~/.vimrc,输入如下内容
- let Tlist_Show_One_File=1 “ 只展示一个文件的taglist
- let Tlist_Exit_OnlyWindow=1 “ 当taglist是最后以个窗口时自动退出
- let Tlist_Use_Right_Window=1 " 在右边显示taglist窗口
- let Tlist_Sort_Type="name" “ tag按名字排序
这几行配置看名字就能知道什么意思,引号后边是说明,在vim配置文件里,双引号代表注释,类似于C语言里的/
测试
打开一个文件,在命令行模式下输入:TlistToggle
即可显示taglist窗口,配合NERDTree一起效果如下
OmniCppComplete
这是一个对C++进行语法补全的插件,可以对函数、命名空间、类成员等进行补全,使用起来和绝大多数IDE差不多,不一样的是IDE为你做了很多你不知道的事情,而omni补全需要依赖tags文件,需要你用ctags命令自己生成
下载地址
http://www.vim.org/scripts/script.php?script_id=1520
也可用如下命令直接下载并安装
cd ~/.vim/bundle && wget "http://www.vim.org/scripts/download_script.php?src_id=7722" -O omnicppcomplete.zip && unzip omnicppcomplete.zip -d omnicppcomplete
该命令会生成~/.vim/bundle/omnicppcomplete目录,目录结构为
打开vim,在命令行模式下输入:helptags ~/.vim/bundle/omnicppcomplete/doc
即可加载说明文档,输入:help omnicppcomplete
查看说明文档
配置
打开~/.vimrc文件,输入
- filetype plugin indent on
- set completeopt=longest,menu
- let OmniCpp_NamespaceSearch = 2 " search namespaces in the current buffer and in included files
- let OmniCpp_ShowPrototypeInAbbr = 1 " 显示函数参数列表
- let OmniCpp_MayCompleteScope = 1 " 输入 :: 后自动补全
- let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
测试
前面说过,omni插件的补全是依赖于tags文件的,因此需要我们手动建立tags文件,假设现在有两个文件hello.h和hello.cpp如下
我们在和这两个文件所在的目录输入
ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++
这样就生成了tags文件,然后我们打开main.cpp来测试,当输入hello.h和hello.cpp中的函数或结构体时,通过按ctr+x ctr+o
就可以自动补全了,效果如下
通过按ctr+n和ctr+p可以对候选项进行上下选择。通过这种方式可以实现对函数、结构体的补全
对STL补全
上面的方式只能对自己的代码进行补全,是当我们要使用其它库比如STL甚至是第三方库时就无法补全,原因很简单,我们只对自己的代码建立了tags文件,想要对其它库进行补全,就必须对它们的源代码建立tags文件,所幸的是vim的插件编写者们早已解决了这个需求,并且他们专门针对STL头文件进行了修改,以便能更好的适应omni的补全,首先下载STL源代码,地址为http://www.vim.org/scripts/script.php?script_id=2358,可通过如下命令下载并解压
mkdir -p ~/.vim/tags && cd ~/.vim/tags && wget "http://www.vim.org/scripts/download_script.php?src_id=9178" -O - | tar jxvf -
这样就将STL的源码下载到了~/.vim/tags/cpp_src目录下,我们在该目录下执行ctags命令
ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++
这样就生成了~/.vim/tags/cpp_src/tags这个文件,然后打开~/.vimrc进行如下设置
set tags+=~/.vim/tags/cpp_src/tags
该命令是设置tags文件的搜索路径,默认只有vim工作目录的tags文件,这样设置之后就会同时加载指定目录的tags文件,你可以在后面添加更多其它第三方库的tags文件,现在对STL的补全效果如下
omnicppcomplete的补全设置虽然麻烦,但也让我们更加清楚了插件是怎样工作的,作为程序员,至少应该对某些东西的工作原理搞清楚,而不是像使用IDE一样不管任何东西,你想自定义一下东西也无从下手。
omnicppcomplete触发补全需要用到ctr+x ctr+o
,显然这是不友好的,熟悉Linux命令行的人一定对shell命令的补全印象深刻,只需要按一下TAB键就可以进行补全,vim插件的强大之处在于,它可以实现你几乎所有的需求,想要用TAB键进行补全,就需要用到SuperTab
SuperTab
项目地址
https://github.com/ervandew/supertab
安装
使用git进行安装是最方便的
cd ~/.vim/bundle && git clone https://github.com/ervandew/supertab.git
测试
无需任何配置即可使用,这时你想要补全变量名或函数名只需按一下TAB键即可,出现候选窗口之后也可以用TAB键进行选择,这样是不是方便了很多!
由于TAB键被映射成了补全快捷键,也就无法通过TAB键直接输入制表符,这时如果想要输入制表符可以通过ctr+v TAB
即可,即先输入ctr+v再输入TAB键,在vim下通过ctl+v可以输入很多不可见字符,比如试试ctr+v ctr+w
最终的配置文件
装了这么多插件,在配置文件~/.vimrc里也增添了不少内容,最后你的配置文件至少应该包含以下内容
- set tags+=~/.vim/tags/cpp_src/tags " 设置tags搜索路径
- syntax on
- filetype plugin indent on
- map <C-n> :NERDTree<CR>
- " pathongen
- execute pathogen#infect()
- " taglist
- let Tlist_Show_One_File=1
- let Tlist_Exit_OnlyWindow=1
- let Tlist_Use_Right_Window=1
- let Tlist_Sort_Type="name"
- " omnicppcomplete
- set completeopt=longest,menu
- let OmniCpp_NamespaceSearch = 2 " search namespaces in the current buffer and in included files
- let OmniCpp_ShowPrototypeInAbbr = 1 " 显示函数参数列表
- let OmniCpp_MayCompleteScope = 1 " 输入 :: 后自动补全
- let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
这个配置文件全都是和插件相关的配置,你还可以在里面添加其它配置来灵活定制你的vim,由于本文主要介绍插件相关内容,就不展开介绍了
总结
vim的C++开发环境到此就配好了,总的来说我们安装了这么几类插件
- 管理插件的插件
- 管理窗口和buffer
- 语法增强
- 代码补全
通过这些插件我们可以将vim打造成一个好用的IDE,虽然经过了很多周折,但这些功夫都不会白费,一来我们可以通过这些插件了解IDE的一些工作原理,二来通过这些插件的安装我们也更加了解了vim插件的使用方法,有了这些基础,后续如果想满足一些个性化的需求,岂不易哉!
相关推荐
" \ \ / /_ | / | _ \ / | / / _ | \ | | | / |. " \ \ / / | || |/| | |) | | | | | | | | | | | | | | _.