X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/8089ffc6c5a6519c310362753071f9aa84a0e46b..cb0a58684509ba5d3546d7d08a11b136ca294c11:/company-files.el diff --git a/company-files.el b/company-files.el index 9f5fb1df6..6b34d57a0 100644 --- a/company-files.el +++ b/company-files.el @@ -1,21 +1,29 @@ -;;; company-files.el --- a company-mode completion back-end for file names -;; -;; Copyright (C) 2009 Nikolaj Schumacher -;; -;; This file is part of company 0.4. -;; -;; 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, +;;; company-files.el --- A company-mode completion back-end for file names + +;; Copyright (C) 2009-2011 Free Software Foundation, Inc. + +;; Author: Nikolaj Schumacher + +;; This file is part of GNU Emacs. + +;; GNU Emacs 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 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs 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 . +;; along with GNU Emacs. If not, see . + + +;;; Commentary: +;; + +;;; Code: (require 'company) (eval-when-compile (require 'cl)) @@ -26,14 +34,22 @@ (directory-files dir nil "\\`[^.]\\|\\`.[^.]") (file-name-all-completions prefix dir)))) +(defvar company-files-regexps + (let ((begin (if (eq system-type 'windows-nt) + "[a-z][A-Z]\\" + "~?/"))) + (list (concat "\"\\(" begin "[^\"\n]*\\)") + (concat "\'\\(" begin "[^\'\n]*\\)") + (concat "\\(?:[ \t]\\|^\\)\\(" begin "[^ \t\n]*\\)")))) + (defun company-files-grab-existing-name () ;; Grab file names with spaces, only when they include quotes. - (let ((file (or (company-grab-line "\"\\(~?/[^\"\n]*\\)" 1) - (company-grab-line "\'\\(~?/[^\'\n]*\\)" 1) - (company-grab-line "[ \t\n]\\(~?/[^ \t\n]*\\)" 1))) - dir) - (and file + (let (file dir) + (and (dolist (regexp company-files-regexps) + (when (setq file (company-grab-line regexp 1)) + (return file))) (setq dir (file-name-directory file)) + (not (string-match "//" dir)) (file-exists-p dir) (file-name-all-completions (file-name-nondirectory file) dir) file))) @@ -44,7 +60,6 @@ (let* ((dir (file-name-directory prefix)) (file (file-name-nondirectory prefix)) candidates) - (setq company-files-completion-cache nil) (unless (equal dir (car company-files-completion-cache)) (dolist (file (company-files-directory-files dir file)) (setq file (concat dir file)) @@ -58,16 +73,16 @@ ;;;###autoload (defun company-files (command &optional arg &rest ignored) - "a `company-mode' completion back-end existing file names." + "A `company-mode' completion back-end existing file names." (interactive (list 'interactive)) (case command - ('interactive (company-begin-backend 'company-files)) - ('prefix (company-files-grab-existing-name)) - ('candidates (company-files-complete arg)) - ('location (cons (dired-noselect - (file-name-directory (directory-file-name arg))) 1)) - ('sorted t) - ('no-cache t))) + (interactive (company-begin-backend 'company-files)) + (prefix (company-files-grab-existing-name)) + (candidates (company-files-complete arg)) + (location (cons (dired-noselect + (file-name-directory (directory-file-name arg))) 1)) + (sorted t) + (no-cache t))) (provide 'company-files) ;;; company-files.el ends here