]> code.delx.au - gnu-emacs-elpa/blobdiff - company-gtags.el
Add company-etags-everywhere
[gnu-emacs-elpa] / company-gtags.el
index 204a111220a65f7d7419725424321b7517e9b418..50507838e52d1540e878132bbf49e879ff0bab60 100644 (file)
@@ -1,4 +1,4 @@
-;;; company-gtags.el --- company-mode completion back-end for GNU Global
+;;; company-gtags.el --- company-mode completion backend for GNU Global
 
 ;; Copyright (C) 2009-2011, 2014  Free Software Foundation, Inc.
 
 ;;; Code:
 
 (require 'company)
+(require 'company-template)
 (require 'cl-lib)
 
 (defgroup company-gtags nil
-  "Completion back-end for GNU Global."
+  "Completion backend for GNU Global."
   :group 'company)
 
 (defcustom company-gtags-executable
   'company-gtags-gnu-global-program-name
   'company-gtags-executable "earlier")
 
-(defvar company-gtags--tags-available-p 'unknown)
-(make-variable-buffer-local 'company-gtags--tags-available-p)
+(defcustom company-gtags-insert-arguments t
+  "When non-nil, insert function arguments as a template after completion."
+  :type 'boolean
+  :package-version '(company . "0.8.1"))
 
-(defvar company-gtags-modes '(c-mode c++-mode jde-mode java-mode php-mode))
+(defvar-local company-gtags--tags-available-p 'unknown)
+
+(defcustom company-gtags-modes '(prog-mode jde-mode)
+  "Modes that use `company-gtags'.
+In all these modes (and their derivatives) `company-gtags' will perform
+completion."
+  :type '(repeat (symbol :tag "Major mode"))
+  :package-version '(company . "0.8.4"))
 
 (defun company-gtags--tags-available-p ()
   (if (eq company-gtags--tags-available-p 'unknown)
@@ -52,7 +62,7 @@
             (locate-dominating-file buffer-file-name "GTAGS"))
     company-gtags--tags-available-p))
 
-(defun company-gtags-fetch-tags (prefix)
+(defun company-gtags--fetch-tags (prefix)
   (with-temp-buffer
     (let (tags)
       (when (= 0 (call-process company-gtags-executable nil
@@ -64,7 +74,7 @@
                                      "\\([^ ]*\\)" ;; completion
                                      "[ \t]+\\([[:digit:]]+\\)" ;; linum
                                      "[ \t]+\\([^ \t]+\\)" ;; file
-                                     "[ \t]+\\(.*\\)" ;; definition 
+                                     "[ \t]+\\(.*\\)" ;; definition
                                      "$"
                                      ) nil t)
                  collect
                                              (string-to-number (match-string 2)))
                              ))))))
 
+(defun company-gtags--annotation (arg)
+  (let ((meta (get-text-property 0 'meta arg)))
+    (when (string-match (concat arg "\\((.*)\\).*") meta)
+      (match-string 1 meta))))
+
 ;;;###autoload
 (defun company-gtags (command &optional arg &rest ignored)
-  "`company-mode' completion back-end for GNU Global."
+  "`company-mode' completion backend for GNU Global."
   (interactive (list 'interactive))
   (cl-case command
     (interactive (company-begin-backend 'company-gtags))
     (prefix (and company-gtags-executable
-                 (memq major-mode company-gtags-modes)
+                 buffer-file-name
+                 (apply #'derived-mode-p company-gtags-modes)
                  (not (company-in-string-or-comment))
                  (company-gtags--tags-available-p)
                  (or (company-grab-symbol) 'stop)))
-    (candidates (company-gtags-fetch-tags arg))
+    (candidates (company-gtags--fetch-tags arg))
     (sorted t)
     (duplicates t)
-    (annotation (let ((meta (get-text-property 0 'meta arg)))
-                  (when (string-match (concat arg "\\((.*)\\).*") meta)
-                    (match-string 1 meta))))
+    (annotation (company-gtags--annotation arg))
     (meta (get-text-property 0 'meta arg))
-    (location (get-text-property 0 'location arg))))
+    (location (get-text-property 0 'location arg))
+    (post-completion (let ((anno (company-gtags--annotation arg)))
+                       (when (and company-gtags-insert-arguments anno)
+                         (insert anno)
+                         (company-template-c-like-templatify anno))))))
 
 (provide 'company-gtags)
 ;;; company-gtags.el ends here