2012-11-07 34 views
8

Làm thế nào để thiết lập emacs để tôi có thể duyệt qua các lỗi biên dịch trước trong quá trình biên dịch mới?Duyệt qua các lỗi biên dịch trước trong quá trình biên dịch mới?

Hai điều không làm việc cho tôi:

  1. M-g M-g (tiếp theo lỗi) chức năng không hoạt động khi biên soạn thứ hai là kinh doanh dở dang.

  2. Tôi có các emacs của tôi chia thành 5 cửa sổ không đồng đều (cửa sổ phân chia theo chiều ngang), cửa sổ biên dịch "gấp đôi kích thước (thiết lập màn hình dbl). Khi tôi khởi chạy trình biên dịch, nó luôn xuất hiện trong cửa sổ biên dịch kép cuối cùng. Bây giờ nó sẽ mở ra một cửa sổ mới cho chính nó.

+0

Xét nó có thể lập trình, câu trả lời là có. –

+0

Bạn có thể giải thích chính xác chi tiết nào các câu trả lời hiện tại đang thiếu? – Francesco

+0

@Francesco - Quên thêm giải thích những gì không hoạt động - được thêm vào trong các bình luận cho câu trả lời của bạn. –

Trả lời

0

Đó là một chút của một kludge, nhưng cố gắng này:

Trước khi bắt đầu biên soạn mới, tiết kiệm (viết, C-x C-w) biên soạn đệm hiện tại vào một tập tin. Nếu bộ đệm cho tệp mới bị mất cài đặt "chế độ biên dịch", chỉ cần bật lại chế độ biên dịch (chế độ biên dịch M-x).

+0

Điều này nghe có vẻ giống như một cách tiếp cận hợp lý. Nhưng tôi không thể làm điều đó bằng tay. Hơn nữa, khi biên dịch mới kết thúc, tôi muốn nó ghi đè lên danh sách lỗi cũ. MAybe chúng tôi có thể sửa đổi biên dịch lệnh để biên dịch vào một số bộ đệm tạm thời và di chuyển nó để \ * biên dịch \ * khi hoàn thành? –

3

Dưới đây là một giải pháp mà dường như thực hiện đầy đủ mọi yêu cầu của bạn:

  • bộ đệm *compilation-old* luôn nằm trong cùng một cửa sổ
  • next-error không phá vỡ
  • tất cả các kết quả đầu ra biên soạn liên tiếp được nối ở cuối của *compilation-old* khi quá trình biên dịch chấm dứt
(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 điều không hiệu quả đối với tôi: 1. Chức năng M-g M-g (nex-error) không hoạt động khi quá trình biên dịch thứ hai đang diễn ra. 2. Tôi có emacs của tôi chia thành 5 cửa sổ không đồng đều (split-windows-theo chiều ngang), biên dịch "cửa sổ" là gấp đôi kích thước (thiết lập dbl moniotr). Khi tôi khởi chạy trình biên dịch, nó luôn xuất hiện trong cửa sổ biên dịch kép cuối cùng. Bây giờ nó phản đối cửa sổ mới cho chính nó. –

+0

Đối với vấn đề 1, bạn đã thử sử dụng 'lỗi tiếp theo' theo cách được mô tả trong trợ giúp nội tuyến của nó chưa? Đầu tiên chạy 'next-error' trong bộ đệm biên dịch mà bạn muốn dùng làm nguồn (' * compilation-old * 'trong trường hợp của bạn), sau đó tất cả các invocations liên tiếp của' next-error' sẽ sử dụng bộ đệm này. – Francesco

+0

Đối với vấn đề 2, tôi không hiểu bộ đệm nào bạn muốn xem trong cửa sổ hai kích thước; cái cũ hay cái đang chạy? – Francesco

2

Việc đặt mã sau vào tệp init của bạn sẽ đổi tên bộ đệm biên dịch thành *compilation-old* khi lệnh biên dịch kết thúc.

Xin lưu ý rằng điều này sẽ không hoạt động nếu bạn chạy quá trình biên dịch mới từ bộ đệm biên soạn cũ (vì compile sẽ trong trường hợp này tái sử dụng bộ đệm thay vì tạo một cái mới)

(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

Vẫn cùng một vấn đề: 1. (lỗi tiếp theo) chỉ sử dụng các lỗi biên dịch trong cửa sổ mới. Ngay cả khi tôi thực thi (lỗi tiếp theo) từ bộ đệm biên dịch cũ thứ hai. –

Các vấn đề liên quan