Нужны ли команды сброса xemacs/elisp?

Я новичок в xemacs и Linux в целом, так что считайте меня новичком. И мне было интересно, есть ли причина, по которой elisp не будет выполнять команду или команды сразу.

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

(defun myClear ()
  "Clears console output buffer (F5)"
  (erase-buffer "*Shell Command Output*"))

(defun myMake ()
  "Executes make (F6)"
  (shell-command "make"))

(defun myClearMake ()
  "Clears console output buffer before executing make (F7)"
  (erase-buffer "*Shell Command Output*")
  (shell-command "make"))

они связаны с клавишами F5-F7. Удар по F7 не дает того же результата, что сначала нажатие по F5, а затем по F6, которые работают, как и ожидалось.

Вместо этого происходит то, что оператор (erase-buffer ...), кажется, пропущен или может быть выполнен прямо перед (shell-command ...). Так как команда shell все равно стирает буфер перед выводом вывода оболочки, сказать сложно.

Что я ожидал: вывод консоли очищается. Это должно быть видно, пока make все еще работает и еще не выдает никаких результатов (что, в моем случае, составляет несколько секунд).

Я понятия не имею, как провести дальнейшее тестирование, и хотя это кажется обычной задачей, я не смог найти ничего подходящего или похожего. Также учтите, что меня интересует не только упомянутое поведение, но и понимание того, что я сделал неправильно.

Любые ссылки / указатели на механику elisp, которые объясняют это поведение, приветствуются. Спасибо таще

1 ответ

Решение

Во-первых, я не очень привык к XEmacs, а скорее к Emacs... Могут быть различия. Но я могу воспроизвести вашу проблему с Emacs, поэтому я надеюсь, что решение Emacs будет работать и для XEmacs.

Emacs не отображает пользовательский интерфейс во время выполнения команды, что означает нажатие F5 запускает команду myClear, затем перерисовывает дисплей в ожидании другого ввода, затем myMake выполняется, когда вы нажмете F6. С другой стороны, когда вы нажмете F7, весь цикл myClear-myMake выполняется без какого-либо повторного erase-buffer эффекты невидимы. Вы должны заставить redisplay после erase-buffer чтобы увидеть его последствия.

Ниже приведен рабочий пример на основе предоставленного вами кода.

(defun myClear ()
  "Clears console output buffer (F5)"
  (interactive)
  (with-current-buffer "*Shell Command Output*"
    (erase-buffer)))

(defun myMake ()
  "Executes make (F6)"
  (interactive)
  (shell-command "sleep 2; echo Hello World"))

(defun myClearMake ()
  "Clears console output buffer before executing make (F7)"
  (interactive)
  (myClear)
  (redisplay)
  (myMake))

(global-set-key (kbd "<f5>") 'myClear)
(global-set-key (kbd "<f6>") 'myMake)
(global-set-key (kbd "<f7>") 'myClearMake)

Обратите внимание, что мне пришлось внести незначительные корректировки (возможно, из-за различий в Emacs/XEmacs?)

Также обратите внимание, что лучший способ сделать что-то вроде запуска make состоит в использовании MxcompileRET. В частности, это позаботится о стирании буфера для вас, запуске процессов в фоновом режиме (без зависания Emacs, как в вашем примере) и обработке выходных данных для обнаружения сообщений об ошибках / предупреждений.

Другие вопросы по тегам