【问题标题】:Vim: Adding cursorshape support over tmux + sshVim:在 tmux + ssh 上添加 cursorshape 支持
【发布时间】:2017-07-11 16:52:07
【问题描述】:

我喜欢在插入模式下更改光标形状,但是在通过 tmux 进行 ssh-ing 时我无法正确配置它。以下是我的发现:

  • 当我在本地 tmux 会话之外 ssh 并在远程 tmux 会话之外打开 Vim 时,光标形状可以正常工作(插入模式下的垂直条)。
  • 当我在本地 tmux 会话之外 ssh 并在远程 tmux 会话中打开 Vim 时,光标形状起作用。
  • 当我在本地 tmux 会话中 ssh 并在远程 tmux 会话之外打开 Vim 时,光标形状被破坏(插入模式中的块)。
  • 当我在本地 tmux 会话中 ssh 并在远程 tmux 会话中打开 Vim(嵌套 tmux;我的首选设置)时,光标形状被破坏。
  • 当我在本地 tmux 会话中本地打开 Vim 时,cursorshape 工作(也就是说,tmux 和 ssh 的组合出现问题;本地 tmux 在本地很好)。

我的本​​地机器运行的是 OS X Sierra,而我的远程机器是 CentOS 7。我认为这些都是相关的 dotfile 设置,如果需要,将发布其他设置:

=== ~/.tmux.conf(在本地和远程机器上)===

set-option -g default-terminal "screen-256color"
set-option -g xterm-keys on

=== ~/.vimrc(在远程机器上)===

if empty($TMUX)
  let &t_SI = "\<Esc>]50;CursorShape=1\x7" " Vertical bar in insert mode
  let &t_EI = "\<Esc>]50;CursorShape=0\x7" " Block in normal mode
else
  let &t_SI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=1\x7\<Esc>\\"
  let &t_EI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=0\x7\<Esc>\\"
endif

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

附带说明,在任何这些情况下,光标形状似乎都无法与 mosh 一起使用。我认为这是一个 mosh 限制,但如果有人有办法让它与 mosh 一起工作,那将特别有帮助。

【问题讨论】:

  • 如果你使用iTerm2,你可能想看看vitality.vim
  • 我不喜欢使用 iTerm2 的 tmux 集成。如果没有这种整合,活力能帮助解决这个问题,我会试一试。
  • AFAIK,集成是独立的,不需要生命力。

标签: vim ssh terminal tmux


【解决方案1】:

首先,您应该使用其他转义码。 iTerm2 支持 xterm DECSCUSR 扩展来设置光标形状,因此无需使用专有的转义码。这三行告诉 vim 使用 xterm 代码:​​

set t_SI=^[[6\ q
set t_SR=^[[4\ q
set t_EI=^[[2\ q

重要提示^[ 是一个字符。你可以按Ctrl-V进入,然后转义。

我已添加t_SR 以在替换模式下更改光标。 tmux 知道这些光标形状代码,因此您无需检查您是否在 tmux 会话中。此外,tmux 会自动跟踪不同窗格的光标形状(这在专有代码中是不可能的)。这些代码也适用于许多其他终端仿真器,例如所有基于 VTE 的仿真器(gnome 终端、tilda、xfce 终端,...)。

之后,本地 tmux 会话中的 vim 应该可以按预期工作,但是您需要做一些额外的工作才能让它在 ssh 上运行。默认情况下,如果外部终端是xterm(或类似xterm-256color),tmux 只接受光标形状更改。在您的本地机器上,一切都很好,因为 iTerm2 是您的外部终端并将$TERM 设置为xterm-256color。使用 ssh 时,您的本地 tmux 会话将成为外部终端并将$TERM 设置为screen-256color。因此,当连接基于屏幕的终端仿真器时,您必须告诉远程机器上的 tmux 传递光标形状转义码。为此,您可以使用terminal-overrides 选项:

set -ga terminal-overrides ",screen*:Ss=^[[%p1%d q:Se=^[[2 q"

^[又是一个字符。

重新启动您的 tmux 会话,您的本地和远程计算机上的光标形状应该会发生变化。

【讨论】:

    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2014-11-07
    • 2021-10-09
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多