Attivazione M-! in M- & (a'ka emacs equivale a bash Ctrl-Z)


14

Di tanto in tanto mi capita M-! some_commandsolo di scoprire che il comando viene eseguito più a lungo del previsto e mantiene i miei emacs congelati per lunghi secondi. Quindi guardo i miei emacs congelati e mi prendo a calci per non usare M-& some_commande mi prometto di usare la M-&prossima volta. Ma M-!è nella mia memoria muscolare da decenni ... E ovviamente c'è Ctrl-G, ma ci sono casi in cui rompere il comando e rieseguire non è preferibile (forse può rompere sth, forse sarebbe costoso ripetere ...).

Errore simile in Konsole shell è banale per corretta, Ctrl-Z, bge lavoro è in esecuzione in background.

Esiste qualche trucco simile in emacs - un modo per trasformare il comando in primo piano (sincrono) attualmente in esecuzione in uno in background (asincrono)?

Nota: nel caso in cui sia impossibile per impostazione predefinita M-! , sono aperto a suggerimenti su come ricollegarsi M-!a qualcos'altro (cosa sarebbe funzionalmente equivalente a parte questo trucco).


2
Potresti essere interessato a sapere che semplicemente aggiungere un &alla fine di un normale shell-command( M-!) lo renderà asincrono. Ovviamente, devi farlo prima di eseguire un comando, ma almeno puoi usare lo stesso keybinding.
tata

4
Si può sempre e solo rimappare M-!a async-shell-command. :-) Sembra che l'unica cosa che perdi sia ottenere l'output nell'area dell'eco quando è abbastanza corta.
Glucas,

1
@nanny, infatti, è tutto async-shell-command. Aggiunge un &alla fine della COMMANDstringa ed esegue shell-command.
Matthew Piziak,

Risposte:


2

Esiste qualche trucco simile in emacs - un modo per trasformare il comando in primo piano (sincrono) attualmente in esecuzione in uno in background (asincrono)?

Sospetto che non esista un simile trucco. Il problema è che il comando di shell sincrono (che in realtà è call-process-region) blocca il loop degli eventi di emacs. L'unico modo per interromperlo è interrompere o interrompere il processo con un segnale USR1 o USR2 C-g. (Potrebbero esserci altri modi, ma è quello che faccio).

Ciò significa che non c'è nulla che tu possa fare perché non hai un modo per invocare il trucco, poiché Emacs non elabora l'input mentre il loop degli eventi è bloccato.


Una cosa che puoi fare è semplicemente scambiare i tasti:

(global-set-key (kbd "M-!") #'async-shell-command)
(global-set-key (kbd "M-&") #'shell-command)

Rilegatura M-! async-shell-command ha un senso parziale, ma: (1) Non sono sicuro di M-1 M-! comportamento (output del comando nel buffer) - i casi semplici veloci funzionano ma cosa succede se il comando è più lento e digito sth? (2) in molti casi mi piace il congelamento fino a quando il comando non termina il comportamento in quanto fornisce un'indicazione di finitura chiara (alcuni comandi non hanno output ...), quindi la battitura esplicita "mettere in background" sarebbe più piacevole (3) asincrono lascia quei buffer Async che devono essere mietuto
Mekk,

Sto pensando se sarebbe possibile scrivere un wrapper attorno al comando asincrono-shell (una funzione che genererebbe il comando asincrono-shell, quindi attendere la fine, reagire a Ctrl-G interrompendo il comando e alcuni altri tasti lasciando è in esecuzione ma non è più in attesa, e raccoglie il buffer Async una volta fatto se l'output è vuoto o corto). Non sono sicuro di come fare quella parte in attesa ...
Mekk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.