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.