私のファイルが開いているvim / tmuxを見つけることができますか?

私のファイルが開いているvim / tmuxを見つけることができますか?

私はtmux職場でIDEとして使用しています。またvim、さまざまなtmuxウィンドウで実行してプロセスをバックグラウンドにすることがよくあります(または単にウィンドウを閉じます。ウィンドウが閉じたときに開いているバッファを削除しないようにvimを設定しました)。これで、編集したいファイルが他のvimセッションの1つに開かれていますが、どのセッションかわからないため、問題が発生しました。

すべてのウィンドウとウィンドウを手動で確認せずにどのウィンドウを見つけることができますか?私の特別なケースでは、何も返されなかったvim ~/myfile.txtので編集しなかったことを知っています。ps aux | grep myfile.txt

答え1

それは私に言わないすべてしかし、私はfuser ~/.myfile.txt.swpvimセッションの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/2pts/22そこにいます二つマッチ、こんな!

| awk '{ print $1 }'

これにより、session:0.1に渡すのに適したウィンドウ出力の一部が生成されますtmux switch -t

これはセッションとウィンドウの両方で機能し、スワップファイルを含むウィンドウにフォーカスを置きます。

答え2

あなたの質問に対する要約答えは次のとおりです。

for all the tmux sessions:
  for all the windows in the session:
      for all the panes in windows:
         for all sub process pids (recursively):
            find the open files

すべてのセッション: tmux list-sessions -F '#{session_id}:#{session_name}

すべてのウィンドウ: tmux list-windows -F '#{window_id}XX#{window_index}XX#{window_name}' -t "$session_id"

すべてのウィンドウ: tmux list-panes -F '#{pane_id}:#{pane_index}:#{pane_pid}' -t ""$session_id":"$window_index""

すべての子プロセス pid: ps -o pid --no-headers --ppid $pid

ファイルを開く:lsof -p $ pid

上記の実装はツリーを示しています。

sessions
   windows
      panes
         process
            open files

ファイルが開いているプロセスを表示します(私の場合はvimでもあります)。

ここに画像の説明を入力してください。

以下で見つけることができます。https://github.com/nkh/tmux-ls

5年間githubにいたが、削除された場合やgithubがクラッシュした場合に備えて複製することをお勧めします。

関連情報