GNU/Linux >> Tutoriels Linux >  >> Linux

Est-il possible de trouver quel Vim/tmux a ouvert le fichier ?

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 ?
Linux
  1. Comment trouver le fichier le plus ancien dans une arborescence de répertoires sous Linux

  2. Comment supprimer un fichier dont le nom de fichier contient des caractères non imprimables ?

  3. Est-il possible de détecter quand un fichier a été téléchargé ?

  4. Comment trouver le type d'un fichier Img et le monter ?

  5. Trouver l'URL d'un fichier

Comment enregistrer un fichier dans Vim / Vi et quitter l'éditeur

Comment puis-je trouver l'emplacement MySQL my.cnf

Comment ouvrir un fichier dans vim en utilisant pipe

Pourquoi est-il possible de retourner l'écran ?

Ouvrir un fichier donné par le résultat d'une commande dans vim

Trouver quel processus modifie un fichier