2013-05-24 4 views
1

Я новичок в xemacs и linux вообще, поэтому считаю меня новичком. И мне было интересно, есть ли причина, по которой elisp не будет выполнять команду или команды мгновенно.команды flush xemacs/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 ...). Так как командная оболочка стирает буфер, прежде чем выпустить вывод оболочки, его сложно сказать.

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

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

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

+0

Я предлагаю вам использовать 'M-x compile RET' вместо' shell-command'. Это создаст буфер компиляции, в котором вы можете щелкнуть по ошибкам/предупреждениям, которые должны быть взяты непосредственно в соответствующую точку в файле. – sds

ответ

2

Во-первых, я не очень привык к 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 различие?)

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

+0

Спасибо Франческо, это решило неприятность, помогая мне понять, что не так, и в совершенствовании самого метода (с помощью компиляции). – Tasche