branch: externals/auto-header
commit 2afead22b1870eaa5996b2d28c82f8cbea9266b7
Author: Philip Kaludercic <[email protected]>
Commit: Philip Kaludercic <[email protected]>

    Add completion for auto-header-insert
---
 auto-header.el | 38 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 36 insertions(+), 2 deletions(-)

diff --git a/auto-header.el b/auto-header.el
index 1ed5dbb39c..991afe8566 100644
--- a/auto-header.el
+++ b/auto-header.el
@@ -3,7 +3,7 @@
 ;; Copyright (C) 2022  Philip Kaludercic
 
 ;; Author: Philip Kaludercic <[email protected]>
-;; Version: $Id: auto-header.el,v 1.15 2022/06/13 18:34:32 oj14ozun Exp 
oj14ozun $
+;; Version: $Id: auto-header.el,v 1.16 2022/06/13 18:48:30 oj14ozun Exp 
oj14ozun $
 ;; URL: https://wwwcip.cs.fau.de/~oj14ozun/src+etc/auto-header.el
 ;; Package-Version: 1
 ;; Keywords: c
@@ -104,9 +104,43 @@
          (newline))
        (delete-blank-lines)))))
 
+(defvar auto-header--header-cache nil
+  "Cache of known header files.")
+
+(defun auto-header--header-list ()
+  "Return a list of known header files."
+  (catch 'fail
+    (unless auto-header--header-cache
+      (with-temp-buffer
+       (process-file (or (executable-find "GCC")
+                         (executable-find "clang")
+                         (throw 'fail nil))
+                     nil t nil
+                     "-xc" "-E" "-v" "-")
+       (goto-char (point-min))
+       (search-forward "#include <...> search starts here:")
+       (forward-line 1)
+       (let ((start (point)))
+         (search-forward "End of search list.")
+         (beginning-of-line)
+         (narrow-to-region start (point)))
+       (goto-char (point-min))
+       (while (search-forward-regexp (rx bol (* space) (group (+ nonl)) eol)
+                                     nil t)
+         (let ((dir (match-string 1)))
+           (setq auto-header--header-cache
+                 (nconc
+                  (mapcar
+                   (lambda (file) (file-relative-name file dir))
+                   (directory-files-recursively dir "\\.h$"))
+                  auto-header--header-cache)))))
+      (setq auto-header--header-cache
+           (delete-dups auto-header--header-cache)))
+    auto-header--header-cache))
+
 (defun auto-header-insert (header)
   "Add HEADER to the top of the file."
-  (interactive "MAdd header: ")
+  (interactive (completing-read "Add header: " (auto-header--header-list)))
   (auto-header--insert-headers (list header)))
 
 ;;;###autoload

Reply via email to