Kết hợp mã từ How can I prevent emacs from opening new window for compilation output? và mã từ http://www.emacswiki.org/emacs/CompilationMode, đây là tất cả các mã của tôi cho compile
, nó cung cấp cho bạn 4 tính năng:
1). Sử dụng compile-again
để chạy cùng một biên dịch tự động như lần trước, không có lời nhắc. Nếu không có thời gian qua, hoặc có một đối số tiền tố, nó hoạt động như biên dịch M-x.
2). compile
sẽ chia cửa sổ hiện tại (luôn có kích thước nhất định), nó sẽ không ảnh hưởng đến các cửa sổ khác trong khung này.
3). nó sẽ tự động đóng bộ đệm *compilation*
(cửa sổ) nếu không có lỗi, giữ nó nếu lỗi tồn tại.
4). nó sẽ làm nổi bật dòng lỗi và số dòng của mã nguồn trong bộ đệm *compilation*
, sử dụng M-n/p
để điều hướng mọi lỗi trong bộ đệm *compilation*
, Enter
trong dòng lỗi để chuyển đến dòng trong mã của bạn.
(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)
[popwin] (https://github.com/m2ym/popwin-el) có thể hữu ích như đề xuất của Amardeep. – kenorb