如何让 tmux 中的 Vim 中的 shift+箭头和 ctrl+箭头起作用?

如何让 tmux 中的 Vim 中的 shift+箭头和 ctrl+箭头起作用?

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

我曾经有

export TERM='xterm-256color'

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

我又补充说

set -g xterm-keys on

然后,带修饰符的键盘快捷键在 Vim 中就可以正常工作了。即:shift+left/right我将其映射到切换 Vim 选项卡,ctrl+up/down将其映射到移动(“气泡”)行,以及shift+left/right在命令行模式下按单词跳转(例如,当输入类似 的内容时)的开箱即用功能:e foo bar baz

但是,这种设置存在一个问题,即 Vim 背景颜色仅显示在文本后面,如上所述这里

所以我删除了

export TERM='xterm-256color'

来自我的.bashrc,而是把这个放在我的.tmux.conf

set -g default-terminal "screen-256color"

这修复了 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>

这使得快捷方式可以工作,但感觉这不是正确的解决方案。有人能告诉我这里发生了什么以及如何修复它吗?

答案1

您需要设置tmux窗口选项xterm-keys,以便tmux会将这些密钥传递到其终端。您可能希望将其放入~/.tmux.conf

set-window-option -g xterm-keys on

Vim当 TERM 为 -something 时,通常会自动设置对这些键的处理xterm,但由于 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

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

答案2

正如这里解释的那样,禁用背景颜色擦除(BCE)通过清除t_ut终端选项(:set t_ut=在 Vim 中运行,然后按Control+L刷新终端的显示),以便在 tmux 和 GNU 屏幕内部使用 Vim 时配色方案正常工作。

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

相关内容