文章目录
前言
vim的强大不仅强大在它的几乎全键盘的快捷键,更强大在它的插件。
这篇文章助你打造一款属于自己的vim。有人说,我用vscode它不香吗,但作为一个喜欢动手党,我更想自己动,起码可以学习一些关于插件的小知识。(maybe你也可能用Obsidian这样的软件,这款软件想用起来顺手,也必然少不了各式各样的插件)
一、使用插件前后对比
安装插件前的样子:
不说别的,就这个紫色我就不喜欢,且初使用vim时各种拼写不检查,语法不报错种种问题,那种痛处,想必每个使用vim的人都经历过一遍。
目前我的vim大致长这个样子:
想要用的达到vscode的便利性,至少需要语法检查,目录树,函数列表,能同时打开多个buffer,以及代码跳转。
下面介绍一些好用的插件及其安装:
二、插件
插件管理Vim-plug
只要你安装插件,这款必不可少。首先将这款插件手动下载下来,插件下载地址:https://github.com/junegunn/vim-plug 若是无法访问github的小伙伴,推荐去码云https://gitee.com瞅一瞅,总有些意想不到的惊喜哦。下载后解压到
~/.vim
目录中,接下来在终端中运行
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
插件安装之后,还需要在
~/.vimrc
中配置和声明,请在 ~/.vimrc 的顶部添加以下行
call plug#begin()
" The default plugin directory will be as follows:
" - Vim (Linux/macOS): '~/.vim/plugged'
" - Vim (Windows): '~/vimfiles/plugged'
" - Neovim (Linux/macOS/Windows): stdpath('data') . '/plugged'
" You can specify a custom plugin directory by passing it as the argument
" - e.g. `call plug#begin('~/.vim/plugged')`
" - Avoid using standard Vim directory names like 'plugin'
" Make sure you use single quotes
" Unmanaged plugin (manually installed and updated)
Plug '~/my-prototype-plugin'
" Initialize plugin system
call plug#end()
在配置文件中,注释用
" "
来表示,使用vim-plug来安装其他的插件格式如:
Plug '~/my-prototype-plugin'
。
所有通过vim-plug安装的插件,请把代码写在
call plug#begin()
和
call plug#end()
之间。
重新加载 .vimrc 并安装插件。请在vim中使用命令
:PlugInstall
使用
$ vim #打开vim
:PlugStatus #查看插件状态
:PlugInstall #安装之前在配置文件中声明的插件
:PlugUpdate #更新插件
:PlugDiff #查看插件的变化状态,简单地回滚有问题的插件。
:PlugClean #删除插件
YouCompleteMe
插件如其名,号称最强大最智能的vim补全插件。什么都好,唯一的缺点:安装困难(依赖环境较复杂)
安装此插件需要一些前置条件:首先你的python版本要大于3.6,且官方文档中说ycmd已经更新到C++17,所以要求gcc版本至少为8,clang版本至少为7,CMake版本至少为3.13。
下面咱们一起来安装:
gcc 安装
:
在终端中输入
sudo apt update
sudo apt install build-essential
这个命令将会安装一系列软件包,包括gcc,g++,和make
在终端中输入:
sudo apt install python3-pip
CMake安装
:
安装pip(安装cmake使用)(默认你们电脑都安装了python3了)
YCM 需要 CMake 3.13 或更高版本。如果你的CMake太旧了,你可以简单地得到一个非常新的版本。
pip install --user cmake
推荐的安装方式(源码编译安装):
首先去cmake官方下载
.tar.gz
文件,执行
$ tar zxvf 文件名
# 注释
# 进入解压后的cmake文件夹
$ ./bootstrap
# 编译
$ make
# 安装
$ sudo make install
YCM安装
:
在
~/.vimrc
中加入
Plug 'Valloric/YouCompleteMe'
,
vim-plug包补全
vim-plug 安装完成后,为了避免包缺失,在 ~/.vim/plugged/YouCompleteMe下运行命令。
当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:
git submodule update --init --recursive
即可将子模块内容下载下来后工程才不会缺少相应的文件。
YCM配置
:
~/.vimrc
中加入
youcompleteme 默认tab s-tab 和自动补全冲突
"let g:ycm_key_list_select_completion=['<c-n>']
"let g:ycm_key_list_select_completion = ['<Down>']
"let g:ycm_key_list_previous_completion=['<c-p>']
"let g:ycm_key_list_previous_completion = ['<Up>']
let g:ycm_confirm_extra_conf=0 "关闭加载.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 " 语法关键字补全
nnoremap <F5> :YcmForceCompileAndDiagnostics<CR> "force recomile with syntatic
"nnoremap <leader>lo :lopen<CR> "open locationlist
"nnoremap <leader>lc :lclose<CR> "close locationlist
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'
简单使用
:
使用 Tab 键进行补全循环选择,然后继续按 Tab 循环完成。使用 Shift-Tab 向后循环
效果如图:
NERDTree
目录树(几乎必装),可以支持在不退出vim的编辑器的前提下,在文件中快速切换,同时能让开发人员快速掌握项目目录结构
1.安装
在vim-plug中安装
call plug#begin()
Plug ‘preservim/nerdtree’
call plug#end()
2.配置
NERDTree默认无须配置即可直接使用,当然更改部分映射后,可以使得目录树试用起来更加得心应手。最常见的配置在
~/.vimrc
添加如下命令,即可使用Ctrl+n快速开启目录树。
键盘映射:
map <C-n> :NERDTreeToggle<CR>
3.使用
目录树的使用主要通过在vim的command模式下键入如下命令,即可达到相应的效果。
?: 快速帮助文档
o: 打开一个目录或者打开文件,创建的是 buffer,也可以用来打开书签
go: 打开一个文件,但是光标仍然留在 NERDTree,创建的是 buffer
t: 打开一个文件,创建的是Tab,对书签同样生效
T: 打开一个文件,但是光标仍然留在 NERDTree,创建的是 Tab,对书签同样生效
i: 水平分割创建文件的窗口,创建的是 buffer
gi: 水平分割创建文件的窗口,但是光标仍然留在 NERDTree
s: 垂直分割创建文件的窗口,创建的是 buffer
gs: 和 gi,go 类似
x: 收起当前打开的目录
X: 收起所有打开的目录
e: 以文件管理的方式打开选中的目录
C 设置当前目录为项目根目录
D: 删除书签
很有用:
:ma 新建文件
:md 删除文件
:mm 移动文件/修改文件名 输入对应目录和名称回车
leaderF
LeaderF是一个用Python写的vim插件,可以在成千上万数十万个文件中,通过模糊查找的方式,快速找到目标文件。它还有很多衍生功能:快速打开或定位某个buffer、最近使用的文件(mru)、tags(包括函数、类、变量等)、命令历史、文件中的某一行、vim的help、marks等等。
1.安装
~/.vimrc
中添加
Plug ‘Yggdroot/LeaderF’, { ‘do’: ‘./install.sh’ }
2.使用
leaderF几乎不需要额外的配置,只要装好LeaderF插件就可以使用了。下面说一下常用的命令 :LeaderfFile搜索当前目录下的文件
:LeaderfBuffer搜索当前的Buffer
:LeaderfMru 搜索最近使用过的文件( search most recently used files)
:LeaderfLine 搜索当前文件中有的某个单词
:LeaderfFunction 搜索当前文件的函数
vim-which-key
帮你管理一大堆的命令和键绑定。随着插件越装越多,命令和键绑定也会越来越多,有效防止错乱
安装
:
Plug 'liuchengxu/vim-which-key', { 'on': ['WhichKey', 'WhichKey!'] }
Ale
一款异步语法检错插件。
安装
:
Plug 'dense-analysis/ale'
vim-airline
vim-airline是vim的底部状态增强/美化插件,当该插件搭配具备代码检测功能的插件时,可以实时提示该文件有多少个报错和警告等有用信息。
1.安装
Plug ‘vim-airline/vim-airline’
Plug ‘vim-airline/vim-airline-themes’
其中vim-airline-themes是主题插件,可以使得状态栏的颜色更加丰富。
tab键与youcompleteme冲突
2.配置
set laststatus=2 "永远显示状态栏
let g:airline_powerline_fonts = 1 " 支持 powerline 字体
let g:airline#extensions#tabline#enabled = 1 " 显示窗口tab和buffer
"let g:airline_theme='moloai' "我没有用这里的配色,而是用了另一个插件vim-colors-solarized
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
let g:airline_left_sep = '▶'
let g:airline_left_alt_sep = '❯'
let g:airline_right_sep = '◀'
let g:airline_right_alt_sep = '❮'
let g:airline_symbols.linenr = '¶'
let g:airline_symbols.branch = '⎇'
vim-colors-solarized
背景色设置,可设置在终端中和vim中不同色
"背景色“
Plug 'altercation/vim-colors-solarized'
"set background=dark"
if has('gui_running')
set background=light
else
set background=dark
endif
"If you do use the custom terminal colors, simply add the following line before the colorschem solarized line":
let g:solarized_termcolors=16
let g:solarized_termtrans=1
let g:solarized_contrast="normal"
更强大的代码跳转及函数列表插件–GNU Global(gtags)
Unix/Linux 用户可以直接从仓库进行安装. 安装完不需要进行其它设置.
安装:(使用自带的源)官网都已经是 6.6. 因此如果想用最新版的 GLOBAL, 就需要自己编译安装.
sudo apt install global
# 安装依赖库
sudo apt build-dep global
sudo apt install libncurses5-dev libncursesw5-dev
# 移驾至 GNU GLOBAL 官方下载最新的 tar.gz 包并解开.
wget https://ftp.gnu.org/pub/gnu/global/global-6.6.8.tar.gz
# 编译安装
./configure --with-sqlite3 # gtags可以使用Sqlite3作为数据库, 在编译时需要加这个参数
make -j4
sudo make install
配置
"gtags 设置项
set cscopetag " 使用 cscope 作为 tags 命令
set cscopeprg='gtags-cscope' " 使用 gtags-cscope 代替 cscope
let GtagsCscope_Auto_Load = 1
let CtagsCscope_Auto_Map = 1
let GtagsCscope_Quiet = 1
let gtags_file=findfile("GTAGS", ";") "查找 gtags 文件
if !empty(gtags_file)
exe "cs add" gtags_file
endif
只写 C/C++/Java 的话,那么到这里就够了,gtags 原生支持。如想要更多语言,那么 gtags 是支持使用 ctags/universal-ctags 或者 pygments 来作为分析前端支持 50+ 种语言。使用 ctags/universal-ctags 作为前端只能生成定义索引不能生成引用索引,因此我们要安装 pygments ,保证你的 $PATH 里面有 python,接着:
pip install pygments
保证 Vim 里要设置过两个环境变量才能正常工作:
let $GTAGSLABEL = 'native-pygments'
let $GTAGSCONF = '/path/to/share/gtags/gtags.conf'
第一个 GTAGSLABEL 告诉 gtags 默认 C/C++/Java 等六种原生支持的代码直接使用 gtags 本地分析器,而其他语言使用 pygments 模块。
第二个环境变量必须设置,否则会找不到 native-pygments 和 language map 的定义, Windows 下面在 gtags/share/gtags/gtags.conf,Linux 下要到 /usr/local/share/gtags 里找,也可以把它拷贝成 ~/.globalrc ,Vim 配置的时候方便点。
在想要使用gtags的源码根目录执行,执行 gtags 生成索引数据
# 生成tag文件
gtags –v
当然,也可以加上 –sqlite3 参数
增量更新
GLOBAL 支持增量更新, global -u 这个命令会自动向上找到 project/GTAGS, 并更新其内容. 而 gtags 的优势就在这里, 增量更新单个文件的速度极快, 几乎是瞬间完成.
global -vu
或者
gtags -iv
vim打开源码根目录下任意源码文件
Ctrl+] 跳转到函数定义处
Ctrl+t 跳转回来
最后,附上我的
~/.vimrc
配置文件
set number " 显示行号
"set foldmethod=indent "使用引导折叠
"set relativenumber " 显示相对行号 看着别扭
set incsearch " 实时开启搜索高亮
set hlsearch " 搜索结果高亮
set autoindent " 自动缩进
set smartindent " 智能缩进
set tabstop=4 " 设置tab制表符号所占宽度为4
set softtabstop=4 " 设置按tab时缩进宽度为4
set shiftwidth=4 " 设置自动缩进宽度为4
set expandtab " 缩进时将tab制表服转为空格
set smartcase " 开启智能大小写查找
set encoding=utf-8 " Use UTF-8.
set showcmd " Display incomplete commands.
set clipboard=unnamedplus " 开启系统剪切板
"set cursorline " 高亮当前行
"set ignorecase " 设置忽略大小写
set smartcase " 设置智能大小写
set ruler " 设置显示当前位置
" set autoread
filetype on " 开启文件类型检测
filetype plugin indent on " 开启文件类型插件检测
syntax on " 开启语法高亮
let $GTAGSLABEL = 'native-pygments'
let $GTAGSCONF = '/path/to/share/gtags/gtags.conf' "使用pygments(让gtags支持更多语言)必须的变量
"为当前代码指定tags"
set tags=~/path/tags
"按键映射"
" This allows buffers to be hidden if you've modified a buffer.
" This is almost a must if you wish to use buffers in this way.
set hidden
" To open a new empty buffer
" This replaces :tabnew which I used to bind to this mapping
nmap <leader>T :enew<cr>
" Move to the next buffer
nmap <leader>n :bnext<CR>
" Move to the previous buffer
nmap <leader>l :bprevious<CR>
" Close the current buffer and move to the previous one
" This replicates the idea of closing a tab
nmap <leader>bq :bp <BAR> bd #<CR>
" Show all open buffers and their status
nmap <leader>bl :ls<CR>
"函数列表"
"禁止自动改变当前Vim窗口的大小
"把方法列表放在屏幕的右侧
"让当前不被编辑的文件的方法列表自动折叠起来, 这样可以节约一些屏幕空间
nmap tl :TlistToggle <Enter>
let Tlist_Inc_Winwidth=0
let Tlist_Use_Right_Window=1
let Tlist_File_Fold_Auto_Close=1
call plug#begin()
"语法检错"
Plug 'dense-analysis/ale'
" Unmanaged plugin (manually installed and updated)
" On-demand lazy load
" 显示按键绑定"
Plug 'liuchengxu/vim-which-key', { 'on': ['WhichKey', 'WhichKey!'] }
"初始化图形界面"
Plug 'mhinz/vim-startify'
Plug 'tpope/vim-sensible'
Plug 'Valloric/YouCompleteMe'
"目录树"
Plug 'preservim/nerdtree'
"autocmd VimEnter * NERDTree "默认加载
map <C-n> :NERDTreeToggle<CR>
Plug 'Yggdroot/LeaderF', { 'do': './install.sh' }
"cpp语法检查"
let g:include_path=":../include:./include:./tinyxml"
let g:compile_flag="-D_LINUX_"
let g:cpp_compiler="/usr/bin/g++"
let g:enable_warning=1
let g:cpp_compiler="LANG=C g++ -Wall"
"airline"
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
set laststatus=2 "永远显示状态栏
let g:airline_powerline_fonts = 1 " 支持 powerline 字体
let g:airline#extensions#tabline#enabled = 1 " 显示窗口tab和buffer
"let g:airline#extensions#enabled = 1 " 显示窗口tab和buffer
"let g:airline_theme='angr' " murmur配色不错molokai配色使用另一个插件“
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
let g:airline_left_sep = '▶'
let g:airline_left_alt_sep = '❯'
let g:airline_right_sep = '◀'
let g:airline_right_alt_sep = '❮'
let g:airline_symbols.linenr = '¶'
let g:airline_symbols.branch = '⎇'
"YouCompletMe
" 自动补全配置
set completeopt=longest,menu "让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)
autocmd InsertLeave * if pumvisible() == 0|pclose|endif "离开插入模式后自动关闭预览窗口
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>" "回车即选中当前项
"上下左右键的行为 会显示其他信息
inoremap <expr> <Down> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <Up> pumvisible() ? "\<C-p>" : "\<Up>"
inoremap <expr> <PageDown> pumvisible() ? "\<PageDown>\<C-p>\<C-n>" : "\<PageDown>"
inoremap <expr> <PageUp> pumvisible() ? "\<PageUp>\<C-p>\<C-n>" : "\<PageUp>"
"youcompleteme 默认tab s-tab 和自动补全冲突
"let g:ycm_key_list_select_completion=['<c-n>']
"let g:ycm_key_list_select_completion = ['<Down>']
"let g:ycm_key_list_previous_completion=['<c-p>']
"let g:ycm_key_list_previous_completion = ['<Up>']
let g:ycm_confirm_extra_conf=0 "关闭加载.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 " 语法关键字补全
nnoremap <F5> :YcmForceCompileAndDiagnostics<CR> "force recomile with syntatic
"nnoremap <leader>lo :lopen<CR> "open locationlist
"nnoremap <leader>lc :lclose<CR> "close locationlist
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'
"背景色“
Plug 'altercation/vim-colors-solarized'
"set background=dark"
if has('gui_running')
set background=light
else
set background=dark
endif
"If you do use the custom terminal colors, simply add the following line before the colorschem solarized line":
let g:solarized_termcolors=16
let g:solarized_termtrans=1
let g:solarized_contrast="normal"
let g:solarized_visibility="normal"
colorscheme solarized
" Initialize plugin system
call plug#end()