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

117

我尝试通过在.vimrc中添加以下行将<Alt+D>映射到<Ctrl+D>,但它不起作用。 我已确认Vim已经加载了.vimrc

map <Alt-D> <C-D>

这个映射有错误吗?


你是在终端中使用vim,还是图形界面版本(gvim,macvim)? - Nick Knowlson
请注意,如果在映射程序运行后您的编码方式发生更改,则 Alt 键输出的内容可能与您最初设置的不符。 - dash-tom-bang
在插入模式下,按下 control+v,然后按下你的组合键 alt+d,它应该会插入 ^[d。所以最终你得到的是 map ^[d <C-D> 或者其他什么的。请注意,直接打出 ^[d 并不能达到同样的效果。 - Reed
你的操作系统或终端模拟器(或两者都有可能)截取了你的 Alt-d 按键,并执行了一个没有可见变化的操作(新建书签?)。找到你的操作系统 系统设置->按键映射 工具,并删除所有与 Alt-d 相关联的按键映射。同样,在你的终端 设置->按键映射 中定义的按键绑定中也要这样做。现在,vim 就能接收你的 Alt-d 了。 - Eric Leschinski
10个回答

177

给Mac用户:如果要映射ALT+hjkl,请使用生成的实际字符(在插入模式下找出使用组合键生成哪个字符),例如,我的键盘可以得到:

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

等等,解决方案在StackOverflow上找到了这里

我在我的.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 :)

备注(2019年)由Dylan_Larkin补充:在Mac上,必须在“终端->首选项->键盘”中将“使用Option作为Meta键”关闭。

更新于09/2021

我最近从“英式”键盘切换到“ABC-扩展”键盘,并注意到此配置无法按预期工作。 作为替代方案,我将<up><down>键映射到执行相同操作(我想,这也解决了其他答案中所解释的大部分复杂性):

nnoremap <down> :m .+1<CR>==
nnoremap <up> :m .-2<CR>==

inoremap <down> <Esc>:m .+1<CR>==gi
inoremap <up> <Esc>:m .-2<CR>==gi

vnoremap <down> :m '>+1<CR>gv=gv
vnoremap <up> :m '<-2<CR>gv=gv

这对于初学者来说也是一种很好的方式,可以重塑使用箭头的习惯,并且学习更高效的 Vim 移动方式来浏览代码。 ;)

您可以通过完成过渡映射 <left><right> 来快速在选项卡之间移动:

您可以通过完成过渡映射 <left><right> 来快速在选项卡之间移动:

nnoremap <left> gT
nnoremap <right> gt

或者你喜欢什么(甚至像我一开始做的那样,使用了一个残酷的<NOP>)。


12
这正是我来这里的原因(使用Alt+HJKL移动屏幕分割)!谢谢! - Jamie Schembri
6
找出按键对应的字符,一种简单的方法是使用cat命令。只需在终端中输入cat,然后在cat窗口内按下想要查找的按键组合。我在我的Mac电脑上发现,alt键加方括号键会产生单引号和双引号符号。 - patchrail
4
这个操作可以很好地作为Alt+HJKL在分屏之间移动,我的手指非常喜欢它!nmap ˙ <C-w><Left> nmap ¬ <C-w><Right> nmap ˚ <C-w><Up> nmap ∆ <C-w><Down> - John Morales
4
这些确切的映射在未来的OSX版本中可能不能按预期工作。在配置映射之前,使用sed -n l查看<A-k>和<A-j>的输出。在我的情况下,<A-j>是,而<A-k>是˚ - luk3thomas
6
在 macOS 上,当设置Use Option as Meta Key或在 iTerm 配置文件中设置 ⌥ key to Esc+ 时,会像传统 Linux/Unix 系统一样工作。因此,您不需要在 Vim 中将映射设置为 <^[j>,只需将其设置为 <A+j><M+j> 即可正常工作。 - goetz
显示剩余16条评论

56

:help key-notation 描述了映射不同键所需使用的格式。对于 alt 键,您可以使用 <A-<M-。因此,您的映射将是

map <M-d> <C-d>

我还建议使用 nore 变种的 :map(例如,noremap ),除非您明确希望允许重新评估右侧进行映射。

我建议使用 noremap 替代 :map ,除非你想允许对于映射的右侧进行重新求值。


2
这仍然没有任何效果。Alt+D输入仍然会向Vim输入一些奇怪的字符。 - Thomson
13
那是一个独立的问题。你的终端向Vim发送了一个多字节字符,而Vim并不知道如何将其解释为 <A-d>。你可能需要更改终端的设置,以便将 <A-d> 发送为 <Esc>d - jamessan
3
@jamessan如何在iterm2上操作? - Finn
@jamessan 感谢。在Mac上,这个关键符号 <A-j> 在IdeaVim中运行得很好。 - Richard
2023年在neovim和NixOS 23.05上可用。 - undefined

46

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

是的,即使在终端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>
    

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

注意:我不知道为什么,但对于一些人来说,使用\<Esc>代替\e有效。


更新(2016年2月)

根据终端运行的terminfo设置不同,也许你可以...在大多数终端中,“alt + h”例如,被映射为^[h,即:“escape + h”。所以它可能会覆盖键。我刚刚尝试了一下,似乎可以工作,但我认为这是一个非常有错误和易出错的实现。

尽管如此,对于勇敢的人,这里是一个实验性的插件:


2
不必使用“execute“set...”这些东西,您可以直接使用“set <M-d>=^[d”。 “^ [”实际上是使用“C-v-Esc”输入的转义字符。在rxvt / urxvt中需要这样做,但xterm不应该需要特殊处理。有关此主题的更多信息,请参见[vim wiki](http://vim.wikia.com/wiki/Get_Alt_key_to_work_in_terminal)。 - Micah Elliott
是否有类似的方法可以在tmux中工作,例如绑定M-d? - George
3
对我来说,现在 <Esc> 然后 d 的效果和 <Alt>+d 相同。此外,你可以像这里所述那样使用 Ctrl-v<Esc> 来在一行内完成它。 - Sparhawk
我曾经遇到过vim-move [1]的问题,但这个解决方案终于解决了它——谢谢![1] https://github.com/matze/vim-move/issues/15 - Kipras Melnikovas

29

在Mac OSx上为Vim映射Alt键:

首先查看终端发送到Vim的按键代码:

$ sed -n l
^[[1;9D 
在上面的例子中,我运行了命令并按下了Alt + Left键。 ^[[1;9D是发送到vim的转义序列,因此我们可以将其用于我们的映射。
map <Esc>[1;9D 

4
如果您正在使用iTerm2应用程序,建议检查在“配置文件 > 键”中如何映射键。 - fikovnik
1
将左边的 Option 键 () 配置为 Esc+ 在 iTerm2 中,我可以将 alt+q 映射到退出 vim:**`nnoremap q :qa!`** - ryenus
您还可以设置iTerm2以与该重新映射配合使用,方法是转到“首选项”>“配置文件”,选择当前配置文件,转到该配置文件的“键”选项卡,并更改选项“左⌥键”为“Esc+”(可用选项为“Normal”、“Meta”和“Esc+”)。 - Giovanni Benussi

17

使用:

map <A-D> <C-D>

请参阅:help key-notation


1
似乎这仍然不起作用。Alt+d将向Vim输入一个奇怪的字符,这与取消映射的情况相同。 - Thomson
对我来说可以工作(我在Windows上使用gvim - Deqing
@Thomson,你的终端/konsole GUI 拦截了你的 Alt-d,并转发了一个不同的按键,可以通过进入终端->设置->键映射找到。你的 vim 命令完美运行,只是按键无法通过终端窗口传递。 - Eric Leschinski

11

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


10

作为对 Bruno 回答的跟进,对于 Mac 用户,尝试确保您的选项键映射为 Esc +

这将使 Vim 中选项 (A) 键的行为变得“正常”。

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

iterm2 preferences screenshot


我还不得不更改配置为nnoremap <Esc>j :m .+1<CR>==等等... - mihaipopescu

9
您的终端可能无法正确传输“Alt-D”键。您可以使用“C-V”命令来获取实际发送到Vim的转义序列,并使用它来创建映射。例如,编辑您的.vimrc文件并通过键入以下序列“C-V Alt-D”替换实际序列,这样您就可以在vimrc中获得正确的转义序列。如果您的终端不向vim发送任何内容,则此方法将无效。

3

在vim编辑器中输入以下命令,查找关键映射:

:help key-notation

它将显示所有按键映射。

输入图像描述

在我的Ubuntu系统中,Alt键的映射为<M-...>。您的版本可能有不同的映射。如果您也有相同的映射,则以下操作应该有效。

map <M-D> <C-D>

1

嗨,在经过多年测试所有以上方法都无法解决问题后,我继续搜索。

这是我的解决方案:

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

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

在下面的示例中,您应该能够使用 ALT-Up 退出 vim。

vim 设置: vim setting

mac 设置: mac setting


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接