GNU/Linux >> Linux Esercitazione >  >> Linux

È possibile trovare quale Vim/tmux ha il file aperto?

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?
Linux
  1. Come eliminare un file il cui nome file ha caratteri non stampabili?

  2. È possibile reindirizzare i risultati di FIND a un comando COPY CP?

  3. Come trovare il file manager predefinito?

  4. Come ricaricare il file di configurazione tmux che ha definito più sessioni?

  5. Trova quale processo sta modificando un file

Come salvare un file in Vim/Vi e uscire dall'editor

È possibile rilevare quando un file è stato scaricato?

Come trovare il tipo di un file Img e montarlo?

Come trovo la posizione MySQL my.cnf

Perché è possibile capovolgere lo schermo?

Apre un file dato dal risultato di un comando in vim