Ele não me diz tudo , mas eu usei fuser ~/.myfile.txt.swp , o que me deu o PID da sessão vim. Rodando ps aux | grep <PID> , pude descobrir qual sessão vim eu estava usando, o que me deu uma dica sobre em qual janela eu a abria.
Graças à inspiração de Giles e um pouco de persistência e sorte, eu criei o seguinte comando:
⚘ (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 }'))
Para explicar o que isso faz:
(FNAME="/tmp/.fnord.txt.swp";
Isso cria uma subshell e define FNAME como uma variável de ambiente. Não é, estritamente falando, necessário - você poderia simplesmente substituir $FNAME pelo nome do arquivo, mas isso facilita a edição das coisas. Agora, trabalhando de dentro para fora:
lsof -t $FNAME
Isso produz somente o PID do processo que abriu o arquivo.
ps -o tty= -p $(...)
Isso produz o pts do PID que encontramos usando lsof .
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}'
Isso produz uma lista do painel de entradas como session:0.1 /dev/pts/1 . A primeira parte é o formato que o tmux gosta para os alvos, e a segunda parte é o pts
| grep $(...)$
Isso filtra a nossa lista de painéis - o $ é para que corresponda apenas ao um que nos interessa. Eu descobri que por acaso eu tinha pts/2 e pts/22 , então havia duas correspondências, whoops!
| awk '{ print $1 }'
Isso produz a parte session:0.1 da saída do painel, que é adequada para passar para tmux switch -t .
Isso deve funcionar nas sessões e nos painéis, trazendo para o foco do painel que contém o arquivo de troca.