Латекс, Emacs: автоматически открывать * TeX Help * буфер при ошибке и закрывать его после исправления ошибки? - PullRequest
7 голосов
/ 12 февраля 2012

Я использую функцию TeX-parse-error, определенную Иваном Андрусом в нижней части Функция Emacs latexmk выбрасывает меня в пустой буфер , чтобы автоматически открывать буфер * TeX Help *, когда произошла ошибка во времякомпиляция (C-c C-c).После исправления ошибки и повторной компиляции буфер * TeX Help * остается открытым (хотя ошибка была исправлена).Есть ли способ настроить функцию (к сожалению, у меня нет опыта в программировании на elisp), чтобы буфер * TeX Help * был закрыт, если ошибка была устранена и обновлена ​​(и все еще открыта), если ошибка не была устранена?Это сэкономило бы много печатания, например C-c ', чтобы показать буфер * TeX Help *, и C-x 1, чтобы снова его скрыть.

Ответы [ 2 ]

6 голосов
/ 17 февраля 2012

Во-первых, давайте определим функцию, которая находит буфер *TeX Help*, если он существует, закрывает свое окно, а затем уничтожает буфер:

(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
        )
    )
  )

Теперь вы должны вызывать это при вызовекакую бы функцию вы ни использовали для компиляции.Взяв пример с этой другой страницы, вы можете изменить функцию Ивана Андруса следующим образом:

(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)))

(Примечание: на самом деле это не работает для меня, потому что мой latexmk облажался, поэтому я неуспешно проверил его. Но если версия Ивана сработала для вас, то это тоже должно.)

Так что теперь, каждый раз, когда вы вызываете latexmk с этой функцией (например, нажимая C-0), когда компиляциясделано, он проверяет на ошибки.Если были ошибки, он автоматически открывает окно справки и получает первую ошибку.Если их не было, он проверяет, открыт ли буфер справки;если это так, он закрывает это окно и убивает буфер.

1 голос
/ 17 февраля 2012

Примечание: После некоторых разъяснений я вижу, что следующее не совсем то, о чем просили. Мой другой ответ на этот вопрос должен сделать работу.

Похоже, что автоматическое открытие буфера требует изменения функции, которая вызывается при запуске latex. (По крайней мере, я не могу найти какой-либо крючок, который позволил бы вам это сделать.) Это на самом деле одна из вещей, которая была сделана в предыдущем ответе на этот вопрос, который вы упомянули. В частности, линии

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

проверьте, не было ли ошибки. Если это так, функция запускается TeX-next-error; если нет, то просто печатает сообщение. Так что вы можете попробовать установить эту функцию.

Автоматическое закрытие буфера справки требует лишь небольшой корректировки функции Ивана Андруса. В области вокруг «Больше никаких ошибок» просто замените соответствующую часть на:

     ((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)

Это фактически убивает буфер справки после закрытия его окна, но вы можете закомментировать это, если вам по какой-то причине он не нравится.

Еще один хороший вариант - поместить (setq TeX-display-help nil) в ~/.emacs. При этом буфер справки даже не отображается. Вместо этого в минибуфер помещается лаконичное сообщение, описывающее ошибку, а курсор помещается на неверную строку в оригинале. (Я никогда не нахожу большую часть этой справочной информации полезной.)

Наконец, вы можете попробовать другую привязку клавиш для TeX-next-error, потому что C-c ' неудобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...