Нужны ли команды сброса 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 состоит в использовании Mxcompile
RET. В частности, это позаботится о стирании буфера для вас, запуске процессов в фоновом режиме (без зависания Emacs, как в вашем примере) и обработке выходных данных для обнаружения сообщений об ошибках / предупреждений.