如何让 vim 与 tmux 正常工作?

如何让 vim 与 tmux 正常工作?

我正在想办法如何聚vim在一起tmux玩。

我的问题是:当我使用时,xterm-256color我可以vim很好地工作,但背景无法正确渲染。

我通过使用修复了这个问题screen-256color。这看起来不错,但破坏了Ctrl + arrow keys(它们进入插入模式并删除 4 行)。我想使用这些映射来切换vim.

我该如何让它发挥作用?

答案1

为了获得最佳功能,需要正确设置多个级别的配置。

  1. 配置多路复用器来识别序列。启动前多路复用器,设置适合您的终端仿真器的 TERM 值(例如xterm-256color)。由 TERM 环境变量标识的 terminfo 数据库条目告诉多路复用器如何识别修改后的箭头键的序列(用户定义的功能 { kUP, kDN, kRIT, kLFT}{, 3.. 7})。
  2. 配置多路复用器来生成序列。将会话xterm-keys选项设置为on多路复用器当它接收到其 TERM 标识的序列时,将生成自己的 xterm 样式序列。在你的~/.tmux.conf

    set-option -g xterm-keys on
    
  3. 配置里面运行的程序多路复用器使用/期望其大部分序列。确保您screen在内部使用基于 - 的术语多路复用器(例如screen-256color)。这告诉里面运行的程序多路复用器如何控制多路复用器的终端(重新)仿真以及他们应该期望得到什么响应多路复用器
  4. 不幸的是,screen基于 terminfo 的数据库条目通常不会为修改后的箭头键定义任何序列(即它们可能没有kUP等等),因此内部运行的程序多路复用器可能不知道会出现这样的序列。您将需要手动配置任何您想要识别这些键的程序。在维姆,您可以将其放入您的~/.vimrc

    if &term =~ '^screen'
        " tmux will send xterm-style keys when xterm-keys 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
    

    如果您发现使用 -variant会导致正常的箭头键停止工作,您可能需要使用没有的变体x(即<Up>代替等)。<xUp>x

    像这样定义按键的优点是,您不必单独映射每个修饰符组合(Shift、Control、Contol+Shift、Meta、Meta+Shift、Meta+Control、Meta+Control+Shift);获得*特殊解释来处理所有相关序列(请参阅:help xterm-modifier-keys)。

  5. 然后您可以映射键而不是硬编码序列:

    nnoremap <C-Right> gt
    nnoremap <C-Left> gT
    

答案2

运行并按cat下相tmux关键以找出它们生成的转义码。对我来说,这给出了^[[D^[[C。然后直接映射这些转义码即可。

nnoremap ^[[D gT
nnoremap ^[[C gt

其中 是^[转义字符,您可以通过<CTRL-v><ESC>在 vim 中按 来插入该字符。

答案3

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

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

答案4

set t_Co=256~/.vimrc 中的设置有帮助吗?这只是一个颜色设置,但可能有助于解决一些问题。

ctrl+Arrow您也可以重新映射~/.vimrc 中的键...

编辑:你尝试过ctrl+ArrowGNU 屏幕会话吗?我想这可能是你的问题。

相关内容