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
" ===================================================================
" ~/.vimrc - Lightweight Config (Company / Ops Friendly)
" ===================================================================

" ============================
" 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 'airblade/vim-gitgutter'
" gv.vim 使用频率低,依赖 git 历史完整性 → 去掉

" ---------- 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'

call plug#end()

" ===================================================================
" 基础设置(只保留“看 + 改 + 查”)
" ===================================================================
set number
set cursorline
set ruler
set nowrap

set ts=4
set shiftwidth=4
set expandtab
set autoindent

set encoding=utf-8
set scrolloff=3
set novisualbell

set ignorecase
set smartcase
set incsearch
set hlsearch

" listchars 在看配置文件时有点吵,默认关
" set listchars=tab:\|\ ,trail:.,extends:>,precedes:<,eol:$

" ===================================================================
" 行长度提示(保留,但不强制)
" ===================================================================
highlight OverLength ctermbg=red ctermfg=white
set tw=250
match OverLength /\%250v.*/

" ===================================================================
" 折叠(手动,配置文件友好)
" ===================================================================
set foldenable
set foldmethod=manual

" ===================================================================
" GUI 字体(仅 GUI Vim 生效,终端不影响)
" ===================================================================
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 = ","

" 文件树
nnoremap wm :NERDTreeToggle<CR>

" 快速编辑 vimrc
nnoremap <leader>e :e! ~/.vimrc<CR>

" FZF / 文件
nnoremap <leader>f :Files<CR>
nnoremap <leader>g :Rg<CR>
nnoremap <leader>b :Buffers<CR>
nnoremap <leader>m :History<CR>

" 分屏跳转
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l

" ===================================================================
" 状态栏(简单直观)
" ===================================================================
set statusline=%F%m%r%h%w\ [%l,%v]\ %p%%
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