Disons que j'ai un serveur X11 suspendu, ce qui m'empêche d'enregistrer le travail de la session XTerm Vim que le serveur X11 contrôle. (Pas GVim, juste Vim-in-XTerm régulier.)
Existe-t-il un moyen (à partir d'un autre terminal) de dire au processus Vim en cours de «tout enregistrer et quitter» à partir de la ligne de commande? En envoyant un signal, ou par d'autres moyens?
Je connais les fichiers d'échange de Vim et je pourrais simplement tuer Vim et récupérer à partir de l'échange. Je demande s'il existe une méthode "plus propre".
Réponses:
Ayant récemment rencontré ce problème (via une autre façon: Vim fonctionnant sur un serveur distant, et j'avais oublié l'écran), j'ai décidé de chercher un moyen.
La première idée a été de rechercher les descripteurs de fichiers utilisés par Vim et d'essayer d'y écrire. Les fds de Vim pointent vers le psedoterminal ouvert par l'émulateur de terminal, assez naturellement:
Cependant, mes quelques premières tentatives ont échoué:
Le
^[
et^M
ont été obtenus respectivement par CtrlVEscet CtrlVEnter.Ils ont tous fait apparaître les personnages sur le terminal (je testais cela localement, avant de l'appliquer à la session distante). Googler autour, j'ai trouvé ce message SO , en utilisant Python pour écrire sur le périphérique pseudoterminal:
Et l'essayer sur un shell python interactif a fonctionné:
Terminé!
la source
Vous pouvez envoyer des commandes à vim en externe si vous exécutez ...
Serveurs Vim
Par exemple, faire:
fera en sorte que vim lance un serveur avec le nom "vim". Appelez-le deux fois et le nouveau serveur sera appelé "vim1", appelez-le trois fois et ce sera "vim2", etc. Vous voudrez peut-être créer un alias de cette commande.
Vous pouvez savoir quel serveur une instance particulière est nommée en regardant le titre de la fenêtre. Quand tu vois:
le nom du serveur est insensible à la casse "VIM3" ("vim3" ferait référence à la même instance.). Notez que si vous voyez:
cela ne signifie pas nécessairement qu'il a un serveur nommé "VIM". Vous pouvez vous assurer que le serveur existe en répertoriant les noms de serveur avec:
Pourtant, la question ne se pose que pour "VIM", en particulier. Si vous voyez "GVIM" ou un autre nom avec un numéro ajouté, cela signifie que c'est un serveur.
Comment utiliser le client
Maintenant, sur votre question, vous pouvez tout sauvegarder et quitter une instance de vim donnée en faisant, par exemple:
Nous utilisons l'évasion pour revenir au mode normal au cas où vous êtes en mode insertion ou commande. Vous pouvez faire autre chose que
:wqa
, mais cela me semble le plus approprié car cela laissera les fichiers d'échange de tampons qui n'ont pas pu être enregistrés (car ils sont nouveaux et n'ont pas de nom de fichier, etc.).Si vous voulez le faire pour toutes les instances comme dans votre cas ici, vous pouvez simplement parcourir la liste des serveurs comme suit:
Si pour une raison que vous n'aimez pas
--remote-send
, vous pouvez utiliser à la place--remote-expr
ce qui a l'avantage de faire en sorte que le client génère le résultat ou l'erreur qu'il a pu causer, comme ceci:Notez que l'utilisation des fonctionnalités du serveur de Vim nécessite que Vim ait été construit avec l'
+clientserver
option.la source
Installez la
reptyr
commande à l'aide du gestionnaire de packages du système, tel que:Utilisez ensuite la
reptyr
commande pour basculer le terminal distant vers le terminal local (nouveau), comme suit:Où
PID
est l'ID de processus de laps
sortie de la commande.Sur l'erreur:
Remplacez la "portée ptrace" par 0:
Une fois que la session vim a été échangée de l'ancienne session à la nouvelle, enregistrez et quittez comme d'habitude. Notez que vous devrez peut-être appuyer sur Enterpour actualiser la console.
la source
Et si tu tuais Vim avec grâce?
kill -s 15 -p [PID for Vim]
kill -s (signal) 15 est appelé SIGTERM, ce qui indique à ce processus de s'arrêter normalement.
Pour obtenir le PID (Process ID) de Vim, utilisez:
ps ax | grep vim
la source