Vim:在tmux + ssh上添加cursorshape支持

时间:2017-02-21 21:04:25

标签: vim ssh terminal tmux

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

  • 当我在本地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合作会特别有用。

1 个答案:

答案 0 :(得分:3)

首先,您应该使用其他转义码。 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会话,光标形状应在本地和远程计算机上更改。