Way*_*ner 5 process vim tmux open-files
我tmux
在工作中用作我的 IDE。我还在vim
各种 tmux 窗格中运行,并且经常将进程置于后台(或者我只是关闭窗口 - 我已将 vim 配置为在窗口关闭时不删除打开的缓冲区)。现在我遇到了一个问题,因为我想编辑的文件在我的其他 vim 会话之一中打开,但我不知道是哪个。
是否有可能找出哪一个,而无需手动浏览我所有的窗口和窗格?在我的特殊情况下,我知道我没有编辑它,vim ~/myfile.txt
因为ps aux | grep myfile.txt
它没有返回任何内容。
它并没有告诉我一切,但我使用fuser ~/.myfile.txt.swp
which 给了我 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/2
和pts/22
,所以有两场比赛,哎呀!
| awk '{ print $1 }'
Run Code Online (Sandbox Code Playgroud)
这会生成session:0.1
窗格输出的一部分,适合传递给tmux switch -t
.
这应该适用于会话和窗格,使包含交换文件的窗格成为焦点。