Как я могу предотвратить открытие emacs нового окна для вывода компиляции? - PullRequest
9 голосов
/ 29 ноября 2011

Как я могу предотвратить открытие нового окна в emacs при вызове команды компиляции?Я хотел бы привязать его к конкретному существующему окну.

Ответы [ 5 ]

8 голосов
/ 29 ноября 2011

На основании ваших комментариев с Люком я бы порекомендовал проверить эту функцию, которую я использую. Мне это нравится, потому что он скрывает буфер компиляции, если ошибок не было, иначе оставляет его, чтобы вы могли их видеть.

Вы можете проверить вики emacs на странице, но вот код:

;; Helper for compilation. Close the compilation window if
;; there was no error at all. (emacs wiki)
(defun compilation-exit-autoclose (status code msg)
  ;; 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))
;; Specify my function (maybe I should have done a lambda function)
(setq compilation-exit-message-function 'compilation-exit-autoclose)

Вы всегда можете переключиться обратно в буфер компиляции для просмотра любых предупреждений.

3 голосов
/ 29 ноября 2011

Вы можете выбрать имя буфера компиляции, установив compilation-buffer-name-function для функции, которая принимает имя основного режима и возвращает имя буфера:

(setq compilation-buffer-name-function 
      '(lambda (maj-mode)
     "existing-buffer-name"))

Однако, глядя на исходный код compliation-start, похоже, что буфер компиляции всегда очищается (вызывая erase-buffer) перед записью вывода.

Редактировать : Если я правильно понял вопрос, вам нужно взломать функцию compilation-start в вашем файле compile.el, закомментировав строку:

    ;; Pop up the compilation buffer.
    ;; http://lists.gnu.org/archive/html/emacs-devel/2007-11/msg01638.html
    ;; (setq outwin (display-buffer outbuf)) 
1 голос
/ 30 ноября 2011

Не совсем уверен, что вы спрашиваете, но если вы хотите, чтобы буфер ` compilation 'отображался в текущем окне, а не в другом окне, то:

(add-to-list 'same-window-buffer-names "*compilation*")
0 голосов
/ 06 февраля 2015

Я задал похожий вопрос для другого случая (в режиме Man), но, возможно, код будет полезен и здесь: Управление Emacs * Man * расположение буфера? (в частности https://gist.github.com/Mekk/aad77cf3401a17e5df0d, но проверьте вопрос выше)

0 голосов
/ 02 февраля 2015

Сочетание @zdav 's anwser и кода от http://www.emacswiki.org/emacs/CompilationMode, это весь мой код для compile, он предоставляет вам 4 функции:

1).Используйте compile-again для автоматического запуска той же компиляции, что и в прошлый раз, без приглашения.Если последний раз отсутствует или есть префиксный аргумент, он действует как Mx compile.

2).compile разделит текущее окно, оно не повлияет на другие окна в этом кадре.

3).он автоматически закроет буфер *compilation* (окно), если ошибки нет, сохраните его, если ошибка существует.

4).он выделит строку ошибки и номер строки исходного кода в буфере *compilation*, используйте M-n/p для навигации по каждой ошибке в буфере *compilation*, Enter в строке ошибок для перехода к строке в вашем коде кода.

(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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...