都说vim大法好(如何打造一款属于自己的vim)

  • Post author:
  • Post category:其他





前言

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()



版权声明:本文为qq_43460315原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。