2009-04-13 8 views
4

Wenn ich nur ein Fenster in Emacs zeige und M-x kompiliere, spaltet sich das Fenster in zwei Teile und ich kann den Kompilierpuffer leicht beobachten. Wenn jedoch mehr Fenster angezeigt werden, übernimmt das Kompilierungsprotokoll einen der anderen, was mich irritiert. Wie kann ich Emacs immer ein neues Fenster aufteilen, um das Kompilierungsprotokoll anzuzeigen?Wie kann ich das Kompilierungsprotokoll veranlassen, ein neues Fenster in Emacs zu erstellen?

Edit: Etwas mehr Informationen aus meiner Lektüre, die ich getan habe. Es sieht so aus, als ob compile.el den display-buffer aufruft, der nur ein Fenster aufteilt, wenn es die volle Breite hat. Gibt es eine Möglichkeit, dieses Verhalten zu vermeiden?

Antwort

4

Sie können die Lösung von Trey Jackson passen Ihre Bedürfnisse zur Verfügung gestellt ändern.

Der folgende Code-Schnipsel markiert den Puffer *compilation* als speziell und legt eine benutzerdefinierte Funktion als Anzeigefunktion fest, um das aktuelle Fenster zu teilen, auch wenn es bereits in einem geteilten Fenster vorhanden ist.

(setq special-display-buffer-names 
     '("*compilation*")) 

(setq special-display-function 
     (lambda (buffer &optional args) 
     (split-window) 
     (switch-to-buffer buffer) 
     (get-buffer-window buffer 0))) 
+0

Es funktioniert überhaupt nicht. – CodyChan

3

Wenn Sie wollen, ist ein dediziertes Top-Level-Fenster (Emacs nennt diese Frames), dann wird dies den Trick für Sie tun. Dieses Snippet enthält Placement-Anweisungen. Wenn Sie jedoch die Variable 'special-display-buffer-names anpassen, erhalten Sie das, was Sie möchten.

(setq special-display-buffer-names 
     `(("*compilation*" . ((name . "*compilation*") 
          ,@default-frame-alist 
          (left . (- 1)) 
          (top . 0))))) 
+0

weiß, dass ich die Terminologie, und ich bin eigentlich auf der Suche nach einem logischen Emacs-Fenster, wie auf einem physischen gegenüber. –

1

Kombination Code aus How can I prevent emacs from opening new window for compilation output? und Code aus http://www.emacswiki.org/emacs/CompilationMode, das ist mein Code für compile, es bietet Ihnen 4 Funktionen:

1). Verwenden Sie compile-again, um die gleiche Kompilierung wie das letzte Mal automatisch ohne Aufforderung auszuführen. Wenn es kein letztes Mal gibt oder ein Präfix-Argument vorhanden ist, verhält es sich wie M-x kompilieren.

2). compile wird das aktuelle Fenster teilen, es wirkt sich nicht auf die anderen Fenster in diesem Rahmen aus.

3). Es wird den *compilation* Puffer (Fenster) automatisch schließen, wenn es keinen Fehler gibt, behalten Sie es bei, wenn ein Fehler vorliegt.

4). es wird die Fehlerzeile und die Zeilennummer des Quellcodes im *compilation* Puffer markiert, verwenden Sie M-n/p jeden Fehler in *compilation* Puffern, Enter in der Fehlerzeile navigieren Sie zu der Zeile im Code Code zu springen.

(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) 
0

Installieren Sie smart-compile Paket in Emacs.

fügen Sie diese in Ihr init.el oder .emacs

(require 'compile) 
(setq compilation-last-buffer nil) 
;; save all modified buffers without asking before compilation 
(setq compilation-ask-about-save nil) 
(defun compile-again (ARG) 
    "Run the same compile as the last time. 

With a prefix argument or no last time, this acts like M-x compile, 
and you can reconfigure the compile args." 
    (interactive "p") 
    ;; the following two lines create bug: split a new window every time 
    ;; (if (not (get-buffer-window "*compilation*")) 
    ;;  (split-window-below)) 
    (if (and (eq ARG 1) compilation-last-buffer) 
     (recompile) 
    (call-interactively 'smart-compile))) 
(bind-key* "C-x C-m" 'compile-again) 
;; create a new small frame to show the compilation info 
;; will be auto closed if no error 
(setq special-display-buffer-names 
     `(("*compilation*" . ((name . "*compilation*") 
          ,@default-frame-alist 
          (left . (- 1)) 
          (top . 0))))) 
(setq compilation-finish-functions 
     (lambda (buf str) 
     (if (null (string-match ".*exited abnormally.*" str)) 
      ;;no errors, make the compilation window go away in a few seconds 
      (progn 
       (run-at-time 
       "1 sec" nil 'delete-windows-on 
       (get-buffer-create "*compilation*")) 
       (message "No Compilation Errors!"))))) 

Verwenden C-x C-m Ihren Quellcode zu kompilieren, wenn Sie das erste Mal sind C-x C-m auszuführen, werden Sie gefragt, den Standardbefehl zu ändern (was in der Regel genug ist), andernfalls wird der Befehl ausgeführt, den Sie gerade zum direkten Kompilieren verwendet haben, und Sie müssen C-u C-x C-m verwenden, um den Befehl zu ändern, wenn Sie möchten. Wenn Sie ein Makefile innerhalb des aktuellen Verzeichnisses haben, wird es bemerkt und aufgefordert zu fragen, ob Sie es verwenden möchten.

Vielleicht ist diese Antwort auf Ihre Frage zu viel, aber bitte versuchen Sie es.