簡簡單單的 Vim 就很好
當你用 —clean
選項啟動 Vim 時,它以 「素」 模式展示 Vim。沒有插件、沒有配置,一切回到了最初。多年來,我收集了一堆配置語句,其中一些可以追溯到 MS-DOS 或 Windows 3.1 時期。我是這樣打算的:從頭開始,只用 Fedora 35 中可用的插件,找到一個好的配置起點。我可以在一周的編碼生活中生存下來嗎?我會找到答案的!
規則是這樣的:儘可能少的配置語句,並且只使用 Fedora 35+ 中的插件。順便說一下,如果你不是 Fedora 用戶,也請繼續閱讀。你可以隨時從你的操作系統軟體包管理器手動安裝或者使用 Vim 插件管理器安裝這些插件。
在我開始之前,有一個大問題需要解決:用 Vim 還是 Neovim(Vim 的一個復刻)。好吧,這由你決定。這篇文章中的所有內容應該對兩者都適用。然而,我只用 Vim 測試過。當你登錄到一個只有 vi
可用的伺服器時,所有的這些技能都會派上用場。它可以是一個舊的 UNIX 系統、一個安裝了最少的軟體以提高安全性的 Linux 伺服器、一個容器中的互動式 shell,或者一個空間寶貴的嵌入式系統。
閑話少說,下面是我提煉出來的使用 Vim 進行編碼的絕對最低限度的東西:
# dnf install --allowerasing vim-default-editor
vim-enhanced
vim-ctrlp
vim-airline
vim-trailing-whitespace
vim-fugitive
vim-ale
ctags
不要擔心 —allowerasing
選項。在確認之前,只需查看一下安裝的東西。這個選項的作用是告訴軟體包管理器把現有的 nano-default-editor
包替換為 vim-default-editor
。這是一個小軟體包,它在 shell 配置文件中將 EDITOR
環境變數設置為 vim
,如果你想默認使用 Vim(例如,與 git
一起使用),這是必須的。這是專門針對 Fedora 的。你不需要在其他發行版或操作系統上這樣做,只要確保你的 EDITOR
shell 變數被正確設置就行。
概覽
簡單介紹一下我認為好的、乾淨的插件集:
- CtrlP:儘可能小的模糊查找插件(純 vimscript)
- Fugitive:一個 git 的必備工具
- Trailing-whitespace:顯示並修復(刪除)尾部的空格
- Airline:一個改進的狀態行(純 vimscript)
- Ale:在你打字時高亮顯示錯別字或語法錯誤
- Ctags:不是 Vim 插件,但卻是一個非常需要的工具
還有其他的模糊查找插件,如 command-t 或我最喜歡的 fzf.vim
(非常快)。問題是,fzf.vim
不在 Fedora 中,而我想要儘可能少的配置。CtrlP 就可以了,而且配置它更容易,因為它不需要什麼依賴。
如果讓我選擇一個絕對最小的配置,那就是:
# cat ~/.vimrc
let mapleader=","
let maplocalleader="_"
filetype plugin indent on
let g:ctrlp_map = '<leader><leader>'
let g:ctrlp_user_command = ['.git/', 'git --git-dir=%s/.git ls-files -oc --exclude-standard']
set exrc
set secure
但這可能太極端了,所以這裡是一個稍大的配置,下面是我的詳細解釋:
" vim: nowrap sw=2 sts=2 ts=2 et:
" leaders
let mapleader=","
let maplocalleader="_"
" filetype and intent
filetype plugin indent on
" incompatible plugins
if has('syntax') && has('eval')
packadd! matchit
end
" be SSD friendly (can be dangerous!)
"set directory=/tmp
" move backups away from projects
set backupdir=~/.vimbackup
" fuzzy searching
let g:ctrlp_map = '<leader><leader>'
let g:ctrlp_user_command = ['.git/', 'git --git-dir=%s/.git ls-files -oc --exclude-standard']
nnoremap <leader>b :CtrlPBuffer<cr>
nnoremap <leader>t :CtrlPTag<cr>
nnoremap <leader>f :CtrlPBufTag<cr>
nnoremap <leader>q :CtrlPQuickfix<cr>
nnoremap <leader>m :CtrlPMRU<cr>
" buffers and quickfix
function! ToggleQuickFix()
if empty(filter(getwininfo(), 'v:val.quickfix'))
copen
else
cclose
endif
endfunction
nnoremap <leader>w :call ToggleQuickFix()<cr>
nnoremap <leader>d :bd<cr>
" searching ang grepping
nnoremap <leader>g :copen<cr>:Ggrep!<SPACE>
nnoremap K :Ggrep "b<C-R><C-W>b"<cr>:cw<cr>
nnoremap <leader>s :set hlsearch! hlsearch?<cr>
" ctags generation
nnoremap <leader>c :!ctags -R .<cr><cr>
" per-project configs
set exrc
set secure
使用逗號作為引導鍵
我喜歡把我的 引導鍵
映射成逗號 ,
,而不是默認的反斜杠
看起來很合適。。當你的手處於書寫位置時,它是 Vim 中最接近的自由鍵。另外,這個鍵在大多數鍵盤布局中都是一樣的,而
在每個型號或布局都不一樣。我很少使用
本地引導鍵,但下劃線
_
延伸閱讀:
- 參見 Vim 參考手冊 中的
:help map-which-keys
。 - 參見 Vim Tips Wiki 中的 Vim 中未使用的鍵。
文件類型和關閉語法高亮
接下來是非常重要的 filetype
命令。看,Vim 自帶「內置電池」,8.2 版本包含 644 種語言的語法高亮,251 個文件類型定義(ftplugins
),以及 138 種語言的縮進規則。然而,縮進在默認情況下是不啟用的,也許是為了給所有人提供一個一致的編輯體驗。我喜歡啟用它。
一個簡單的技巧:如果你正在編輯一個非常大的文件,並且 Vim 感覺很慢,你可能想禁用語法高亮來加快速度。只要輸入 :syn off
命令即可。
延伸閱讀:
Matchit 插件
Vim 甚至額外帶有使得一些功能不兼容的插件,其中一個相當有用。它就是 matchit
插件,它使按下 %
鍵可以在某些語言中查找匹配的括弧。通常情況下,你可以找到一個塊的開始或結束(開始和結束括弧)或 HTML 匹配標籤及類似的。
延伸閱讀:
- 參見 Vim 參考手冊 中的
:help matchit
。
交換文件
我想從我的舊配置中保留的許多設置之一是使用 /tmp
進行交換,並在我的家目錄的一個單獨目錄中創建備份,你需要用 mkdir ~/.vimbackup
來創建這個目錄。重要的是要明白,當你開始編輯時,Vim 會創建一個名為 「交換文件」 的副本,所有未保存的工作都會保存在這個文件中。所以即使停電了,你的交換文件也包含了大部分未保存的工作。我更喜歡使用 tmpfs
,因為我所有的筆記本電腦和伺服器都有 UPS 保護,而且我經常保存。另外,大多數情況下,你會使用到交換文件是當你的 SSH 連接丟失而不是由於停電時。對於大文件來說,交換文件可能相當大,我很珍視我的固態硬碟,所以我決定這樣做。如果你不確定,可以刪除這句話,使用 /var/tmp
,這樣更安全。
延伸閱讀;
- 參見 Vim 參考手冊 中的
:help swap-file
。
模糊尋找插件
現在,模糊查找是一個我不能沒有的插件。在伺服器上當你每天需要打開 20 個文件時,使用 :Ex
或 :e
或 :tabe
等命令打開文件是沒問題的。而當編碼時,我通常需要打開數百個文件。正如我所說,CtrlP 很好地完成了這項工作。它很小,沒有依賴性,純 Vim。它用 Ctrl + P
組合鍵打開,這對我來說有點奇怪。我知道一些著名的編輯器(我記得是 VSCode)使用這個組合鍵。問題是,這已經是很重要的 Vim 綁定鍵,我不想覆蓋它。所以對我來說,贏家是 引導鍵 + 引導鍵
(逗號按兩次)。
ctrlp_user_command
只是改變了 CtrlP 獲取文件列表的方式。它不使用內置的遞歸文件列表(glob),而是使用 git ls-files
,這通常更好,因為它忽略了 .gitignore
中的東西,所以像 node_modules
或其他可能拖慢列表的不相關目錄不會受到影響。
使用 引導鍵
+ B
/T
/F
/Q
/M
來打開緩衝區、標籤、當前文件的標籤、快速修復緩衝區和最近使用的文件的列表,非常有用。具體來說,一旦你用 ctags
生成了標籤列表,這基本上就是數百種編程語言的「去……定義處」,而且不需要插件!這都是 Vim 內置的。現在澄清一下,當我說輸入 引導鍵 + B
時,是指按下逗號,然後按 B
鍵,而不是像用 Control
或 Shift
那樣一起按。
延伸閱讀:
- 參見 Vim 參考手冊 中的
:help Explore
。 - 參見 ctrlp.vim GitHub。
緩衝區管理
雖然現在 Vim 支持標籤,但緩衝區管理是掌握 Vim 的一個重要技能。我通常會有很多緩衝區,我需要經常做 :bdelete
。那麼,引導鍵 + D
似乎是一個不錯的選擇,可以更快地完成這個任務。我也喜歡關閉 Quickfix 窗口,所以也有 引導鍵 + W
的組合鍵,我在瀏覽搜索結果時經常使用這個功能。
延伸閱讀:
- 參見 Vim 參考手冊 中的
:help buffer-hidden
。
Ggrep 和 fugitive 插件
說到搜索,它和打開文件一樣重要。我希望能夠對代碼庫進行檢索。為此,有一個來自 fugitive 插件的很棒的 :Ggrep
命令,它使用 git grep
,忽略了垃圾文件,只搜索 Git 中的內容。由於 Shift + K
是 Vim 中的一個自由鍵,它非常適用於自動檢索游標位置的詞語。最後,能夠使用 引導鍵 + G
輸入任意的搜索模式也很好。注意,這將打開一個叫做 Quickfix 的窗口,你可以在這裡瀏覽結果、查看下一個/上一個/最後一個/第一個出現的地方,等等。這個窗口也用於編譯器或其他工具的輸出,所以要熟悉它。如果你對此感到陌生,我建議進一步閱讀文檔。
延伸閱讀:
- 參見 Vim 參考手冊 中的
:help quickfix
。 - 參見 vim-fugitive GitHub。
用 fugitive 進行搜索、檢索
順便說一下,用 /
鍵搜索是智能和大小寫敏感的,這意味著如果所有的搜索字元都是小寫的,Vim 的搜索會忽略大小寫。默認情況下,它會高亮顯示結果,我覺得我已經敲了無數次的 :noh
(來關閉高亮顯示)。這就是為什麼我有 引導鍵 + S
來切換高亮顯示。我建議以後也多讀讀手冊中關於搜索的內容。
接下來是搜索、檢索。fugitive 插件已經為你提供了。使用命令 :Ggrep pattern
來進行 git grep
,結果會進入 Quickfix 窗口。然後簡單地使用快速修復命令(:cn
、:cp
等等)瀏覽結果,或者簡單地使用 :CtrlPQuickfix
(引導鍵 + Q
)來直觀地滾動它們。CtrlP 的快速修復整合的酷炫之處是,你可以通過輸入以匹配文件名或內容來進一步在搜索結果中搜索。
延伸閱讀:
- 參見 Vim 參考手冊 中的
:help grep
。 - 參見 Vim 參考手冊 中的
:help noh
。 - 參見 vim-fugitive GitHub 。
Ctags
引導鍵 + C
可以生成一個 ctags 文件,以便更好地導航,這在處理一個新的代碼庫或做一個有很多跳轉的較長的編碼任務時很有用。ctags 支持數百種語言,而 Vim 可以利用所有這些知識來導航。後面會有更多關於如何配置它的內容。注意我已經討論過 引導鍵 + T
來打開所有標籤的模糊搜索,記得嗎?這兩個是非常相同的。
延伸閱讀:
- 參見 Vim 參考手冊 中的
:help ctags
。 - 參見 Universal Ctags 網站。
按鍵映射
能夠通過在項目目錄下創建一個 .vimrc
文件來覆蓋該項目中的任何設置是一個好主意。只要把它放在(全局的) .gitignore
中,以確保你不需要在每個項目中編輯成千上萬的 .gitignore
文件。這樣的一個項目的 .vimrc
可以是這樣的(對於使用 GNU Makefile 的 C/C++ 項目):
" coding style
set tabstop=4
set softtabstop=4
set shiftwidth=4
set noexpandtab
" include and autocomplete path
let &path.="/usr/local/include"
" function keys to build and run the project
nnoremap <F9> :wall!<cr>:make!<cr><cr>
nnoremap <F10> :!LD_LIBRARY_PATH=/usr/local/lib ./project<cr><cr>
正如你所看到的,我通常將 F2
到 F10
等鍵映射到編譯、運行、測試和類似的操作。用 F9
來調用 make
,聽起來不錯。還記得 MS-DOS 上的藍色 Borland IDE 嗎?
如前所述,在全局範圍內忽略 .vimrc
和(由 ctags
生成的)tags
是個好主意,所以不需要每次都更新 .gitignore
:
# git config --global core.excludesfile ~/.gitignore
# cat ~/.gitignore
/.vimrc
/tags
/TAGS
在我的個人配置中還有幾條只與那些非美國鍵盤布局的人有關(我用捷克語)。我需要用「死鍵」來輸入許多字元(LCTT 譯註:「死鍵」是一種通過將變音符號與後面的字母結合起來打出重音字元的方法。這種方法在歷史上被用於機械打字機),這根本不可能,我寧願輸入命令而不是按那些難以按下的組合鍵。這裡有一個解決問題的辦法:
" CTRL-] is hard on my keyboard layout
map <C-K> <C-]>
" CTRL-^ is hard on my keyboard layout
nnoremap <F1> :b#<cr>
nnoremap <F2> :bp<cr>
nnoremap <F3> :bn<cr>
" I hate entering Ex mode by accident
map Q <Nop>
延伸閱讀:
- 參見 Vim 參考手冊 中的
:help map
。
功能鍵在 Vim 中都是自由的,除了 F1
,它被綁定在幫助上。我不需要幫助,並不是說我已經會對 Vim 了如指掌,並不是。但如果需要的話,我可以簡單地輸入 :help
。而 F1
是一個關鍵的鍵,離 Esc
鍵如此之近。我喜歡將它用於緩衝區交換(:b#
),將 F2
/F3
用作下一個/上一個。你越是與緩衝區打交道,你就越需要這個。如果你沒有使用過 Ctrl + ^
,我建議你要習慣於它。哦,你有沒有醜陋地輸入 :visual
進入過 Ex 模式?許多初學者都不知道如何從該模式下退出 Vim。對我來說,這就是打擾,因為我很少使用它。
現在,熟悉 ctags
是成功使用 Vim 的一個關鍵因素。這個工具支持數百種語言,它不小心就為你不想創建標籤的文件創建它,因此我建議忽略典型的垃圾目錄:
# cat ~/.ctags.d/local.ctags
--recurse=yes
--exclude=.git
--exclude=build/
--exclude=.svn
--exclude=vendor/*
--exclude=node_modules/*
--exclude=public/webpack/*
--exclude=db/*
--exclude=log/*
--exclude=test/*
--exclude=tests/*
--exclude=*.min.*
--exclude=*.swp
--exclude=*.bak
--exclude=*.pyc
--exclude=*.class
--exclude=*.cache
Airline 插件
我一定不能忘記 Vim 的 Airline 插件。在 Fedora 的兩個插件中,這個插件很輕量級,不需要外部依賴,而且可以開箱即用我所有的字體。你可以定製它,而且還有主題之類的東西。我只是碰巧喜歡它的默認設置。
我必須提到,有兩個主要的 Ctags 項目:Exuberant Ctags 和 Universal Ctags。後者是一個更現代的復刻。如果你的發行版有,就用它。如果你在 Fedora 35+ 上,你應該知道你現在用的是 Universal Ctags。
總結
作為總結,我的建議是這樣的。盡量保持你的 Vim 配置流暢和乾淨。這將在未來得到回報。在我轉換到新配置之後,我不得不重新學習「寫入並退出」的命令,因為我總是不小心把它打成 :Wq
,而我在舊的配置里有一個「小技巧」,讓它實際上按我的意思工作。好吧,這個可能真的很有用,並能入選,我希望你能明白我的意思:
:command Wq wq
:command WQ wq
最後的一個快速技巧是:你可能需要經常改變你的默認 Vim 配置,來找到我在這裡向你介紹的和你自己口味之間的舒適區。使用下面的別名,這樣你就不需要一直搜索歷史。相信我,當一個 Vim 用戶在命令歷史裡搜索 「vim」 時,找不到什麼是相關的內容:
alias vim-vimrc='vim ~/.vimrc'
就是這些了。也許這可以幫助你在沒有大量插件的情況下在 Vim 的豐富世界遨遊。「簡簡單單」 的 Vim 也很不錯!
要嘗試你剛剛讀到的內容,請安裝軟體包並檢出這些配置:
test -f ~/.vimrc && mv ~/.vimrc ~/.vimrc.backup
curl -s https://raw.githubusercontent.com/lzap/vim-lzap/master/.vimrc -o ~/.vimrc
mkdir ~/.vimbackup
特別感謝 Marc Deop 和 Melanie Corr 對本文的審閱。
更新
我已經在這種配置下生存下來了!我唯一的糾結是 CtrlP 插件的結果順序不同。文件的模糊演算法與 fzf.vim
插件不同,所以我以前用各種搜索詞能找到的文件現在找不到了。我最後安裝了 Fedora 的 fzf 包以獲得更相關的文件搜索,它附帶了一個 vim 函數 FZF
,可以綁定到引導鍵組合上。請看我的 GitHub 倉庫 中更新後的配置文件。一路走來,我學到了很多東西。有一些鍵的綁定我已經忘記了,這要感謝許多插件。
這篇文章最初發表在 作者的網站 上,經許可後重新發表。
via: https://opensource.com/article/21/12/vanilla-vim-config
作者:Lukáš Zapletal 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive