É possível descobrir qual vim / tmux tem meu arquivo aberto?

3

Eu uso tmux no trabalho como meu IDE. Eu também corro vim em uma variedade de painéis tmux e com frequência coloco em segundo plano o processo (ou simplesmente fecho a janela - eu configurei o vim para não remover os buffers abertos quando a janela está fechada). Agora eu tenho um problema, porque um arquivo que eu quero editar está aberto em uma das minhas outras sessões vim mas eu não sei qual delas.

É possível descobrir qual, sem passar manualmente por todas as minhas janelas e painéis? No meu caso particular, sei que não editei com vim ~/myfile.txt porque ps aux | grep myfile.txt não retorna nada.

    
por Wayne Werner 13.09.2016 / 21:30

1 resposta

8

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.

    
por 13.09.2016 / 21:34