]> code.delx.au - gnu-emacs-elpa/commitdiff
Added company-dabbrev-code.
authorNikolaj Schumacher <git@nschum.de>
Wed, 15 Apr 2009 19:21:44 +0000 (21:21 +0200)
committerNikolaj Schumacher <git@nschum.de>
Sat, 18 Apr 2009 09:47:03 +0000 (11:47 +0200)
company-dabbrev-code.el [new file with mode: 0644]
company.el

diff --git a/company-dabbrev-code.el b/company-dabbrev-code.el
new file mode 100644 (file)
index 0000000..a9d7c28
--- /dev/null
@@ -0,0 +1,65 @@
+;;; company-dabbrev-code.el --- a dabbrev-like company-mode back-end for code
+;;
+;; Copyright (C) 2009 Nikolaj Schumacher
+;;
+;; This file is part of company 0.3.1.
+;;
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License
+;; as published by the Free Software Foundation; either version 2
+;; of the License, or (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+(require 'company)
+(eval-when-compile (require 'cl))
+
+(defcustom company-dabbrev-code-modes
+  '(asm-mode batch-file-mode c++-mode c-mode cperl-mode csharp-mode css-mode
+    emacs-lisp-mode erlang-mode espresso-mode f90-mode fortran-mode
+    haskell-mode java-mode javascript-mode jde-mode js2-mode lisp-mode
+    lua-mode objc-mode perl-mode php-mode python-mode ruby-mode scheme-mode
+    shell-script-mode)
+  "*Modes that use `company-dabbrev-code'.
+In all these modes `company-dabbrev-code' will complete only symbols, not text
+in comments or strings.  In other modes `company-dabbrev-code' will pass control
+to other back-ends \(e.g. `company-dabbrev'\)"
+  :group 'company
+  :type '(repeat (symbol :tag "Major mode")))
+
+(defun company-dabbrev-code--buffer-symbols (prefix)
+  (save-excursion
+    (goto-char (point-min))
+    (let ((regexp (concat "\\_<" (if (equal prefix "")
+                                     "\\([a-zA-Z]\\|\\s_\\)"
+                                   (regexp-quote prefix))
+                          "\\(\\sw\\|\\s_\\)*\\_>"))
+           match symbols)
+      (while (re-search-forward regexp nil t)
+        (setq match (match-string-no-properties 0))
+        (unless (company-in-string-or-comment)
+          (add-to-list 'symbols match)))
+      symbols)))
+
+;;;###autoload
+(defun company-dabbrev-code (command &optional arg &rest ignored)
+  "A dabbrev-like `company-mode' back-end for code.
+The back-end looks for all symbols in the current buffer that aren't in
+comments or strings."
+  (interactive (list 'interactive))
+  (case command
+    ('interactive (company-begin-backend 'company-dabbrev-code))
+    ('prefix (and (apply 'derived-mode-p company-dabbrev-code-modes)
+                  (not (company-in-string-or-comment))
+                  (or (company-grab-symbol) 'stop)))
+    ('candidates (let ((case-fold-search nil))
+                   (company-dabbrev-code--buffer-symbols arg)))))
+
+(provide 'company-dabbrev-code)
+;;; company-dabbrev-code.el ends here
index 10f22521ab17ac5f3212a4e537878bbbff842805..6f8f3f6d1aec027a01af63c6d2bfedf9882e1265 100644 (file)
@@ -69,6 +69,7 @@
 ;;
 ;;; Change Log:
 ;;
+;;    Added back-end `company-dabbrev-code' for generic code.
 ;;    Fixed `company-begin-with'.
 ;;
 ;; 2009-04-15 (0.3.1)
@@ -245,7 +246,7 @@ The visualized data is stored in `company-prefix', `company-candidates',
 (defcustom company-backends '(company-elisp company-nxml company-css
                               company-semantic company-xcode company-gtags
                               company-etags company-oddmuse company-files
-                              company-dabbrev)
+                              company-dabbrev-code company-dabbrev)
   "*The list of active back-ends (completion engines).
 Each back-end is a function that takes a variable number of arguments.
 The first argument is the command requested from the back-end.  It is one