MacVim (iterm2/tmux) 绑定 alt/meta

art*_*ave 2 macos vim macvim

我有一套很好的 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
Run Code Online (Sandbox Code Playgroud)

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

PS“左选项键充当”+Esc在 iTerm 会话键首选项中设置为

LMu*_*vey 5

在搜索了大量的问题和答案后,我把这个扔在这里。这个解决方案对我来说适用于 iTerm2 + Mojave。

\n\n
    \n
  1. iTerm2中中,转到首选项 -> 配置文件 -> 密钥。在右下角,更改左(或右)选项键以触发 Esc+ 序列而不是 Meta/Normal。
  2. \n
  3. 将以下代码放入您的 .vimrc 中:
  4. \n
\n\n
execute "set <A-j>=\\ej"\nexecute "set <A-k>=\\ek"\n\nnnoremap <A-j> :m .+1<\nnnoremap <A-k> :m .-2<\ninoremap <A-j> <Esc>:m .+1<CR>==\ninoremap <A-k> <Esc>:m .-2<CR>==\nvnoremap <A-j> :m \'>+1<CR>gv=\nvnoremap <A-k> :m \'<-2<CR>gv=gv\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是在做什么?

\n\n

诚然,我的理解力并不大。当您向终端发送ALT+j命令时,iTerm 将接收它作为^[j转义序列。当将其映射到 Vim 时,^[最终结果为\\e. 如果您想仔细检查您的ALT+j(或ALT+k)正在触发的内容,请sed -n l在终端窗口中键入,然后点击ALT+j\xe2\x80\x93 您应该看到以下输出:^[j

\n\n

这些execute set命令是重新映射<A-j><A-k>映射以便 Vim 触发^[j/^[k匹配 iTerm 触发的内容。

\n\n

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

\n