Как я могу повторно запустить grep или скомпилировать окно при следующей ошибке

В next-error в окне grep или компиляции я могу использовать что-то вроде

(setq next-error-recenter 35)

чтобы окно, отображающее совпадение, прокручивалось, чтобы показать полное совпадение, как описано более подробно в этот вопрос о stackoverflow .

Как мне сделать то же самое в самом окне grep или самой компиляции? У меня часто есть выход grep или компиляция вывода, который находится в нижней части окна, и в дни, когда я трачу все свое время на обработку ошибок grep или компиляцию, переключение между окнами добавляет значительные накладные расходы.

5
Вы хотите посмотреть compilation-goto-locus и поместить в команду recenter , где это необходимо - в разделе, который начинается с комментария: Если буфер компиляции выбрано окно. , , , Вы можете повторно разместить в другом месте окна - см. doc-строку для recenter .
добавлено автор lawlist, источник

1 ответы

Я использую такое обходное решение для точного сохранения позиции point в буфере compilation/grep :

(defun eab/compile-goto-error ()
  (interactive)
  (let ((istc? truncate-lines))
    (toggle-truncate-lines t)
    (let ((buf (current-buffer))
          (line (- (count-lines (window-start) (point))
                   (if (eq (point) (point-at-bol)) 0 1)))
          (point (point)))
      (compile-goto-error)
      (run-with-timer 0.01 nil `(lambda ()
                                 (let ((cb (current-buffer)))
                                       (pop-to-buffer ,buf)
                                       (recenter ,line)
                                       (goto-char ,point)
                                       (toggle-truncate-lines ,istc?)
                                       (pop-to-buffer cb)))))))

Если вы хотите простое центрирование point в буфере compilation/grep , используйте:

(defun eab/next-error ()
  (interactive)
  (let ((buf (current-buffer)))
    (next-error)
    (run-with-timer 0.01 nil `(lambda ()
                             (let ((cb (current-buffer)))
                               (pop-to-buffer ,buf)
                               (recenter)
                               (pop-to-buffer cb))))))

Вы можете использовать next-error вместо compile-goto-error в первом примере.

Upd. Emacs 25.1 необходим для ненулевого периода времени.

1
добавлено