Abel'Blog

我干了什么?究竟拿了时间换了什么?

0%

vim

简介

记录vim编辑器。
现代 Vim + coc.nvim + fzf + treesitter 真的已经可以做到接近 IDE 的体验了,尤其是多语言(Go/C++/Rust/TS/JS)开发的时候:

•	自动补全、跳转、重构一应俱全
•	文件搜索/历史/Buffer 搜索比 cscope 强多了
•	自动格式化和 LSP 实时提示让开发更流畅
•	加上你熟悉的快捷键,几乎不用切出 Vim

🔧 新版 ~/.vimrc(vim-plug)

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
" ===================================================================
" ~/.vimrc - Modern Vim Config (Go / C++ / Rust)
" ===================================================================

" ============================
" Vim-Plug
" ============================
if empty(glob('~/.vim/autoload/plug.vim'))
silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif

call plug#begin('~/.vim/plugged')

" ---------- Git ----------
Plug 'tpope/vim-fugitive'
Plug 'junegunn/gv.vim'
Plug 'airblade/vim-gitgutter'

" ---------- File tree ----------
Plug 'preservim/nerdtree'

" ---------- Fuzzy Search ----------
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'

" ripgrep (搜索用)

Plug 'BurntSushi/ripgrep'

" ---------- MRU ----------
Plug 'yegappan/mru'

" ---------- Statusline ----------
Plug 'vim-airline/vim-airline'

" ---------- Go ----------
Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }

" ---------- LSP ----------
Plug 'neoclide/coc.nvim', {'branch': 'release'}

" ---------- Lint ----------
Plug 'dense-analysis/ale'

" ---------- Syntax ----------
Plug 'octol/vim-cpp-enhanced-highlight'
Plug 'tomlion/vim-solidity'

call plug#end()

" ===================================================================
" 基础设置
" ===================================================================
set number
set ts=4
set shiftwidth=4
set expandtab
set autoindent
set encoding=utf-8
set nowrap
set cursorline
set ruler
set ignorecase
set hlsearch
set incsearch
set listchars=tab:\|\ ,trail:.,extends:>,precedes:<,eol:$

set scrolloff=3
set novisualbell

" ========= 行长度 =========
highlight OverLength ctermbg=red ctermfg=white guibg=red guifg=white
set tw=250
match OverLength /\%250v.*/

" ========= 折叠 =========
set foldenable
set foldmethod=manual

" ========= 字体 =========
set guifontwide=YaHei\ Consolas\ Hybrid\ 12
set guifont=YaHei\ Consolas\ Hybrid\ 12

" ===================================================================
" NERDTree 设置
" ===================================================================
let g:NERDTreeDirArrows = 1
let g:NERDTreeDirArrowExpandable = '▸'
let g:NERDTreeDirArrowCollapsible = '▾'

if !exists("g:NERDTreeNodeDelimiter")
let g:NERDTreeNodeDelimiter = "│"
endif

" ===================================================================
" MRU
" ===================================================================
let MRU_File=$HOME.'/.mru_files.txt'
let MRU_Max_Entries=50
let MRU_Window_Height=10
let MRU_Auto_Close=1

" ===================================================================
" 快捷键
" ===================================================================
let mapleader = ","
let g:mapleader = ","

" ---- 保留原有快捷键 ----
nmap wm :NERDTreeToggle<CR>
map <leader>e :e! ~/.vimrc<CR>
" === 你原来的快捷键恢复 ===
nnoremap vf :Files<CR>
nnoremap vn :History<CR>
nnoremap vb :Buffers<CR>

" 分屏跳转
map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l

" FZF
nnoremap <leader>f :Files<CR>
nnoremap <leader>g :Rg<CR>
nnoremap <leader>t :Tags<CR>
nnoremap <leader>s :BLines<CR>
nnoremap <leader>m :History<CR>

" ===================================================================
" LSP (coc.nvim)
" ===================================================================
" 跳到定义
nmap gd <Plug>(coc-definition)
" 跳到实现
nmap gi <Plug>(coc-implementation)
" 查看引用
nmap gr <Plug>(coc-references)
" 文档
nmap K :call CocActionAsync('doHover')<CR>
" 重命名
nmap <leader>r <Plug>(coc-rename)
" 自动修复/导入
nmap <leader>a <Plug>(coc-codeaction)
" 格式化
nmap <leader>F :call CocAction('format')<CR>

" ===================================================================
" 自动格式化
" ===================================================================
" Go(使用 gopls)
autocmd BufWritePre *.go :silent! lua vim.lsp.buf.format()

" Rust
autocmd BufWritePre *.rs :silent! %!rustfmt

" C++
autocmd BufWritePre *.cpp,*.hpp,*.h :silent! %!clang-format

" ===================================================================
" 状态栏
" ===================================================================
set statusline=%F%m%r%h%w\[POS=%l,%v][%p%%]\%{strftime(\"%d/%m/%y\ -\ %H:%M\")}
set laststatus=2


🚀 在新机器上安装步骤

  1. 安装 vim-plug
1
2
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

安装 ctags(必备代替 cscope)

1
2
3
4
5
6
sudo apt install universal-ctags

# macOS (Homebrew)
brew install --HEAD universal-ctags/universal-ctags/universal-ctags

ctags --version

在你的项目根目录创建 tags 生成脚本
📌 在项目根目录 新建: generate_tags.sh

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# chmod +x generate_tags.sh

echo "Generating ctags..."
ctags -R \
--languages=Go,C,C++,Rust \
--exclude=.git \
--exclude=vendor \
--exclude=node_modules \
-f tags .

echo "Done."
  1. 复制配置文件

把上面的 .vimrc 保存到新机器的 ~/.vimrc

  1. 打开 Vim 并安装插件
1
2
3
:PlugInstall
"这个是安装go插件
:GoInstallBinaries

这一步会自动下载并安装你配置的所有插件。

  1. 日常更新插件
1
:PlugUpdate
  1. 清理不用的插件
1
:PlugClean

关于如何配置vim-go

1
go install golang.org/x/tools/gopls@latest
1
2
3
sudo add-apt-repository ppa:jonathonf/vim
sudo apt update
sudo apt install vim
1
2
3
4
Plug 'neoclide/coc.nvim', {'branch': 'release'}
:CocInstall coc-go
" 安装ts,js的环境
:CocInstall coc-tsserver coc-json coc-eslint coc-prettier

coc-settings.json

1
2
~/.vim/coc-settings.json       # Vim
~/.config/nvim/coc-settings.json # Neovim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"languageserver": {
"golang": {
"command": "gopls",
"rootPatterns": ["go.mod"],
"filetypes": ["go"]
}
},
"go.formatTool": "gofmt",
"go.useLanguageServer": true,
"gopls": {
"analyses": {
"unusedparams": true,
"shadow": true
},
"staticcheck": true
}
}

配置跳转逻辑

1
2
3
4
5
6
7
8
" 跳转到定义
nmap <silent> gd <Plug>(coc-definition)
" 查找引用
nmap <silent> gr <Plug>(coc-references)
" 重命名
nmap <leader>rn <Plug>(coc-rename)
" 查看文档
nmap <silent> K :call CocActionAsync('doHover')<CR>
1
2
:CocInstall coc-go coc-clangd coc-rust-analyzer
:CocInstall coc-tsserver coc-json coc-eslint coc-prettier