2012-03-15 6 views
11

Quiero hacer que la ventana de compilación en Emacs aparezca siempre en la parte inferior de una ventana y siempre tenga cierta altura. Hasta ahora pongo las siguientes líneas en mi archivo .emacs:¿Cómo hago que la ventana de compilación en Emacs tenga siempre un determinado tamaño?

(setq split-height-threshold 0) 
(setq compilation-window-height 10) 

... y funciona para cuando sólo tengo una ventana abierta, pero tan pronto como dividir la pantalla en dos ventanas en horizontal (que es decir, la línea divisoria en el medio va de arriba a abajo), la ventana de compilación deja de respetar la variable de altura y divide la ventana en el medio.

¿Cómo puedo solucionar esto?

+0

[popwin] (https://github.com/m2ym/popwin-el) podría ser útil según lo sugerido por Amardeep. – kenorb

Respuesta

13

me gustaría utilizar algo como esto, una adaptación libre de la EmacsWiki:

(defun my-compilation-hook() 
    (when (not (get-buffer-window "*compilation*")) 
    (save-selected-window 
     (save-excursion 
     (let* ((w (split-window-vertically)) 
       (h (window-height w))) 
      (select-window w) 
      (switch-to-buffer "*compilation*") 
      (shrink-window (- h compilation-window-height))))))) 
(add-hook 'compilation-mode-hook 'my-compilation-hook) 

Si el buffer *compilation* no es visible, esto va a dividir la ventana verticalmente, cambiar el tamaño de la ventana que se abre a la altura de 10 líneas, y abra el buffer *compilation* en él.

+2

¿Tiene idea de cómo parchear para que esté siempre en la parte inferior del * marco * actual, no en la ventana? Me refiero al siguiente caso: edite algo, C-x2 para dividir la ventana por la mitad, M-x compile mientras permanece en la ventana superior. Tu código abre la compilación en la parte inferior del primer premio, sería más agradable tenerlo abierto en la parte inferior del marco ... – Mekk

+1

@Mekk He publicado una versión revisada en la siguiente [esencia] (https: // gist. github.com/ffevotte/d7e69cf147c014381003) – Francesco

+0

Muchas gracias, se ve bien. Hay una cosa más que estaría bien, pero aquí no estoy seguro de si es posible: hacer una ventana de compilación compartida con algunos modos derivados similares (en mi caso, esos son principalmente * Ack * o * Ag *, pero supongo * Ocurrir * o * (algunos) Grep * requeriría lo mismo). Traté de buscar la solución yo mismo, pero no sé cómo decirle a emacs "por favor, abra esta compilación que acaba de crear en la ventana actualmente ocupada por * Ack *) (todavía, una vez más, gracias por el código actual) – Mekk

1

Puede personalizar la variable compilation-window-height.

1

Código de combinación de How can I prevent emacs from opening new window for compilation output? y el código de http://www.emacswiki.org/emacs/CompilationMode, todo esto es mi código de compile, que le proporciona 4 funciones:

1). Use compile-again para ejecutar automáticamente la misma compilación que la última vez, sin solicitud. Si no hay una última vez, o hay un argumento de prefijo, actúa como compilación M-x.

2). compile dividirá la ventana actual (siempre será un determinado tamaño), no afectará a las otras ventanas en este marco.

3). cerrará automáticamente el buffer *compilation* (ventana) si no hay ningún error, guárdelo si existe un error.

4). resaltará la línea de error y el número de línea del código fuente en el buffer *compilation*, use M-n/p para navegar cada error en *compilation* buffer, Enter en la línea de error para saltar a la línea en su código de código.

(require 'compile) 
(setq compilation-last-buffer nil) 
(defun compile-again (ARG) 
    "Run the same compile as the last time. 

If there is no last time, or there is a prefix argument, this acts like M-x compile." 
    (interactive "p") 
    (if (and (eq ARG 1) 
      compilation-last-buffer) 
     (progn 
     (set-buffer compilation-last-buffer) 
     (revert-buffer t t)) 
    (progn 
     (call-interactively 'compile) 
     (setq cur (selected-window)) 
     (setq w (get-buffer-window "*compilation*")) 
     (select-window w) 
     (setq h (window-height w)) 
     (shrink-window (- h 10)) 
     (select-window cur)))) 
(global-set-key (kbd "C-x C-m") 'compile-again) 
(defun my-compilation-hook() 
    "Make sure that the compile window is splitting vertically." 
    (progn 
    (if (not (get-buffer-window "*compilation*")) 
     (progn 
      (split-window-vertically))))) 
(add-hook 'compilation-mode-hook 'my-compilation-hook) 
(defun compilation-exit-autoclose (STATUS code msg) 
    "Close the compilation window if there was no error at all." 
    ;; If M-x compile exists with a 0 
    (when (and (eq STATUS 'exit) (zerop code)) 
    ;; then bury the *compilation* buffer, so that C-x b doesn't go there 
    (bury-buffer) 
    ;; and delete the *compilation* window 
    (delete-window (get-buffer-window (get-buffer "*compilation*")))) 
    ;; Always return the anticipated result of compilation-exit-message-function 
    (cons msg code)) 
(setq compilation-exit-message-function 'compilation-exit-autoclose) 
(defvar all-overlays()) 
(defun delete-this-overlay(overlay is-after begin end &optional len) 
    (delete-overlay overlay) 
) 
(defun highlight-current-line() 
"Highlight current line." 
    (interactive) 
    (setq current-point (point)) 
    (beginning-of-line) 
    (setq beg (point)) 
    (forward-line 1) 
    (setq end (point)) 
    ;; Create and place the overlay 
    (setq error-line-overlay (make-overlay 1 1)) 

    ;; Append to list of all overlays 
    (setq all-overlays (cons error-line-overlay all-overlays)) 

    (overlay-put error-line-overlay 
       'face '(background-color . "red")) 
    (overlay-put error-line-overlay 
       'modification-hooks (list 'delete-this-overlay)) 
    (move-overlay error-line-overlay beg end) 
    (goto-char current-point)) 
(defun delete-all-overlays() 
    "Delete all overlays" 
    (while all-overlays 
    (delete-overlay (car all-overlays)) 
    (setq all-overlays (cdr all-overlays)))) 
(defun highlight-error-lines(compilation-buffer process-result) 
    (interactive) 
    (delete-all-overlays) 
    (condition-case nil 
     (while t 
     (next-error) 
     (highlight-current-line)) 
    (error nil))) 
(setq compilation-finish-functions 'highlight-error-lines) 
Cuestiones relacionadas