跳转至

Vim 工作流

半年前倒腾过很长时间的vim配置,后来转懒人族直接使用lazynvim,最近geek瘾又犯了,想在UCB给的服务器上使用曾经配置好的Vim

这段时间做lab,我刻意回避vscode这类“接地气”的文本编辑器,强制使用vim :)

配置文件

~/.vimrc文件内容,你可以直接在我的仓库复制:

VimL
  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
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
" Clearly this is my configuration of Vim, and it's suitable for mac!
" There are some confs with the path of plugins and you have to switch them to your own paths.

" 0. 显示设置(优化)
set nocompatible
filetype on
filetype indent on
filetype plugin on
filetype plugin indent on
"let g:ycm_python_binary_path = '/opt/homebrew/bin/python3'
set mouse=a                                 "可使用鼠标控制
set encoding=utf-8
let &t_ut=''
set expandtab                               "缩进相关
set tabstop=4
set shiftwidth=4
set softtabstop=4
"set list
"set listchars=tab:...?
set scrolloff=5
set tw=0
set indentexpr=
set backspace=indent,eol,start              "row(k+1)行首 回退至 row(k)行末
set foldmethod=indent
set foldlevel=99
let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_SR = "\<Esc>]50;CursorShape=2\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"    "三种模式下光标显示不一样
set laststatus=2                            "最下面的状态栏宽度是2
set autochdir
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" |endif


let mapleader = " "             "将键盘<LEADER>主动设置为空格键<SPACE>
syntax on                       "语法高亮
set number                      "设置行号
set norelativenumber            "设置相对行号(off)
set cursorline                  "行所在下线
set wrap
set showcmd
set wildmenu                    "命令关键字自索引
set nohlsearch                  "搜索高亮
exec "nohlsearch"
set incsearch                   "搜索过程直接高亮
set ignorecase                  "大小写忽略(searching)
set smartcase                   "大小写自动识别(searching)


" 1. 将hjkl重定向给四个方向键
noremap <Up> k
noremap <Down> j
noremap <Left> h
noremap <Right> l


" 2. 常见键位映射更改
" 1) shift + s <=> (S) => 实现保存 <=> :w<CR> (<CR>是回车键)
" 2) s 原:删除所在字符并自开启insert模式 => none
" 3) shift + q <=> (Q) => 实现退出 <=> :q<CR>
" 4) shift + r <=> (R) => 刷新.vimrc_File <=> :source $MYVIMRC<CR>
" map S :w<CR>
map s <nop>
map Q :wq<CR>
map R :source $MYVIMRC<CR>

" 3. search jumping
noremap = nzz                         "= refers to 跳到下一个搜索目标
noremap - Nzz                         "- refers to 返回上一个搜索目标
noremap <LEADER><CR> :nohlsearch<CR>  "<SPACE>+<return> refers to 撤销搜索印记


" 4. 实现高级分屏和跳转
" 高级分屏
map s<Right> :set splitright<CR>:vsplit<CR>
map s<Left> :set nosplitright<CR>:vsplit<CR>
map s<Up> :set nosplitbelow<CR>:split<CR>
map s<Down> :set splitbelow<CR>:split<CR>
" 鼠标跳转
map q<Right> <C-w>l
map q<Left>  <C-w>h
map q<Up>    <C-w>k
map q<Down>  <C-w>j
" 设置当前分屏大小
map w<Right> :vertical resize-5<CR>
map w<Left>  :vertical resize+5<CR>
map w<Up> :res -5<CR>
map w<Down> :res +5<CR>
" 分屏在“上下”&“左右”之间切换
map sv <C-w>t<C-w>H
map sh <C-w>t<C-w>K


"5. 设置打开一个新的标签页
map tu :tabe<CR>
map ty :-tabnext<CR>
map ti :+tabnext<CR>


" end: set plugins
call plug#begin('~/.vim/plugged')

Plug 'vim-airline/vim-airline'
Plug 'connorholyday/vim-snazzy'

" File navigation
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
Plug 'Xuyuanp/nerdtree-git-plugin'

" Taglist
Plug 'majutsushi/tagbar', { 'on': 'TagbarOpenAutoClose' }

" Error checking
Plug 'w0rp/ale'

" Auto Complete
Plug 'Valloric/YouCompleteMe'

" Undo Tree
Plug 'mbbill/undotree/'

" Other visual enhancement
Plug 'nathanaelkane/vim-indent-guides'
Plug 'itchyny/vim-cursorword'

" Git
Plug 'rhysd/conflict-marker.vim'
Plug 'tpope/vim-fugitive'
Plug 'mhinz/vim-signify'
Plug 'gisphm/vim-gitignore', { 'for': ['gitignore', 'vim-plug'] }

" HTML, CSS, JavaScript, PHP, JSON, etc.
Plug 'elzr/vim-json'
Plug 'hail2u/vim-css3-syntax'
Plug 'spf13/PIV', { 'for' :['php', 'vim-plug'] }
Plug 'gko/vim-coloresque', { 'for': ['vim-plug', 'php', 'html', 'javascript', 'css', 'less'] }
Plug 'pangloss/vim-javascript', { 'for' :['javascript', 'vim-plug'] }
Plug 'mattn/emmet-vim'

" Python
Plug 'vim-scripts/indentpython.vim'

" Markdown
Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install_sync() }, 'for' :['markdown', 'vim-plug'] }
Plug 'dhruvasagar/vim-table-mode', { 'on': 'TableModeToggle' }
Plug 'vimwiki/vimwiki'

" Bookmarks
Plug 'kshenoy/vim-signature'

" Other useful utilities
Plug 'terryma/vim-multiple-cursors'
Plug 'junegunn/goyo.vim' " distraction free writing mode
Plug 'tpope/vim-surround' " type ysks' to wrap the word with '' or type cs'` to change 'word' to `word`
Plug 'godlygeek/tabular' " type ;Tabularize /= to align the =
Plug 'gcmt/wildfire.vim' " in Visual mode, type i' to select all text in '', or type i) i] i} ip
Plug 'scrooloose/nerdcommenter' " in <space>cc to comment a line

" Dependencies
Plug 'MarcWeber/vim-addon-mw-utils'
Plug 'kana/vim-textobj-user'
Plug 'fadein/vim-FIGlet'

call plug#end()



" end+: colorBar
color snazzy
let g:SnazzyTransparent = 1

" ===
" === NERDTree
" ===
map ff :NERDTreeToggle<CR>
let NERDTreeMapOpenExpl = ""
let NERDTreeMapUpdir = ""
let NERDTreeMapUpdirKeepOpen = "l"
let NERDTreeMapOpenSplit = ""
let NERDTreeOpenVSplit = ""
let NERDTreeMapActivateNode = "i"
let NERDTreeMapOpenInTab = "o"
let NERDTreeMapPreview = ""
let NERDTreeMapCloseDir = "n"
let NERDTreeMapChangeRoot = "y"


" ==
" == NERDTree-git
" ==
let g:NERDTreeIndicatorMapCustom = {
    \ "Modified"  : "✹",
    \ "Staged"    : "✚",
    \ "Untracked" : "✭",
    \ "Renamed"   : "➜",
    \ "Unmerged"  : "═",
    \ "Deleted"   : "✖",
    \ "Dirty"     : "✗",
    \ "Clean"     : "✔︎",
    \ "Unknown"   : "?"
    \ }


" ===
" === You Complete ME
" ===
nnoremap gd :YcmCompleter GoToDefinitionElseDeclaration<CR>
nnoremap g/ :YcmCompleter GetDoc<CR>
nnoremap gt :YcmCompleter GetType<CR>
nnoremap gr :YcmCompleter GoToReferences<CR>
let g:ycm_autoclose_preview_window_after_completion=0
let g:ycm_autoclose_preview_window_after_insertion=1
let g:ycm_use_clangd = 0
let g:ycm_python_interpreter_path = "/opt/homebrew/bin/python3"
let g:ycm_python_binary_path = "/opt/homebrew/bin/python3"


" ===
" === ale
" ===
let b:ale_linters = ['pylint']
let b:ale_fixers = ['autopep8', 'yapf']


" ===
" === Taglist
" ===
map <silent> T :TagbarOpenAutoClose<CR>


" ===
" === MarkdownPreview
" ===
let g:mkdp_auto_start = 0
let g:mkdp_auto_close = 1
let g:mkdp_refresh_slow = 0
let g:mkdp_command_for_global = 0
let g:mkdp_open_to_the_world = 0
let g:mkdp_open_ip = ''
let g:mkdp_browser = 'chromium'
let g:mkdp_echo_preview_url = 0
let g:mkdp_browserfunc = ''
let g:mkdp_preview_options = {
    \ 'mkit': {},
    \ 'katex': {},
    \ 'uml': {},
    \ 'maid': {},
    \ 'disable_sync_scroll': 0,
    \ 'sync_scroll_type': 'middle',
    \ 'hide_yaml_meta': 1
    \ }
let g:mkdp_markdown_css = ''
let g:mkdp_highlight_css = ''
let g:mkdp_port = ''
let g:mkdp_page_title = '「${name}」'


" ===
" === vim-table-mode
" ===
map <LEADER>tm :TableModeToggle<CR>

" ===
" === Python-syntax
" ===
let g:python_highlight_all = 1
" let g:python_slow_sync = 0


" ===
" === vim-indent-guide
" ===
let g:indent_guides_guide_size = 1
let g:indent_guides_start_level = 2
let g:indent_guides_enable_on_vim_startup = 1
let g:indent_guides_color_change_percent = 1
silent! unmap <LEADER>ig
autocmd WinEnter * silent! unmap <LEADER>ig


" ===
" === vim-signiture
" ===
let g:SignatureMap = {
        \ 'Leader'             :  "m",
        \ 'PlaceNextMark'      :  "m,",
        \ 'ToggleMarkAtline'   :  "m.",
        \ 'PurgeMarksAtLine'   :  "dm-",
        \ 'DeleteMark'         :  "dm",
        \ 'PurgeMarks'         :  "dm/",
        \ 'PurgeMarkers'       :  "dm?",
        \ 'GotoNextLineAlpha'  :  "m<LEADER>",
        \ 'GotoPrevLineAlpha'  :  "",
        \ 'GotoNextSpotAlpha'  :  "m<LEADER>",
        \ 'GotoPrevSpotAlpha'  :  "",
        \ 'GotoNextLineByPos'  :  "",
        \ 'GotoPrevLineByPos'  :  "",
        \ 'GotoNextSpotByPos'  :  "mn",
        \ 'GotoPrevSpotByPos'  :  "mp",
        \ 'GotoNextMarker'     :  "",
        \ 'GotoPrevMarker'     :  "",
        \ 'GotoNextMarkerAny'  :  "",
        \ 'GotoPrevMarkerAny'  :  "",
        \ 'ListLocalMarks'     :  "m/",
        \ 'ListLocalMarkers'   :  "m?"
        \ }


" ===
" === Undotree
" ===
let g:undotree_DiffAutoOpen = 0
map L :UndotreeToggle<CR>

如何配置

Lua
1
vim ~/.vimrc

复制上述文件内容,:wq保存退出。

然后再进入vim,输入:PluginInstall,等待插件安装完成即可(如有提醒直接按Enter即可)。

现在就可以直接使用了

常用指法

免责申明:下面的指法部分只适用于我的vimrc配置

Tips

现在使用我的vimrc,你会发现有几个最方便的点:

  1. 可以用鼠标/触控板进行光标移动
  2. 复制/粘贴可以直接用鼠标
  3. 默认tab缩进是4

其实已经失去了vim的灵魂了🤡

像语法高亮/状态栏/搜索高亮之类的就不用说了...

基础操作

Normal Mode

这一部分不会的话,......

插入

Lua
1
2
3
i -- enter insert mode and begin inserting or deleting text
a -- enter insert mode, one space after cursor position
<escape> -- enter normal mode

保存退出

Lua
1
2
<:q!> -- quit without writing
<:wq> -- write and quit

移动

Lua
1
<Up/Down/Left/Right> -- 方向键
Lua
1
number + <Up/Down/Left/Right> -- 向上/下/左/右移动几number格

词单元

Lua
1
2
3
4
5
6
<w> -- next word 
<b> -- beginning of word
<e> -- end of word
<0> (zero) -- move to beginning of line
<$> -- move to end of line
<^> -- first non-null part of the line
Lua
1
<number w,b> -- eg: <4w> - moves forward 4 words

跳转

Lua
1
2
<G> -- go to end of file
<gg> -- go to beginning of file
Lua
1
2
<ctrl u> -- scroll up (half a page)
<ctrl d> -- scroll down (half a page)

查找

Lua
1
2
3
< /search_item > -- searches for all occurrences in the file
<n> -- jumps to the next occurrence
<N> -- jumps to the previous occurrence

删除

Lua
1
2
dd -- delete this line
cc -- delete this line and into `Insert` mode

撤销和回退

Lua
1
2
<u> -- undo edit
<ctrl r> -- redo edit

复制和粘贴

Lua
1
2
3
<yy> -- yanks(or copies) current line
<p> -- pastes copied item
y5<Right> -- 复制右边的5个字符

分屏

s + 方向键

Lua
1
2
3
4
s <Right> -- 向右分屏
s <Left> -- 向左分屏
s <Up> -- 向上分屏
s <Down> -- 向下分屏

分屏时切换光标的区域

q + 方向键

Lua
1
2
3
4
q <Right> <C-w>l
q <Left>  <C-w>h
q <Up>    <C-w>k
q <Down>  <C-w>j

在vim打开的file中执行终端命令

Lua
1
:!<command> -- eg: :!ls 就会在终端中执行命令

Visual Mode

Lua
1
2
<V> -- enter multi-lined visual line mode
<v> -- enter single-lined visual mode

Actions:

Lua
1
2
3
<y> -- copy current item
<d> -- delete current item -> automatically goes to clipboard, so you can <p> to paste it
<escape> -- go back to normal mode

彩蛋

显示文件系统结构

Lua
1
ff -- 按下ff就会自动显示文件系统结构,鼠标点击即可打开细节

代码分层显示

Lua
1
T -- 按下 shift + t 会显示代码中的Tag,分好层级

显示效果应该如下:

alt text

一些别的指法

重新开一个iterm2窗口(左右分屏)

Lua
1
<cmd + d> -- 水平分屏

重新开一个iterm2窗口(上下分屏)

Lua
1
<cmd + shift + d> -- 垂直分屏

下面是一些mac常用的指法:

Bash
1
2
3
<control> + <d> 退出(logout),常用于服务器/虚拟机退出
<control> + <l> 等价于清屏命令clear
<control> + <c> 暂停,programmer都知道