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

Tho*_*son 82 vim

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

map <Alt-D> <C-D>

这个映射有什么错误吗?

Bru*_*tti 121

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

<ALT+j> ==> ª
<ALT+k> ==> º
Run Code Online (Sandbox Code Playgroud)

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

我使用它在ALT + k\j上上下移动线,在我的.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
Run Code Online (Sandbox Code Playgroud)

为解释在这里.

希望它有用,享受Vim :)

ADDENDUM BY Dylan_Larkin(2019):为了在Mac上工作,必须在终端 - >首选项 - >键盘中关闭 " 使用选项作为元键 "

  • 这就是我来这里(Alt + HJKL移动分裂)!谢谢! (8认同)
  • 找出它是哪个角色的简单方法是使用`cat`.只需键入`cat`并在cat窗口内输入您想要的组合键.发现我的mac上的alt +括号是'和'. (6认同)
  • 这很好,因为Alt + HJKL在分裂之间移动,我的手指喜欢它!`nmap˙<Cw> <Left>nmap¬<Cw> <Right>nmap˚<Cw> <Up>nmapΔ<Cw> <Down>` (4认同)
  • 在未来版本的OSX中,这些精确映射可能无法正常工作.在配置映射之前,使用`sed -nl`查看<Ak>和<Aj>的输出.在我的情况下,<Aj>是"Δ"而<Ak>是"˚" (3认同)
  • 听起来很古怪,这实际上是正确的.谢谢串! (2认同)
  • @MicahElliott:我实际上同意你的观点,但是请记住他的问题差不多2年了,我的实际上只是Mac用户的补遗:问题已经回答了,我不知道为什么它现在被接受了.无论如何,关于SO的好处是pablox的答案在这里,每个人都可以阅读它,如果有人发现它相关可以投票(就像我刚才那样,BTW).在一天结束时,唯一真正重要的是互相帮助.:) (2认同)
  • 在macOS上,当将“使用选项用作元密钥”或在iTerm配置文件中将“ +”键设置为Esc +时,其行为将与传统方式相同(例如在Linux / Unix上)。因此,您无需在Vim上将地图设置为`&lt;^ [j&gt;`”,只需将其映射到`&lt;A + j&gt;`或`&lt;M + j&gt;`即可。 (2认同)

jam*_*san 39

:help key-notation描述了需要使用什么格式来映射不同的键.在alt的情况下,您可以使用<A-<M-.所以你的映射就是

map <M-d> <C-d>
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个单独的问题.你的终端正在向Vim发送一个多字节字符,Vim不知道将其解释为"<Ad>".您可能需要更改终端的设置,以便将"<Ad>"作为"<Esc> d`发送. (9认同)
  • 这仍然没有任何影响。Alt+D 输入仍然向 Vim 输入一些奇怪的字符。 (2认同)
  • @jamessan 如何在 iterm2 上做到这一点? (2认同)

Pab*_* C. 28

我不确定是否"可能"了.请阅读以下更新.

是的,你甚至可以在终端vim,但没有真正捕获所有的答案.你基本上必须遵循两个步骤:

  1. 确保<M-d>符号存在,并准确映射终端输入的内容(^[是转义字符):

    $ cat
    ^[d
    $
    
    " in your .vimrc
    execute "set <M-d>=\ed"
    " you have to use double quotes!
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将某些内容映射到新创建的组合:

    noremap <M-d> :echo "m-d works!"<cr>
    
    Run Code Online (Sandbox Code Playgroud)

了解它是如何工作的,你可以将这个"技巧"扩展到其他"奇怪"组合,例如,我使用白蚁,而vim无法识别<S-F1>,使用我得到的猫^[[1;2P.然后,在我的vimrc中我做:execute "set <S-F1>=\e[1;2P"然后我可以将它映射到任何东西.

注意:我不知道为什么,但对于一些使用\<Esc>作品的人来说\e.


更新(2016年2月)

根据你的终端运行的terminfo,也许你可以...在大多数终端中,例如,"alt + h"映射到^[h,"escape + h".所以它可以覆盖密钥.我刚刚尝试(再次)它似乎工作,但我相信这是一个非常错误和容易出错的实现.

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

  • 你可以直接使用 set &lt;Md&gt;=^[d`,而不是 `execute "set...`。`^[` 实际上是用 `Cv-Esc` 输入的转义字符。这是必要的在 rxvt/urxvt 中,但 xterm 不需要特殊处理。有关此主题的更多信息,请参见 [vim wiki](http://vim.wikia.com/wiki/Get_Alt_key_to_work_in_terminal)。 (2认同)
  • 对我来说,`<Esc>`然后`d`现在与`<Alt>`+`d`做同样的事情.另外,您可以使用`Ctrl-v`,`<Esc>`按照[here](http://stackoverflow.com/a/16600458/1944384)在一行中执行此操作. (2认同)

lfe*_*445 20

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

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

$ sed -n l
^[[1;9D 
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我运行命令并按下Alt + Left.

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

map <Esc>[1;9D 
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用的是iTerm2应用程序,最好检查密钥在配置文件>密钥中的映射方式. (3认同)

Ben*_*oit 11

使用:

map <A-D> <C-D>
Run Code Online (Sandbox Code Playgroud)

:help key-notation.


axe*_*ung 10

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

A这将为您提供Vim 中选项 ( ) 键的“正常”行为。

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

iterm2 首选项屏幕截图


mb1*_*b14 8

您的终端可能无法"正确"传输Alt-D.您可以使用CV实际获取发送到Vim的实际转义序列,并使用它来创建映射.即,编辑.vimrc并通过键入以下序列"CV Alt-D"替换实际值,这样您就可以在vimrc中获得正确的转义序列.如果您的终端不向vim发送任何内容,那将无效.


lak*_*tak 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
Run Code Online (Sandbox Code Playgroud)

添加到.vimrc以修复所有alt键映射.