2012-11-07 78 views
8

如何設置emacs,以便在新編譯期間瀏覽以前的編譯錯誤?在新編譯期間瀏覽以前的編譯錯誤?

兩件事情不爲我工作:

    當第二編譯正在進行
  1. M-克間克(下一個錯誤)功能無法正常工作。

  2. 我有我的emacs分成5個不平坦的窗口(拆分窗口水平),編譯「窗口」是兩倍的大小(dbl顯示器設置)。當我啓動編譯時,它總是出現在最後一個雙編譯窗口中。現在它爲自己打開一個新窗口。

+0

考慮它的可編程的,這是行不通的,答案是肯定的。 –

+0

你能否詳細解釋一下目前的答案缺乏哪些細節? – Francesco

+0

@Francesco - 忘記添加解釋什麼不工作 - 在評論中添加到您的答案。 –

回答

0

這是一個有點的未完善,但試試這個:

開始新的編譯之前,請保存(寫,C-X C-W)當前編譯緩衝區中的文件。如果新文件的緩衝區放棄了「編譯模式」設置,只需重新打開編譯模式(M-x編譯模式)即可。

+0

這聽起來像一個合理的方法。但我無法手動完成。而且,當新的編譯完成時,我希望它覆蓋舊的錯誤列表。也許我們可以修改編譯命令以編譯到某個臨時緩衝區,並在完成後將它移動到\ * compilation \ *中。 –

3

這裏是一個解決方案,這似乎滿足您的所有需求:

  • *compilation-old*緩衝區始終保持在同一個窗口
  • next-error不破
  • 所有連續編譯輸出在末尾附加*compilation-old*當編譯過程終止時
(defun my-compilation-finish-function (buffer msg) 
    ;; Don't do anything if we are in a derived mode 
    (when (with-current-buffer buffer (eq major-mode 'compilation-mode)) 

    ;; Insert the last compilation output at the end of *compilation-old* 
    (if (get-buffer "*compilation-old*") 
     (with-current-buffer "*compilation-old*" 
      (save-excursion 
      (goto-char (point-max)) 
      (insert-buffer buffer))) 
     (with-current-buffer buffer 
     (rename-buffer "*compilation-old*"))))) 

(add-hook 'compilation-finish-functions 'my-compilation-finish-function) 



(defadvice compile (around my-compile-show-old activate) 
    "Show the *compilation-old* buffer after starting the compilation" 
    (let ((buffer (current-buffer))) 
    (when (get-buffer "*compilation-old*") 
     (pop-to-buffer "*compilation-old*") 
     (switch-to-buffer "*compilation*")) 
    ad-do-it 
    (when (get-buffer "*compilation-old*") 
     (switch-to-buffer "*compilation-old*") 
     (pop-to-buffer buffer)))) 
+0

2件事對我不起作用:1.當第二次編譯正在進行時,M-g M-g(nex-error)函數不起作用。 2.我將emacs分成5個不平坦窗口(水平分割窗口),編譯窗口的大小是雙倍大小(dbl moniotr設置)。當我啓動編譯時,它總是出現在最後一個雙編譯窗口中。現在它爲自己開闢了一扇新窗口。 –

+0

至於問題1,你是否按照內聯幫助中描述的方式嘗試使用'next-error'?首先在要用作源代碼的編譯緩衝區中運行'next-error'(在您的情況下爲'* compilation-old *'),然後所有連續的'next-error'調用將使用此緩衝區。 – Francesco

+0

對於問題2,我不明白你想在雙倍窗口中看到哪個緩衝區;舊的還是跑步的? – Francesco

2

在編譯命令終止時,將以下內容放入init文件中將會將編譯緩衝區重命名爲*compilation-old*

請注意,如果您從舊編譯緩衝區中的新編譯過程(將在這種情況下,再利用,而不是創建一個新的緩衝,因爲compile

(defun my-rename-compilation-buffer (buffer message) 
    ;; Don't do anything if we are in a derived mode 
    (when (with-current-buffer buffer (eq major-mode 'compilation-mode)) 
    (let* ((old-compilation-buffer-name "*compilation-old*") 
      (old-compilation-buffer (get-buffer old-compilation-buffer-name))) 

     ;; Kill old compilation buffer if necessary 
     (when old-compilation-buffer 
     (kill-buffer old-compilation-buffer)) 

     ;; Rename the current compilation buffer 
     (with-current-buffer buffer 
     (rename-buffer old-compilation-buffer-name))))) 

(add-hook 'compilation-finish-functions 'my-rename-compilation-buffer) 
+0

仍然是同樣的問題:1.(next-error)僅在新窗口中使用編譯錯誤。即使我從第二個舊編譯緩衝區執行(下一個錯誤)。 –