Process

是否可以找到打開我的文件的 vim/tmux?

  • October 7, 2021

tmux在工作中用作我的 IDE。我還在vim各種 tmux 窗格中執行,並且經常將程序置於後台(或者我只是關閉視窗 - 我已將 vim 配置為在視窗關閉時不刪除打開的緩衝區)。現在我遇到了一個問題,因為我要編輯的文件在我的其他 vim 會話之一中打開,但我不知道是哪個。

是否可以在不手動瀏覽所有視窗和窗格的情況下找出哪一個?在我的特殊情況下,我知道我沒有編輯它,vim ~/myfile.txt因為ps aux | grep myfile.txt沒有返回任何東西。

它並沒有告訴我一切,但我使用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 喜歡的目標格式,第二部分是pts

| grep $(...)$

這會過濾我們的窗格列表 - 尾隨$是所以它只會匹配我們關心的那個。我很偶然地發現了pts/2pts/22所以有兩場比賽,哎呀!

| awk '{ print $1 }'

這會產生session:0.1窗格輸出的一部分,適合傳遞給tmux switch -t.

這應該適用於會話和窗格,使包含交換文件的窗格成為焦點。

引用自:https://unix.stackexchange.com/questions/309660