2011-09-21 911 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键映射。