私はtmux
職場でIDEとして使用しています。またvim
、さまざまなtmuxウィンドウで実行してプロセスをバックグラウンドにすることがよくあります(または単にウィンドウを閉じます。ウィンドウが閉じたときに開いているバッファを削除しないようにvimを設定しました)。これで、編集したいファイルが他のvimセッションの1つに開かれていますが、どのセッションかわからないため、問題が発生しました。
すべてのウィンドウとウィンドウを手動で確認せずにどのウィンドウを見つけることができますか?私の特別なケースでは、何も返されなかったvim ~/myfile.txt
ので編集しなかったことを知っています。ps aux | grep myfile.txt
ベストアンサー1
それは私に言わないすべてしかし、私はfuser ~/.myfile.txt.swp
vimセッションのPIDを提供するために使用しました。これを実行した後ps aux | grep <PID>
、私はどのvimセッションを使用しているかを知り、どのウィンドウで開いているかについてのヒントを得ました。
Gilesのインスピレーションと少しの粘り強さと幸運のおかげで、私は次のコマンドを思い出しました。
⚘ (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
私たちが使用して見つけたPIDを生成しますlsof
。
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}'
これにより、入力ウィンドウのリストが作成されます(例:)session:0.1 /dev/pts/1
。最初の部分はtmuxが好きなターゲット形式で、2番目の部分はpts
| grep $(...)$
これにより、ウィンドウのリストがフィルタリングされます。末尾には一致$
するもののみが表示されます。一つ私たちは心配しています。私は偶然見つけたのでpts/2
、pts/22
そこにいます二つマッチ、こんな!
| awk '{ print $1 }'
これにより、session:0.1
に渡すのに適したウィンドウ出力の一部が生成されますtmux switch -t
。
これはセッションとウィンドウの両方で機能し、スワップファイルを含むウィンドウにフォーカスを置きます。