【问题标题】:MacVim (iterm2/tmux) bind alt/metaMacVim (iterm2/tmux) 绑定 alt/meta
【发布时间】:2012-03-01 17:08:27
【问题描述】:

我有一套很好的 vim 映射

" Drag Current Line/s Vertically
nnoremap <M-j> :m+<CR>
nnoremap <M-k> :m-2<CR>
inoremap <M-j> <Esc>:m+<CR>
inoremap <M-k> <Esc>:m-2<CR>
vnoremap <M-j> :m'>+<CR>gv

我无法在 Mac/iTerm2/Tmux/vim 组合上工作。我猜的问题是 Alt 键没有被映射。

附:在 iTerm 会话密钥首选项中,“左选项键充当”设置为 +Esc

【问题讨论】:

  • 我至少可以确认这不适用于 OSX10.6/iTerm2/tmux/vim over ssh(来自 putty),但适用于 WindowsXP/GVim。
  • 所以这没有意义——因为在那个设置中 putty 将是我的终端,而不是 iTerm2。我确实在家里运行了 iTerm2,但这不是我测试的一部分。

标签: macos vim macvim


【解决方案1】:

在浏览了大量的 SO 问题和答案后,我将其扔在这里。该解决方案适用于 iTerm2 + Mojave。

  1. iTerm2 中,转到 Preferences -> Profile -> Keys。在右下角,更改左(或右)选项键以触发 Esc+ 序列而不是 Meta/Normal。
  2. 将以下代码放入您的 .vimrc 中:
execute "set <A-j>=\ej"
execute "set <A-k>=\ek"

nnoremap <A-j> :m .+1<
nnoremap <A-k> :m .-2<
inoremap <A-j> <Esc>:m .+1<CR>==
inoremap <A-k> <Esc>:m .-2<CR>==
vnoremap <A-j> :m '>+1<CR>gv=
vnoremap <A-k> :m '<-2<CR>gv=gv

这是在做什么?

诚然,我的理解不是很好。当您向终端发送ALT+j 命令时,iTerm 将接收它作为^[j,这是一个转义序列。将其映射到 Vim 时,^[\e 结束。如果您想仔细检查ALT+j(或ALT+k)的触发方式,请在终端窗口中输入sed -n l,然后点击ALT+j——您应该会看到以下输出:^[j

execute set 命令正在重新映射 &lt;A-j&gt;&lt;A-k&gt; 映射,以便 Vim 分别触发 ^[j/^[k 以匹配 iTerm 触发的内容。

这为我解决了这个问题,我现在可以像专业人士一样移动线块。希望它对某些人有所帮助(抱歉我的解释乏善可陈——仍在学习 Vim 生态系统)。

【讨论】:

    【解决方案2】:

    我已经完成了some real life tests regarding this exact issue。我的临时和非权威性结论是/是使用&lt;M-&gt; 的映射在 iTerm2 中不起作用,应该使用替代解决方案。

    我使用&lt;leader&gt;

    【讨论】:

    • 我只是在没有 iTerm2 的情况下尝试过。在 tmux 会话中使用 putty SSH 到 OSX10.6,vim 将不允许映射。这应该可以有效地消除 iTerm2 作为罪魁祸首。
    • 你的问题和另一个问题都是关于 iTerm2 中的 Vim 的,但罪魁祸首是 Vim 不能很好地与 shell 发送的 Meta 键配合使用。。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多