2010-02-25 34 views
11

Tengo una pregunta sobre cómo "salir de SLIME con elegancia", cuando salgo de Emacs. Aquí está la parte pertinente de mi fichero de configuración:Cómo salir elegantemente de SLIME y Emacs?

;; SLIME configuration 

(setq inferior-lisp-program "/usr/local/bin/sbcl") 
(add-to-list 'load-path "~/Scripts/slime/") 
(require 'slime) 
(slime-setup) 

;; configure SLIME to gracefully quit when emacs 
;; terminates 

(defun slime-smart-quit() 
    (interactive) 
    (when (slime-connected-p) 
    (if (equal (slime-machine-instance) "Gregory-Gelfonds-MacBook-Pro.local") 
(slime-quit-lisp) 
     (slime-disconnect))) 
    (slime-kill-all-buffers)) 

(add-hook 'kill-emacs-hook 'slime-smart-quit) 

Que yo sepa esto debe matar de forma automática BABA y está procesos cada vez que salir de Emacs asociado. Sin embargo, cada vez que la salida, sigo teniendo el símbolo:

Proc  Status Buffer Command 
----  ------ ------ ------- 
SLIME Lisp open  *cl-connection* (network stream connection to 127.0.0.1) 
inferior-lisp run  *inferior-lisp* /usr/local/bin/sbcl 


Active processes exist; kill them and exit anyway? (yes or no) 

Puede alguien arrojar alguna idea de lo que me falta de mi configuración?

Gracias de antemano.

+0

¿A quién le importan los atajos de teclado? Queremos que se pegue algo en .emacs que sale de SLIME cuando termina emacs. – mcandre

Respuesta

2

Una forma de solucionar el problema es depurar la función.

Coloque su cursor dentro de la rutina 'slime-smart-quit y escriba M-x edebug-defun. Luego salga de Emacs como lo haría normalmente. A continuación, el depurador de lisp de Emacs debe preguntarle edebug. Es un depurador bastante fácil de usar (escriba ? para obtener ayuda).

Examine el código y vea dónde no funciona lo que espera que haga.

Uso q para salir fuera del depurador, a continuación, hacer cambios, y M-x-defun edebug de nuevo para depurar la nueva versión.

Repita hasta que encuentre el éxito, o tenga un poco más de información para la pregunta.

21

Sé que no es exactamente lo que pediste, pero quizás esto sea útil para otros noobs como yo.

Puede ejecutar un comando SLIME para salir, por lo que le quedarán unos emacs bonitos y limpios.

En un búfer SLIME, escriba , (coma). Estás en el minibúfer y SLIME pregunta qué comando ejecutar. Escriba sayoonara y pulse Ingrese. Debería ver que SLIME sale, el minibúfer menciona que "Connection se cerró". y estás en el búfer * scratch *.

Me pregunto si hay alguna manera de invocar simplemente este comando "sayoonara" desde sus .emacs, en lugar de desconectarlo todo manualmente.

+4

Prefiero 'dejar' a 'sayoonara'. Es más corto :-) –

+1

Quizás sea así, pero 'sayoonara' es mucho más genial ψ (' ∇') ψ – rsenna

+0

Esto termina mi sesión stumpwm. :) Creo que solo necesito '(slime-disconnect)'. – daveloyall

3

El problema es que la comprobación de los procesos activos (y la consulta de confirmación para matar) se activaría antes de que kill-emacs-hooks tuviera la oportunidad de hacer su trabajo.

Una solución muy kludgy:

(defadvice save-buffers-kill-terminal (before slime-quit activate) 
    (slime-smart-quit) 
    (sleep-for 1)) 

La función slime-quit-lisp es asíncrona; necesita tiempo para terminar después de regresar, de ahí el sleep-for.

4

Según el manual page on this, "una vez que save-buffers-kill-emacs ha terminado con todos los archivos guardados y confirmados, llama a kill-emacs que ejecuta las funciones en este enganche". Por lo tanto, la comprobación de los procesos activos se realiza antes de llamar al enganche.

una solución de trabajo sería la de hacer su propio comando kill-emacs, por ejemplo

(defun kill-emacs-slime() 
    (interactive) 
    (when (slime-connected-p) 
    (if (equal (slime-machine-instance) "Gregory-Gelfonds-MacBook-Pro.local") 
     (slime-quit-lisp) 
     (slime-disconnect))) 
    (slime-kill-all-buffers) 
    (save-buffers-kill-emacs)) 

Y luego unir esto a su dejar de fumar clave

(global-set-key (kbd "C-x C-c") 'kill-emacs-slime) 

(estoy asumiendo su función correctamente dejar de fumar SLIME y cierra sus buffers, no lo he probado).

1

@Alex - Encontré que su método es la forma más limpia de dejar SLIME. Sin embargo, el archivo de configuración necesita ser editado de esta manera para que sea utilizado.

(require 'slime-autoloads) 
(slime-setup '(slime-fancy)) ; load contrib packages 

Una vez que está la configuración de esta manera a continuación:

  1. prensa coma (,) para abrir el minibuffer
  2. tipo dejar o sayoonara a limpiamente salida.

PS: Comprobar esto para BABA config en el arranque - http://common-lisp.net/project/slime/doc/html/Loading-Contribs.html

1

me resulta molesto tener que ponerse de acuerdo para matar todos los procesos cada vez que cierro los Emacs lo que ocurrió esta función

(defun emacs-forget-buffer-process() 
    "Emacs will not query about this process when killing." 
    (let ((p (get-buffer-process (current-buffer)))) 
    (when p 
     (set-process-query-on-exit-flag p nil)))) 

que hace que el proceso muera silenciosamente cuando Emacs está cerrado. Utilizar de esta

(add-hook 'slime-inferior-process-start-hook #'emacs-forget-buffer-process) 
(add-hook 'slime-repl-mode-hook #'emacs-forget-buffer-process) 

lo uso para todos los tampones repl-como que tengo, que incluye octava, pitón, esquema, cáscara y ghci de Haskell. Hasta el momento no ha sucedido nada malo cuando estos repls son asesinados silenciosamente, así que asumo que esta solución no está mal, aunque puede que no sea graciosa.

0

Esta es una solución más general que yo uso. Funciona no solo para SLIME, sino para otras cosas, p. python, terminal, ceceo, etc.

(defadvice save-buffers-kill-emacs (around no-query-kill-emacs activate) 
    "Prevent annoying \"Active processes exist\" query when you quit Emacs." 
    (flet ((process-list())) ad-do-it)) 
Cuestiones relacionadas