Je me suis retrouvé à utiliser ma session principale Emacs (CocoaEmacs sous OSX) pour modifier ma ligne de commande bash. Pour ce faire, mon éditeur est réglé sur emacsclient
. Ensuite, je modifie la ligne dans Emacs, puis enregistre et quitte ce tampon - normalement à l’aide de celui "C-x #"
qui s’exécute (server-edit)
.
Le problème est que, parfois, je suis en train de modifier une ligne et je me rends compte que je ne veux pas réellement exécuter la ligne (le regret s'installe). Le problème est que bash détermine si la ligne doit être exécutée ou non en fonction du statut de retour.
Ce que j'aimerais, c'est qu'il y ait deux options pour moi.
Si je clique sur
"C-x #"
sauvegarder le tampon et que je retourne le code de sortie0
(c’est-à-dire que j’ai terminé mon montage et que je suis prêt pour que Bash s’enfonce).Si je tue le tampon, n'enregistrez pas le tampon, tuez-le et renvoyez un code de sortie non nul. Je n'aurais même pas l'esprit si je devais frapper une autre liaison.
Une solution partielle consiste simplement à commenter la ligne. Je ne vois pas cela comme une option pour moi, car normalement, si je modifie une ligne de commande dans Emacs, c'est que je travaille sur plusieurs lignes.
la source
Réponses:
Dans les versions relativement actuelles d’Emacs (par exemple, dans ma copie d’Emacs 24.2, mais pas dans la distribution d’Emacs 22.1 sous OS X), vous pouvez écrire du code Elisp qui enverra une commande à emacsclient lui indiquant de quitter avec un statut d’exit d’erreur.
C'est plus facile que ça en a l'air.
Il existe une variable locale du tampon
server-buffer-clients
, avec les clients attachés au tampon. Et la fonctionserver-send-string
peut être utilisée pour communiquer des commandes suivant leserver-process-filter
protocole.Par exemple:
provoque (un des) emacsclient (s) associé (s) au tampon à émettre immédiatement le texte
puis quittez avec le code de sortie 1.
Donc, il est assez facile de définir une fonction interactive que vous pourriez appeler depuis emacs pour tuer les clients emacs:
Avec ce qui précède dans votre
.emacs
fichier (et une version suffisamment récente d’Emacs), vous pouvezM-x tell-emacsclients-for-buffer-to-die
faire appel pour que les clients emacs soient fermés avec le statut d’erreur. (Et bien sûr, vous pouvez lier cette fonction à une autre séquence de touches appropriée.)note de bas de page
Idéalement, on couplerait ensuite la fonction ci-dessus avec un crochet
server-kill-buffer
pour atteindre le nombre d'objectifs (2.) de la question d'origine. (Autrement dit, tuer le tampon sans l'enregistrer viaC-x #
devrait déclencher les mêmes erreurs que emacsclient.)Cependant, mes tentatives pour l'ajouter à
kill-buffer-hook
ont échoué, car laserver-kill-buffer
fonction est placée au premier plan de lakill-buffer-hook
liste une fois lesserver-visit-hook
points d'ancrage exécutés. Laserver-kill-buffer
fonction par défaut est donc exécutée en premier. (On pourrait réparer lakill-buffer-hook
suite, mais je ne sais pas encore où mettre le code pour le faire dans le flux de contrôle Elisp.)Mise à jour: d'accord, voici un moyen vraiment déconcertant d'accomplir ce qui précède:
Mise à jour 2: variante légèrement plus robuste:
la source
Appuyez simplement sur
Ctrl+C
le terminal sur lequel vous exécutez bash. Ceci annule l'édition et pousse la ligne d'origine dans l'historique. Si vous ne pouvez pas le faire directement car Emacs est exécuté sur le même terminal, interrompez leemacsclient
processus par le moyen de votre choix.la source
server.el