缺點:同學沒法幫你調程式碼了
快速在考場上配置 vim
- 在使用者目錄建立
.vimrc; - 追加如下的配置:
so $VIMRUNTIME/vimrc_example.vim
" 使用空格代替 tab
set expandtab
" 控制縮排寬度
set tabstop=4
set softtabstop=4
set shiftwidth=4
" 自動縮排相關配置
set autoindent
set smartindent
set cindent
" 顯示行號相對行號
set number
set relativenumber
" 顯示狀態列
set laststatus=2
" 自動 cd
set autochdir
" 啟用滑鼠,注意,對 Windows 預設終端的支援不太好,推薦使用 gvim
set mouse=a
" C-s 儲存
nnoremap <C-s> :w<CR>
- 可選配置:
" 雙押退出編輯模式
inoremap jf <ESC>
inoremap fj <ESC>
" 對映按鍵 200ms 超時,預設是 1000ms,看自己的手速設定
set tm=200
" 根據語言配置
augroup LangSettings
autocmd BufRead,BufNewFile *.cpp
\ nnoremap <buffer><F9> :!g++ % -Wall -std=c++2a -o %<<CR>
\|nnoremap <buffer><F10> :!./%<<CR>
autocmd BufRead,BufNewFile *.py
\ nnoremap <buffer><F10> :!python %<CR>
augroup END
注意:
so $VIMRUNTIME/vimrc_example.vim主要完成了一些瑣碎的工作,如關閉相容模式,開啟filetype,調整backspace等。- 有些命令可以簡寫,如 expandtab = et,tabstop = ts, softtabstop = sts 等,通常來說只需要 1 分鐘左右就能配置好。
- 推薦使用多用
nore模式,除非你本身就希望遞迴執行按鍵。 - 使用 jf 和 fj 對映 ESC,而不是常見的 jk 的原因是 OI 中常常需要打
dijkstra。 - Windows 下
nnoremap <F10> :!./%<<CR>應該改為nnoremap <F10> :!%<<CR>。
快速入門 vim
vim 自帶了一個互動式的教程,終端執行 vimtutor 以閱讀。
vim 自帶的 help 永遠是學習 vim 最好的資料, vimcdoc.sourceforge.net 提供了一箇中文的 vim 文件。
vim 本身相當複雜,不熟練掌握幾十個命令就不能體現其優點,下面介紹幾個常用的東西。
概念
- buffer 是儲存所有開啟檔案及外掛顯示內容的東西。
- window 是包含 buffer 的檢視。
- tab 是包含 window 的容器,類似各種瀏覽器的標籤頁。
- register 是儲存文本的地方。複製貼上就是對 register 的操作。
說了跟沒說一個樣
控制 buffer
e開啟檔案bd關閉 bufferbn切換到下個 buffer,可以繫結成快捷鍵以方便使用buffers顯示所有 bufferbuffer + 檔名/編號可以跳轉到其他 buffer。
移動游標
| 鍵 | 效果 |
|---|---|
| hjkl | 左下上右 |
| w W | 跳到下一個單詞開頭 |
| e E | 跳到下一個單詞結尾 |
| b B | 跳到上一個單詞開頭 |
| ^ | 跳到“軟”行首 |
| 0 | 跳到“硬”行首 |
| $ | 跳到行尾 |
| C-u C-d | 向上翻半頁 |
| gg | 跳轉到檔案開頭 |
| G | 跳轉到檔案結尾 |
注:
- “軟”行首與“硬”行首的區別在於,前者指行中第一個可見字元,即不包括縮排,而後者指第一個字元包括縮排;
- web 和 WEB 的區別在於,前者只要是有運算子或空格就分一個詞,後者只有空格才會分詞。如下面的例子,假設游標在行首:
l o r e m ( i p s u m d o l o r )
w : 0 1 2 3 4
W : 0 1
普通模式進入編輯模式的幾種命令
| 鍵 | 效果 |
|---|---|
| i | 在游標左邊進入插入模式 |
| I | 在“軟”行首進入插入模式 |
| a | 在游標右邊進入插入模式 |
| A | 在行尾進入插入模式 |
| o | 先在游標下插入一行,在再那一行進入插入模式 |
| O | 先在游標上插入一行,在再那一行進入插入模式 |
| s | 先刪除指定字元,再進入插入模式 |
| S | 先清空當前行,再進入插入模式 |
撤銷命令
| 鍵 | 效果 |
|---|---|
| u | 撤銷最後一次修改 |
| U | 撤銷對整行的修改 |
| C-r | 反撤銷 |
分割視窗
- 使用
:split或:vsplit以水平/垂直分割視窗。 - 使用 C-w + h/j/k/l 以左下上右瀏覽視窗。
- 使用 C-w + H/J/K/L 以左下上右移動視窗。
- 使用 C-wC-w 以按照順序瀏覽視窗。
- 使用 C-w= 平均劃分視窗大小。
- 使用 C-w + -/+ 以減少/增加分割視窗的高度。
- 使用 C-w + </> 以減少/增加視窗寬度。
如果使用了 set mouse=a 則可以直接用滑鼠控制視窗大小,跳轉。
對映按鍵
前面 vimrc 也展示了,我們可以對映按鍵以簡化操作。
對於例子:nnoremap <C-s> :w<CR>
- 開頭的第一個
n表示該對映作用於預設模式(normal),其他常用模式有i(insert)、x(visual)、c(command)等。不寫表示作用於所有模式。 nore表示不遞迴,如果有imap a b和imap b c那麼按下 a 的效果就是 c。<C-表示 ctrl,<M-表示 Meta,shift 用大寫字母表示。
用 [n/i/x/v]unmap 取消對映。
許多終端對 Meta 支援不好,需要特殊配置: Skywind:終端里正確設定 ALT 鍵和 BS 鍵,然而 gvim 是支援的,開箱即用。配置好後十分方便,不會與自帶對映衝突。
可以在按鍵對映中用 <leader> 表示特殊的對映前置鍵,它預設為 \,可以用 let g:mapleader = '' 來配置。<leader> 開頭的對映也不會與自帶對映衝突。
縮寫
縮寫只能用於插入,替換,命令模式。
例子:iab #i #include 表示輸入 #i 後自動替換為 #include。
搜尋與替換
普通模式下鍵入 / 以搜尋。推薦 set hlsearch 和 incsearch
(如果應用了 vimrc_example.vim 就不用了)。
用 n/N 以跳轉到後/前一個匹配項。
在關鍵詞上按 #/* 前後匹配關鍵詞。
替換用 :s/匹配/替換/ 命令,表示將匹配串替換成替換串,預設作用於當前行第一個。在 s 前面加範圍,在最後一個 / 後加選項。
複製貼上
vim 的複製貼上是藉助 registers 實現的,你可以看 :registers 檢視暫存器中的內容。
y 表示將選中內容放入暫存器 "0,可以在 y 前鍵入暫存器名稱。如 "+y。大寫 Y 表示複製整行,yy 也是同樣效果。
p 表示把 "0 中內容貼上,同樣也可以附加暫存器名稱。大寫 P
是粘到游標前,小寫則粘到游標後。
在插入模式中用 C-r 加暫存器名稱(省略引號)可以插入暫存器中內容。
如果要複製到系統剪貼簿上,首先需要你的 vim 是有 +clipboard feature 的,然後暫存器 "+ 就是系統剪貼簿。
補全操作
選項 completeopt 提供了關於補全的配置,推薦直接用預設值,注意使用 C-y 確認選項,C-n 和 C-p 切換選項。當然你可以用:
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>"
以使用回車確認選項。
pumvisible() 用於判斷補全視窗是否顯示,使用了判斷,所以要加 <expr>。注意到這裡觸發按鍵是 CR, 如果補全視窗不顯示最終按下的也是
CR,所以這裡必須加 nore 防止遞迴。
關鍵詞補全
使用 C-n 或 C-p 啟用關鍵詞補全,如果函式名變數名較長,可以只打一段字首然後使用關鍵詞補全。
C-xC-n 和單獨的 C-n 的區別在於,前者補全內容來自所有 buffer,後者只來自當前 buffer。
行補全
對於某些重複出現的行,比如二分中的 int mid = (l + r) / 2 之類的,使用 C-xC-l 進行行補全。
檔名補全
在 freopen 中,為了防止輸錯檔名,可以考慮使用 C-xC-f 進行檔名補全。
vim 命令補全
在寫 .vimrc 時,使用 C-xC-v 進行 vim 命令補全。
其他技巧
快速註釋程式碼
使用 C-v 進入可視塊模式,用 jk 選擇需要(反)註釋的行,再按 I 到行首,新增(去掉)註釋符號,最後退出可視模式。
除錯技巧
vim 8.1 更新了 terminal,同時也帶來了基於 terminal 的除錯工具。
使用 packadd termdebug 啟用除錯工具,再用 Termdebug <程式名稱> 來除錯。
悲摧的是我們學校用的是 vim 8.0
考場之外
你還可以安裝外掛,進一步配置 vim。
嘗試 neovim
neovim 是 vim 的 fork,沒有了 vim 上個世紀九十年代遺留下來的歷史包袱,支援 lua,開發更加積極。
當然現在 vim 9.0 引入了新一代 vim9script,效能比以前更好,語義更加清晰現代,對於計算敏感的專案 vim9script 要比原先快許多,可以與 lua 打平。
安裝外掛
首先你需要個外掛管理器,常見的有:
如果是 neovim 推薦用 packer.nvim。
vim 有數以萬計的外掛,可以去 rockerBOO/awesome-neovim 或 vimawesome 尋找需要的外掛。
大部分外掛託管在 GitHub 上,為了提高安裝效率,通常推薦為 git 設定代理:
git config --global http.proxy "foo.bar"。
不推薦安裝太多的外掛,也不推薦安裝大量影響操作邏輯的外掛,防止產生過多的依賴性。
vim 有自己的一套哲學,如果你想通過外掛把 vim 配置成 vs,vscode,pycharm 等軟體的樣子的話,我推薦你直接使用這些 ide,再加個 vim 擴充套件。vim 的意義就在於它是一套在幾乎所有編輯軟體中都能用的操作邏輯,和它極高的自定義性。