vim打造IDE推荐的那些插件

vim打造IDE推荐的那些插件

2022年为什么还要推荐vim?我认为主要有三点原因:因为它轻盈,因为它扩展性好,因为它帮助集中开发人员的注意力。

如果一个程序员希望今后在编码过程中,双手只希望触碰到一个输入设备,而不是鼠标和键盘来回切换,那我推荐你开始学习vim。

插件管理

vim有许多优秀的插件,在它们的帮助下,可以让vim变得更加强大,就好像本领高强的孙悟空又给配上了筋斗云。

在vim中安装插件,有两种主要的方式,一种是手动复制插件内容到指定的文件夹,这种常常需要用户自己去git clone插件源码,拷贝到指定位置。另一种更便捷的方式是使用插件管理器,著名的管理器有Vundle、VAM、vim-plug、pathogen等等,而经过多年发展,vim-plug出挑的越发标致了,相比于其他的,更推荐使用这种方式安装vim插件。

vim-plug

vim-plug源码位置:源码。使用vim-plug安装插件操作简单,windows 或者 linux系统上都可以很高效的进行配置。

vim-plugin 安装其实就是要下载plug.vim文件,让vim工具可以自动加载它。

对于windows自带的PowerShell,要将其放到$HOME/vimfiles/autoload/plug.vim。而对于使用win git 客户端或者ubuntu的话 ,要将其放到$HOME/.vim/autoload/plug.vim

github地址中下载,网站中介绍了vimplug的安装方式,易学方便,使用时只需要在vim配置文件中写入下面两行。

1
2
call plug#begin()
call plug#end()

vimawesome中找到要安装的插件,放在上面两行中间,像这样:

1
2
3
call plug#begin()
Plug 'tpope/vim-fugitive'
call plug#end()

下面是一些推荐的插件,帮助打造一个像IDE一样的编码环境。

推荐工具和vim插件

可以下载查看我的完整.vimrc配置:

1
wget https://hangliebe.com/download/filevim/.vimrc

Nerdtree

NERDTree 是一款目录树资源管理工具,它的作用就是列出当前路径的目录树,可以方便的浏览项目的总体的目录结构和创建删除重命名文件或文件名。如下图左侧所示。

Nerdtree

安装

vimawesome: Nerdtree

1
2
3
call plug#begin()
Plug 'scrooloose/nerdtree'
call plug#end()
1
:PlugInstall

配置

1
2
3
4
5
6
7
8
9
" ######set for NERDTree############
" 设置NERDTree子窗口位置
let NERDTreeWinPos="left"
" 显示隐藏文件
let NERDTreeShowHidden=1
" 是否显示行号
let g:NERDTreeShowLineNumbers=1
nmap <F8> :NERDTreeToggle<CR>
nmap <F2> :NERDTreeFind<CR>

ctags

ctags是vim下方便代码阅读的工具。

安装

1
sudo apt-get install ctags

在工程的主要目录下运行ctags -R会递归当前目录及子目录下的所有代码文件生成tags文件

1
ctags -R

如果只想为某些源码生成tags文件,使用类似如下命令

1
ctags *.c *.h

可以指定参数生成tags文件,C++工程推荐如下命令:

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

extra 选项用于增加额外的条目: f表示为每个文件增加一个条目, q为每个类增加一个条目

Taglist.vim

vim下的taglist插件主要用于查看程序源码的tags文件,能让用户很快速的定位到相应的tags。下图中右侧生成的属性列表就依赖Tglist.vim生成

Nerdtree

安装

taglist依赖于ctags,所以要先装ctags

vimawesome: taglist.vim

1
2
3
call plug#begin()
Plug 'vim-scripts/taglist.vim'
call plug#end()
1
:PlugInstall

配置

1
2
3
4
5
6
7
8
" ######set for Tlist############
" 只显示当前文件的taglist
let Tlist_Show_One_File=1
" 如果是最后一个窗口,直接退出
let Tlist_Exit_OnlyWindow=1
" 在右侧显示
let Tlist_Use_Right_Window=1
nmap <F9> :TlistToggle<CR>

youcompleteme

代码补全插件,在vim作为IDE这件事情上承重极高,简称YCM。在编码时候,依赖该插件,完成自动补全,这一点才真正让开发人员接受使用vim作为新的IDE。

YCM

安装

  • 安装YCM plugin

vimawesome: youcompleteme

1
2
3
call plug#begin()
Plug 'valloric/youcompleteme'
call plug#end()
1
:PlugInstall
  • 安装 cmake, vim 和 python3
1
apt install build-essential cmake vim-nox python3-dev
  • 安装mono-complete, go, node, java and npm
1
apt install mono-complete golang nodejs default-jdk npm
  • 编译
1
2
3
cd ~/.vim/bundle/YouCompleteMe
python3 install.py --all
python3 install.py --clang-completer // 如果只做C++开发,选择编译这个

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
"youcompleteme  默认tab  s-tab 和自动补全冲突
let g:ycm_confirm_extra_conf=1 "打开加载.ycm_extra_conf.py提示
let g:ycm_collect_identifiers_from_tags_files=1 " 开启 YCM 基于标签引擎
let g:ycm_min_num_of_chars_for_completion=1 " 从第2个键入字符就开始罗列匹配项
let g:ycm_cache_omnifunc=0 " 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_seed_identifiers_with_syntax=1 " 语法关键字补全
inoremap <leader><leader> <C-x><C-o>
"在注释输入中也能补全
let g:ycm_complete_in_comments = 1
"在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
"注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>
let g:clang_library_path='/usr/lib/llvm-10/lib/libclang.so'
let g:ycm_global_ycm_extra_conf='~/.vim/plugged/youcompleteme/.ycm_extra_conf.py'
let g:ycm_filetype_whitelist = {
\ "c":1,
\ "cpp":1,
\ }
" 增加语义触发条件
let g:ycm_semantic_triggers = {
\ 'c' : ['->', '.'],
\ 'objc' : ['->', '.', 're!\[[_a-zA-Z]+\w*\s', 're!^\s*[^\W\d]\w*\s',
\ 're!\[.*\]\s'],
\ 'ocaml' : ['.', '#'],
\ 'cpp,objcpp' : ['->', '.', '::'],
\ 'perl' : ['->'],
\ 'php' : ['->', '::'],
\ 'cs,java,javascript,typescript,d,python,perl6,scala,vb,elixir,go' : ['.'],
\ 'ruby' : ['.', '::'],
\ 'lua' : ['.', ':'],
\ 'erlang' : [':'],
\ }

在使用vim编写c++文件的时候, 出现’module’ object has no attribute ‘FlagsForFile’ , 修改.ycm_extra_conf.py文件,在最后加上

1
2
3
4
def Settings( **kwargs ):
return {
'flags': [ '-x', 'c++', '-Wall', '-Wextra', '-Werror' ],
}

cpplint

cpplint是Google开发的一个C++代码风格检查工具,如果是遵循google code style的,可以使用cpplint作为代码规范的一个检查工具。该工具结合vim的Ale插件,可以实现代码编写过程中的静态检查。查看下一小节的Ale内容。

使用方法

直接在命令行使用cpplint检查文件。

1
cpplint [options] files

cpplint

Ale

ALE(Asynchronous Lint Engine)是一个插件,在NeoVim 0.2.0+和Vim 8中,当你编辑文本文件时,它提供提示(语法检查和语义错误),并作为Vim语言服务器协议客户端。

A linting example with the darkspectrum color scheme in GVim.

安装

vimawesome: Ale

1
2
3
call plug#begin()
Plug 'w0rp/ale'
call plug#end()
1
:PlugInstall

配置

1
2
3
4
5
6
7
8
9
10
11
12
"------------ale设置------------------
"文件内容发生变化时不进行检查
let g:ale_lint_on_text_changed = 'never'
"打开文件时不进行检查
let g:ale_lint_on_enter = 1
" 上面两个设置可以让文件仅在打开和保存时候进行检查

let g:ale_linters = {'cpp': ['cpplint'],'c': ['cpplint'],'python': ['pylint']}
let g:ale_sign_err = "✗"
let g:ale_sign_warnin = "⚠"
nmap sp <Plug>(ale_previous_wrap)
nmap sn <Plug>(ale_next_wrap)

cscope

1
2
sudo apt-get install cscope // 安装
cscope -Rbkq // 生成数据库文件

cscope -Rbkq这个命令会生成三个文件:cscope.in.out, cscope.out, cscope.po.out

参数解析:

  • -R: 在生成索引文件时,搜索子目录树中的代码
  • -b: 只生成索引文件,不进入cscope的界面
  • -k: 在生成索引文件时,不搜索/usr/include目录
  • -q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度

.vimrc配置

1
2
3
4
5
6
"通过cscope -Rbq产生代码的数据库文件, 通过该选项指定。
cs add cscope.out
"设置cscope显示的时候,清除缓存内容。
set cscopequickfix=s-,c-,d-,i-,t-,e- "
"使用ctag插件中的快捷键
set cst

该工具配合tags工具使用。

fzf

Fuzzy finder 是一款使用GO语言编写的交互式的命令行工具,一款在linux上不可或缺的模糊检索工具。

fzf

安装

我的fzf工具安装基于vim 扩展安装

1
2
3
4
5
call plug#begin()
……
Plug 'junegunn/fzf'
Plug 'junegunn/fzf.vim'
call plug#end()

安装后需要执行下./.vim/plugged/fzf/install,进行完整安装。

配置

.bashrc中配置执行环境。

1
[ -f ~/.fzf.bash ] && source ~/.fzf.bash

上图中我执行fe进行模糊查找,是因为我在~/.bashrc中按个人习惯配置了命令。

auto-pairs

auto-pairs是一个帮助自动补全或者删除括号,引号的插件。在vimawesome查看介绍和安装方法。

配置

1
2
"----auto-pairs 自动补全括号-----------
let g:AutoPairs = {'(':')', '[':']', '{':'}',"'":"'",'"':'"'}

indentline

提供缩进线的功能,在vimawesome查看介绍和安装方法。

indentline

配置

1
2
3
"----缩进指示线 indentLine 配置 ----------
let g:indentLine_enabled = 1
let g:indentLine_char='┆'


关注博客或微信搜索公众号多媒体与图形,获取更多内容,欢迎在公众号留言交流!
扫一扫关注公众号
作者

占航

发布于

2022-08-20

更新于

2023-10-04

许可协议

评论