Uso tmux
al lavoro come mio IDE. Eseguo anche vim
in una varietà di riquadri tmux e farà abbastanza spesso il processo in background (o in alternativa chiudo semplicemente la finestra - ho vim configurato per non rimuovere i buffer aperti quando la finestra è chiusa). Ora ho un problema, perché un file che voglio modificare è aperto in una delle mie altre sessioni vim ma non so quale.
È possibile scoprire quale, senza passare manualmente attraverso tutte le mie finestre e riquadri? Nel mio caso particolare, so di non averlo modificato con vim ~/myfile.txt
perché ps aux | grep myfile.txt
non restituisce nulla.
Risposta accettata:
Non mi dice tutto , ma ho usato fuser ~/.myfile.txt.swp
che mi ha dato il PID della sessione vim. Esecuzione di ps aux | grep <PID>
Sono stato in grado di scoprire quale sessione vim stavo usando, il che mi ha dato un suggerimento su quale finestra l'avevo aperta.
Grazie all'ispirazione di Giles e un po' di tenacia e fortuna, mi è venuto in mente il seguente 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 }'))
Per spiegare cosa fa:
(FNAME="/tmp/.fnord.txt.swp";
Questo crea una subshell e imposta FNAME
come variabile d'ambiente. Non è, in senso stretto, necessario:potresti semplicemente sostituire $FNAME
con il nome del file, ma rende le cose più facili da modificare. Ora, lavorando dall'interno verso l'esterno:
lsof -t $FNAME
Questo produce solo il PID del processo che ha aperto il file.
ps -o tty= -p $(...)
Questo produce i pts
del PID che abbiamo trovato utilizzando lsof
.
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}'
Questo produce un elenco di pannelli di voci come session:0.1 /dev/pts/1
. La prima parte è il formato che piace a tmux per i target, e la seconda parte è il pts
| grep $(...)$
Questo filtra il nostro elenco di riquadri:il $
finale è così che corrisponderà solo a uno ci preoccupiamo. L'ho scoperto per caso poiché avevo pts/2
e pts/22
, quindi ce n'erano due partite, whoops!
| awk '{ print $1 }'
Questo produce la session:0.1
parte dell'output del riquadro, che è adatto per il passaggio a tmux switch -t
.
Questo dovrebbe funzionare tra le sessioni e i riquadri, mettendo a fuoco il riquadro che contiene il tuo file di scambio.
Correlati:rimuovere le righe di intestazione extra dal file, ad eccezione della prima riga?