NeoVim插件配置

关于我的neovim配置的一些想法:

    • 首先准备一个所有插件的管理器vim-plug
    • coc.vim(静态检查,代码补全,函数跳转,)

      CocList extensions:查看安装扩展的coc插件

      coc-snippets:片段补全

      coc-cmake

      coc-json:配置

      coc-marketplace

      coc-highlight:提供默认文件符号高亮和颜色支持(默认效果不太行)

      coc-sh:bash

    • 注释工具 nerdcommenter.vim
    • 函数signature工具 vista.vim,提取符号配置的是coc.vim
    • 文件管理器 defx
    • 基本颜色主题 PaperColor
    • 增量语法树高亮 vim-lsp-cxx-highlight

[插件管理器] vim-plug

首先安装一个vim插件管理器.

[coc.nvim]的快捷键(大部分都是normal模式下)

1.补全/提示类
  • <c-space>触发补全提示 inoremap
  • K显示符号/函数信息
2.符号导航类
  • [g]g去前一个和下一个诊断信息.
  • gd:跳转到类型/函数的定义处
  • gy跳转到变量的类型定义处
  • gi去()实现处(好像没有用)
  • gr查看符号的所有被引用到的地方
3.格式化
  • :Format格式化当前buffer
  • <leader>f格式化选中的代码

[ccls] 识别c/c++项目,(函数引用,静态检查)

如果不进行配置无法解析函数等.

看手册然后我选择在project的root目录下添加ccls file解决:

仅识别c文件+头文件路径+编译options

1
2
3
4
5
6
7
8
9
10
11
12
13
gcc
%c -Wall -c -m32 -fno-builtin -fno-stack-protector -W -Wno-implicit-fallthrough
%h
-Ilib/
-Ilib/kernel/
-Ilib/user/
-Ilib/shell/
-Ikernel/
-Idevice/
-Ithread/
-Iuserprog/
-Ifs/
-Igraphics/include

[高亮]vim-lsp-cxx-highlight

  1. 先安装ccls,
  2. 在coc.nvim的json配置中配置ccls,
  3. 根据vim-lsp-cxx-highlight.nvim文档在coc的ccls配置中添加highlight选项

[函数标签生成] vista.vim

启动映射到

并且配置窗口大小等.

[文件管理器]对defx按键的需求

启动 映射到

  1. jk下上移动,h去上一层目录,l或者<CR>打开目录或者文件
  2. 剪切文件 dd
  3. 粘贴文件p
  4. 重命名文件 r
  5. 创建新文件 N
  6. 删除文件 dD
  7. 展开文件夹o
  8. 退出窗口q

[注释工具]nerd commenter使用(文档翻译)

许多nerd注释命令使用\键执行,在vim中,这个键致力于给用户自定义,它高效的创造了一个命名空间自定义命令并且不干涉vim内置的快捷键。

the leader key能够被印射到任何用户想要的,在自定义命令leader的定义中,是一个占位符为了leader key,看当前映射的类型:echo mapleader.如果它报告一个未定义变量则意味着leader key被设置为默认的\

默认的快捷键
  1. 注释当前行或者在可视模式下被选中的文本

    [count] \cc

  2. 和上面一样但是强制嵌套

    [count] \cn

  3. 切换被选中的行的注释状态,如果被选中的顶行已经被注释则剩下的所有被选中的行都取消注释,反之也是

    [count] \c<space>

  4. 使用/**/一组多部分的分隔符来注释

    [count] \cm

  5. 规整的注释掉选中的行

    [count] \cs

  6. 和1命令一样并且复制

    [count] \cy

  7. 从光标位置注释到当前行末尾

    [count] \c$

  8. 在行末尾添加注释分隔符

    [count] \cA

  9. 切换另一个注释分割符

    \ca

  10. 取消注释

    \cu

参考的blog

[neovim根据上面插件的配置] ~/.config/nvim/init.vim

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
" ------------- vim-plug管理器 -----------------
" Plugins will be downloaded under the specified directory.
call plug#begin()

" 1.lsp补全支持
Plug 'neoclide/coc.nvim', {'branch': 'release'}
" 2.配色
"Plug 'dracula/vim', {'name': 'dracula'}
Plug 'NLKNguyen/papercolor-theme'
" 3.快速注释工具
Plug 'preservim/nerdcommenter'
" 4.状态栏和标签栏
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes' "airline 的主题
" 5.lsp 函数符号生成
Plug 'liuchengxu/vista.vim'
" 6.文件管理器
Plug 'Shougo/defx.nvim', { 'do': ':UpdateRemotePlugins' }
" 7.比coc更强的语法高亮 nvim版本不够安装不了
"Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'}
" 8.上面高亮的代替插件
Plug 'jackguo380/vim-lsp-cxx-highlight'
" List ends here. Plugins become visible to Vim after this call.
call plug#end()
" ------------- vim-plug管理器 -----------------

" ------------- vim-按键基本配置-----------------
set number " 设置行号
set shiftwidth=2 " 格式化缩进2空格
set tabstop=2 "tab 缩进两空格
" 自动补全大括号{}
inoremap { {}<C-[>i
inoremap ( ()<C-[>i
nnoremap H ^
nnoremap L $
" inoremap jk <C-[>
" ------------- vim-按键基本配置-----------------

" ------------- vim-插件窗口快捷键-----------------
nnoremap <silent><buffer> <F2> :Vista<CR>
nnoremap <silent><buffer> <F3> :Defx<CR>
" ------------- vim-插件窗口快捷键-----------------

" ------------- vim-插件单独配置-----------------
" Plug.2 颜色设置
set t_Co=256
set background=dark
colorscheme PaperColor
"colorscheme dracula
" Plug.3 nerdcommenter配置
" Plug.4 airline配置
let g:airline_theme = 'desertink'
" Plug.5 vista配置
" lsp生成符号
let g:vista_default_executive = 'coc'
let g:vista_icon_indent = ["╰─▸ ", "├─▸ "]
" 放在左边
let g:vista_sidebar_position = "vertical topleft"
" 窗口宽度为
let g:vista_sidebar_width = 25

" Plug.6 defx配置 (类似ranger操作)
" 窗口大小设置
call defx#custom#option('_', {
\ 'winwidth': 25,
\ 'split': 'vertical',
\ 'direction': 'botright',
\ 'show_ignored_files': 0,
\ 'buffer_name': 'defxplorer',
\ 'toggle': 1,
\ 'resume': 1
\ })

" 图标设置
call defx#custom#column('icon', {
\ 'directory_icon': '▸ ',
\ 'file_icon': ' ',
\ 'opened_icon': '▾ ',
\ 'root_icon': ' ',
\ })


" 快捷键设置
autocmd FileType defx call s:defx_my_settings()
function! s:defx_my_settings() abort
" hjkl方向移动键
nnoremap <silent><buffer><expr> h
\ defx#do_action('cd','..')
nnoremap <silent><buffer><expr> j
\ line('.') == line('$') ? 'gg' : 'j'
nnoremap <silent><buffer><expr> k
\ line('.') == 1 ? 'G' : 'k'
" drop打开文件在新窗口打开,open只能在当前窗口打开
nnoremap <silent><buffer><expr> l
\ defx#do_action('drop')
nnoremap <silent><buffer><expr> <CR>
\ defx#do_action('drop')
" 粘贴剪切复制
nnoremap <silent><buffer><expr> yy
\ defx#do_action('copy')
nnoremap <silent><buffer><expr> dd
\ defx#do_action('move')
nnoremap <silent><buffer><expr> p
\ defx#do_action('paste')
" 重命名
nnoremap <silent><buffer><expr> r
\ defx#do_action('rename')
" 新建文件
nnoremap <silent><buffer><expr> N
\ defx#do_action('new_file')
" 删除文件
nnoremap <silent><buffer><expr> D
\ defx#do_action('remove')
" 打开或者关闭文件夹
nnoremap <silent><buffer><expr> o
\ defx#do_action('open_or_close_tree')
" 退出
nnoremap <silent><buffer><expr> q
\ defx#do_action('quit')
endfunction

" Plug.8 高亮配置

" Plug.1 coc.nvim的默认配置
" Set internal encoding of vim, not needed on neovim, since coc.nvim using some
" unicode characters in the file autoload/float.vim
set encoding=utf-8

" TextEdit might fail if hidden is not set.
set hidden

" Some servers have issues with backup files, see #649.
set nobackup
set nowritebackup

" Give more space for displaying messages.
set cmdheight=2

" Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable
" delays and poor user experience.
set updatetime=300

" Don't pass messages to |ins-completion-menu|.
set shortmess+=c

" Always show the signcolumn, otherwise it would shift the text each time
" diagnostics appear/become resolved.
if has("nvim-0.5.0") || has("patch-8.1.1564")
" Recently vim can merge signcolumn and number column into one
set signcolumn=number
else
set signcolumn=yes
endif

" Use tab for trigger completion with characters ahead and navigate.
" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
" other plugin before putting this into your config.
inoremap <silent><expr> <TAB>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<TAB>" :
\ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"

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

" Use <c-space> to trigger completion.
if has('nvim')
inoremap <silent><expr> <c-space> coc#refresh()
else
inoremap <silent><expr> <c-@> coc#refresh()
endif

" Make <CR> auto-select the first completion item and notify coc.nvim to
" format on enter, <cr> could be remapped by other vim plugin
inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm()
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

" Use `[g` and `]g` to navigate diagnostics
" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list.
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)

" GoTo code navigation.
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)

" Use K to show documentation in preview window.
nnoremap <silent> K :call <SID>show_documentation()<CR>

function! s:show_documentation()
if (index(['vim','help'], &filetype) >= 0)
execute 'h '.expand('<cword>')
elseif (coc#rpc#ready())
call CocActionAsync('doHover')
else
execute '!' . &keywordprg . " " . expand('<cword>')
endif
endfunction

" Highlight the symbol and its references when holding the cursor.
autocmd CursorHold * silent call CocActionAsync('highlight')

" Symbol renaming.
nmap <leader>rn <Plug>(coc-rename)

" Formatting selected code.
xmap <leader>f <Plug>(coc-format-selected)
nmap <leader>f <Plug>(coc-format-selected)

augroup mygroup
autocmd!
" Setup formatexpr specified filetype(s).
autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
" Update signature help on jump placeholder.
autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup end

" Applying codeAction to the selected region.
" Example: `<leader>aap` for current paragraph
xmap <leader>a <Plug>(coc-codeaction-selected)
nmap <leader>a <Plug>(coc-codeaction-selected)

" Remap keys for applying codeAction to the current buffer.
nmap <leader>ac <Plug>(coc-codeaction)
" Apply AutoFix to problem on the current line.
nmap <leader>qf <Plug>(coc-fix-current)

" Run the Code Lens action on the current line.
nmap <leader>cl <Plug>(coc-codelens-action)

" Map function and class text objects
" NOTE: Requires 'textDocument.documentSymbol' support from the language server.
xmap if <Plug>(coc-funcobj-i)
omap if <Plug>(coc-funcobj-i)
xmap af <Plug>(coc-funcobj-a)
omap af <Plug>(coc-funcobj-a)
xmap ic <Plug>(coc-classobj-i)
omap ic <Plug>(coc-classobj-i)
xmap ac <Plug>(coc-classobj-a)
omap ac <Plug>(coc-classobj-a)

" Remap <C-f> and <C-b> for scroll float windows/popups.
if has('nvim-0.4.0') || has('patch-8.2.0750')
nnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
nnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
inoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<Right>"
inoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<Left>"
vnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
vnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
endif

" Use CTRL-S for selections ranges.
" Requires 'textDocument/selectionRange' support of language server.
nmap <silent> <C-s> <Plug>(coc-range-select)
xmap <silent> <C-s> <Plug>(coc-range-select)

" Add `:Format` command to format current buffer.
command! -nargs=0 Format :call CocActionAsync('format')

" Add `:Fold` command to fold current buffer.
command! -nargs=? Fold :call CocAction('fold', <f-args>)

" Add `:OR` command for organize imports of the current buffer.
command! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport')

" Add (Neo)Vim's native statusline support.
" NOTE: Please see `:h coc-status` for integrations with external plugins that
" provide custom statusline: lightline.vim, vim-airline.
set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}

" Mappings for CoCList
" Show all diagnostics.
nnoremap <silent><nowait> <space>a :<C-u>CocList diagnostics<cr>
" Manage extensions.
nnoremap <silent><nowait> <space>e :<C-u>CocList extensions<cr>
" Show commands.
nnoremap <silent><nowait> <space>c :<C-u>CocList commands<cr>
" Find symbol of current document.
nnoremap <silent><nowait> <space>o :<C-u>CocList outline<cr>
" Search workspace symbols.
nnoremap <silent><nowait> <space>s :<C-u>CocList -I symbols<cr>
" Do default action for next item.
nnoremap <silent><nowait> <space>j :<C-u>CocNext<CR>
" Do default action for previous item.
nnoremap <silent><nowait> <space>k :<C-u>CocPrev<CR>
" Resume latest coc list.
nnoremap <silent><nowait> <space>p :<C-u>CocListResume<CR>

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!