2012-02-12 25 views
7

Tôi sử dụng hàm TeX-parse-error được xác định bởi Ivan Andrus ở cuối Emacs latexmk function throws me into an empty buffer để tự động mở bộ đệm * Trợ giúp TeX * khi có lỗi trong quá trình biên dịch (C-c C-c). Sau khi sửa lỗi và biên dịch lại, bộ đệm * TeX Help * vẫn mở (mặc dù lỗi đã được sửa). Có cách nào để điều chỉnh chức năng (không may, tôi không có kinh nghiệm trong lập trình elisp) để bộ đệm * TeX Help * bị đóng nếu lỗi được giải quyết và cập nhật (và vẫn mở) nếu lỗi không được giải quyết? Điều đó sẽ tiết kiệm được rất nhiều việc gõ như C-c ' để hiển thị bộ đệm * TeX Help * và C-x 1 để ẩn nó một lần nữa.Latex, Emacs: tự động mở * Trợ giúp TeX * bộ đệm bị lỗi và đóng sau khi sửa lỗi?

Trả lời

6

Trước tiên, hãy xác định một chức năng mà thấy bộ đệm *TeX Help*, nếu nó tồn tại, đóng cửa sổ của nó, và sau đó giết chết bộ đệm:

(defun demolish-tex-help() 
    (interactive) 
    (if (get-buffer "*TeX Help*") ;; Tests if the buffer exists 
     (progn ;; Do the following commands in sequence 
     (if (get-buffer-window (get-buffer "*TeX Help*")) ;; Tests if the window exists 
      (delete-window (get-buffer-window (get-buffer "*TeX Help*"))) 
     ) ;; That should close the window 
     (kill-buffer "*TeX Help*") ;; This should kill the buffer 
     ) 
    ) 
) 

Bây giờ, bạn phải gọi đây là khi bạn gọi bất cứ chức năng nó là bạn sử dụng để biên dịch. Lấy ví dụ từ đó trang khác, bạn có thể sửa đổi chức năng Ivan Andrus cho bạn trở thành:

(defun run-latexmk() 
    (interactive) 
    (let ((TeX-save-query nil) 
     (TeX-process-asynchronous nil) 
     (master-file (TeX-master-file))) 
    (TeX-save-document "") 
    (TeX-run-TeX "latexmk" 
       (TeX-command-expand "latexmk %t" 'TeX-master-file) 
       master-file) 
    (if (plist-get TeX-error-report-switches (intern master-file)) 
     (TeX-next-error t) 
     (progn 
     (demolish-tex-help) 
     (minibuffer-message "latexmk done"))))) 

(add-hook 'LaTeX-mode-hook 
      (lambda() (local-set-key (kbd "C-0") #'run-latexmk))) 

(Lưu ý: Điều này không thực sự làm việc đối với tôi, vì latexmk của tôi là hơi say lên, vì vậy tôi đã không thử nghiệm thành công Nhưng nếu phiên bản của Ivan làm việc cho bạn, thì điều này cũng nên làm.)

Vì vậy, bây giờ, bất cứ khi nào bạn gọi latexmk với chức năng này (ví dụ: bằng cách nhấn C-0, khi biên dịch xong, nó sẽ kiểm tra lỗi . Nếu có lỗi, nó sẽ tự động mở cửa sổ Trợ giúp và nhận được lỗi đầu tiên. Nếu không có, nó sẽ kiểm tra xem bộ đệm Trợ giúp có mở hay không; nếu có, nó đóng cửa sổ đó và giết chết bộ đệm.

+0

okay, tuyệt vời, cảm ơn rất nhiều, Mike! Về nguyên tắc, nó hoạt động. Vẫn còn vấn đề này với bộ đệm TeX Live 2011: Khi có lỗi trong tệp .tex, thay vì chỉ nhìn thấy bộ đệm Trợ giúp TeX ở nửa dưới của cửa sổ và mã .tex ở nửa trên, nửa trên chứa bộ đệm TeX Live 2011 trống này mà sau đó tôi phải giết. Đối với mỗi lỗi tìm thấy, tôi phải làm điều đó. Tôi hy vọng tôi có thể tìm ra cách để cho TeX Live hoạt động chính xác như được mô tả trên http://neilernst.net/2011/04/21/forcing-auctex-to-properly-show-error-messages/#comment-469 (Tôi đã thử nó nhưng nó không hoạt động) –

+0

okay, nó hoạt động. Tôi đã phải sử dụng 'file_line_error_style = t' thay vì' file-line-error = t' và sau đó nó làm việc –

+1

Thậm chí tốt hơn, sử dụng '(TeX-command-expand" latexmk -pdflatex = 'pdflatex -file-line-error' -pdf% s "'TeX-master-file)', do đó, tùy chọn 'file-line-error' được chuyển tới' pdflatex' và các lỗi được chỉ ra ở dòng chính xác trong tệp '.tex' gốc. Không cần điều chỉnh '/ usr/local/texlive/2010/texmf.cnf 'như được mô tả trên http://neilernst.net/2011/04/21/forcing-auctex-to-properly-show-error-messages/#comment-469 –

1

Lưu ý: Sau khi làm rõ, tôi thấy rằng những điều sau đây không hoàn toàn là những gì được yêu cầu. Câu trả lời khác của tôi cho câu hỏi này nên thực hiện công việc.

Dường như tự động mở bộ đệm yêu cầu thay đổi chức năng được gọi khi bạn chạy latex. (Ít nhất, tôi không thể tìm thấy bất kỳ móc nào sẽ cho phép bạn làm điều đó.) Đó thực sự là một trong những điều được thực hiện trong câu trả lời trước đó cho câu hỏi mà bạn đề cập đến. Đặc biệt, các dòng

(if (plist-get TeX-error-report-switches (intern master-file)) 
    (TeX-next-error t) 
    (minibuffer-message "latexmk done")))) 

kiểm tra xem có lỗi không. Nếu có, hàm chạy TeX-next-error; nếu không nó chỉ in tin nhắn. Vì vậy, bạn có thể muốn thử cài đặt chức năng đó.

Tự động đóng bộ đệm Trợ giúp chỉ cần điều chỉnh một chút cho chức năng của Ivan Andrus. Trong khu vực xung quanh "Không có nhiều sai sót", chỉ cần thay thế các bộ phận có liên quan với điều này:

 ((null 
     (re-search-forward regexp nil t)) 
     ;; No more errors. 
     (message "No more errors.") 
     (beep) 
    (delete-window (get-buffer-window (get-buffer "*TeX Help*"))) 
    (kill-buffer "*TeX Help*") 
     (TeX-pop-to-buffer old) 
     nil) 

Điều này thực sự giết chết bộ đệm giúp sau khi đóng cửa sổ của nó, nhưng bạn có thể nhận xét rằng ra nếu bạn không thích nó vì một lý do.

Một tùy chọn thú vị khác là đặt (setq TeX-display-help nil) trong ~/.emacs của bạn. Với điều này, bộ đệm Trợ giúp thậm chí không bao giờ hiển thị. Thay vào đó, một thông điệp ngắn gọn mô tả lỗi được đưa vào minibuffer, và con trỏ được đặt trên dòng xấu trong bản gốc. (Tôi không bao giờ tìm thấy hầu hết các đầu ra trợ giúp hữu ích nào.)

Cuối cùng, bạn có thể muốn thử một khóa khác cho TeX-next-errorC-c ' là khó xử.

+0

Chỉ trong trường hợp vấn đề này, tôi đang sử dụng GNU Emacs 24.0.92.1 (x86_64-apple-darwin, NS apple-appkit-1038.36) của 2012-01-15 trên bob.porkrind.org với AUCTeX 11.86 –

+0

Tôi đã thử mã từ trên, nhưng nó dường như không có bất kỳ ảnh hưởng nào, tôi vẫn thấy bộ đệm * Trợ giúp TeX * ngay cả sau khi biên dịch thành công tài liệu. Tôi tự hỏi nếu chức năng TeX-phân tích lỗi được sử dụng ở tất cả và làm thế nào tôi có thể làm cho nó có sẵn khi sử dụng latexmk (hoặc thậm chí chỉ 'latex ') –

+0

Oh, xin lỗi. Tôi nghĩ bạn muốn bước qua tất cả các lỗi, sau đó đóng cửa sổ Trợ giúp khi không còn lỗi nữa. (Hãy thử bước qua tất cả, và bạn sẽ thấy cửa sổ đó đóng lại.) Tôi cho rằng những gì bạn thực sự muốn làm lại là thay đổi hàm được gọi khi bạn chạy latex, nhưng thêm thứ gì đó vào đầu để đóng cửa sổ. Tôi sẽ làm việc trên nó, và thêm một câu trả lời thứ hai. – Mike

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