2011-06-23 31 views
16

Esto me ha vuelto loco por mucho tiempo; Me pregunto si hay alguna manera de solucionarlo Espero poder describir bien la situación.¿Cerrar automáticamente el modo de shell de emacs?

Para simplificar, digamos que tengo la siguiente estructura de directorios: ~ jer/DIRA y ~ jer/dirB

Dentro de una cáscara dentro de emacs, yo a empezar en mi directorio de nivel superior (~ JER) , escribe 'cd dir' y pulsa la pestaña.

Mi ventana se divide en 2, y tengo un búfer * Completions *. Esto es genial; Veo que mis opciones son 'dirA' y 'dirB', escribo 'A' (así que mi comando completo es 'cd dirA') y pulso enter, pero el búfer * Completions * permanece abierto y tengo que cerrarlo manualmente (generalmente con 'Cx 1' porque estoy en el buffer de shell que quiero guardar, pero si ya tengo una ventana dividida esto es aún más molesto, porque el búfer * Completions * toma el lugar del otro que era ya está allí, y tengo que cambiar a ese y presionar Cx k para matarlo manualmente).

Así que mi pregunta: ¿hay alguna manera de hacer que * Completions * muera automáticamente una vez que termine mi comando? En el ejemplo anterior, tan pronto como presiono enter luego de escribir 'cd DirA', me gustaría que se elimine el buffer.

Gracias, y espero que esto tenga sentido. Tenga en cuenta, no creo que esto es un duplicado de Is there any way to automatically close filename completetion buffers in Emacs?, porque eso es sobre el uso de encontrar-archivo (y en ese caso el * Terminaciones * búfer se cierra

+1

El búfer debe cerrarse automáticamente una vez que salga del "área de finalización" (el fragmento de texto que estaba completando). Al menos si usa una versión enugh reciente de Emacs. Si todavía ve este problema en Emacs-24, infórmelo a través de 'M-x report-emacs-bug' con suficientes detalles para reproducir el problema. – Stefan

Respuesta

8

Creo que esto es exactamente lo que quieres.
La función delete-completion-window-buffer se ejecutará cada vez que ingrese un comando. Encuentra todas las ventanas actuales y saca el búfer. Compruebe si el nombre del búfer es "* Completions *", el búfer que lo hace enojar, si es así, elimine el búfer y elimine la ventana correspondiente.
Por fin, pasa la cadena de salida a su próximo enlace comint-preoutput-filter-functions.
¿Por qué hay un argumento de salida? Consulte el documento de comint-preoutput-filter-functions. Mejor explicado allí.

(defun delete-completion-window-buffer (&optional output)                 
    (interactive)                         
    (dolist (win (window-list))                     
    (when (string= (buffer-name (window-buffer win)) "*Completions*")           
     (delete-window win)                      
     (kill-buffer "*Completions*")))                   
    output)                          

(add-hook 'comint-preoutput-filter-functions 'delete-completion-window-buffer) 

Pero acturelly, la dosis no búfer finalización mí mucho molestia. Lo que molesta es que el comando "claro" dosen't funciona bien. Para resolver tu problema, me gusta el modo shell, no hay nada allí.
Pero tengo una solución a mi problema EmacsWiki.

(defun clear-shell()                       
    (interactive)                         
    (let ((comint-buffer-maximum-size 0))                   
    (comint-truncate-buffer)))                     

(define-key shell-mode-map (kbd "C-l") 'clear-shell)               

Lo ato a Ctrl-L, el enlace de terminal normal.
Buen código. ¡Espero que te guste!

+0

Gracias, gracias, gracias! Hasta ahora, esto está funcionando perfectamente. – Jer

+0

@Jer ¡De nada! :) –

0

eshell-mode. Terminaciones búfer se cerrará cuando se pulse el espacio o se termina de comandos.

Cuestiones relacionadas