Может ли Emacs запустить команду в фоновом режиме - PullRequest
8 голосов
/ 28 декабря 2011

У меня есть команда Emacs, подобная следующей:

(defun query-lisp (word)
  (interactive "sType a word to query:")
  (message "%s" (query word)))

Операция query занимает много времени.Когда эта команда выполняется, Emacs блокирует весь кадр.Есть ли способ заставить Emacs запустить эту команду в фоновом режиме или заблокировать только одно окно, такое как минибуфер?

Ответы [ 3 ]

11 голосов
/ 28 декабря 2011

Если вы планируете использовать внешний процесс (который вы указали в комментарии к другому вопросу), вы можете использовать следующее:

 (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS)

Это вернет процесс объект.Вы можете отправить вывод в буфер или добавить к процессу функцию фильтра .В последнем случае это функция, которая вызывается каждый раз, когда ваш процесс генерирует какие-либо выходные данные.

Кроме того, вы можете присоединить дозорную функцию к вашему процессу.Эта функция вызывается каждый раз, когда изменяется состояние вашего процесса, это полезно выяснить, когда он завершился.

В исходном коде Emacs есть несколько примеров вышеупомянутого, один такой пример - compile.el.

9 голосов
/ 28 декабря 2011

Emacs не имеет потоков. Для длительных операций вы можете разбить задачу на чанки и выполнить чанки в таймеры простоя , чтобы emacs мог реагировать на ввод пользователя между чанками.

Другая возможность - запускать его как внешний процесс, из которого emacs принимает вывод.

4 голосов
/ 28 декабря 2011

Например, вы можете использовать что-то вроде этого

(shell-command "sleep 10 && echo 'finished' &")

Результат будет отображаться в буфере *Async Shell Command*.

...