如何在 tmux 中的 Vim 中使用 shift+arrows 和 ctrl+arrows?

Hen*_*k N 54 vim tmux modifier-keys

这一切都在 OS X 上的 iTerm2 中。

我曾经有过

export TERM='xterm-256color'
Run Code Online (Sandbox Code Playgroud)

在我的.bashrc. 这意味着 tmux 中的 Vim 确实使用了 256 种颜色。

一旦我添加

set -g xterm-keys on
Run Code Online (Sandbox Code Playgroud)

然后带有修饰符的键盘快捷键在 Vim 中运行良好。即:shift+left/right我映射到切换 Vim 选项卡,ctrl+up/down我映射到移动(“气泡”)行,并且shift+left/right在命令行模式下开箱即用以逐字跳转(例如,在键入类似的内容时:e foo bar baz)。

然而,这种设置有问题,即Vim的背景颜色只能说明后面的文字,提到这里

所以我删除了

export TERM='xterm-256color'
Run Code Online (Sandbox Code Playgroud)

从我的.bashrc,而不是把它放在我的.tmux.conf

set -g default-terminal "screen-256color"
Run Code Online (Sandbox Code Playgroud)

这修复了 Vim 的背景颜色,但破坏了键盘快捷键 - 他们做了意想不到的事情(移动光标,删除文本)。

通过使用ctrl+v插入来自组合键逐字输出(如描述在这里),我是能够解决它:

map [1;5A <C-Up>
map [1;5B <C-Down>
map [1;2D <S-Left>
map [1;2C <S-Right>
cmap [1;2D <S-Left>
cmap [1;2C <S-Right>
Run Code Online (Sandbox Code Playgroud)

这使快捷方式有效,但感觉不是正确的解决方案。谁能告诉我这里发生了什么以及如何解决它?

Chr*_*sen 84

您需要设置tmux窗口选项,xterm-keys以便tmux将这些密钥传递到其终端。你可能想把它放在你的~/.tmux.conf

set-window-option -g xterm-keys on
Run Code Online (Sandbox Code Playgroud)

当 TERM 是xterm-something 时,Vim通常会自动设置对这些键的处理,但由于 TERM 是screen-256color. 您可以~/.vimrc像这样手动配置这些键:

if &term =~ '^screen'
    " tmux will send xterm-style keys when its xterm-keys option is on
    execute "set <xUp>=\e[1;*A"
    execute "set <xDown>=\e[1;*B"
    execute "set <xRight>=\e[1;*C"
    execute "set <xLeft>=\e[1;*D"
endif
Run Code Online (Sandbox Code Playgroud)

至少这样您就不必映射所有不同的组合。

  • 谢谢你!这看起来比我的要好,我很欣赏这个解释。我所解决的一件事,但不是你的线路,是向上/向下箭头在 Command-T 插件中不起作用,如下所述:http://superuser.com/questions/237751/messed- up-keys-in-vim-when-running-inside-tmux 我刚刚从答案之一添加了“map &lt;Esc&gt;[B &lt;Down&gt;”。似乎是插件本身做出了一些错误假设的原因。 (2认同)

小智 11

如此处所述,通过清除终端选项(在 Vim 中运行,然后按+刷新终端显示)来禁用背景颜色擦除(BCE),以便在 tmux 和 GNU 屏幕中使用 Vim 时配色方案正常工作。t_ut:set t_ut=ControlL

这样,您可以保持正确键检测的TERM价值,xterm-256color同时也获得正确的 Vim 配色方案渲染!:-)

  • 这就是我完全改变的内容:https://github.com/henrik/dotfiles/commit/f8347e465fe9c4b9ff7ea211e2263d6e34ace9dd 颜色和修饰键似乎在 tmux 内外都运行良好。 (2认同)