我用Vim作為文字編輯器已有20多年了,但大約兩年前我決定將它作為我的主要文字編輯器。我使用Vim編寫程式碼,配置檔案,部落格文章等。Vim有很多很棒的功能,一旦你習慣了它,你就會變得非常高效。
一直以來,我都更傾向於使用Vim強大的原生功能,但是有許多開源的Vim外掛,可以改善你的工作流程,大大提高你的工作效率,以下是我個人認為最好用的5個Vim外掛
1. Auto Pairs
Auto pair外掛可以幫助插入和刪除對字元,如方括號,圓括號或引號。這對於編寫程式碼幫助很大,因為大多數程式語言在其語法中都要用到字元對 – 例如函式呼叫的括號或字串定義的引號。
在其最基本的功能中,會自動對輸入的起始字元插入相應的結束字元。例如,如果輸入左括號[,Auto-Pairs會自動插入右括號]。相反,如果使用Backspace鍵刪除左括號,Auto Pairs將刪除相應的右括號。
如果您啟用了自動縮排,則當你按Return / Enter鍵時,自動對將成對的字元插入正確的縮排位置,從而大大節省你的時間。
以如下這個Go程式碼塊為例:
package main
import "fmt"
func main() {
x := true
items := []string{"tv", "pc", "tablet"}
if x {
for _, i := range items
}
}
在專案後插入左大括號{,並按回車/回車會產生如下結果:
package main
import "fmt"
func main() {
x := true
items := []string{"tv", "pc", "tablet"}
if x {
for _, i := range items {
| (cursor here)
}
}
}
更多幫助你節約時間的功能,你可以透過檢視GitHub專案頁(GitHub地址:https://github.com/jiangmiao/auto-pairs)
2. NERD Commenter
NERD Commenter外掛向Vim添加了程式碼註釋功能,類似於整合開發環境(IDE)中的程式碼註釋功能。安裝此外掛後,你可以選擇一行或幾行程式碼,並快速將其更改為註釋。
NERD Commenter集成了標準的Vim filetype外掛,因此它可以理解多種程式語言,最簡單的入門方法是按Leader + Space切換當前已註釋和未註釋的行。標準的Vim Leader鍵是字元。
在檢視樣式下,可以選擇多行同時切換它們的狀態,其他一些有用的功能就是由Leader + cs觸發的以”性感”的方式註釋,這是一個用多行字元建立的一個漂亮的高階註釋區,例如:
package main
import "fmt"
func main() {
x := true
items := []string{"tv", "pc", "tablet"}
if x {
for _, i := range items {
fmt.Println(i)
}
}
}
選擇函式main中的所有行並按Leader + cs將產生以下註釋塊:
package main
import "fmt"
func main() {
/*
* x := true
* items := []string{"tv", "pc", "tablet"}
*
* if x {
* for _, i := range items {
* fmt.Println(i)
* }
* }
*/
}
由於所有行都在一個塊中進行了註釋,因此可以透過使用Leader + Space切換塊的任何行來取消註釋整個塊。可以說,NERD Commenter是任何使用Vim編寫程式碼的開發人員必備的。(GitHub地址:https://github.com/scrooloose/nerdcommenter)
3. VIM Surround
vim-surround一款強大的更改成對符號的Vim外掛,它類似於Auto pair,只不過它在插入文字時不工作,在編輯文字時更有用。例如:
"Vim plugins are awesome !"
當你的游標在句子的引號之間時,你可以按下組合“ds”來移除句子周圍的引號:
Vim plugins are awesome !
你亦可使用命令cs ‘ ‘將雙引號改為單引號:
'Vim plugins are awesome !'
或者使用命令cs'[改為方括號
[ Vim plugins are awesome ! ]
此外,這個外掛在處理HTML或XML標記時也很出色。如下HTML行:
<p>Vim plugins are awesome !p>
當游標位於該單詞的任何位置時,您可以透過按ysiw 組合來強調“awesome”這個單詞 :
<p>Vim plugins are <em>awesomeem>
!p>
Vim Surround還有許多強大的功能,你依然可以從GitHub獲得。(GitHub地址:https://github.com/tpope/vim-surround)
4. Vim Gitgutter
如果你使用Git版本控制,那麼Vim Gitgutter對你的幫助一定很大,它可以顯示git diff狀態,例如,將下麵的程式碼作為Git中提交的版本:
1 package main
2
3 import "fmt"
4
5 func main() {
6 x := true
7 items := []string{"tv", "pc", "tablet"}
8
9 if x {
10 for _, i := range items {
11 fmt.Println(i)
12 }
13 }
14 }
Vim Gitgutter在做了一些修改後,在gutter中顯示如下符號:
1 package main
2
3 import "fmt"
4
_ 5 func main() {
6 items := []string{"tv", "pc", "tablet"}
7
~ 8 if len(items) > 0 {
9 for _, i := range items {
10 fmt.Println(i)
+ 11 fmt.Println("------")
12 }
13 }
14 }
-符號表示在第5行和第6行之間刪除了一行。符號~表示修改了第8行,符號+表示添加了第11行。
5. VIM Fugitive
對於將Git納入Vim工作流程的任何人來說,Vim Fugitive是另一個很棒的外掛。它是一個Git包裝器,允許你直接在Vim執行Git命令並與Vim的介面整合。
下麵是一個使用Vim Fugitive的基本Git工作流示例。考慮到我們對第4部分Go程式碼塊所做的更改,您可以透過輸入命令:Gblame來使用git blame:
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 1 package main
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 2
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 3 import "fmt"
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 4
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│_ 5 func main() {
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 6 items := []string{"tv", "pc", "tablet"}
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 7
00000000 (Not Committed Yet 2018-12-05 18:55:00 -0500)│~ 8 if len(items) > 0 {
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 9 for _, i := range items {
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 10 fmt.Println(i)
00000000 (Not Committed Yet 2018-12-05 18:55:00 -0500)│+ 11 fmt.Println("------")
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 12 }
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 13 }
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 14 }
你可以看到第8行和第11行尚未提交。輸入以下命令檢查儲存庫狀態:Gstatus:
1 # On branch master
2 # Your branch is up to date with 'origin/master'.
3 #
4 # Changes not staged for commit:
5 # (use "git add ..." to update what will be committed)
6 # (use "git checkout -- ..." to discard changes in working directory)
7 #
8 # modified: vim-5plugins/examples/test1.go
9 #
10 no changes added to commit (use "git add" and/or "git commit -a")
--------------------------------------------------------------------------------------------------------
1 package main
2
3 import "fmt"
4
_ 5 func main() {
6 items := []string{"tv", "pc", "tablet"}
7
~ 8 if len(items) > 0 {
9 for _, i := range items {
10 fmt.Println(i)
+ 11 fmt.Println("------")
12 }
13 }
14 }
Vim Fugitive開啟另一個視窗,其中包含git status的結果。您可以透過在帶有檔案名的行上按下- 將檔案進行提交。您可以再次按-重置,更新最新狀態:
1 # On branch master
2 # Your branch is up to date with 'origin/master'.
3 #
4 # Changes to be committed:
5 # (use "git reset HEAD ..." to unstage)
6 #
7 # modified: vim-5plugins/examples/test1.go
8 #
--------------------------------------------------------------------------------------------------------
1 package main
2
3 import "fmt"
4
_ 5 func main() {
6 items := []string{"tv", "pc", "tablet"}
7
~ 8 if len(items) > 0 {
9 for _, i := range items {
10 fmt.Println(i)
+ 11 fmt.Println("------")
12 }
13 }
14 }
現在可以使用命令:Gcommit提交更改。
1 vim-5plugins: Updated test1.go example file
2 # Please enter the commit message for your changes. Lines starting
3 # with '#' will be ignored, and an empty message aborts the commit.
4 #
5 # On branch master
6 # Your branch is up to date with 'origin/master'.
7 #
8 # Changes to be committed:
9 # modified: vim-5plugins/examples/test1.go
10 #
將檔案儲存為:wq以完成提交:
[master c3bf80f] vim-5plugins: Updated test1.go example file
1 file changed, 2 insertions(+), 2 deletions(-)
Press ENTER or type command to continue
可以再次使用:Gstatus檢視結果,並透過:Gpush提交更新遠端儲存庫。
1 # On branch master
2 # Your branch is ahead of 'origin/master' by 1 commit.
3 # (use "git push" to publish your local commits)
4 #
5 nothing to commit, working tree clean
如果你想瞭解更多,可檢視GitHub詳情頁(GitHub地址:https://github.com/tpope/vim-fugitive)