it-swarm.cn

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

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

map <Alt-D> <C-D>

这个映射有什么错误吗?

80
Thomson

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

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

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

我使用它在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

正如解释 这里

希望它有用,享受Vim :)

ADDENDUM BY Dylan_Larkin(2019):为了在Mac上工作,“ 使用选项作为Meta Key ”必须转为 _ off _ in 终端 - >首选项 - >键盘

117
Bruno Belotti

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

map <M-d> <C-d>

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

39
jamessan

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

是的,你甚至可以在终端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我得到^[[1;2P。然后,在我的vimrc中我做:execute "set <S-F1>=\e[1;2P",然后我可以将它映射到任何东西。

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


更新(2016年2月)

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

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

28

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

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

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

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

^[[1;9D是被发送到vim的转义序列,因此我们可以将其用于我们的映射。

map <Esc>[1;9D 
19
lfender6445

使用:

map <A-D> <C-D>

:help key-notation

10
Benoit

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

8
mb14

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

6
laktak