2011-09-21 59 views
62

我試圖映射爲將下面的行添加到.vimrc,但它不起作用。我檢查了.vimrc是由Vim加載的。我可以在Vim中映射Alt鍵嗎?

map <Alt-D> <C-D>

有這個映射的任何錯誤?

+0

你是否在終端或gui版本(gvim,macvim)中使用vim? –

+0

另請注意,如果您的'encoding'在映射運行後發生變化,您從Alt鍵獲得的內容可能與您最初設置的內容不匹配。 –

回答

99

Mac用戶那裏:映射ALT + hjkl,改用產生真正的字符(找出使用組合,而在插入模式字符),例如用我的鍵盤,我得到:

<ALT+j> ==> ª 
<ALT+k> ==> º 

等。 在StackOverflow上找到解決方案here

我用這個用ALT + K \Ĵ向上和向下移動線,採用這對我的.vimrc:

nnoremap ª :m .+1<CR>== 
nnoremap º :m .-2<CR>== 

inoremap ª <Esc>:m .+1<CR>==gi 
inoremap º <Esc>:m .-2<CR>==gi 

vnoremap ª :m '>+1<CR>gv=gv 
vnoremap º :m '<-2<CR>gv=gv 

的解釋here

希望這是有用的,享受在Mac OSX的Vim的Vim的:)

+7

這就是我到這裏來的(Alt + HJKL移動分割)!謝謝! –

+6

找出它是哪個字符的簡單方法是使用'cat'。只需輸入'cat'並在貓窗口內輸入所需的組合鍵即可。發現在我的Mac上alt +括號是'和'。 – dvcrn

+3

這個效果很好,按Alt + HJKL在分割之間移動,我的手指愛它!'NMAP˙ NMAP¬ NMAP˚ NMAPΔ' –

9

用途:

map <A-D> <C-D> 

:help key-notation

+1

看來這仍然不起作用。 Alt + d會向Vim輸入一個奇怪的字符,這與unmap大小寫相同。 – Thomson

+0

適用於我(我在Windows上使用'gvim') – Deqing

34

:help key-notation描述了需要使用哪種格式來映射不同的密鑰。在alt的情況下,您可以使用<A-<M-。所以,你的映射會

map <M-d> <C-d> 

我也建議使用nore變種:map(例如,noremap),除非你明確要允許右手側進行重新評估的映射。

+0

這仍然沒有任何效果。 Alt + D輸入仍然向Vim輸入一些奇怪的字符。 – Thomson

+9

這是一個單獨的問題。您的終端正在向Vim發送多字節字符,而Vim不知道將其解釋爲''。您可能需要更改終端的設置,以便發送''作爲' d'。 – jamessan

+1

+1提示無數變體。 – Benoit

8

您的終端可能無法正確傳輸Alt-D。您可以使用C-V將實際的轉義序列發送給Vim,並使用它創建映射。即,編輯您的.vimrc ,並通過輸入以下序列「C-V Alt-D」來替換實際內容,以便在vimrc中擁有正確的轉義序列。如果你的終端不向vim發送任何東西,這將不起作用。

13

地圖Alt鍵:

開始通過查看你的終端發送到VIM關鍵代碼:

$ sed -n l 
^[[1;9D 

在上面的例子中,我運行了命令並按下了Alt + Left

^[[1;9D是發送給vim的轉義序列,所以我們可以將其用於我們的映射。

map <Esc>[1;9D 
+2

如果您使用的是iTerm2應用程序,最好檢查一下密鑰在配置文件>密鑰中的映射方式。 – fikovnik

21

我不確定是否「可能」了。請閱讀下面的更新。

是的,你甚至可以在終端vim,但沒有真正的捕獲所有答案。基本上,你必須遵循兩個步驟:

  1. 確保<M-d>符號存在,並且準確地映射你的終端輸入(^[是轉義字符):

    $ cat 
    ^[d 
    $ 
    
    " in your .vimrc 
    execute "set <M-d>=\ed" 
    " you have to use double quotes! 
    
  2. 一些映射到新「創建」 組合:

    noremap <M-d> :echo "m-d works!"<cr> 
    

Unders如果它是如何工作的,你可以將這個「技巧」擴展到其他「奇怪」的組合,例如,我使用白蟻,vim不識別<S-F1>,使用貓我得到^[[1;2P。然後,在我的vimrc中:execute "set <S-F1>=\e[1;2P",然後我可以將它映射到任何東西。

注:我不知道爲什麼,但是對於一些人使用\<Esc>的作品,而不是\e


更新(2016年2月)

根據你的終端運行的terminfo,也許你可以...在最終端, 「ALT + H」,例如,被映射到^[h,這是:「逃生+ h」。所以它可以覆蓋鍵。我剛剛嘗試(再次),它似乎工作,但我相信這是一個非常錯誤和容易出錯的實現。

儘管如此,足夠勇敢,這裏是一個實驗性的插件:

+0

是否適用於插入模式映射? –

+0

而不是'執行'設置...'的東西,你可以直接使用'set =^[d'。'^ ['實際上是一個用'Cv-Esc'輸入的轉義字符。 rxvt/urxvt,但xterm不需要特殊處理。[vim wiki](http://vim.wikia.com/wiki/Get_Alt_key_to_work_in_terminal)有關此主題的更多信息。 –

+0

是否存在類似的方法可以和tmux一起工作,這樣Md就可以綁定了嗎? – George

5

我的終端會產生^[x命令(例如對於ALT-X)。是什麼讓這對Vim內部工作是這個小腳本vim.wikia.com

for i in range(97,122) 
    let c = nr2char(i) 
    exec "map \e".c." <M-".c.">" 
    exec "map! \e".c." <M-".c.">" 
endfor 

添加到.vimrc裏解決所有alt鍵映射。