Process
是否可以找到打開我的文件的 vim/tmux?
我
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
我們使用 找到的 PIDlsof
。tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}'
這會產生一個條目的窗格列表,例如
session:0.1 /dev/pts/1
. 第一部分是 tmux 喜歡的目標格式,第二部分是pts
| grep $(...)$
這會過濾我們的窗格列表 - 尾隨
$
是所以它只會匹配我們關心的那個。我很偶然地發現了pts/2
,pts/22
所以有兩場比賽,哎呀!| awk '{ print $1 }'
這會產生
session:0.1
窗格輸出的一部分,適合傳遞給tmux switch -t
.這應該適用於會話和窗格,使包含交換文件的窗格成為焦點。