;; Copyright (C) 2009 Nikolaj Schumacher
;;
;; Author: Nikolaj Schumacher <bugs * nschum de>
-;; Version: 0.4
+;; Version: 0.4.1
;; Keywords: abbrev, convenience, matchis
;; URL: http://nschum.de/src/emacs/company/
;; Compatibility: GNU Emacs 22.x, GNU Emacs 23.x
;;
;;; Change Log:
;;
+;; Windows compatibility fixes.
+;;
+;; 2009-04-19 (0.4.1)
+;; Added `global-company-mode'.
+;; Performance enhancements.
+;; Added `company-eclim' back-end.
;; Added safer workaround for Emacs `posn-col-row' bug.
;;
;; 2009-04-18 (0.4)
(company-css . "CSS")
(company-dabbrev . "dabbrev for plain text")
(company-dabbrev-code . "dabbrev for code")
+ (company-eclim . "eclim (an Eclipse interace)")
(company-elisp . "Emacs Lisp")
(company-etags . "etags")
(company-files . "Files")
(return t))))))
(defcustom company-backends '(company-elisp company-nxml company-css
- company-semantic company-xcode
+ company-eclim company-semantic company-xcode
(company-gtags company-etags company-dabbrev-code
company-keywords)
company-oddmuse company-files company-dabbrev)
keymap)
"Keymap that is enabled during an active completion.")
+(defvar company--disabled-backends nil)
+
(defun company-init-backend (backend)
(and (symbolp backend)
(not (fboundp backend))
(if (ignore-errors (funcall backend 'init) t)
(put backend 'company-init t)
(put backend 'company-init 'failed)
- (message "Company back-end '%s' could not be initialized"
- backend)
+ (unless (memq backend company--disabled-backends)
+ (message "Company back-end '%s' could not be initialized"
+ backend)
+ (push backend company--disabled-backends))
nil)
(mapc 'company-init-backend backend)))
(company-cancel)
(kill-local-variable 'company-point)))
+(define-globalized-minor-mode global-company-mode company-mode
+ (lambda () (company-mode 1)))
+
(defsubst company-assert-enabled ()
(unless company-mode
(company-uninstall-map)
(car (setq ppss (cdr ppss)))
(nth 3 ppss))))
+(if (fboundp 'locate-dominating-file)
+ (defalias 'company-locate-dominating-file 'locate-dominating-file)
+ (defun company-locate-dominating-file (file name)
+ (catch 'root
+ (let ((dir (file-name-directory file))
+ (prev-dir nil))
+ (while (not (equal dir prev-dir))
+ (when (file-exists-p (expand-file-name name dir))
+ (throw 'root dir))
+ (setq prev-dir dir
+ dir (file-name-directory (directory-file-name dir))))))))
+
(defun company-call-backend (&rest args)
(if (functionp company-backend)
(apply company-backend args)
(defvar company--point-max nil)
(make-variable-buffer-local 'company--point-max)
-(defvar company--this-command nil)
-
(defvar company-point nil)
(make-variable-buffer-local 'company-point)
overriding-local-map))
(eq company-idle-delay t)
(or (eq t company-begin-commands)
- (memq company--this-command company-begin-commands)
+ (memq this-command company-begin-commands)
(and (symbolp this-command) (get this-command 'company-begin)))
(not (and transient-mark-mode mark-active))))
(eq pos (point))
(not company-candidates)
(not (equal (point) company-point))
- (let ((company-idle-delay t))
+ (let ((company-idle-delay t)
+ (company-begin-commands t))
(company-begin)
(when company-candidates
(company-input-noop)
(company-post-command)))))
-(defun company-manual-begin ()
- (interactive)
+(defun company-auto-begin ()
(company-assert-enabled)
(and company-mode
(not company-candidates)
(let ((company-idle-delay t)
(company-minimum-prefix-length 0)
(company-begin-commands t))
- (setq company--explicit-action t)
(company-begin)))
;; Return non-nil if active.
company-candidates)
+(defun company-manual-begin ()
+ (interactive)
+ (setq company--explicit-action t)
+ (company-auto-begin))
+
(defun company-require-match-p ()
(let ((backend-value (company-call-backend 'require-match)))
(or (eq backend-value t)
(= (- (point) (length new-prefix))
(- company-point (length company-prefix))))
(company-calculate-candidates new-prefix))))
- (cond
- ((eq c t)
- ;; t means complete/unique.
- (company-cancel new-prefix)
- nil)
- ((consp c)
- ;; incremental match
- (setq company-prefix new-prefix)
- (company-update-candidates c)
- c)
- (t (company--continue-failed new-prefix)))))
+ (or (cond
+ ((eq c t)
+ ;; t means complete/unique.
+ (company-cancel new-prefix)
+ nil)
+ ((consp c)
+ ;; incremental match
+ (setq company-prefix new-prefix)
+ (company-update-candidates c)
+ c)
+ (t (company--continue-failed new-prefix)))
+ (company-cancel))))
(defun company--begin-new ()
(let (prefix c)
(when (and (stringp prefix)
(>= (length prefix) company-minimum-prefix-length))
(setq company-backend backend
- company-prefix prefix
c (company-calculate-candidates prefix))
;; t means complete/unique. We don't start, so no hooks.
(when (consp c)
+ (setq company-prefix prefix)
(company-update-candidates c)
(run-hook-with-args 'company-completion-started-hook
(company-explicit-action-p))
(setq company-candidates
(or (and company-candidates (company--continue))
(and (company--should-complete) (company--begin-new))))
- (if company-candidates
- (progn
- (when (and company-end-of-buffer-workaround (eobp))
- (save-excursion (insert "\n"))
- (setq company-added-newline (buffer-chars-modified-tick)))
- (setq company-point (point)
- company--point-max (point-max))
- (company-enable-overriding-keymap company-active-map)
- (company-call-frontends 'update))
- (company-cancel)))
+ (when company-candidates
+ (when (and company-end-of-buffer-workaround (eobp))
+ (save-excursion (insert "\n"))
+ (setq company-added-newline (buffer-chars-modified-tick)))
+ (setq company-point (point)
+ company--point-max (point-max))
+ (company-enable-overriding-keymap company-active-map)
+ (company-call-frontends 'update)))
(defun company-cancel (&optional result)
(and company-added-newline
(message "%s" (error-message-string err))
(company-cancel))))
(when company-timer
- (cancel-timer company-timer))
+ (cancel-timer company-timer)
+ (setq company-timer nil))
(company-uninstall-map))
(defun company-post-command ()
(unless (company-keep this-command)
(condition-case err
(progn
- (setq company--this-command this-command)
(unless (equal (point) company-point)
(company-begin))
- (when company-candidates
- (company-call-frontends 'post-command))
- (when (numberp company-idle-delay)
- (setq company-timer
- (run-with-timer company-idle-delay nil 'company-idle-begin
- (current-buffer) (selected-window)
- (buffer-chars-modified-tick) (point)))))
+ (if company-candidates
+ (company-call-frontends 'post-command)
+ (and (numberp company-idle-delay)
+ (or (eq t company-begin-commands)
+ (memq this-command company-begin-commands))
+ (setq company-timer
+ (run-with-timer company-idle-delay nil
+ 'company-idle-begin
+ (current-buffer) (selected-window)
+ (buffer-chars-modified-tick) (point))))))
(error (message "Company: An error occurred in post-command")
(message "%s" (error-message-string err))
(company-cancel))))