標籤:

在 Vim 中移動游標需要先切換模式,是否很麻煩?


謝邀請;

首先我們直接一點,作為這個問題的「答案」,我給出的是,不覺得

然後,看到這個題目之後我最首先想到的,是下面這幾個「相關問題」,來大家一起感受下:

+ 在使用 Emacs 的時候,每次想上下左右還要一起按住 Ctrl/Meta 修飾鍵,不覺得很麻煩嗎?

+ 在使用(大部分)其他編輯器的時候,每次想上下左右/定位游標還要把手挪到編輯鍵區按游標鍵或者去摸滑鼠,不覺得很麻煩嗎?

麻煩!果斷很麻煩!為毛編輯器就不能我想到哪兒就把游標放在哪兒?!退而求其次,就算盯著某個地方眨兩下眼再把游標移過去也比這些省事兒啊!

我不知道現在有沒有實用的腦電/眼球跟蹤類型的編輯器,僅就最常見的這三大編輯器(Emacs、

Vim、et al.)的三種風格,咱們看看怎麼樣能相對不麻煩。

1. 普通編輯器(Notepad++,UltraEdit,Sublime Text,TextMate,Kate,GEdit et al.),無模式,鍵盤按鍵直接表示字元,通過 Ctrl/Alt/Shift 修飾鍵與普通鍵的不同組合(組合鍵)和菜單、滑鼠等提供功能調用,於是因為組合鍵的數量限制(並且為了方便記憶,不是所有組合鍵都提供),其內置的功能數量受到限制。以移動游標為例,由於游標鍵的存在,為了節省組合鍵,一般不提供移動游標的組合鍵,於是移動游標要通過游標鍵或滑鼠操作。這兩個都要求手離開鍵盤主鍵位很遠的位置,效率低,步驟繁;

2. 神之編輯器(Emacs 家族,以 GNU Emacs 為代表)。針對以上缺點,如果能充分利用組合鍵來保證手的位置盡量不離開主鍵區,還要保證組合鍵能提供足夠多的功能,——讓你來設計,會是什麼類型?Emacs 選擇了「組合鍵與按鍵的序列」這一霸氣側漏的解決方案。然而,這種解決方案對於只有兩隻手的人類而言太不友好,雙手既要照顧打字又要按修飾鍵調用命令,在 Emacs 腳踏板推廣之前,或者在人類進化出三隻手之前,這款編輯器只有「神」能用的比較溜,而很多想修鍊成仙的凡人最終走火入魔傷了手指/手腕。不過,用組合鍵移動游標,已經可以讓手留在主鍵區「不動」,但組合鍵的操作本身就已經具有一定難度(更何況現在經常是組合鍵的組合 XD),所以,也不算是最優方案。

3. 模式編輯器(Vi-家族,以 Vim 為代表,部分其他編輯器提供基本的 Vi-mode),區分不同模式可以使得同樣的按鍵在不同模式下具有不同的功能,從而最大限度地實現「用更少的按鍵序列完成更多的功能」這一目標。而不甚方便的地方就是,必須要經常在不同模式間來回切換。在插入模式,大部分鍵盤按鍵都對應可列印字元,應直接作為文本輸入而不是命令(退化成類似普通編輯器的狀態),於是插入模式下只有幾個特殊按鍵或者組合鍵來調用功能。Vim 選擇了 Esc 作為退回到普通模式的功能鍵,符合鍵名的意義,符合前述需求,放眼望去,我找不到比 Esc 更適於充當這個角色的按鍵了(順帶拉點兒仇恨,Emacs 把 Esc 當作粘滯版本的 Meta 鍵還真是蛋疼啊!Esc 不應該是「退回/取消」的意思喵?大家都是這麼用的啊,你腫么這麼特殊……)。唯一稍微不爽的是,現在的鍵盤布局中,Esc 離主鍵位稍遠了點兒。

優缺點對比:

1. 普通編輯器(普文二系列?):上手可用,功能可能不夠豐富,可定製性可能較差或者沒有;針對游標移動的方式,不用學習不用記憶直觀簡單但需要消耗更多 ATP 或者時間,有助於鍛煉上肢(尤其右臂)肌肉與靈活性;不良反應:可能引發滑鼠手;

2. Emacs 操作系統:下可做普通編輯器用,上可當操作系統,實乃居家旅行殺人越貨之神器……針對游標移動,BNFP 的位置與作用沒半毛錢相關性,需要學習(記憶到肌肉記憶)需要熟悉,關鍵組合鍵的操作更需要適應。有助於增強手指靈活性,鍛煉大腦運動皮層,延緩老年痴呆;不良反應與禁忌:可能引發手部疼痛,家族癲癇病史請在醫生指導下使用;

3. Vim:開模式就是史上最快編輯器,關模式也能秒殺大部分普通編輯器……針對游標操作,hjkl 已經成為一種行業標準(編輯器、閱讀器、瀏覽器、網頁……支持 hjkl 是一種時尚,來各位看官,試試關掉輸入法,按 j,k。NONONO 我是不會直接讓你們按 V 來騙贊的,——那種人簡直就是臭牛氓,不!明明就是臭牛氓!)。原因在於,這(基本上)就是右手基本鍵位啊!手本就該在這兒啊哪兒也不用動就可以了啊!(所以,乃們知道 Vim 黨有多懶了?XD)當然,喜歡用游標鍵又不是不可以(別告訴我你用的真的是 Vi ?_?)……這幾個鍵與方向本來是有關係的,不過現在,可以認為它們曾經是親戚就好了,需要學習和記憶但難度很低。Vim 的好處,熟悉之後它會讓你變得更「懶」,但表現出來是效率很高;不良反應:經常在某些地方輸入 jjjjjjjjj,經常去拍 Esc……

作為「二逼青年」 vim 黨,自然應該對 vim 再多說幾句:

前面提到,vim 插入模式下本身就是類似於普通編輯器,所以也支持游標鍵、滑鼠移動游標(由於手要換到較遠的位置,不建議使用);退回普通模式可以用 Esc,當然也可以用組合鍵。Vim 已經天然支持 Ctrl-[(按 Vim 字元的規則,這貨剛好是 Esc,正如 Ctrl-M 剛好是m Enter 一樣),所以可以用這個(本人認為不甚方便的)組合鍵來當作 Esc 用。這一招被很多 Vimmer 提到過,剛好本人持不同意見:Esc 雖然稍遠,拍過去並不需要費什麼勁,手的位置也基本不會變多少;組合鍵本來就不好按,更何況要用更加不靈活的小指,況且那個距離也不近(所以我會不小心按到 p 上)。至於看官您,it is up to you。 :)

當然,Vim/Emacs 更重要的是可定製,改造成自己任何想要的形式都成。嫌 Esc 之後 hjkl 麻煩,很多人用 imap 定義插入模式下游標移動的快捷鍵(比如 Meta-hjkl);喜歡 Emacs 的操作樣式也完全可以……這麼說吧,Vim 自己就可以支持普通編輯器的游標操作、Emacs 式、Vim 式。三大樣式都可以,不夠還可以自己加,——還會麻煩么?

另,某答案提到 Ctrl-C,作為 Vim 中度患者,奉勸您最好別拿 Ctrl-C 當 Esc 用,正如 exit() 不同於 return。Ctrl-C 類似一記中斷,打斷 Vim 的操作於是回到了解放前,而 Esc 是等操作結束回家休息,這能一樣么?知不知道 Vim 的自動命令有 InsertLeave 一說……

再另,i_Ctrl-O 是個好同志,用好了簡直是個神器!C,(注意!前方 Bug 多發路段請小心駕駛降低車速!)寫個函數(&<&>表示按鍵):

iint main()&iint argc, char * argv[]&o{}&i&&Oprintf();&h""&hhello world.
&oreturn 0;&

咦?好像什麼地方有點問題欸對不對?為毛有的 i_Ctrl-O 後面跟 i,有的跟 h 才行?……鑒於這個答案不是技術帖,只給個關鍵詞請各位看官自己尋找答案 XD [:h "ve"]

最後,Vim 黨經常提到,Vim 應該大部分時間處於普通模式而不是插入模式。這一點我覺得沒必要太絕對,比如上面的例子,整段輸入下來,沒太有必要停留在普通模式下。這時,簡單的命令只需要用 i_Ctrl-O 神鍵臨時切換,完了自己回到插入模式,比 Esc 再 i/a/o 什麼的方便很多。普通模式的要點在於,——當你停下,或者不知道幹嘛時,回到普通模式下。你也知道,如果啟用交換文件,它的更新是跟普通模式相關的。我的觀點是,讓 Esc 跟你的思維間隙對應。(於是真的就養成了隨手拍 Esc 的毛病啊 XD)

(PS,其實有時候我也覺得 Esc 稍微有點遠,不過起碼比 Ctrl 要好按就是了。咦?為毛 Space 要佔用這麼多 Space!割出一塊給閑著沒事幹的大拇哥按 Ctrl 鍵多好!順便 Esc 也可以拿下來了!咦這個叫 Caps Lock 的鍵占著這麼重要的地方幹嘛!一般又用不到它……媽蛋誰設計的鍵盤!拉過來彈丁丁!)


  • ctrl + [

  • ctrl + c
  • ctrl + o
  • inoremap jj &

用這幾個都可以進入正常模式,不需要esc,esc是很古老的方式了,感覺還好。


有了模式的存在,讓你在做操作的時候,不需要按組合快捷鍵了啊。

組合快捷鍵 和 模式之前的切換,VIM選擇了 模式切換。。。取捨問題。

你要是覺得這個事情麻煩,又要用編輯器寫代碼,那就用emacs吧。


其實正如題主所說,總是需要按esc確實麻煩,這也是我主要用emacs的原因。我大學本科有個同學好像自製了一個腳踏板用於替代esc,據說效果拔群,題主不妨一試。


可以自定義,把它map成了jj

具體操作是這樣的:

I set it up in my ~/.vimrc

imap jj &

遇到問題用英語搜一下,一定有答案。


這是你沒習慣,習慣以後這一切都是自然反應了,根本輪不到你的大腦去想,那時你自然就不會覺得麻煩了。

ESC:w


表示用習慣了可能就好了。反正我不覺得麻煩。。


麻煩。

所以我在插入模式下做了類似Emacs的鍵盤映射方案:

map! & &
map! & &
map! & &
map! & &
cmap & &
cmap & &
cmap & &

imap & &ea
imap & &b
imap & &cw
imap & &O
imap & &
imap & &
imap && (col(".")==col("$"))?"&":"&D"

為什麼是Emacs呢?因為這套方案不只適用於Emacs,而且適用於所有使用GNU readline庫的互動式命令行程序,比如bash、ipython等大多數linux程序。

完整的映射方案看這:luzhlon/.vim


vim擅長的是對文本進行精準地編輯,合理地運用宏可以提高編輯的效率。

vim的模式切換確實比較煩瑣,這是事實。


在你的vimrc中加上

inoremap jk &

這樣在輸入模式的時候連續按下j和k就可以退出輸入模式了,由於j和k組合很少會被用到,所以這樣做既方便又安全

可以參考我的設置https://github.com/DorianZheng/dotfiles


題主既然說「每次」,說明你還是把vim當成普通編輯器來使用,即一直停留在insert模式。正確使用vim的方法應該是,絕大部分時間裡都應該待在normal模式,只有確實需要打字的時候才進入insert模式,打完字應該立即回到normal模式。而normal模式上下左右移動就是hjkl,因為不用移動胳膊,所以比方向鍵還要方便。


在插入模式下,試著按下「alt+space」,也就是"Alt"鍵和空格鍵,就會進入普通模式。。。。。


推薦閱讀:

如何優雅地使用 Vim?
到底 VIM 能配置到多強大的程度?
你最愛的一個 Vim 命令是什麼?
為什麼vimrc設置inoremap <c-h> <left>無效?
vim顯示^@是什麼意思啊?

TAG:Vim |