標籤:

為什麼vimrc設置inoremap <c-h> <left>無效?

inoremap & &

inoremap & &

inoremap & &

上面3個都正常,為何inoremap & &無效,效果為刪除


很簡單,因為你的終端軟體(Xshell, SecureCRT)有些老,默認配置是按下&鍵以後

發送的是:^H (ASCII 碼 0x08),而 ^H在你的 Vim 里被你 inoremap 成 & 了,所以你按了&會被認為按下了左鍵。

早在 VT100終端時代,^H(ASCII碼 0x08)表示& 而 ^? (ASCII碼 0x7f)表示&。過去 0x7f是留給 DELETE鍵使用的。而到了 VT220時代,DELETE已經變為 ^[[3~ (ASCII 碼 0x1b, 0x5b, 0x33, 0x7e 共4個位元組),而 ^? 的 0x7f 換給了我們的&,有些老點版本的終端軟體,默認 &還是使用 VT100的 ^H,比如 Xshell 4 Build 0142以前的版本,默認&是發送^H。SecureCRT直到6.x版本還在默認發送 VT100的 ^H。

你需要做的就是改一下終端默認配置而已,大部分不那麼陳舊的終端軟體,如今都是默認VT220的標準,比如 Xshell4 Build 0142及以後的 Xshell5,Putty,Mac下面的 Terminal.app, iTerm2,Ubuntu下面的 gnome-terminal,他們都是把 & 發送成 ^?

你可以在你服務端下面查看下默認的鍵位設置:

$ stty -a

現在所有 Linux伺服器的 erase (bs)基本都是 ^? 了(如果鏈接到非 Linux老操作系統 erase不是這個的話,需要改一下,可以在系統層改,也可以vim裡面 set t_kb=...),Vim裡面也是認可 ^?的,可老舊的終端軟體卻默認發送 ^H,不過好在他們都支持修改:

Xshell 老版本的修改方法:把&設置成 127,而 &設置成 VT220 Del

SecureCRT 6 的設置方法:Backspace sends delete

Putty好像是默認 ^?的,不過你需要確認一下:

Mac 下 Terminal.app 默認是發送 ^? 的,你可以確認一下這勾沒打(mac下bs叫做delete)

而 iTerm2中也確認一下 「Delete key sends ^H」 前面的勾沒打

好了,默認 Vim 同時識別 ^H(ASCII 碼 0x08)和 ^?(ASCII碼 0x7f) 都把這兩個當成&,現在我們統一把終端軟體的 &改為 0x7f以後,^H 的 0x08就空出來給我們 noremap了:

noremap & &
noremap & &
noremap & &
noremap & &
inoremap & &
inoremap & &
inoremap & &
inoremap & &
cnoremap & &
cnoremap & &
cnoremap & &
cnoremap & &

其實這樣映射是有好處的,有時候就想在插入模式下移動一小下,真沒必要 &跳出。

命令模式下,這樣移動也是有好處的,因為進場敲 Ex命令時都是按上,把上一條弄出來,移動下游標修改下,然後回車,這下 Ex命令模式下 直接 &把上一條顯示出來,然後& 和&左右移動修改。當然你也可以map成 emacs格式,為了保持一致性,Command/Normal/Insert/Visual我都做了這個設置。

可能你會問,NORMAL下面的 & 之類的不是覆蓋給窗口移動 &h 了么?這個看個人意願了,比如你可以把你的窗口移動改為 &h, &j, &k, &l 四個鍵,向右移動窗口時normal下先按&再按L,多順暢?

如果擔心覆蓋了原生 & & & &的話,我們看看原生這幾個鍵是做啥的。

:help index

上面這條命令會列出 Vim裡面所有默認按鍵的含義,平時推薦多看看:

CTRL-H 同 &一樣功能,我們都是直接用 &沒人CTRL-H的,直接覆蓋掉

CTRL-J 同回車(有兩個碼 0x0d 或 0x0a),C-J是0x0d,硬回車是0x0a,沒人按這個,覆蓋。

CTRL-K 輸入 digraph,比如可以用來輸入歐洲文字,不需要,實在需要可以把這個功能挪給 INSERT模式下的 CTRL-B (空閑),或者 && ,完全可以覆蓋。

CTRL-L 重繪,很少用,自己可以把他挪到 &r 之類的鍵去多乾淨,覆蓋。

好了,看看上面這四個鍵基本都是些無關痛癢的功能,完全可以覆蓋之。

當然,對於需要用 & 進行 digraph 輸入符號或者日文的同學,推薦改為& (其實是CTRL和減號一起按下):

inoremap & &

好了,因為本來 & 是用來處理從右向左的文字的(阿拉伯語,希伯來語,波斯語)我們不需要,所以覆蓋之用來輸入符號,原來輸入 "&ko" 插入的是 "こ" ,現在改成了 "&ko" 而已。

--

相關閱讀:Skywind Inside " Vim 中正確使用 Alt映射

--


謝邀;

問題無法重現,懷疑是某插件或設定項導致。您可以試試關掉所有插件再 map,是可以的:

$ vim -u NONE&

:set nocp

:inoremap & &

ia quick brown fox jumps over the lazy dog.&&...

為了定位到衝突的位置,set vbs=1 之後,:imap &回車,可以看到當前的映射是在哪兒設定的,可能會有幫助。

最後,i_CTRL-K 原本是用於輸入 digraph 的,i_CTRL-L 用於切換模式(平常倒是用不太到),而且很多插件都會自己 map 一些 Ctrl 修飾的快捷鍵。鑒於此,很多 vimmer 在處理你這樣的需求時,是用的 & 修飾鍵(PC 鍵盤上也就是 Alt),如果衝突問題不好解決,可以換用 Meta 鍵方案。需要注意的是,Meta 會被系統捕獲,比如窗口菜單快捷鍵,這可以通過關掉菜單快捷鍵或者直接取消菜單來做到。


我大概兩年多前,遇到了同樣的問題,然後一直沒解決,也就放棄了,後來在修改一個插件的時候,意外發現插件裡面把C-H映射成刪除了,所以注釋之,就改好了。這個插件是autocomplete,代碼文件位於autoloadacp.vim,查找C-h可以看到有做這個映射。


推薦閱讀:

vim顯示^@是什麼意思啊?
VIM如何永久性顯示行號?
Vim 和 Emacs 都用過兩年以上的人,說說它們使用起來感覺最大的區別是什麼?
你用vim還是xcode寫iPhone程序代碼?

TAG:Linux | Vim | vimrc |