branch: externals/ivy-hydra
commit 0f61cc56054aa2d368655bde11a79cd3f7fd51db
Author: Rudi Grinberg <[email protected]>
Commit: Oleh Krehel <[email protected]>

    Add support for browising compilation errors
    
    [counsel-compilation-errors] allows to navigate through the errors of
    [M-x compile].
    
    Fixes #2299
    
    Signed-off-by: Rudi Grinberg <[email protected]>
---
 counsel.el | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/counsel.el b/counsel.el
index c5cbc9b..bdd400a 100644
--- a/counsel.el
+++ b/counsel.el
@@ -6238,6 +6238,44 @@ We update it in the callback with 
`ivy-update-candidates'."
 (define-obsolete-function-alias 'counsel-google
     'counsel-search "<2019-10-17 Thu>")
 
+;;* `counsel-compilation-errors'
+(defun counsel--compilation-errors-buffer (buf)
+  (with-current-buffer buf
+    (let ((res nil)
+          (pt (point-min)))
+      (while (setq pt (compilation-next-single-property-change
+                       pt 'compilation-message))
+        (let ((loc (get-text-property pt 'compilation-message)))
+          (when (and loc (setq loc (compilation--message->loc loc)))
+            (let* ((fs (compilation--loc->file-struct loc))
+                   (file-name (caar fs))
+                   (line-number (compilation--loc->line loc)))
+              (push (propertize
+                     (format "%d:%s" line-number file-name)
+                     'pt pt
+                     'buffer buf) res)))))
+      (nreverse res))))
+
+(defun counsel-compilation-errors-cands ()
+  (cl-loop
+     for buf in (buffer-list)
+     when (compilation-buffer-p buf)
+     nconc (counsel--compilation-errors-buffer buf)))
+
+(defun counsel-compilation-errors-action (x)
+  (pop-to-buffer (get-text-property 0 'buffer x))
+  (goto-char (get-text-property 0 'pt x))
+  (compile-goto-error))
+
+;;;###autoload
+(defun counsel-compilation-errors ()
+  "Compilation errors."
+  (interactive)
+  (ivy-read "compilation errors: " (counsel-compilation-errors-cands)
+            :require-match t
+            :action #'counsel-compilation-errors-action
+            :history 'counsel-compilation-errors-history))
+
 ;;* `counsel-mode'
 (defvar counsel-mode-map
   (let ((map (make-sparse-keymap)))

Reply via email to