(require 'pulse)
|
|
|
|
;;(setq next-error-hook nil)
|
|
(add-hook 'next-error-hook
|
|
'(lambda ()
|
|
(if (ycmd-next-error-at-ycmd-button (point)) (push-button)
|
|
(let ((compilation-buffer (get-buffer "*compilation*")))
|
|
(when compilation-buffer
|
|
(save-excursion
|
|
(set-buffer "*compilation*")
|
|
(move-beginning-of-line nil)
|
|
(pulse-line-hook-function)))))))
|
|
|
|
(eval-after-load "ycmd"
|
|
'(add-hook 'ycmd-mode-hook
|
|
'(lambda ()
|
|
(setq next-error-function 'ycmd-next-error-goto-next-error))))
|
|
|
|
(defun ycmd-next-error-at-ycmd-button (cur)
|
|
"Returns whether CUR is at a ycmd button."
|
|
(let* ((button (button-at cur))
|
|
(type (and button (button-type button))))
|
|
(or (eq type 'ycmd--error-button)
|
|
(eq type 'ycmd--warning-button))))
|
|
|
|
(defun ycmd-next-error-goto-next-error (&optional count reset)
|
|
"Go to next YCM-detected error in the current buffer, or stay put if none"
|
|
(interactive)
|
|
(when (null count) (setq count 0))
|
|
(let ((target nil)
|
|
(move-fn (if (< count 0) 'previous-button 'next-button))
|
|
(next-count (if (< count -1) (1+ count) (if (> count 1) (1- count) 0)))
|
|
(cur (if reset (point-min) (point))))
|
|
(save-excursion
|
|
(when (and
|
|
(setq cur (funcall (symbol-function move-fn) cur))
|
|
(ycmd-next-error-at-ycmd-button cur))
|
|
(setq target cur)))
|
|
(if (not (and count target))
|
|
(message "Reached last error")
|
|
(goto-char target)
|
|
(when (not (eq next-count 0))
|
|
(ycmd-next-error-goto-next-error next-count nil)))))
|
|
|
|
(provide 'ycmd-next-error)
|