Ich verwende tmux
bei der Arbeit als meine IDE. Ich verwende auch vim
in einer Vielzahl von tmux-Bereichen und wird den Prozess ziemlich oft im Hintergrund ausführen (oder alternativ schließe ich einfach das Fenster – ich habe vim so konfiguriert, dass offene Puffer nicht entfernt werden, wenn das Fenster geschlossen wird). Jetzt habe ich ein Problem, weil eine Datei, die ich bearbeiten möchte, in einer meiner anderen vim-Sitzungen geöffnet ist, aber ich weiß nicht, welche.
Ist es möglich, herauszufinden, welches, ohne alle meine Fenster und Bereiche manuell zu durchsuchen? In meinem speziellen Fall weiß ich, dass ich es nicht mit vim ~/myfile.txt
bearbeitet habe weil ps aux | grep myfile.txt
gibt nichts zurück.
Akzeptierte Antwort:
Es sagt mir nicht alles , aber ich habe fuser ~/.myfile.txt.swp
verwendet was mir die PID der vim-Sitzung gab. Ausführen von ps aux | grep <PID>
Ich konnte herausfinden, welche vim-Sitzung ich benutzte, was mir einen Hinweis darauf gab, in welchem Fenster ich sie geöffnet hatte.
Dank der Inspiration von Giles und etwas Beharrlichkeit und Glück kam ich auf den folgenden Befehl:
⚘ (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 }'))
Um zu erklären, was das bewirkt:
(FNAME="/tmp/.fnord.txt.swp";
Dadurch wird eine Subshell erstellt und FNAME
festgelegt als Umgebungsvariable. Es ist streng genommen nicht notwendig – Sie könnten einfach $FNAME
ersetzen mit dem Dateinamen selbst, aber es erleichtert die Bearbeitung. Jetzt von innen nach außen arbeiten:
lsof -t $FNAME
Dies erzeugt nur die PID des Prozesses, der die Datei geöffnet hat.
ps -o tty= -p $(...)
Dies erzeugt die pts
der PID, die wir mit lsof
gefunden haben .
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}'
Dies erzeugt eine Bereichsliste mit Einträgen wie session:0.1 /dev/pts/1
. Der erste Teil ist das Format, das tmux für Ziele bevorzugt, und der zweite Teil sind die pts
| grep $(...)$
Dies filtert unsere Bereichsliste – das nachgestellte $
Es wird also nur mit dem Einen übereinstimmen wir kümmern uns um. Ich habe das eher zufällig entdeckt, da ich pts/2
hatte und pts/22
, also waren es zwei Streichhölzer, hoppla!
| awk '{ print $1 }'
Dies erzeugt die session:0.1
Teil der Pane-Ausgabe, der zur Übergabe an tmux switch -t
geeignet ist .
Dies sollte sitzungs- und bereichsübergreifend funktionieren und den Bereich mit Ihrer Auslagerungsdatei in den Fokus rücken.
Verwandte:Zusätzliche Kopfzeilen aus der Datei entfernen, außer der ersten Zeile?