是否可以找到哪个 vim/tmux 打开了我的文件?

Way*_*ner 5 process vim tmux open-files

tmux在工作中用作我的 IDE。我还在vim各种 tmux 窗格中运行,并且经常将进程置于后台(或者我只是关闭窗口 - 我已将 vim 配置为在窗口关闭时不删除打开的缓冲区)。现在我遇到了一个问题,因为我想编辑的文件在我的其他 vim 会话之一中打开,但我不知道是哪个。

是否有可能找出哪一个,而无需手动浏览我所有的窗口和窗格?在我的特殊情况下,我知道我没有编辑它,vim ~/myfile.txt因为ps aux | grep myfile.txt它没有返回任何内容。

Way*_*ner 9

它并没有告诉我一切,但我使用fuser ~/.myfile.txt.swpwhich 给了我 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 }'))
Run Code Online (Sandbox Code Playgroud)

要解释它的作用:

(FNAME="/tmp/.fnord.txt.swp";
Run Code Online (Sandbox Code Playgroud)

这将创建一个子外壳并设置FNAME为环境变量。严格来说,这不是必需的 - 您可以$FNAME自己替换文件名,但它确实使编辑变得更容易。现在,从内到外工作:

lsof -t $FNAME
Run Code Online (Sandbox Code Playgroud)

生成打开文件的进程的 PID。

ps -o tty= -p $(...)
Run Code Online (Sandbox Code Playgroud)

这会产生pts我们使用 找到的 PID 的lsof

tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}'
Run Code Online (Sandbox Code Playgroud)

这会生成一个包含条目的窗格列表,例如session:0.1 /dev/pts/1。第一部分是 tmux 喜欢的目标格式,第二部分是pts

| grep $(...)$
Run Code Online (Sandbox Code Playgroud)

该过滤器我们窗格列表-结尾$是这样只会匹配一个我们所关心的。我很偶然地发现了,因为我有pts/2pts/22,所以有两场比赛,哎呀!

| awk '{ print $1 }'
Run Code Online (Sandbox Code Playgroud)

这会生成session:0.1窗格输出的一部分,适合传递给tmux switch -t.

这应该适用于会话和窗格,使包含交换文件的窗格成为焦点。