我可以在Vim中映射Alt键吗?


90

我试图映射到.vimrc,将以下行添加到了它,但是它不起作用。我检查了.vimrc是由Vim加载的。

map <Alt-D> <C-D>

此映射中有任何错误吗?


您是在终端机上还是在gui版本(gvim,macvim)中使用vim?
Nick Knowlson

还要注意,如果encoding在映射运行后所做的更改,从Alt键中得到的内容可能与您最初设置的内容不符。
dash-tom-bang

Answers:


136

对于在那里的Mac用户:为了映射ALT + hjkl,请改用生成的真实字符(在INSERT模式下使用组合查找哪个字符),例如,使用键盘,我得到:

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

等等。发现的解决方案在这里在计算器上。

我使用它在.vimrc上使用ALT + k \ j上下移动行:

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

这里解释。

希望它有用,请享受Vim :)

Dylan_Larkin的补充(2019年):要在Mac上运行,必须在终端->首选项->键盘中关闭使用选项作为元密钥


10
这就是我来这里的目的(Alt + HJKL移动拆分)!谢谢!
Jamie Schembri 2013年

6
使用找出字符是一个简单的方法cat。只需cat在猫窗口内键入所需的组合键即可。在我的Mac上发现alt +中括号是'和'。
dvcrn 2014年

4
当Alt + HJKL在拆分之间移动时,这非常有用,我的手指喜欢它!!nmap ˙ <C-w><Left> nmap ¬ <C-w><Right> nmap ˚ <C-w><Up> nmap ∆ <C-w><Down>
约翰·莫拉莱斯

3
这些精确的映射可能无法在OSX的未来版本中按预期方式工作。用sed -n l看的输出的<Ak>并在配置映射之前<AJ>。在我的情况下,<Aj>是且<Ak>是˚
luk3thomas

4
在macOS上,当Use Option as Meta Key在iTerm上进行设置或配置时,配置文件⌥ key to Esc+将按照传统方式运行(例如在Linux / Unix上)。因此,您无需在Vim上将map设置为<^[j>,只需将其映射到<A+j>or即可<M+j>
goetzc

40

:help key-notation描述了用于映射不同键的格式。如果是alt,则可以使用<A-<M-。所以你的映射是

map <M-d> <C-d>

我也建议您使用(例如)的nore变体:mapnoremap除非您明确希望允许重新评估右侧的映射。


1
这仍然没有任何效果。Alt + D输入仍然向Vim输入一些奇怪的字符。
汤姆森

9
那是一个单独的问题。您的终端正在向Vim发送一个多字节字符,而Vim不知道将其解释为<A-d>。你可能需要更改终端设置,使其发出<A-d><Esc>d
jamessan 2011年

1
@jamessan如何在iterm2上执行此操作?
Finn

33

我不确定是否“可能”了。请阅读下面的更新。

是的,您甚至可以在终端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>
    

了解了它是如何工作的,您可以将此“技巧”扩展为其他“奇怪”的组合,例如,我正在使用白蚁,而vim则无法识别<S-F1>,使用cat I get ^[[1;2P。然后,在我的vimrc中执行:execute "set <S-F1>=\e[1;2P",然后可以将其映射到任何内容。

注意:我不知道为什么,但是对于某些使用\<Esc>work代替的人\e


更新(2016年2月)

根据您的终端运行的terminfo,也许您可​​以...在大多数终端中,例如,“ alt + h”被映射到^[h,即:“ escape + h”。因此它可能会覆盖密钥。我刚刚尝试(再次),它似乎可以工作,但是我认为这是一个非常容易出错的错误实现。

不过,为了足够勇敢,这里有一个实验性插件:


除了这些execute "set...东西,您可以直接使用set <M-d>=^[d。该^[实际上是进入了一个转义字符C-v-Esc。这在rxvt / urxvt中是必需的,但是xterm不需要特殊处理。有关此主题的更多信息,请参见vim Wiki
米卡·艾略特

是否有类似的方法可以与tmux一起使用,以便可以绑定Md?
乔治

2
对我来说,<Esc>那么d现在做同样的事情<Alt>+ d。此外,你可以做到这一点与一行Ctrl-v<Esc>这里
Sparhawk

24

在Mac OSx上的Vim中映射Alt键:

首先查看终端发送给vim的密钥代码:

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

在上面的示例中,我运行了命令并按Alt + Left

^[[1;9D被发送到VIM逃脱的序列,因此我们可以通过用户对于我们的映射。

map <Esc>[1;9D 

3
如果您使用的是iTerm2应用程序,则最好在“配置文件”>“密钥”中检查密钥的映射方式。
fikovnik '17

1
使用iTerm2中配置的向左键OptionEsc+,我可以映射alt+q到退出vim: nnoremap <silent> <Esc>q :qa!<cr>
ryenus

如果转到“首选项”>“配置文件”,选择当前的配置文件,转到该配置文件的“键”选项卡,并将“左⌥键”的选项更改为“ Esc +”(可用),也可以设置iTerm2以使用该重映射。选项是“普通”,“元”和“ Esc +”)。
Giovanni Benussi

12

使用:

map <A-D> <C-D>

请参阅:help key-notation


1
看来这仍然行不通。Alt + d将向Vim输入一个奇怪的字符,与unmap情况相同。
汤姆森

为我工作(我gvim在Windows上使用)
Deqing

8

您的终端可能无法“正确”发送Alt-D。您可以使用CV实际将实际的转义序列发送给Vim,并使用它来创建映射。即,编辑您的.vimrc并通过键入以下序列“ CV Alt-D”来替换实际的代码,以便在vimrc中具有正确的转义序列。如果您的终端没有向Vim发送任何内容,那将无法正常工作。


8

我的终端会生成^[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键映射。


1

作为针对Mac用户的Bruno回答的后续措施,请尝试确保将选项键映射到Esc+

这将使您A在Vim中的option()键具有“正常”的行为。

例如,在中iterm2,可以在以下位置找到此选项Preferences > Profiles > Keys

iterm2首选项截图


我还必须将配置更改为nnoremap <Esc>j :m .+1<CR>==和类似的...
mihaipopescu

0

您好,经过多年在Mac上进行的所有上述测试之后,没有好的解决方案,我一直在寻找。

这是我的解决方案:

要创建包括Alt的组合击键,您必须在首选项>键盘中声明该组合,并在vim设置文件中使用该组合(选中use选项作为meta键)。

输出必须是一个不寻常的字符(a例如,否),这样您就不会覆盖常规字符。

在下面的示例中,您应该能够充分利用ALT-Up。

vim设置: vim设置

Mac设定: mac设置

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.