Kva*_*ass 5 vim ssh terminal tmux
我喜欢在插入模式下更改光标形状,但是在通过tmux ssh-ing时无法正确配置此形状。这是我的发现:
我的本地计算机运行的是OS X Sierra,而我的远程计算机运行的是CentOS7。我认为这些都是相关的dotfile设置,如果需要,还会发布其他文件:
=== ~/.tmux.conf(在本地和远程计算机上)===
set-option -g default-terminal "screen-256color"
set-option -g xterm-keys on
Run Code Online (Sandbox Code Playgroud)
=== ~/.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
Run Code Online (Sandbox Code Playgroud)
顺便提一下,在任何情况下,光标形状似乎都不适用于mosh。我认为这是对mosh的限制,但是如果有人能够将其与mosh配合使用,那将特别有用。
首先,您应该使用其他转义码。iTerm2 支持 xterm DECSCUSR 扩展来设置光标形状,因此无需使用专有的转义码。这三行告诉 vim 使用 xterm 代码:
set t_SI=^[[6\ q
set t_SR=^[[4\ q
set t_EI=^[[2\ q
Run Code Online (Sandbox Code Playgroud)
重要说明:^[是一个字符。您可以通过按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"
Run Code Online (Sandbox Code Playgroud)
^[ 又是一个字。
重新启动您的 tmux 会话,并且光标形状在您的本地和远程计算机上都会发生变化。