Włączanie M-! na M- & (a'ka emacs equiv to bash Ctrl-Z)

14

Od czasu do czasu zdarza mi się po M-! some_commandprostu stwierdzić, że polecenie działa dłużej niż się spodziewałem i utrzymuje moje emacsy zamrożone przez długie sekundy. Więc glazuruję na moich zamrożonych emacach i kopię się za to, że nie używam, M-& some_commandi obiecuję, że użyję M-&następnym razem. Ale M-!jest w mojej pamięci mięśni przez dziesięciolecia… Oczywiście, że tak Ctrl-G, ale zdarzają się przypadki, w których złamanie polecenia i ponowne uruchomienie nie jest preferowane (być może może to zepsuć coś, być może ponowne uruchomienie byłoby kosztowne…).

Podobny błąd w konsoli konsoli jest prosty do naprawienia Ctrl-Z, bga zadanie działa w tle.

Czy istnieje jakaś podobna sztuczka w emacsie - sposób na przekształcenie aktualnie uruchomionej komendy pierwszego planu (synchronicznej) w tło (asynchroniczną)?

Uwaga: w przypadku, gdy nie jest to możliwe domyślnie M-! , jestem otwarty na sugestie, jak ponownie powiązać M-!w coś innego (co byłoby funkcjonalnie równoważne oprócz tej sztuczki).

Mekk
źródło
2
Być może zainteresuje Cię fakt, że po prostu dodanie &na końcu funkcji regular shell-command( M-!) spowoduje, że stanie się ona asynchroniczna. Oczywiście musisz to zrobić przed uruchomieniem polecenia, ale przynajmniej możesz użyć tego samego skrótu klawiszowego.
niania
4
Zawsze można po prostu przemapować M-!do async-shell-command. :-) Wydaje się, że jedyną rzeczą, którą tracisz, jest uzyskanie sygnału wyjściowego w obszarze echa, gdy jest wystarczająco krótki.
glucas
1
@ nanny, w rzeczywistości to wszystko async-shell-command. Dodaje &na końcu COMMANDłańcucha i wykonuje shell-command.
Matthew Piziak

Odpowiedzi:

2

Czy istnieje jakaś podobna sztuczka w emacsie - sposób na przekształcenie aktualnie uruchomionej komendy pierwszego planu (synchronicznej) w tło (asynchroniczną)?

Podejrzewam, że taka sztuczka nie istnieje. Problem polega na tym, że polecenie synchronicznej powłoki (która tak naprawdę jest call-process-region) blokuje pętlę zdarzeń emacs. Jedynym sposobem na złamanie tego jest zabicie procesu sygnałem USR1 lub USR2 lub zrobienie tego C-g. (Mogą być inne sposoby, ale to właśnie robię).

Oznacza to, że nic nie możesz zrobić, ponieważ nie masz sposobu na wywołanie lewy, ponieważ Emacs nie przetwarza danych wejściowych, gdy pętla zdarzeń jest zablokowana.


Jedną rzeczą, którą możesz zrobić, to po prostu zamienić klucze:

(global-set-key (kbd "M-!") #'async-shell-command)
(global-set-key (kbd "M-&") #'shell-command)
PythonNut
źródło
Ponowne wiązanie M-! komenda async-shell-command ma częściowy sens, ale: (1) Nie jestem pewien co do M-1 M-! zachowanie (polecenie wyjściowe do bufora) - działają proste szybkie przypadki, ale co jeśli polecenie jest wolniejsze i wpisuję coś? (2) w wielu przypadkach lubię zamrażać, dopóki polecenie nie zakończy działania, ponieważ daje wyraźne wskazanie zakończenia (niektóre polecenia nie mają danych wyjściowych…), dlatego wyraźniejsze naciśnięcie klawisza „przeniesienie do tła” byłoby ładniejsze (3) async opuszcza bufory Async, które muszą zostać
zebranym
Zastanawiam się, czy można by napisać jakieś otoki wokół polecenia async-shell-command (funkcja, która odradza polecenie async-shell-command, a następnie czeka na zakończenie, reaguje na Ctrl-G, przerywając polecenie i na inne naciśnięcie klawisza, pozostawiając działa, ale nie czeka już i po zakończeniu zbiera bufor Async, jeśli dane wyjściowe są puste lub krótkie). Nie jestem pewien, jak to zrobić, czekając…
Mekk