Время от времени я M-! some_command
просто обнаруживаю, что команда выполняется дольше, чем я ожидал, и сохраняет мои emacs замороженными на долгие секунды. Поэтому я смотрю на свои замороженные emacs и бью себя за то, что я не использую, M-& some_command
и обещаю использовать в M-&
следующий раз. Но M-!
в моей мышечной памяти на протяжении десятилетий ... И, конечно, есть Ctrl-G
, но есть случаи, когда нарушение команды и повторный запуск не являются предпочтительными (может быть, это может нарушить, может быть, может потребоваться повторный запуск ...).
Подобная ошибка в оболочке konsole тривиальна для исправления Ctrl-Z
, bg
и задание выполняется в фоновом режиме.
Существует ли в emacs похожая хитрость - способ превратить текущую запущенную команду переднего плана (синхронную) в фоновую (асинхронную)?
Примечание: в случае, если это невозможно по умолчанию M-!
, я открыт для предложений о том, как сделать привязку M-!
к чему-то другому (что было бы функционально эквивалентным, кроме этого трюка).
&
в конец функции normalshell-command
(M-!
) сделает его асинхронным. Конечно, вы должны сделать это перед выполнением команды, но по крайней мере вы можете использовать ту же привязку клавиш.M-!
кasync-shell-command
. :-) Похоже, единственное, что вы теряете, это получение результата в эхо-области, когда он достаточно короткий.async-shell-command
делает. Он добавляет&
в конецCOMMAND
строки и выполняетshell-command
.Ответы:
Я подозреваю, что такой уловки не существует. Проблема в том, что синхронная команда оболочки (которая действительно
call-process-region
) блокирует цикл событий emacs. Единственный способ прекратить это - остановить процесс с помощью сигнала USR1 или USR2 или сделать C-g. (Могут быть и другие способы, но я так и делаю).Это означает, что вы ничего не можете сделать, потому что у вас нет способа вызвать трюк, так как Emacs не обрабатывает ввод, пока цикл событий остановлен.
Одна вещь, которую вы можете сделать, это просто поменять местами ключи:
источник