2017-02-21 8 views
1

挿入モードのときにカーソルの形状を変更したいのですが、tmuxを使ってssh-ingするときに正しく設定するのに問題があります。Vim:tmux + ssh上のカーソル形状の追加

  • ローカルのtmuxセッションの外でsshを実行し、リモートのtmuxセッションの外部でVimを開くと、カーソルの形状が働きます(挿入モードでは垂直バー)。
  • ローカルtmuxセッションの外でsshを実行し、リモートtmuxセッション内でVimを開くと、カーソルシェイプが機能します。
  • ローカルのtmuxセッションの内部でsshを実行していて、リモートのtmuxセッションの外でVimを開くと、カーソルの形状が壊れてしまいます(挿入モードのブロック)。
  • ローカルのtmuxセッションの内部でsshを実行していて、リモートのtmuxセッション(ネストされたtmux;私の優先設定)でVimを開くと、カーソルの形状が壊れてしまいます。
  • ローカルのtmuxセッション内でローカルにVimを開くと、cursorshapeが機能します(つまり、tmuxとsshの組み合わせで何か問題が起きています;ローカルのtmuxはローカルで問題ありません)。

私のローカルマシンはOS Xシエラ、私のリモートマシンを実行している私は要求された場合、これらは他の人を掲示し、関連するすべてのドットファイルの設定だと思いますCentOSの7です:

===両方のローカルで~/.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と一緒に働く方法を持っていると、それが特に役立ちます。

+0

iTerm2を使用している場合は、[vitality.vim](https://github.com/sjl/vitality.vim)を参照してください。 –

+0

iTerm2のtmux統合の使用は嫌です。活力がその統合なしでこの問題に役立つなら、私はそれを試してみましょう。 – Kvass

+0

AFAIK、その統合は独立しており、活力のために必要ではありません。 –

答えて

1

まず、他のエスケープコードを使用する必要があります。 iTerm2はxtermのDECSCUSR拡張をサポートしているので、独自のエスケープコードを使用する必要はありません。これらの3行はxtermのコードを使用してVimを伝える:

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

重要な注意^[は1つの文字です。 Ctrl-Vを押して入力してからエスケープすることができます。

置換モードでカーソルを変更するには、t_SRを追加しました。 tmuxはこれらのカーソル形状コードを認識しているため、tmuxセッション内にいるかどうかを確認する必要はありません。さらに、tmuxは自動的に異なるペインのカーソル形状を追跡します(独自のコードでは不可能です)。これらのコードは、他の多くの端末エミュレータ、例えばすべてのVTEベースのもの(gnome端末、tilda、xfce端末など)でも動作します。

その後、ローカルのtmuxセッションのvimは期待通りに動作するはずですが、sshで実行するには余分な作業が必要です。デフォルトでは、外部端末がxterm(またはxterm-256colorのようなもの)の場合、tmuxはカーソル形状の変更のみを受け入れます。あなたのローカルマシンでは、iTerm2が外部端末であり、$TERMからxterm-256colorに設定されているので、すべてが正常です。 sshを使用する場合、ローカルのtmuxセッションは外部端末になり、$TERMscreen-256colorに設定します。したがって、画面ベースのターミナルエミュレータが接続されているときに、カーソルのエスケープコードを渡すようにリモートマシンのtmuxに指示する必要があります。そのため、あなたはterminal-overridesオプションを使用することができます。

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

^[は再び1つの文字です。

ローカルマシンとリモートマシンの両方でtmuxセッションとカーソルシェイプを再起動する必要があります。

関連する問題