--- /dev/null
+;;; 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
;;
;;; Change Log:
;;
+;; Added back-end `company-dabbrev-code' for generic code.
;; Fixed `company-begin-with'.
;;
;; 2009-04-15 (0.3.1)
(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