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