Включення активних M-! в M- & (a'ka emacs equiv to bash Ctrl-Z)


14

Час від часу мені трапляється M-! some_commandпросто виявити, що команда працює довше, ніж я очікувала, і зберігає мої emacs довгими секундами. Тому я глазурую свої заморожені емаки і б'ю себе за те, що не користуюся, M-& some_commandі обіцяю використовувати M-&наступний раз. Але M-!це в моїй м'язовій пам’яті десятиліттями… І звичайно, є Ctrl-G, але випадки, коли порушувати команду і повторно запускати її не бажано (можливо, це може зламати що-небудь, можливо, дорого було б повторити…).

Подібна помилка в консолі оболонки є тривіальною для виправлення Ctrl-Z, bgі робота працює у фоновому режимі.

Чи є в emacs якийсь подібний трюк - спосіб перетворити команду, що працює на даний момент (синхронний), у фоновий (асинхронний)?

Зауважте: якщо це неможливо за замовчуванням M-! , я відкритий для пропозицій, як перезавантажити M-!щось інше (що було б функціонально еквівалентним, крім цього фокусу).


2
Можливо, вам буде цікаво знати, що просто додавання &до кінця звичайного shell-command( M-!) зробить його асинхронним. Звичайно, ви повинні зробити це перед тим, як запустити команду, але принаймні ви можете скористатися тим самим прив'язкою клавіш.
няня

4
Ви завжди можете просто перепризначити M-!до async-shell-command. :-) Здається, що єдине, що ви втрачаєте, - це отримання результату в області ехо, коли він досить короткий.
глюкас

1
@nanny, насправді, це все і async-shell-commandробиться. Він додає &до кінця COMMANDрядка і виконує shell-command.
Матвій Пізіак

Відповіді:


2

Чи є в emacs якийсь подібний трюк - спосіб перетворити команду, що працює на даний момент (синхронний), у фоновий (асинхронний)?

Я підозрюю, що такої хитрості не існує. Проблема полягає в тому, що команда синхронної оболонки (яка насправді call-process-region) блокує цикл подій emacs. Єдиний спосіб її зламати - це вбити процес за допомогою сигналу USR1 або USR2 або зробити C-g. (Можуть бути й інші способи, але це я роблю).

Це означає, що ви нічого не можете зробити, оскільки у вас немає способу викликати трюк, оскільки Emacs не обробляє введення даних, коли цикл подій затримується.


Одне, що ви можете зробити, - це просто поміняти клавіші:

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

Повторний M-! команда async-shell-command має частковий сенс, але: (1) Я не впевнений у M-1 M-! поведінка (вихід команди в буфер) - прості швидкі випадки працюють, але що робити, якщо команда повільніше, і я набираю sth? (2) у багатьох випадках мені подобається заморожувати до тих пір, поки команда не закінчить поведінку, оскільки вона дає чітку індикацію закінчення (деякі команди не мають виходу…), тому явне натискання клавіші „ставити на задній план” було б приємніше (3), оскільки асинхронізація залишає ті буфери Async, які повинні пожинатися
Мекк

Я думаю, чи вдасться записати якусь обгортку навколо команди async-shell-команда (функція, яка б породила команду async-shell-команду, потім дочекалася її завершення, реагуватиме на Ctrl-G шляхом переривання команди та на якийсь інший натискання клавіші, залишивши він працює, але більше не чекає, і знову почніть знову буфер Async, якщо вихід порожній або короткий). Я не впевнений, як зробити цю частину очікування…
Mekk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.