Move lisp/emacs-lisp/authors.el to admin/
[bpt/emacs.git] / lisp / pcmpl-gnu.el
index 60e2e6a..bcab1f7 100644 (file)
@@ -1,7 +1,6 @@
-;;; pcmpl-gnu.el --- completions for GNU project tools
+;;; pcmpl-gnu.el --- completions for GNU project tools -*- lexical-binding: t -*-
 
-;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+;; Copyright (C) 1999-2014 Free Software Foundation, Inc.
 
 ;; Package: pcomplete
 
@@ -36,7 +35,7 @@
 ;; User Variables:
 
 (defcustom pcmpl-gnu-makefile-regexps
-  '("\\`GNUmakefile" "\\`Makefile" "\\.mak\\'")
+  '("\\`GNUmakefile" "\\`[Mm]akefile" "\\.ma?k\\'")
   "A list of regexps that will match Makefile names."
   :type '(repeat regexp)
   :group 'pcmpl-gnu)
   "Completion for GNU `make'."
   (let ((pcomplete-help "(make)Top"))
     (pcomplete-opt "bmC/def(pcmpl-gnu-makefile-names)hiI/j?kl?no.pqrsStvwW.")
-    (while (pcomplete-here (pcmpl-gnu-make-rule-names) nil 'identity))))
+    (while (pcomplete-here (completion-table-in-turn
+                            (pcmpl-gnu-make-rule-names)
+                            (pcomplete-entries))
+                           nil 'identity))))
 
 (defun pcmpl-gnu-makefile-names ()
   "Return a list of possible makefile names."
   "Return a list of possible make rule names in MAKEFILE."
   (let* ((minus-f (member "-f" pcomplete-args))
         (makefile (or (cadr minus-f)
-                      (if (file-exists-p "GNUmakefile")
-                          "GNUmakefile"
-                        "Makefile")))
+                      (cond
+                        ((file-exists-p "GNUmakefile") "GNUmakefile")
+                        ((file-exists-p "makefile") "makefile")
+                        (t "Makefile"))))
         rules)
     (if (not (file-readable-p makefile))
        (unless minus-f (list "-f"))
       (with-temp-buffer
-       (insert-file-contents-literally makefile)
+       (ignore-errors                  ;Could be a directory or something.
+         (insert-file-contents makefile))
        (while (re-search-forward
                (concat "^\\s-*\\([^\n#%.$][^:=\n]*\\)\\s-*:[^=]") nil t)
          (setq rules (append (split-string (match-string 1)) rules))))
       (pcomplete-uniqify-list rules))))
 
 (defcustom pcmpl-gnu-tarfile-regexp
-  "\\.t\\(ar\\(\\.\\(gz\\|bz2\\|Z\\)\\)?\\|gz\\|a[zZ]\\|z2\\)\\'"
+  "\\.t\\(ar\\(\\.\\(gz\\|bz2\\|Z\\|xz\\)\\)?\\|gz\\|a[zZ]\\|z2\\)\\'"
   "A regexp which matches any tar archive."
+  :version "24.3"                       ; added xz
   :type 'regexp
   :group 'pcmpl-gnu)
 
-(defvar pcmpl-gnu-tar-buffer nil)
-
 ;; Only used in tar-mode buffers.
 (defvar tar-parse-info)
 (declare-function tar-header-name "tar-mode" t t)
 
+(defmacro pcmpl-gnu-with-file-buffer (file &rest body)
+  "Run BODY inside a buffer visiting FILE."
+  (declare (debug t) (indent 1))
+  (let ((exist (make-symbol "exist"))
+        (filesym (make-symbol "file"))
+        (buf (make-symbol "buf")))
+    `(let* ((,filesym ,file)
+            (,exist (find-buffer-visiting ,filesym))
+            (,buf (or ,exist (find-file-noselect ,filesym))))
+       (unwind-protect
+           (with-current-buffer ,buf
+             ,@body)
+         (when (and (not ,exist) (buffer-live-p ,buf))
+           (kill-buffer ,buf))))))
+
 ;;;###autoload
 (defun pcomplete/tar ()
   "Completion for the GNU tar utility."
   ;; options that end in an equal sign will want further completion...
   (let (saw-option complete-within)
-    (setq pcomplete-suffix-list (cons ?= pcomplete-suffix-list))
-    (while (pcomplete-match "^-" 0)
-      (setq saw-option t)
-      (if (pcomplete-match "^--" 0)
-         (if (pcomplete-match "^--\\([^= \t\n\f]*\\)\\'" 0)
-             (pcomplete-here*
-              '("--absolute-names"
-                "--after-date="
-                "--append"
-                "--atime-preserve"
-                "--backup"
-                "--block-number"
-                "--blocking-factor="
-                "--catenate"
-                "--checkpoint"
-                "--compare"
-                "--compress"
-                "--concatenate"
-                "--confirmation"
-                "--create"
-                "--delete"
-                "--dereference"
-                "--diff"
-                "--directory="
-                "--exclude="
-                "--exclude-from="
-                "--extract"
-                "--file="
-                "--files-from="
-                "--force-local"
-                "--get"
-                "--group="
-                "--gzip"
-                "--help"
-                "--ignore-failed-read"
-                "--ignore-zeros"
-                "--incremental"
-                "--info-script="
-                "--interactive"
-                "--keep-old-files"
-                "--label="
-                "--list"
-                "--listed-incremental"
-                "--mode="
-                "--modification-time"
-                "--multi-volume"
-                "--new-volume-script="
-                "--newer="
-                "--newer-mtime"
-                "--no-recursion"
-                "--null"
-                "--numeric-owner"
-                "--old-archive"
-                "--one-file-system"
-                "--owner="
-                "--portability"
-                "--posix"
-                "--preserve"
-                "--preserve-order"
-                "--preserve-permissions"
-                "--read-full-records"
-                "--record-size="
-                "--recursive-unlink"
-                "--remove-files"
-                "--rsh-command="
-                "--same-order"
-                "--same-owner"
-                "--same-permissions"
-                "--sparse"
-                "--starting-file="
-                "--suffix="
-                "--tape-length="
-                "--to-stdout"
-                "--totals"
-                "--uncompress"
-                "--ungzip"
-                "--unlink-first"
-                "--update"
-                "--use-compress-program="
-                "--verbose"
-                "--verify"
-                "--version"
-                "--volno-file=")))
-       (pcomplete-opt "01234567ABCFGKLMNOPRSTUVWXZbcdfghiklmoprstuvwxz"))
-      (cond
-       ((pcomplete-match "\\`--after-date=" 0)
-       (pcomplete-here*))
-       ((pcomplete-match "\\`--backup=" 0)
-       (pcomplete-here*))
-       ((pcomplete-match "\\`--blocking-factor=" 0)
-       (pcomplete-here*))
-       ((pcomplete-match "\\`--directory=\\(.*\\)" 0)
-       (pcomplete-here* (pcomplete-dirs)
-                        (pcomplete-match-string 1 0)))
-       ((pcomplete-match "\\`--exclude-from=\\(.*\\)" 0)
-       (pcomplete-here* (pcomplete-entries)
-                        (pcomplete-match-string 1 0)))
-       ((pcomplete-match "\\`--exclude=" 0)
-       (pcomplete-here*))
-       ((pcomplete-match "\\`--\\(extract\\|list\\)\\'" 0)
-       (setq complete-within t))
-       ((pcomplete-match "\\`--file=\\(.*\\)" 0)
-       (pcomplete-here* (pcomplete-dirs-or-entries pcmpl-gnu-tarfile-regexp)
-                        (pcomplete-match-string 1 0)))
-       ((pcomplete-match "\\`--files-from=\\(.*\\)" 0)
-       (pcomplete-here* (pcomplete-entries)
-                        (pcomplete-match-string 1 0)))
-       ((pcomplete-match "\\`--group=\\(.*\\)" 0)
-       (pcomplete-here* (pcmpl-unix-group-names)
-                        (pcomplete-match-string 1 0)))
-       ((pcomplete-match "\\`--info-script=\\(.*\\)" 0)
-       (pcomplete-here* (pcomplete-entries)
-                        (pcomplete-match-string 1 0)))
-       ((pcomplete-match "\\`--label=" 0)
-       (pcomplete-here*))
-       ((pcomplete-match "\\`--mode=" 0)
-       (pcomplete-here*))
-       ((pcomplete-match "\\`--new-volume-script=\\(.*\\)" 0)
-       (pcomplete-here* (pcomplete-entries)
-                        (pcomplete-match-string 1 0)))
-       ((pcomplete-match "\\`--newer=" 0)
-       (pcomplete-here*))
-       ((pcomplete-match "\\`--owner=\\(.*\\)" 0)
-       (pcomplete-here* (pcmpl-unix-user-names)
-                        (pcomplete-match-string 1 0)))
-       ((pcomplete-match "\\`--record-size=" 0)
-       (pcomplete-here*))
-       ((pcomplete-match "\\`--rsh-command=\\(.*\\)" 0)
-       (pcomplete-here* (funcall pcomplete-command-completion-function)
-                        (pcomplete-match-string 1 0)))
-       ((pcomplete-match "\\`--starting-file=\\(.*\\)" 0)
-       (pcomplete-here* (pcomplete-entries)
-                        (pcomplete-match-string 1 0)))
-       ((pcomplete-match "\\`--suffix=" 0)
-       (pcomplete-here*))
-       ((pcomplete-match "\\`--tape-length=" 0)
-       (pcomplete-here*))
-       ((pcomplete-match "\\`--use-compress-program=\\(.*\\)" 0)
-       (pcomplete-here* (funcall pcomplete-command-completion-function)
-                        (pcomplete-match-string 1 0)))
-       ((pcomplete-match "\\`--volno-file=\\(.*\\)" 0)
-       (pcomplete-here* (pcomplete-entries)
-                        (pcomplete-match-string 1 0)))))
-    (setq pcomplete-suffix-list (cdr pcomplete-suffix-list))
+    (let ((pcomplete-suffix-list (if (boundp 'pcomplete-suffix-list)
+                                     (cons ?= pcomplete-suffix-list))))
+      (while (pcomplete-match "^-" 0)
+        (setq saw-option t)
+        (if (pcomplete-match "^--" 0)
+            (if (pcomplete-match "^--\\([^= \t\n\f]*\\)\\'" 0)
+                ;; FIXME: Extract this list from "tar --help".
+                (pcomplete-here*
+                 '("--absolute-names"
+                   "--after-date="
+                   "--append"
+                   "--atime-preserve"
+                   "--backup"
+                   "--block-number"
+                   "--blocking-factor="
+                   "--catenate"
+                   "--checkpoint"
+                   "--compare"
+                   "--compress"
+                   "--concatenate"
+                   "--confirmation"
+                   "--create"
+                   "--delete"
+                   "--dereference"
+                   "--diff"
+                   "--directory="
+                   "--exclude="
+                   "--exclude-from="
+                   "--extract"
+                   "--file="
+                   "--files-from="
+                   "--force-local"
+                   "--get"
+                   "--group="
+                   "--gzip"
+                   "--help"
+                   "--ignore-failed-read"
+                   "--ignore-zeros"
+                   "--incremental"
+                   "--info-script="
+                   "--interactive"
+                   "--keep-old-files"
+                   "--label="
+                   "--list"
+                   "--listed-incremental"
+                   "--mode="
+                   "--modification-time"
+                   "--multi-volume"
+                   "--new-volume-script="
+                   "--newer="
+                   "--newer-mtime"
+                   "--no-recursion"
+                   "--null"
+                   "--numeric-owner"
+                   "--old-archive"
+                   "--one-file-system"
+                   "--owner="
+                   "--portability"
+                   "--posix"
+                   "--preserve"
+                   "--preserve-order"
+                   "--preserve-permissions"
+                   "--read-full-records"
+                   "--record-size="
+                   "--recursive-unlink"
+                   "--remove-files"
+                   "--rsh-command="
+                   "--same-order"
+                   "--same-owner"
+                   "--same-permissions"
+                   "--sparse"
+                   "--starting-file="
+                   "--suffix="
+                   "--tape-length="
+                   "--to-stdout"
+                   "--totals"
+                   "--uncompress"
+                   "--ungzip"
+                   "--unlink-first"
+                   "--update"
+                   "--use-compress-program="
+                   "--verbose"
+                   "--verify"
+                   "--version"
+                   "--volno-file=")))
+          (pcomplete-opt "01234567ABCFGKLMNOPRSTUVWXZbcdfghiklmoprstuvwxz"))
+        (cond
+         ((pcomplete-match "\\`-\\'" 0)
+          (pcomplete-here*))
+         ((pcomplete-match "\\`--after-date=" 0)
+          (pcomplete-here*))
+         ((pcomplete-match "\\`--backup=" 0)
+          (pcomplete-here*))
+         ((pcomplete-match "\\`--blocking-factor=" 0)
+          (pcomplete-here*))
+         ((pcomplete-match "\\`--directory=\\(.*\\)" 0)
+          (pcomplete-here* (pcomplete-dirs)
+                           (pcomplete-match-string 1 0)))
+         ((pcomplete-match "\\`--exclude-from=\\(.*\\)" 0)
+          (pcomplete-here* (pcomplete-entries)
+                           (pcomplete-match-string 1 0)))
+         ((pcomplete-match "\\`--exclude=" 0)
+          (pcomplete-here*))
+         ((pcomplete-match "\\`--\\(extract\\|list\\)\\'" 0)
+          (setq complete-within t))
+         ((pcomplete-match "\\`--file=\\(.*\\)" 0)
+          (pcomplete-here* (pcomplete-dirs-or-entries pcmpl-gnu-tarfile-regexp)
+                           (pcomplete-match-string 1 0)))
+         ((pcomplete-match "\\`--files-from=\\(.*\\)" 0)
+          (pcomplete-here* (pcomplete-entries)
+                           (pcomplete-match-string 1 0)))
+         ((pcomplete-match "\\`--group=\\(.*\\)" 0)
+          (pcomplete-here* (pcmpl-unix-group-names)
+                           (pcomplete-match-string 1 0)))
+         ((pcomplete-match "\\`--info-script=\\(.*\\)" 0)
+          (pcomplete-here* (pcomplete-entries)
+                           (pcomplete-match-string 1 0)))
+         ((pcomplete-match "\\`--label=" 0)
+          (pcomplete-here*))
+         ((pcomplete-match "\\`--mode=" 0)
+          (pcomplete-here*))
+         ((pcomplete-match "\\`--new-volume-script=\\(.*\\)" 0)
+          (pcomplete-here* (pcomplete-entries)
+                           (pcomplete-match-string 1 0)))
+         ((pcomplete-match "\\`--newer=" 0)
+          (pcomplete-here*))
+         ((pcomplete-match "\\`--owner=\\(.*\\)" 0)
+          (pcomplete-here* (pcmpl-unix-user-names)
+                           (pcomplete-match-string 1 0)))
+         ((pcomplete-match "\\`--record-size=" 0)
+          (pcomplete-here*))
+         ((pcomplete-match "\\`--rsh-command=\\(.*\\)" 0)
+          (pcomplete-here* (funcall pcomplete-command-completion-function)
+                           (pcomplete-match-string 1 0)))
+         ((pcomplete-match "\\`--starting-file=\\(.*\\)" 0)
+          (pcomplete-here* (pcomplete-entries)
+                           (pcomplete-match-string 1 0)))
+         ((pcomplete-match "\\`--suffix=" 0)
+          (pcomplete-here*))
+         ((pcomplete-match "\\`--tape-length=" 0)
+          (pcomplete-here*))
+         ((pcomplete-match "\\`--use-compress-program=\\(.*\\)" 0)
+          (pcomplete-here* (funcall pcomplete-command-completion-function)
+                           (pcomplete-match-string 1 0)))
+         ((pcomplete-match "\\`--volno-file=\\(.*\\)" 0)
+          (pcomplete-here* (pcomplete-entries)
+                           (pcomplete-match-string 1 0))))))
     (unless saw-option
       (pcomplete-here
        (mapcar 'char-to-string
       (if (pcomplete-match "[xt]" 'first 1)
          (setq complete-within t)))
     (pcomplete-here (pcomplete-dirs-or-entries pcmpl-gnu-tarfile-regexp))
-    (setq pcmpl-gnu-tar-buffer (find-file-noselect (pcomplete-arg 1)))
     (while (pcomplete-here
-           (if complete-within
-               (with-current-buffer pcmpl-gnu-tar-buffer
-                 (mapcar
-                  (function
-                   (lambda (entry)
-                     (tar-header-name (cdr entry))))
-                  tar-parse-info))
+           (if (and complete-within
+                     (let* ((fa (file-attributes (pcomplete-arg 1)))
+                            (size (nth 7 fa)))
+                       (and (numberp size)
+                            (or (null large-file-warning-threshold)
+                                (< size large-file-warning-threshold)))))
+                (let ((file (pcomplete-arg 1)))
+                  (completion-table-dynamic
+                   (lambda (_string)
+                     (pcmpl-gnu-with-file-buffer file
+                       (mapcar #'tar-header-name tar-parse-info)))))
              (pcomplete-entries))
            nil 'identity))))