Activer M-! dans M- & (a'ka emacs équivalent à bash Ctrl-Z)

14

Il m'arrive de temps en temps M-! some_commandde constater que la commande s'exécute plus longtemps que prévu et garde mes emacs figés pendant de longues secondes. Je glaçe donc mes emacs congelés et me donne un coup de pied pour ne pas utiliser M-& some_commandet me promets d'utiliser la M-&prochaine fois. Mais M-!est dans ma mémoire musculaire depuis des décennies… Et bien sûr qu'il y en a Ctrl-G, mais il y a des cas où rompre la commande et le relancer n'est pas préférable (peut-être qu'il peut casser qch, peut être coûteux à réexécuter…).

Une erreur similaire dans shell konsole est triviale à corriger Ctrl-Z, bget le travail s'exécute en arrière-plan.

Existe-t-il une astuce similaire dans emacs - un moyen de transformer la commande de premier plan (synchrone) en cours d'exécution en une commande en arrière-plan (asynchrone)?

Remarque: dans le cas où il est impossible par défaut M-! , je suis ouvert à des suggestions sur la façon de se lier M-!à autre chose (ce qui serait fonctionnellement équivalent en dehors de cette astuce).

Mekk
la source
2
Vous serez peut-être intéressé de savoir que le simple fait d'ajouter un &à la fin d'un regular shell-command( M-!) le rendra asynchrone. Bien sûr, vous devez le faire avant d'exécuter une commande, mais au moins vous pouvez utiliser le même raccourci clavier.
nounou
4
Vous pouvez toujours juste remapper M-!à async-shell-command. :-) On dirait que la seule chose que vous perdez est d'obtenir la sortie dans la zone d'écho lorsqu'elle est suffisamment courte.
glucas
1
@nanny, en fait, c'est tout async-shell-command. Il ajoute un &à la fin de la COMMANDchaîne et s'exécute shell-command.
Matthew Piziak

Réponses:

2

Existe-t-il une astuce similaire dans emacs - un moyen de transformer la commande de premier plan (synchrone) en cours d'exécution en une commande en arrière-plan (asynchrone)?

Je soupçonne qu'aucun tel truc n'existe. Le problème est que la commande shell synchrone (qui est vraiment call-process-region) bloque la boucle d'événements emacs. La seule façon de le casser est de tuer le processus avec un signal USR1 ou USR2 ou de le faire C-g. (Il peut y avoir d'autres moyens, mais c'est ce que je fais).

Cela signifie que vous ne pouvez rien faire car vous n'avez aucun moyen d'invoquer l'astuce, car Emacs ne traite pas les entrées pendant que la boucle d'événements est bloquée.


Une chose que vous pouvez faire est simplement d'échanger les clés:

(global-set-key (kbd "M-!") #'async-shell-command)
(global-set-key (kbd "M-&") #'shell-command)
PythonNut
la source
Relier M-! à async-shell-command est partiellement logique, mais: (1) Je ne suis pas sûr de M-1 M-! comportement (sortie de la commande dans le tampon) - les cas simples et rapides fonctionnent mais que se passe-t-il si la commande est plus lente et que je tape qc? (2) dans de nombreux cas, j'aime le gel jusqu'à ce que la commande termine le comportement car il donne une indication de fin claire (certaines commandes n'ont pas de sortie…), donc une frappe explicite „mettre en arrière-plan” serait plus agréable (3) async laisse ces tampons Async qui doivent être récolté
Mekk
Je me demande si un wrapper autour de async-shell-command serait possible d'écrire (une fonction qui engendrerait async-shell-command, puis attendrait sa fin, réagirait à Ctrl-G en abandonnant la commande et à une autre frappe en laissant il fonctionne mais n'attend plus et récupère le tampon Async une fois terminé si la sortie est vide ou courte). Je ne sais pas comment faire cette partie d'attente…
Mekk