J'utilise tmux
au travail comme mon IDE. Je lance aussi vim
dans une variété de volets tmux et mettra assez souvent le processus en arrière-plan (ou bien je ferme simplement la fenêtre - j'ai configuré vim pour ne pas supprimer les tampons ouverts lorsque la fenêtre est fermée). Maintenant j'ai un problème, car un fichier que je veux éditer est ouvert dans une de mes autres sessions vim mais je ne sais pas laquelle.
Est-il possible de savoir lequel, sans passer manuellement par toutes mes fenêtres et volets ? Dans mon cas particulier, je sais que je ne l'ai pas modifié avec vim ~/myfile.txt
car ps aux | grep myfile.txt
ne renvoie rien.
Réponse acceptée :
Il ne me dit pas tout , mais j'ai utilisé fuser ~/.myfile.txt.swp
qui m'a donné le PID de la session vim. Exécution de ps aux | grep <PID>
J'ai pu savoir quelle session vim j'utilisais, ce qui m'a donné un indice sur la fenêtre dans laquelle je l'avais ouverte.
Grâce à l'inspiration de Giles et un peu de persévérance et de chance, j'ai trouvé la commande suivante :
⚘ (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 }'))
Pour expliquer ce que cela fait :
(FNAME="/tmp/.fnord.txt.swp";
Cela crée un sous-shell et définit FNAME
comme variable d'environnement. Ce n'est pas, à proprement parler, nécessaire - vous pouvez simplement remplacer $FNAME
avec le nom de fichier vous-même, mais cela facilite l'édition. Maintenant, en partant de l'intérieur :
lsof -t $FNAME
Cela produit seulement le PID du processus qui a ouvert le fichier.
ps -o tty= -p $(...)
Cela produit le pts
du PID que nous avons trouvé en utilisant lsof
.
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}'
Cela produit une liste de volets d'entrées comme session:0.1 /dev/pts/1
. La première partie est le format que tmux aime pour les cibles, et la seconde partie est le pts
| grep $(...)$
Cela filtre notre liste de volets - le dernier $
est donc il ne correspondra qu'à un nous nous soucions. J'ai découvert cela tout à fait par hasard car j'avais pts/2
et pts/22
, donc il y en avait deux matchs, oups !
| awk '{ print $1 }'
Cela produit la session:0.1
une partie de la sortie du volet, qui convient pour passer à tmux switch -t
.
Cela devrait fonctionner à travers les sessions ainsi que les volets, en mettant l'accent sur le volet qui contient votre fichier d'échange.
En relation :Supprimer les lignes d'en-tête supplémentaires du fichier, à l'exception de la première ligne ?