tmux
を使用しています 私のIDEとして働いています。 vim
も実行します さまざまなtmuxペインで、プロセスをバックグラウンドで実行することがよくあります(または、ウィンドウを閉じるだけです。ウィンドウを閉じたときに開いているバッファーを削除しないようにvimを構成しています)。編集したいファイルが他のvimセッションの1つで開いているのに、どれがわからないので、問題が発生しました。
すべてのウィンドウとペインを手動で確認しなくても、どれを見つけることはできますか?私の特定のケースでは、vim ~/myfile.txt
で編集しなかったことを知っています。 ps aux | grep myfile.txt
何も返しません。
承認された回答:
すべては教えてくれません 、しかし私はfuser ~/.myfile.txt.swp
を使用しました これでvimセッションのPIDがわかりました。 ps aux | grep <PID>
使用しているvimセッションを見つけることができ、どのウィンドウで開いているかについてのヒントが得られました。
ジャイルズのインスピレーションと少しの粘り強さと幸運のおかげで、私は次のコマンドを思いつきました:
⚘ (FNAME="/tmp/.fnord.txt.swp"; tmux switch -t $(tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}' | grep $(ps -o tty= -p $(lsof -t $FNAME))$ | awk '{ print $1 }'))
これが何をするのかを説明するには:
(FNAME="/tmp/.fnord.txt.swp";
これにより、サブシェルが作成され、FNAME
が設定されます。 環境変数として。厳密に言えば、必要ではありません。$FNAME
を置き換えるだけで済みます。 自分でファイル名を使用しますが、編集が簡単になります。さて、裏返しに取り組んでいます:
lsof -t $FNAME
これにより、のみが生成されます ファイルを開いたプロセスのPID。
ps -o tty= -p $(...)
これにより、pts
が生成されます lsof
を使用して検出したPIDの 。
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}'
これにより、session:0.1 /dev/pts/1
のようなエントリのペインリストが生成されます。 。最初の部分はtmuxがターゲットに好む形式で、2番目の部分はpts
です。
| grep $(...)$
これにより、ペインリスト(末尾の$
)がフィルタリングされます そのため、1つにのみ一致します 私たちは気にします。 pts/2
を持っていたので、まったく偶然にそれを発見しました およびpts/22
、つまり2つありました マッチ、おっと!
| awk '{ print $1 }'
これにより、session:0.1
が生成されます tmux switch -t
に渡すのに適したペイン出力の一部 。
これは、ペインだけでなくセッション間でも機能し、スワップファイルを含むペインに焦点を合わせる必要があります。
関連:最初の行を除いて、ファイルから余分なヘッダー行を削除しますか?