]> code.delx.au - gnu-emacs-elpa/blobdiff - company.el
Added Windows root dir compatibility fixes.
[gnu-emacs-elpa] / company.el
index df5df8a1879f49c50a83b5a9d80933f4fcecab8b..d3caee658486db3773ad76dd6d1ddd748c7348aa 100644 (file)
@@ -3,7 +3,7 @@
 ;; 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.
@@ -487,6 +491,8 @@ The work-around consists of adding a newline.")
     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))
@@ -497,8 +503,10 @@ The work-around consists of adding a newline.")
       (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)))
 
@@ -538,6 +546,9 @@ keymap during active completions (`company-active-map'):
     (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)
@@ -624,6 +635,18 @@ keymap during active completions (`company-active-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)
@@ -802,19 +825,22 @@ keymap during active completions (`company-active-map'):
            (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)
@@ -995,7 +1021,8 @@ keymap during active completions (`company-active-map'):
              (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 ()
@@ -1004,15 +1031,16 @@ keymap during active completions (`company-active-map'):
         (progn
           (unless (equal (point) company-point)
             (company-begin))
-          (when 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)))))
+          (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))))