標籤:

Vim 在插入模式下怎麼用 hjkl 控制方向?

最近在轉變到hjkl上面,發現在插入模式下不能用hjkl了,是必須要esc後移動操作嗎?


對真正的vim用戶來說,插入模式根本不存在,因此這個問題不存在。(當然,用Ctrl-O 再按 hjkl 是一種方法)

作為人腦而言,記憶當前模式並不會是個很愉快的經歷,你的操作很可能出錯。因此熟練之後都會把 vim 永遠保持在普通模式。所以,aprint& 這整個按鍵序列雖然涉及了進入插入模式,輸入字元,然後退出,但是你可以把他理解為一整個命令,在這個命令開始和結束的時候,你都一直停留在普通模式。

類似的,命令模式也不存在,因為 :w& 本身也可以成為一個命令的整體,你不必認為現在進入了命令模式,然後退出了命令模式,而認為 :w& 作為一個整體就是普通模式的操作。——當然,技術流派可能會把分號 ; 映射到冒號 : 因為很多時候,少按一個 shift 鍵將極大的減少出錯概率。

至於 esc 鍵的鍵程問題:真正糾結的的技術流可以把它跟 CapsLock 置換,這可以通過修改 X-Windows 配置來簡單的實現。而在我看來,這只是一個習慣問題,在鋼琴演奏中,比ESC更遠的大跳還有很多,如果你連鋼琴中的大跳都能夠準確演奏,那麼對於準確按ESC鍵然後回到原位來說應該不會是任何問題。


從插入模式進入到正常模式有很多方法的,esc是廣為人知的而已,其實最快的是&,還有其他的&,&,這三種使用起來,比Esc快多了,這些還是有一些區別的,C-c這個組合鍵會取消當前的任何操作,而C-[是比較標準的進入正常模式的按鍵,比如ACE的vim模式,就是用C-[來進入正常模式的。比如C-v,縱向選擇4列文字,然後輸入A,在第一行前面插入一個字元",這時候,使用C-c就進入正常模式,使用C-[也進入正常模式,不過區別是,你輸入的"在你前面選中的5行都會這麼一個字元。

說這麼多,最好使用正常模式來進行移動游標,進入正常模式不需要使用Esc的,而且最好不用Esc,Esc只是曾經的方案而已。

另外,在正常模式下,可以使用C-w來刪除一個單詞,C-u刪除一行,C-t縮進,不過上面那些鍵盤綁定也可以,我覺得使用vim自帶的一些功能就足夠用了。


最好別在插入模式下移動,應該回到normal模式(建議用ctrl+[). 之後你會有各種方法快速移動到相應位置(參考vim :help usr_03)


我的做法是修改插入模式的快捷鍵,好處是修改一些簡單錯誤的時候,不用長途奔襲到方向鍵,手可以一直保持在主鍵盤區。不過最常用的移動操作還是Esc退回到普通模式。

" insert mode shortcut

inoremap &< C-h &> &< Left &>

inoremap &< C-j &> &< Down &>

inoremap &< C-k &> &< Up &>

inoremap &< C-l &> &< Right &>

inoremap &< C-d &> &< DELETE &>


官方user文檔中提議用 &< CTRL-[ &> 來取代 &< ESC &> ,這個組合應該方便些。

另, &< CTRL-C &> 是不展開縮略詞直接退出insert模式,不過感覺縮略詞對中文用戶沒啥用吧


手動贊同 pansz 君一次

另外,需要指出的是hjkl這幾個移動常常是低效的,尤其是jjjjj或者是jjjjjjjjjjjjjjjjjjjjj這樣的移動

推薦閱讀 Habit breaking, habit making

不同於文章中的vim-hardmode插件,推薦使用這個插件 https://github.com/takac/vim-hardtime


auto.vim


esc有點遠,方向鍵也有點遠。有一種不錯的mapping就是:imap jj &< esc &> 。雙擊jj退出編緝模式,繼續用hjkl。


" Ctrl + H 游標移當前行行首

imap & &I

" Ctrl + J 游標移下一行行首

imap & &&I

" Ctrl + K 游標移上一行行尾

imap & &&A

" Ctrl + L 游標移當前行行尾

imap & &A

" Alt + H 游標左移一格

imap & &

" Alt + J 游標下移一格

imap & &

" Alt + K 游標上移一格

imap & &

" Alt + L 游標右移一格

imap & &


插入模式下不能用hjkl移動。

除非你不想通過直接按hjkl就輸入hjkl,這樣你需要自定義插入模式下的映射。


《UnixLinux大學教程》(Harley Hahn著,好書,可以當小說看)第513頁和第522頁里說了,1976年Vi發明人BillJoy使用的ADM-3A終端的鍵盤上的Esc鍵在現在鍵盤的Tab鍵的位置,而方向鍵剛好在HJKL上,所以他這就這麼規定了。


個人認為 ctrl+i 映射為 && 方便退回到普通模式,同時方便進行列補全

最重要的是,ctrl鍵一定要用左手右下角那塊肉來按,極為方便,如下圖所示:

(mac上可以用key4mac把fn的功能與ctrl互換)

同樣在普通模式修改

sl 設置為 / 方便向後搜索

s; 設置為 ? 方便向前搜索

sj 設置為 : 方便進入命令模式

sw 設置為 :sw& 方便存儲

把so設置為esc 方便退出搜索模式

因為如下圖,中間那一行按鍵是最方便,而且最快的,把sl設置為搜索使得能夠瞬間進入搜索模式,而且能夠立刻開始敲想要搜索的目標,這也是快速移動游標位置的好方法,把so映射為esc,

使得能夠快速離開搜索狀態。總得來看,s開頭的按鍵都會非常快。


插入模式下移動這個功能真的很有用,比如插入成對括弧。

插入模式中移動做好的典範是 Emacs,於是我琢磨出了:在 Vim 插入模式下使用 Emacs 按鍵

看這裡 http://log4d.com/2012/04/vim-emacs-key-binding/

ps: Shell 中的默認鍵綁定是 Emacs 方式,輸入習慣很統一。


ctrl-o hjkl


有一個比較簡單的方式是用AutoHotKey改鍵,局限是:

要麼是在Windows下用,比如裝了VsVim的Visual Studio.

要麼就是在SSH和虛擬機中的Linux按鍵用,這樣外面的按鍵映射裡面也能用上。

順便一提,把CapsLock改成ESC,簡直爽翻天。

CapsLock h:: ;|
if GetKeyState("control") = 0 ;|
{ ;|
if GetKeyState("alt") = 0 ;|
Send, {Left} ;|
else ;|
Send, +{Left} ;|
return ;|
} ;|
else { ;|
if GetKeyState("alt") = 0 ;|
Send, ^{Left} ;|
else ;|
Send, +^{Left} ;|
return ;|
} ;|
return ;|
;-----------------------------------o ;|
CapsLock j:: ;|
if GetKeyState("control") = 0 ;|
{ ;|
if GetKeyState("alt") = 0 ;|
Send, {Down} ;|
else ;|
Send, +{Down} ;|
return ;|
} ;|
else { ;|
if GetKeyState("alt") = 0 ;|
Send, ^{Down} ;|
else ;|
Send, +^{Down} ;|
return ;|
} ;|
return ;|
;-----------------------------------o ;|
CapsLock k:: ;|
if GetKeyState("control") = 0 ;|
{ ;|
if GetKeyState("alt") = 0 ;|
Send, {Up} ;|
else ;|
Send, +{Up} ;|
return ;|
} ;|
else { ;|
if GetKeyState("alt") = 0 ;|
Send, ^{Up} ;|
else ;|
Send, +^{Up} ;|
return ;|
} ;|
return ;|
;-----------------------------------o ;|
CapsLock l:: ;|
if GetKeyState("control") = 0 ;|
{ ;|
if GetKeyState("alt") = 0 ;|
Send, {Right} ;|
else ;|
Send, +{Right} ;|
return ;|
} ;|
else { ;|
if GetKeyState("alt") = 0 ;|
Send, ^{Right} ;|
else ;|
Send, +^{Right} ;|
return ;|
} ;|
return ;|
;---------------------------------------------------------------------o

完整的版本見另一個答案:

AutoHotKey 常用函數或小技巧有哪些分享? - 馮若航的回答


我萌新vimer,你可以選擇:

  • 按esc或者ctrl+[或ctrl+c回去(廢話)
  • 用箭頭符號按鍵(上下左右四個按鍵啦)
  • 按照高手們教的寫入.vimrc配置
  • 或者我發現可以alt+hjkl……

insertmode下你試試 alt+h/j/k/l/u/w/b/e/i/I/o/O/a/A/s/d/x/X/c/C/m///?等等

你也insert下可以用ctrl+a-z等鍵一個一個按,有的貌似看不懂什麼意思

我的沒有配置,原生vimrc,等號左邊insertmode ,沒說明的話右邊就是相當於normal mode下的按鍵作用.

alt+h/j/k/l = h/j/k/l

alt+u=u

alt+c/d=esc(就是alt+c或者d相當於Insert下按下esc)

alt+C=看不懂

alt+w/b/e=w/b/e

alt+o/O/i/I/a/A=o/O/i/I/a/A

alt+x/X=x/X

alt+/=/(進入Normal尋找模式)

alt+?=?(同上)

等等等等的,我是一個萌新,或許我亂說了:)


Mac 上在系統自帶的鍵盤設置裡面試著把「caps lock」的功能替換成「control」,會解鎖各種各樣新的姿勢喲,誰用誰知道,不僅僅是 Vim 裡面各種手勢便利……就目前來看,我覺得換成「control」的好處要遠多於想方設法換成「esc」……


建議將Esc和CapsLK鍵對調,這樣按起來比較舒服。

以前的鍵盤Esc鍵就在現在CapsLK鍵的位置上


看了這麼多答案真的很失望。沒有一個真正了解計算機歷史的,vim插入模式下應該映射成類似emacs下的快捷鍵。

可以參考這個插件:https://github.com/tpope/vim-rsi

你要問為什麼?你會發現以上的快捷鍵操在bash和很多gnu的工具上都有。這就是計算機歷史的一部分。


  1. 如果你真的想要在插入模式下使用ijhk來移動方向,可以參考iremap。但是作為一個vim老用戶不太建議這樣使用,vim和其他編輯器(比如emacs)最大的區別在於vim是一個模式編輯器。


推薦閱讀:

vimium 按F 怎么让它默认在后台打开新标签页?
如何使用vim整理聊天記錄?
如何在 Ubuntu 下正確顯示 vim-airline 的箭頭符號?
為什麼比起 Emacs,更多人使用 vim?
vim8發布有一年了,有沒有基於vim8新特性開發的黑科技插件?

TAG:Vim |