VIM 之插件篇

 

本文收集 vim 高效方便的插件及使用方法

本文收集 vim 高效方便的插件及使用方法

插件集锦

序号 名称 插件名 功能 主页
1 startify mhinz/vim-startify 为 Vim 和 Neovim 提供开始屏幕 网址
2 fcitx vim-scripts/fcitx.vim 解决中文下 <Esc> 的问题 网址
3 airline vim-airline/vim-airline vim 的状态栏 网址
4 markdown-toc mzlogin/vim-markdown-toc 生成文章目录 网址
5 nerdTree scrooloose/nerdtree 文件管理器 网址
6 indentLine yggdroot/indentline 显示缩进线 网址
7 easymotion symotion/vim-easymotion 文本跳转插件 网址
8 surround tpope/vim-surround 成对编辑 网址
9 vim-markdown plasticboy/vim-markdown markdown 语法高亮显示 网址
10 vim-table dhruvasagar/vim-table-mode vim 表格 网址
11 coc.vim neoclide/coc.nvim 通用的代码补全工具 网址
12 pangu.vim hotoo/pangu.vim 自动格式化、标准化中文排版 网址
        网址
        网址

为 Markdown 生成目录

功能

  • 为 Markdown 文件生成 Table of Contents,目前支持 GFM 和 Redcarpet 两种链接风格。

  • 更新已经存在的 Table of Contents。

  • 保存文件时自动更新 Table of Contents。

使用方法

生成目录

将光标移动到想在后面插入目录 (Table of Contents) 的那一行,然后运行:

命令 功能
:GenTocGFM 生成 GFM 链接风格的目录,适用 Github
:GenTocRedcarpet 生成 Redcarpet 链接风格的目录,适用 Jekyll 项目

更新已存在的目录

不需要手动做这件事,保存文件时会自动更新。命令为::UpdateToc

删除目录

:RemoveToc 命令可以帮你删除本插件生成的目录

Markdown 语法高亮 vim-markdown

为原生 markdown 进行语法高亮显示、匹配规则和标记映射

基本用法

折叠

默认情况下,页眉已启用折叠。下面的命令对于打开和关闭折叠非常有用:

命令 说明
zr 降低整个缓冲区的折叠水平
zR 打开所有折叠
zm 增加整个缓冲区的折叠水平
zM 将所有内容折叠起来
za 打开光标所在的折叠
zA 递归打开光标所在的折叠
zc 关闭光标所在的折叠
zC 递归地关闭光标所在的折叠

选项

选项可用来禁用折叠或更改折叠样式。

禁用折叠

let g:vim_markdown_folding_disabled = 1

该选项仅控制 Vim Markdown 特定折叠配置。

要启用 / 禁用折叠,请使用 Vim 的标准折叠配置。

set [no]foldenable

改变折叠风格

  1. 要以 python 模式的样式折叠,请将以下内容添加到.vimrc 中
    let g:vim_markdown_folding_style_pythonic = 1
    

    g:vim_markdown_folding_level 设置折叠级别,默认为 1,因此,作为文档标题的第 1 级标题将展开。

  2. 要防止设置 foldtext,请将以下内容添加到 .vimrc
    let g:vim_markdown_override_foldtext = 0
    

语法隐藏

隐藏是为某些语法设置的,比如:将 [链接文本](链接 url) 隐藏为链接文本。另外,_斜体_*斜体* 将隐藏为 斜体。类似地,**粗体**__粗体__** 将分别隐藏为 粗体

  1. 要启用隐藏,请使用 Vim 的标准隐藏配置:
    set conceallevel=2
    
  2. 要禁用隐藏,无论隐藏级别设置如何,请将以下内容添加到 .vimrc
    let g:vim_markdown_conceal = 0
    
  3. 禁用代码栏的隐藏需要另外设置:
    let g:vim_markdown_conceal_code_blocks = 0
    
  4. 若要禁用启用 LaTeX 数学语法的 math hide,请将以下内容添加到.vimrc 中
    let g:tex_conceal = ""
    let g:vim_markdown_math = 1
    

语法的扩展

以下选项控制将打开哪些语法扩展。默认情况下它们是关闭的。

LaTex 数学语法

使用 $x^2$$$x^2$$ 而不是 \$x\$\$\$x\$\$

let g:vim_markdown_math = 1

删除线

删除线使用两个波浪。 抓住这个。

let g:vim_markdown_strikethrough = 1

不需要 .md 扩展的标记链接

如果你想要一个像这样的 [链接](链接文本),然后使用 ge 命令在 vim 中编辑它,但是要让它打开文件 链接 url.md 而不是文件 链接 url,然后使用这个选项

let g:vim_markdown_no_extensions_in_markdown = 1

这对于 GitLab 和 GitHub wiki 知识库非常有用。

进入链接时自动写入

如果您使用 ge 快捷方式进入这样的链接 [链接文本](链接 url),此选项将自动保存您在移动之前进行的任何编辑

更改如何打开新文件

默认情况下,当进入一个链接时,目标文件将在当前缓冲区中打开。可以使用 g:vim_markdown_edit_url_in 来设置在分屏还是新标签中打开,可选值是:tab, vsplit, hsplit, current,默认值是 tab

映射

在正常模式和视觉模式下可行的操作:

指令键 功能 映射方法
gx 在浏览器中打开光标下的链接 <Plug>Markdown_OpenUrlUnderCursor
ge 打开光标下的链接进行编辑,
适用于 markdown 链接
<Plug>Markdown_EditUrlUnderCursor
]] 转到下一级标题 <Plug>Markdown_MoveToNextHeader
[[ 转到前一级标题 <Plug>Markdown_MoveToPreviousHeader
][ 转到下一个同级标题 <Plug>Markdown_MoveToNextSiblingHeader
[] 转到前一个同级标题 <Plug>Markdown_MoveToPreviousSiblingHeader
]c 转到当前标题 <Plug>Markdown_MoveToCurHeader
]u 转到上级标题 <Plug>Markdown_MoveToParentHeader

也可以自己设置映射

map asdf <Plug>Markdown_MoveToParentHeader

禁用映射的使用:

map <Plug> <Plug>Markdown_MoveToParentHeader

创建 markdown 表格 VIM Table Mode

VIM Table Mode 是一个了不起的自动表创建器和格式化器,可以一个创建整齐的表格。

要在动态模式下开始使用这个插件,可以使用 :TableModeToggle,默认情况下映射到 <Leader>tm

vimrc 中加入一段指令后,可以使用 ||__ 在插入模式下快速启用 / 禁用表模式

使用方法

输入第一行,用 | 符号分隔列。插件会自动在文本和分隔符之间插入空格:

| name | address | phone |

当输入后面的行时,插件会自动调整格式以匹配您每次输入的 |

| name       | address | phone |
|------------+---------+-------|
| John Adams |

然后您可以返回到第一行,并在它上面输入 ||,这样整个表格将完成格式化。

移动

现在您可以使用 [|]|{|}| 在单元格之间移动,分别移动 左 / 右 / 上 / 下 的单元格。如果存在当前行中最后一个单元格,则在当前行中最后一个单元格之后,左 / 右 移动环绕该表并移动到前一行的下一个。

操纵表格

指令 功能 备注
i| 选择单元格内部  
a| 选择单元格及周围 包括 immidiate 右表分隔符
<Leader>tdd 删除当前的表行 g:table_mode_delete_row_map
<Leader>tdc 删除整个当前列 g:table_mode_delete_column_map

选择单元格

通过 i|a| 选择表单元格的内部和周围(包括 immidiate 右表分隔符)。

删除行

可以使用选项 g:table_mode_delete_row_map 定义的 <Leader>tdd 映射来删除当前的表行(如果您在表行中),可以先执行一个 [count] 来删除多行,就像删除指令键 dd 一样。

删除列

可以使用选项 g:table_mode_delete_column_map 定义的 <Leader>tdc 映射来删除整个当前列(如果您在一个表行中),也可以在前面加上 [count] 来删除多个列

vim 的状态栏 ari-line

Airline 是 vim 的状态栏插件,它由几个部分组成,每个部分显示一些信息。默认情况下(无配置),如下所示:

airline

+-----------------------------------------------------------------------------+
|~                                                                            |
|~                                                                            |
|~                     VIM - Vi IMproved                                      |
|~                                                                            |
|~                       version 8.0                                          |
|~                    by Bram Moolenaar et al.                                |
|~           Vim is open source and freely distributable                      |
|~                                                                            |
|~           type :h :q<Enter>          to exit                               |
|~           type :help<Enter> or <F1>  for on-line help                      |
|~           type :help version8<Enter> for version info                      |
|~                                                                            |
|~                                                                            |
+-----------------------------------------------------------------------------+
| A | B |                     C                            X | Y | Z |  [...] |
+-----------------------------------------------------------------------------+

其中含义如下:

序号 部分 说明
1 A 显示模式 + 附加标志,如加密 / 拼写 / 粘贴(插入)
2 B VCS 信息(分支,大块摘要)
3 C 文件名 + 只读标志 (~/.vim/vimrc RO)
4 X 文件类型
5 Y 文件编码『文件格式』 (utf-8[unix)
6 Z 文件中的当前位置
7 […] 自外部插件的附加部分(警告 / 错误 / 统计)(例如 YCM,syntastic,…)

Z 段的信息 10% ☰ 10/100 ln : 20 含义如下:

10% 	# 文件顶部向下 10%
 10 	# 当前行:10
/100 LN	# 总共 100 行
:20	# 当前列:20

NerdTree 使用

NerdTree 是一个树形的文件管理器,它可以让你用键盘或鼠标操作文件系统,它也可以执行文件系统的指令。

NerdTree 的设置

" 打开 NerdTree
noremap tt :NERDTreeToggle<CR>

" 在 NerdTree 中定位文件
noremap <leader>v :NERDTreeFind<cr>

常用指令键

序号 快捷键 说明
1 o/go 在已有窗口中打开文件、目录或书签,并跳到该窗口
2 s/gs vsplit 一个新窗口打开选中文件,并跳到该窗口
3 O 递归打开选中 结点下的所有目录
4 x 合拢选中结点的父目录
5 I 切换是否显示隐藏文件

完整指令键

序号 快捷键 说明
1 o 在已有窗口中打开文件、目录或书签,并跳到该窗口
2 go 在已有窗口 中打开文件、目录或书签,但不跳到该窗口
3 t 在新 Tab 中打开选中文件 / 书签,并跳到新 Tab
4 T 在新 Tab 中打开选中文件 / 书签,但不跳到新 Tab
5 i split 一个新窗口打开选中文件,并跳到该窗口
6 gi split 一个新窗口打开选中文件,但不跳到该窗口
7 s vsplit 一个新窗口打开选中文件,并跳到该窗口
8 gs vsplit 一个新 窗口打开选中文件,但不跳到该窗口
9 ! 执行当前文件
10 O 递归打开选中 结点下的所有目录
11 x 合拢选中结点的父目录
12 X 递归 合拢选中结点下的所有目录
13 e Edit the current dif
14 双击 相当于 NERDTree-o
15 中键 对文件相当于 NERDTree-i,对目录相当于 NERDTree-e
16 D 删除当前书签
17 P 跳到根结点
18 p 跳到父结点
19 K 跳到当前目录下同级的第一个结点
20 J 跳到当前目录下同级的最后一个结点
21 k 跳到当前目录下同级的前一个结点
22 j 跳到当前目录下同级的后一个结点
23 C 将选中目录或选中文件的父目录设为根结点
24 u 将当前根结点的父目录设为根目录,并变成合拢原根结点
25 U 将当前根结点的父目录设为根目录,但保持展开原根结点
26 r 递归刷新选中目录
27 R 递归刷新根结点
28 m 显示文件系统菜单
29 cd 将 CWD 设为选中目录
30 I 切换是否显示隐藏文件
31 f 切换是否使用文件过滤器
32 F 切换是否显示文件
33 B 切换是否显示书签
34 q 关闭 NerdTree 窗口
35 ? 切换是否显示 Quick Help

缩进线显示插件 indentLine

此插件用于在每个缩进级别显示带有空格缩进的代码的细竖线。

命令 说明
:IndentLinesToggle 打开或关闭缩进线
let g:indentLine_enabled = 0 默认关闭缩进显示

文本跳转插件 easymotion

easyMotion 提供了一种更简单的方法来在 vim 中完成一些动作。 它通过突出显示所有可能的选项并允许您按一个键直接跳转到目标,它会从 <number> w<number> f {char} 中取出 <number>

当触发其中一个可用指令时,光标之前或之后的所有可见文本都会变淡,并且跳转目标会突出显示。 有点类似于 chrome 的 vim 插件,它可以在要搜索的文本上方显示跳转指令符,这里我们使用的是 ss 搜索 2 个字符的跳转,在 normal 模式中输入 ss 再输入要搜索的两个字母后,就可以出现搜索跳转指令符,非常好用。

nmap ss <Plug>(easymotion-s2)

成对编辑 vim-surround

成对更换一对单引号和双引号,tpope/vim-surround 可以满足要求

指令 说明
ds delete a surrounding,删除
cs change a surrounding, 修改
ys you add a surrounding,增加

应用:

指令 修改前 -> 改后
cs"' "Hello world!" -> 'Hello world!'
cs'<q> "Hello world!" -> <q>Hello world!</q>
cst" "Hello world!" -> Hello world!
ds" "Hello world!" -> Hello world!
ysiw] "Hello world!" -> [Hello] world! 光标在 Hello 处
cs]{ [Hello] world! -> { Hello } world! 注:}不带空格
yssb { Hello } world! -> ({ Hello } world!) 注:b:braces,)也可
ds{ds) ({ Hello } world!) -> Hello world!
ysiw<em> Hello world! -> <em>Hello</em> world!
  • name 增加 " 的方式是: ysiw"
  • "name" 的 “ 改成 ‘: cs”’
  • print("you name is")( 改成 [cs([ 带空格的 []cs(] 不带空格的 []
  • 删除 print("you name is") 中的 "()ds(ds"

通过的代码补全插件 coc.vim

它是一个智能感知引擎,适用于 vim 和 neovim。它的设计是快速,可靠,功能和灵活,同时易于使用的新 vim 用户。

安装

  1. 安装 nodejs
curl -sL install-node.now.sh/lts | bash
  1. 安装 coc.vim
" Use release branch
Plug 'neoclide/coc.nvim', {'branch': 'release'}

代码补全

触发模式

  • 部分匹配触发 默认模式,当输入字母与 triggerCharacters 有重叠时触发补全
  • 完全匹配触发 只有输入与 triggerCharacters 完全匹配时触发
  • 手动触发 手动设置触发方式

触发方式的设置,是在配置文件中 coc-settings.json 进行

  • 在输入时支持补全触发器触发器
      "suggest.triggerAfterInsertEnter": true
    
  • 更改补全超时时间
      "suggest.timeout": 500,
    
  • 自动选择第一个补全的项:
      "suggest.noselect": false,
    
  • 两个输入字符触发补全
      "suggest.minTriggerInputLength": 2
    
  • 更改代码片段项的指示符
      "suggest.snippetIndicator": "►"
    

使用 <Tab> 或自定义键完成触发器

可以使用 coc#refresh() 来完成触发器,如下所示

" use <tab> for trigger completion and navigate to the next complete item
" 使用 <tab> 触发补全并导航到下一个补全项
function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~ '\s'
endfunction

inoremap <silent><expr> <Tab>
      \ pumvisible() ? "\<C-n>" :
      \ <SID>check_back_space() ? "\<Tab>" :
      \ coc#refresh()

注意:<tab> 可以被另一个插件重新映射,使用 :verbose imap <tab> 检查它是否按预期映射。

" use <c-space>for trigger completion
" 使用 <c-space> 触发补全
inoremap <silent><expr> <c-space> coc#refresh()

完善补全体验

  • 使用 <Tab><S-Tab> 在补全列表中移动
      inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
      inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
    
  • 使用 <cr> 确认补全
      inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
    
  • 补全后关闭预览窗口
      autocmd! CompleteDone * if pumvisible() == 0 | pclose | endif
    

补全来源

默认情况下支持缓冲区中的单词补全和文件路径补全

内嵌来源

名称 简写 说明
around [A] 当前缓冲区的单词
buffer [B] 非当前缓冲区的字
file [F] 自动检测的文件名

配置补全源

我们可以通过 coc-settings.json 来配置补全源

序号 功能 设置项
1 控制是否启用了源 "coc.source.{name}.enable"
2 菜单中使用的快捷方式 "coc.source.{name}.shortcut"
3 优先级排序方式 "coc.source.{name}.priority"
4 禁用补全的语法部分 "coc.source.{name}.disableSyntaxes"

优先级排序:当分值相同时,低优先级的源排在高级之后 设置禁用补全的语法部分,例如:[“comment”,“string”]

更多的源

如何使用配置文件

coc.nvim 使用 jsonc 作为配置文件格式,与 VSCode 相同。json 支持注释

要获得正确的注释高亮显示,请在 vimrcinit.vim 中添加

autocmd FileType json syntax match Comment +\/\/.\+$+

打开配置文件

使用命令 :CocConfig 打开用户配置文件

解析配置文件

有两种类型的用户配置文件:

  • coc-settings.json 默认位置放在 $XDG_CONFIG_HOME/nvim$HOME/.config/nvim 文件夹中(或者 vim 为 $HOME/.vim)。 运行命令 :CocConfig 以打开您的用户配置文件。
  • coc-settings.json 工作区配置文件,位于 .vim 目录中。 在 vim 中打开文件后,将从该文件的父目录中解析此目录。

活动配置是“默认”、“用户”和“工作区”配置文件的合并结果,后者具有最高的优先级。

要为 coc-settings.json 文件启用 coc 智能感知,在 vim/NeoVim 中安装 json 语言扩展 coc-json:

:CocInstall coc-json

默认的 COC 配置

默认的 COC 配置可以参考:schema.json

使用代码片段

Coc 以不同的方式支持代码片段:

  • 来自不同的 vim 片段插件,比如:coc-ultisnipscoc-neosnippet
  • 来自语言服务器的代码片段,它是 snipmate 格式的
  • 来自提供 VSCode 片段的 coc 扩展

片段补全

完整的片段类型将默认显示为 ~ 附加在预览窗口中

在补全解析中,补全格式的代码片段不会显示 ~, 这是 vim 的局限

代码片段仅在使用 <C-y> 进行触发 completionDone 时才会展开,以便用户可以决定是否展开代码段

若要使 <cr> 确认补全,在 vimrcinit.vim 中添加:

inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm() :
                                           \"\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

coc#_select_confirm() 在必要时帮助选择第一个补全项,并将 <C-y> 发送到 vim 以确认补全 \<C-g>u 用于在当前位置断开撤销链 coc#on_enter() 通知 coc 您已按下 <enter>,因此它可以在 <enter> 上格式化您的代码

配置片段工作流

要向前 / 向后导航代码段占位符,请使用 < C-j >< C-k >。Vim 全局变量 g:coc_snippet_nextg:coc_snippet_prev 可用于更改键映射。

要使代码片段完成工作就像 VSCode 一样,您需要安装 coc-snippet,然后在 vim 中像这样配置 <tab>

inoremap <silent><expr> <TAB>
      \ pumvisible() ? coc#_select_confirm() :
      \ coc#expandableOrJumpable() ? "\<C-r>=coc#rpc#request('doKeymap', ['snippets-expand-jump',''])\<CR>" :
      \ <SID>check_back_space() ? "\<TAB>" :
      \ coc#refresh()

function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~# '\s'
endfunction

let g:coc_snippet_next = '<tab>'

然后在 coc-settings.json 中添加:

// make vim select first item on completion
"suggest.noselect": false

使用来自 VSCode 的代码片段

要加载 VSCode 代码片段,需要安装 coc-snippet 扩展。

然后从 GitHub 安装一个 VSCode 代码片段插件

:CocInstall https://github.com/andys8/vscode-jest-snippets.git#master

扩展

为什么需要 coc 扩展

主要原因是,与 VSCode 的扩展相比,社区提供的一些语言服务器表现不佳。Coc 扩展可以从 VSCode 扩展分离出来,提供更好的用户体验。

coc 扩展特性

  • 扩展命令
    • 类似于 Vscode,我们可以使用 :CocList commands 打开命令列表,选择需要的命令
    • 使用 :CocCommand <tab> 选择命令
  • 扩展可以提供 json 模式(与 VSCode 相同)
  • 可以提供通过 coc-snippets 扩展加载的片段
  • 扩展可以指定更多的客户端选项
  • Coc 扩展使用 Coc.nvim 作为依赖项而不是 VSCode

管理 coc 扩展

安装扩展

  1. 使用 :CocInstall 安装扩展:
:CocInstall coc-json coc-css

请注意,您可以将扩展名添加到 g:coc_global_extensions 变量中,coc 将在服务器启动时为您安装缺少的扩展名

  1. 使用 vim-plug 安装扩展

但无法使用以下命令卸载扩展 :CocUninstall 并且无法使用自动更新支持。

自动更新

  1. 自动 coc 会自动更新插件,可以通过下面方式取消自动更新:
     coc.preferences.extensionUpdateCheck = "never"
    
  2. 手动 :CocUpdate:CocUpdateSync

删除插件

:CocUninstall coc-css

通过 CocList 管理插件

运行命令 CocList extensions 打开插件列表,

  • ? 表示无效扩展
  • * 表示激活扩展
  • + 表示加载扩展名
  • - 表示禁用扩展

光标移到相应插件后,通过 <tab> 激活指令。

使用工作区

与 Vscode 不同,vim 不支持工作空间的概念,解决方案是从打开的文件中解析工作区文件夹。

解析工作区文件夹

文件 / 文件夹名称列表用于解析工作区文件夹,模式可以来自:

  • 当前缓冲区的 b:coc_root_patterns 变量
  • 指定用于当前缓冲区的语言服务器 rootPatterns
  • "coc.preferences.rootPatterns" 设置,默认为 [".vim", ".git", ".hg", ".projections.json"]

后者具有较低的优先级,这意味着它仅在先前的模式与工作区文件夹不匹配时使用。当工作空间文件夹解析失败时,将 cwd 用于 workspaceFolder。

要为指定的文件类型配置 rootpattern,请使用 autocmd 命令,比如:

autocmd FileType python let b:coc_root_patterns = ['.git', '.env']

注意,由于它是通过解析文件来工作的,因此要启用多个工作区文件夹,您必须打开每个文件夹中的至少一个文件。

管理工作区文件夹

使用命令 :CocList folders 打开工作区文件夹列表,支持删除和编辑操作。

使用命令 :echo coc#util#root_patterns() 获取用于解析当前缓冲区的工作空间文件夹的模式。

禁用工作区文件夹支持

当您不希望语言服务器使用 workspaceFolders 功能时,可以将 "disableWorkspaceFolders":true 添加到语言服务器的配置部分。

持久化工作区文件夹

变量 g:WorkspaceFolders 用于存储当前工作区文件夹,如果想从会话中恢复工作区文件夹,请在 vimrc 中使用 set sessionoptions+=globals

中文排版插件 PanGu

文件目录和搜索

插件 地址
NerdTree scrooloose/nerdtree
CtrlP ctrlpvim/ctrlp.vim
easymotion easymotion/vim-easymotion

ctrlp 模糊搜索器

ctrlp 可以搜索工作目录下的所有文件

强大的 vim 模糊搜索 fzf.vim

vim 的 / 只能搜索当前文件,这里使用的是 fzf.vim 插件。fzf 是强大的命令行搜索工具,fzf.vim 把它集成到了 vim 里。它的主页在『这里』(https://github.com/junegunn/fzf.vim )。

安装与配置

Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'

~/.vim/vimrc 中写入这些安装包,然后执行 source ~/.vim/vimrc 再执行 PlugInstall 就可以安装 fzf.vim 插件

小技巧

安装好 fzf.vim 后,fzf 也被安装了,我们可以通过 vim $(fzf) 来选择打开的文件,可以通过 cd $(find * -type d | fzf) 来选择要进入的目录,而且 fzf 默认使用 ** 来不全 shell 命令

安装好 fzf.vim 后,配置如下:

export FZF_DEFAULT_COMMAND="fd --exclude={.git,.idea,.vscode,.sass-cache,node_modules,build} --type f"

注意,这里使用了 fd 命令来搜索文件,而不是 Linux 自带的 find 命令。fd 的安装看这里

其次,是 fzf 搜索的展示界面,配置如下:

export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --preview '(highlight -O ansi {} || cat {}) 2> /dev/null | head -500'"

这里使用了命令行语法高亮的程序 highlight,网址在这里

指令 说明
Ag [pattern] 模糊搜索字符串
Files [Path] 模糊搜索目录 Files ./<tab>

多文本替换工具 far.vim

far.vim 是一个在多文件内搜索和替换文本的工具,它的地址是: brooth/far.vim。多文件的替换常用于代码重构。

使用方法很简单:

:Far foo bar **/*.py # 在当前 py 文件中搜索 foo,并替换在 bar
:Fardo               # 开始替换

python 的补全插件 python-mode

python-mode 具备基本的补全、跳转、重构和格式化功能,据说是 Python 的最佳辅助型插件,地址:python-mode/python-mode

指令 说明
<c-x> <c-o> 代码补全
<c-]> 跳转到定义
<c-c>ro 整理 import 格式
:PymodeLintAuto 使用 Auto PEP 8 整理格式

浏览代码工具 vim-tagbar

vim-tagbar 是一个通用的代码大纲插件,提供了一种简单的方法来浏览当前文件的标签并获得其结构的概述。 它通过创建一个侧边栏来显示当前文件的 ctags 生成的标签,按其范围排序,地址是:majutsushi/tagbar

它依赖 ctags,我们可以去 ctagsgithub 主页 下载文件,然后自己编译安装

指令 说明
TagbarToggle 打开代码大纲

高亮单词 vim-interestingwords

地址:lfv89/vim-interestingwords

指令 说明
<leader>k 高亮单词
n/N 跳转到下一个
<leader>k 取消高亮

强大的通用代码补全 coc.vim

Coc 是 vim8 和 neovim 的智能感知引擎,是一个支持 VSCode 扩展特性的完成框架和语言服务器客户端。

它需要 node.js 的支持,所以先要安装 node.js

curl -sL install-node.now.sh/lts | bash

格式化和静态检查

静态检查可以让编写的代码更加规范,格式化插件是 sbdchd/neoformat,需要安装对应语言的格式化库,如 python 的 autopep8,js 的 prettier 等

指令 说明
:Neoformat 格式化命令

静态检查 ALE

ale 需要 pylint 的支持,在安装前先要安装 pylint,地址:w0rp/ale

快速注释代码 vim-commentary

地址:tpope/vim-commentary

指令 说明
gc visual 模式下代码注释 / 取消注释
gcc 单行代码注释
gcgc 单行代码取消注释
gcap 注释一个段落

Git 包装器 Fugitive

地址:tpope/vim-fugitive

指令 说明
Gcommit 提交
Gblame 查看提交者

git 显示文件改动 vim-gitgutter

地址:airblade/vim-gitgutter

git 查看提交记录 gv.vim

地址:junegunn/gv.vim

指令 说明
:GV 显示提交记录

YouCompleteMe 插件

YCM 是一款广受赞誉的补全插件,但也出了名的难以安装。下面是安装的要求和步骤:

Python 版本

YCM 要求用来编译 YCM 的 python 版本是通过 --enabled-shared 编译安装的版本,所以在安装 YCM 之前,我们需要安装支持共享对象的 python。

  1. 下载 python 源码 以 python3.7 为例,下载源码包并解压,得到 Python-3.7 目录

  2. 编译并安装
     # 进入 python 源码目录
     cd python3.7
    
     # 清除临时文件
     make distclean
    
     # 配置 python 版本,支持共享对象,安装目录为 /usr/local/
     ./configure --enable-shared --prefix=/usr/local/
    
     # 编译
     make
    
     # 安装
     sudo make install
    
  3. 刷新动态连接库 如果出现类似的问题,可以通过 sudo ldconfig 刷新动态连接库解决
    /opt/python3/bin/python3.7加载共享库时出错libpython3.5m.so.1.0无法打开共享对象文件无此类文件或目录
    

安装 vim

安装了支持共享对象的 python 版本后,下载 vim8.1 源码包,解压后用以下编译指令安装 vim

./configure --with-features=huge --enable-multibyte --enable-python3interp=yes --with-python3-config-dir=/usr/local/lib/python3.8/config-3.8-x86_64-linux-gnu/ --enable-fontset --enable-cscope --enable-fail-if-missing --enable-gtk2-check --prefix=/usr/local

安装 YouCompleteMe

  1. 在 vimrc 中加入 YCM 插件
  2. 在 vim 中执行 :PlugInstall,下载 YCM
  3. 进入 YCM 目录,一般在~/.vim/plugged/YouCompleteMe目录下
  4. 执行 python3.8 install.py --all 安装 YCM

安装完成后,就可以自动补全了

详细的安装过程,可以参考这篇文章

插件可以在 vimawesome 网址中搜索

查看 vim 映射

:verbose map <key>