Порядок выполнения Lisp и асинхронный вызов - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть следующий код:

((lambda()
   (defvar buffer-name)
   (setq buffer-name "*mongo-dev*")
   (switch-to-buffer-other-window buffer-name)
   (call-process "sleep" nil buffer-name  nil "2")
  ))

Есть 2 неожиданных поведения

  1. выглядит как call-process, всегда выполняемое перед switch-to-buffer-xxx. как я могу сделать switch-to-buffer выполненным первым?
  2. при выполнении приведенного выше кода мой emacs зависает на 2 секунды, есть ли способ для call-процесса работать асинхронно?

Кстати, в Emacs есть ли встроенный формат для кода elisp?

1 Ответ

0 голосов
/ 25 апреля 2018

Переключиться в буфер

Использовать существующие макросы. Например, следующее переключается в буфер (и создает его при необходимости) и записывает что-то в него. Весь код внутри (with-current-buffer-window ...) выполняется в контексте, где выбранный буфер активен и видим.

(with-current-buffer-window "*mongo-dev*" nil nil
  (insert "Hello"))

Вышеуказанный макрос является расширением, и перед оценкой он расширяется до кода. Позвонив по коду macroexpand-all (обратите внимание на цитату '), вы увидите, что является результатом преобразования кода:

(macroexpand-all '(with-current-buffer-window "*mongo-dev*" nil nil
                   (insert "Hello")))

(let* ((buffer (temp-buffer-window-setup "*mongo-dev*"))
       (standard-output buffer)
       window
       value)
  (save-current-buffer
    (set-buffer buffer)
    (setq value (progn (insert "Hello")))
    (setq window (temp-buffer-window-show buffer nil)))
  (if (functionp nil)
      (funcall nil window value)
    value))

Создание процесса и использование буфера для просмотра его вывода

Это обычная задача, вместо этого вы можете использовать следующее:

(start-process-shell-command "my-process"
                             "*mongo-dev*"
                             "ls -la /usr/bin")

Ваш код

(defvar buffer-name)

defvar только для объявлений глобальных переменных в качестве операторов верхнего уровня. Вам редко (никогда) нужно помещать defvar внутри функции.

(setq buffer-name "*mongo-dev*")

Вместо этого вы хотели сделать локальную привязку (символ «имя буфера» используется в качестве локальной переменной внутри тела let).

(let ((buffer-name "*mongo-dev*"))
  (switch-to-buffer-other-window buffer-name)
  (call-process "sleep" nil buffer-name  nil "2"))

call-process является синхронным, у вас есть другие варианты, но это слишком широко, чтобы детализировать здесь. См. Руководство.

Кстати, в Emacs есть ли встроенный формат для кода elisp?

Да, emacs-lisp-mode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...