不管學什么技術,我都深信概念是最重要的。是影響整個學習軌跡,決定能在這個技術領域高度。
當然如果你現在的目的不是在學習而在於解決問題(很多人不願意承認,或者沒發現),那概念就暫時沒那么重要了。
目的
弄清楚這些概念,有助於記憶,舉一反三。重復的東西只學一次!!
用鍵盤不用鼠標
第一關是理解vim的設計思路,vim設計之初就是整個文本編輯都用鍵盤而非鼠標來完成,鍵盤上幾乎每個鍵都有固定的用法。
具體有兩個要注意的建議:
學會盲打
如果你要低頭看着鍵盤打字,或者鍵位不熟悉,或者指法不舒服,那學習Vim 的好處不會立竿見影地顯現出來。要高效地使用Vim,必須學會盲打。
不要離開主鍵盤
手指千萬不要離開主鍵盤。很多人會說用光標鍵盤也沒事,偶爾用一下或者設置一下鼠標。
不離開的理由:任何操作通過鍵盤都是可以完成的,只是不知道或者不熟悉而已,只要練習這些時間最終是可以被消除的。而回來切這中間是需要時間的,這些時間再怎么練習也是不可避免的。
組合式的設計理念
vim的學習,特別像漢字學習或者linux學習,通過組合。漢字你只要記幾個部首和意義字,很多你沒學過字組合在面前也能看得懂。linux,只要記住基本的命令,通過組合可以實現強大復雜的功能。
所以重點在於,通過各個維度划分快捷成獨立概念。然后在操作的時候通過組合的方法去思維。
每個快捷即是獨立概念
這里要描述的是概念,所以不會窮舉快捷。具體的快捷到時會打散到各個模式里的常用操作。
比如:
- 表示動作的有: d(刪除),m(移動),co(復制),s(替換),y(復制)等
- 表示移動的有:$(詞尾),0(詞首),w|b|e(詞),G(行),h|j|k|l(方向)等
- 表示重復的量詞:n(表示任何正數)
組合這些概念來完成命令
有一句話:越簡單越靈活,實現的能力越強大。這是因為組合的存在。
比如:
- "dd" 刪除當前行
- "3dd" 刪除三行
- "d$" "d"表示刪除,$"代表行尾,刪除到行尾的內容(包含光標);
- "dw" 表示刪除一個單詞
- "dG" 表示刪除到文件末尾
- "dff" 表示刪除到第一個f
正則表達式
vim的操作核心是文本,既然是文本必須會提到正則。如果正則不熟悉,那很多地方是很糾結的。
這里只描述vim使用正則的場景。這里我划分的是兩大塊內容:通過正則匹配定位到文本,然后通過動作去操作。
想了解更多正則,可以參考下面資源:
應用場景
- 查找(閱讀):/|?
- 替換:s
- 刪除:d
- 拷貝:co
- 移動:m
更細則的東西將在normal模式里記敘。
所有重復都可以被解決
本質上講,我們的工作是重復性的。不論是在幾個不同的地方做相同的小改動,還是在文檔的相似結構間移動,我們都會重復很多操作。凡是可以簡化重復性操作的方式,都會成倍地節省我們的時間,都會被vim解決。
下面的舉例只為說明問題,可能還不是最佳的方案。
文本操作
vim通過:.命令,;命令,量詞,history,宏,vimscript等手段來實現消除重復操作。
但是消除這些重復的關鍵是以下的思想
不要自我重復
舉例說明:
//有以下的文本 //要實現的效果,每行遞進縮進一行。 Line one Line two Line three Line four //千萬不要這么操作 //>G //j >G //j >G //j >G //上面的做法不斷再重復>G這兩個操作。 //合理一些的操作是 //>G //j . //j . //j . //當然再合理一些是用宏錄制或者還有其他辦法
只要是重復的任何操作都可以被解決。這點非常重復!
絕不多使用一個命令
舉例說明:
//現在光標在行中間,但是發現行尾沒有分號,或者說這行暫時不需要想給注釋掉。 //千萬不要這么做 //移動$|0 //按i //輸出符號 //合理做法 //直接使用I|A //輸出符號
只要一個命令可以完成的,堅決不使用二個或者多個命令。換句話說,每一個vim命令都是有原子的獨立的概念,請最終獨立記憶。
使修改可重復
舉例說明:
//給+號左右都多加一個空格 var foo = "method(" + argument1 +","+argument2+")"; //千萬不要這么做: //f+ //i空格->(移動光標)空格 //f+ . //f+ . //合理作法: //f+ //s空格+空格 //f+ . //f+ .
首先,第一種使用了光標移動,這是很費時的,因為要在主鍵盤和光標區切換。其次也不能實現效果,因為.命令重復的是vim的操作,光標不包括在內。
所以很多時候要思考修改可被重復。
使移動可重復
上面的例子可以再簡化。;命令會重復上次查找。因此后面可以輸入兩次按;即可。
所以,盡量讓移動也可以重復。就可以使用;來簡化。
理想模式
;命令帶我們到下一個目標字符上,而.命令則重復上次的修改。因為連續輸入2次;.就可以完成全部。最理想的模式:用一鍵移動,另一鍵執行。
IDE操作|個性化操作
只要是重復的都可以被解決。上面說的是文本的重復操作解決方案。除了文本之外還有更多的重復。比如在不同使用功能時使用不同插件。根據自己的個人喜愛,把重復的設置通過配置文件來固化。
比如說
- 在標記快速定位,可以使用ctags插件等。
- 你不用每次都set nu,不用每次都設置縮進。
回退everything
當vim讓一個操作或者移動可以方便地重復時,我們經常會不小心操作太快過了頭。這時不用擔心,vim提供了強大的回退機制。
//目的 操作 重復 回退 //做出一個修改 {edit} . u //在行內查找下一指定字符 f{char}/t{char} ; , //在行內查找上一指定字符 F{char}/T{char} ; , //在文檔中查找下一處匹配項 /pattern<CR> n N //在文檔中查找上一處匹配項 ?pattern<CR> n N //執行替換 :s/target/replacement & u //執行一系列修改 qx{changes}q @x u
模式
Vim 提供一個區分模式的用戶界面,就是 說在Vim中按鍵盤上的任意鍵所產生的結果可能會不一樣,而這取決於當前處於哪種模式 (mode)。知道當前正處於哪種模式,以及如何在各模式間切換,是極其重要的。在后面的系列文章中,這個是重中之重,也會圍繞着這些來記敘。主要記敘常用的4種模式。insert,normal,command-line,visual。
無處不在的help
有任何的不清楚或者想知道,都可以通過h: xx,來閱讀更詳細的幫助信息。
比如
- :h .
- :h ;
- :h vim-modes
還有一個快捷鍵,K(Shift+k),它能給出你光標上的文本的幫助信息。
vim統一概念很多,不可能一下子所有列舉出來。會在后面的文章邊學習邊總結邊補充。如果大家有什么好的想法也歡迎一起探討。