2014-10-13 104 views
0

我正在與Cygwin/Mintty/Vim合作。我看到<C-S-c>編碼爲<83>。這意味着vim可以讀取它,我可以使用map命令映射它。vim <C-S-Key> mapping

不幸的是,如果我嘗試:

:inoremap <C-S-c> foobar 

它不工作...

我怎樣才能使它發揮作用,爲什麼Vim拒絕映射的Unicode keystokes?

同樣的問題爲<C-S-F1>。如果我執行以下命令:

:inoremap <C-S-F1> foobar 

我會得到這樣的事情:

[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~[20;5~ 

哪裏F1[1;5PF9[20;5~

回答

2

的Vim顯然不支持涉及控制異國組合鍵( <C-…>)。這包括F1 - 儘管你嘗試其他映射Ç支持(和相當於只用Ç來控制)。從上a forum thread 「Mapping ctrl-; (ctrl semicolon)」一個發佈者Tony Mechelynck

其可以可靠地使用Ctrl使用, 可預測的結果,在熟模式在任何操作系統上的唯一的可打印鍵,是那些由 ASCII定義,這意味着以下而不是其他:

  • ASCII字符0x40的至0x5F的(即大寫字母A到Z,加at符號,左支架,斜線,右支架, [插入符號]和下劃線六個 nonalpha字符),其中Ctrl減去0x40,從而將它們映射到到0x00到0x1F分別。這解釋了爲什麼Ctrl- [意思是Esc,Ctrl-I 表示Tab,Ctrl-M表示Enter,等等。
  • 小寫字母,其Ctrl對應項與 對應的大寫字母相同(因此Ctrl +字母和Ctrl +對於給定的字母,Shift +字母是 總是相同的)
  • 另外,Ctrl-?被映射到0x7F(DEL)。

的Vim可能會或可能不會看到其他Ctrl鍵組合,但是這取決於 終端上,而且在大多數情況下,它不會看到他們,或者用 別的東西混淆,如不按Ctrl相同的密鑰。

至於你<C-S-c>映射,我不完全知道爲什麼你可以看到<C-S-c><C-v>,但你不能映射。當我在MacVim(GUI)中測試時,當我嘗試<C-v><C-S-c>:inoremap <C-S-c> foobar時,得到字符^C。當我在OS X的終端中測試時,終端會吞下按鍵和嘟嘟聲,同時有<C-v>:inoremap。在這兩種情況下,<C-v>的行爲都與:inoremap一致,所以我不知道你爲什麼看到這種差異。

1

由於鍵盤輸入在內部處理的方式,現在這種情況通常不可能,即使在GVIM中也是如此。一些組合鍵,像按Ctrl +非字母不能被映射,並按Ctrl +信與按Ctrl ++信無法區分。 (除非你的終端發送了一個明確的termcap代碼,但大部分都沒有。)在插入或命令行模式下,嘗試輸入組合鍵。如果沒有任何事情發生/插入,則不能使用該組合鍵。這也適用於<Tab>/<C-I><CR>/<C-M>/<Esc>/<C-[>等(僅例外是<BS>/<C-H>)。這是一個已知的痛點,並在vim_dev各種討論和#vim IRC頻道的主題。

有些人(最重要的是Paul LeoNerd Evans)想要解決這個問題(甚至在支持這種終端的終端上使用Vim),並且提出了各種各樣的建議。 http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

但截至今日,還沒有補丁或志願者尚未出面,儘管許多人表示希望在未來的Vim 8主要版本中擁有此版本。

+0

謝謝,但你似乎把這個答案無處不在(你實際上回答三個不同的問題一樣)。有些地圖像''在我的vim中完美運行... – nowox

+0

對,我使用這個標準答案來說服Vim的創建者Bram來解決這個常見的疼痛和混亂問題。對不起「污染」你的問題;我希望你仍然從中獲得一些信息,儘管這不是解決問題的辦法。 –

+0

如果是爲了一個好的原因,我原諒你。我也問過這個問題。也許我們最好等待Neovim(http://neovim.org/) – nowox