]> git.eshelyaron.com Git - emacs.git/commitdiff
*** empty log message ***
authorGerd Moellmann <gerd@gnu.org>
Tue, 27 Jun 2000 10:55:46 +0000 (10:55 +0000)
committerGerd Moellmann <gerd@gnu.org>
Tue, 27 Jun 2000 10:55:46 +0000 (10:55 +0000)
lisp/ChangeLog
lisp/pcmpl-cvs.el [new file with mode: 0644]
lisp/pcmpl-gnu.el [new file with mode: 0644]
lisp/pcmpl-linux.el [new file with mode: 0644]
lisp/pcmpl-rpm.el [new file with mode: 0644]
lisp/pcmpl-unix.el [new file with mode: 0644]

index c4d6fc6eec4e3ef8e9b815f0d07cdea4115b25fe..d5cf54fe107ec12485d35ad1e1b0cb7da199d35b 100644 (file)
@@ -1,5 +1,10 @@
 2000-06-27  Gerd Moellmann  <gerd@gnu.org>
 
+       * help.el (describe-variable): Don't insert a second `'s' in front
+       of the string `value is shown below'.  Since the syntax-table is
+       set to emacs-lisp-mode-syntax-table, forward-sexp skips over
+       an existing `'s', so that this won't be deleted.
+
        * pcmpl-cvs.el, pcmpl-gnu.el, pcmpl-linux.el, pcmpl-rpm.el:
        * pcmpl-unix.el: New files.
 
diff --git a/lisp/pcmpl-cvs.el b/lisp/pcmpl-cvs.el
new file mode 100644 (file)
index 0000000..854479d
--- /dev/null
@@ -0,0 +1,186 @@
+;;; pcmpl-cvs --- functions for dealing with cvs completions
+
+;; Copyright (C) 1999, 2000 Free Software Foundation
+
+;; 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 2, 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; These functions provide completion rules for the `cvs' tool.
+
+;;; Code:
+
+(provide 'pcmpl-cvs)
+
+(require 'pcomplete)
+(require 'executable)
+
+(defgroup pcmpl-cvs nil
+  "Functions for dealing with CVS completions"
+  :group 'pcomplete)
+
+;; User Variables:
+
+(defcustom pcmpl-cvs-binary (or (executable-find "cvs") "cvs")
+  "*The full path of the 'cvs' binary."
+  :type 'file
+  :group 'pcmpl-cvs)
+
+;; Functions:
+
+;;;###autoload
+(defun pcomplete/cvs ()
+  "Completion rules for the `cvs' command."
+  (let ((pcomplete-help "(cvs)Invoking CVS"))
+    (pcomplete-opt "HQqrwlntvfab/T/e*d/z?s")
+    (pcomplete-here* (pcmpl-cvs-commands))
+    (cond ((pcomplete-test "add")
+          (setq pcomplete-help "(cvs)Adding files")
+          (pcomplete-opt "k?m?")
+          (while (pcomplete-here (pcmpl-cvs-entries '(??)))))
+         ((pcomplete-test "remove")
+          (setq pcomplete-help "(cvs)Removing files")
+          (pcomplete-opt "flR")
+          (while (pcomplete-here (pcmpl-cvs-entries '(?U)))))
+         ((pcomplete-test "init")
+          (setq pcomplete-help "(cvs)Creating a repository"))
+         ((pcomplete-test '("login" "logout"))
+          (setq pcomplete-help "(cvs)Password authentication client"))
+         ((pcomplete-test "import")
+          (setq pcomplete-help "(cvs)import")
+          (pcomplete-opt "dk?I(pcmpl-cvs-entries '(??))b?m?W?"))
+         ((pcomplete-test "checkout")
+          (setq pcomplete-help "(cvs)checkout")
+          (pcomplete-opt "ANPRcflnpsr?D?d/k?j?")
+          (pcomplete-here (pcmpl-cvs-modules)))
+         ((pcomplete-test "rtag")
+          (setq pcomplete-help "(cvs)Creating a branch")
+          (pcomplete-opt "aflRndbr?DF")
+          (pcomplete-here (pcmpl-cvs-modules)))
+         ((pcomplete-test "release")
+          (setq pcomplete-help "(cvs)release")
+          (pcomplete-opt "d")
+          (while (pcomplete-here (pcomplete-dirs))))
+         ((pcomplete-test "export")
+          (setq pcomplete-help "(cvs)export")
+          (pcomplete-opt "NflRnr?D?d/k?")
+          (pcomplete-here (pcmpl-cvs-modules)))
+         ((pcomplete-test "commit")
+          (setq pcomplete-help "(cvs)commit files")
+          (pcomplete-opt "nRlfF.m?r(pcmpl-cvs-tags '(?M ?R ?A))")
+          (while (pcomplete-here (pcmpl-cvs-entries '(?M ?R ?A)))))
+         ((pcomplete-test "diff")
+          (setq pcomplete-help "(cvs)Viewing differences")
+          (let ((opt-index pcomplete-index)
+                saw-backdate)
+            (pcomplete-opt "lRD?Nr(pcmpl-cvs-tags)")
+            (while (< opt-index pcomplete-index)
+              (if (pcomplete-match "^-[Dr]" (- pcomplete-index opt-index))
+                  (setq saw-backdate t opt-index pcomplete-index)
+                (setq opt-index (1+ opt-index))))
+            (while (pcomplete-here
+                    (pcmpl-cvs-entries (unless saw-backdate '(?M)))))))
+         ((pcomplete-test "unedit")
+          (setq pcomplete-help "(cvs)Editing files")
+          (pcomplete-opt "lR")
+          (while (pcomplete-here (pcmpl-cvs-entries '(?M ?R ?A)))))
+         ((pcomplete-test "update")
+          (setq pcomplete-help "(cvs)update")
+          (pcomplete-opt
+           (concat "APdflRpk?r(pcmpl-cvs-tags '(?U ?P))D?"
+                   "j(pcmpl-cvs-tags '(?U ?P))"
+                   "I(pcmpl-cvs-entries '(??))W?"))
+          (while (pcomplete-here (pcmpl-cvs-entries '(?U ?P)))))
+         (t
+          (while (pcomplete-here (pcmpl-cvs-entries)))))))
+
+(defun pcmpl-cvs-commands ()
+  "Return a list of available CVS commands."
+  (with-temp-buffer
+    (call-process pcmpl-cvs-binary nil t nil "--help-commands")
+    (goto-char (point-min))
+    (let (cmds)
+      (while (re-search-forward "^\\s-+\\([a-z]+\\)" nil t)
+       (setq cmds (cons (match-string 1) cmds)))
+      (pcomplete-uniqify-list cmds))))
+
+(defun pcmpl-cvs-modules ()
+  "Return a list of available modules under CVS."
+  (with-temp-buffer
+    (call-process pcmpl-cvs-binary nil t nil "checkout" "-c")
+    (goto-char (point-min))
+    (let (entries)
+      (while (re-search-forward "\\(\\S-+\\)$" nil t)
+       (setq entries (cons (match-string 1) entries)))
+      (pcomplete-uniqify-list entries))))
+
+(defun pcmpl-cvs-tags (&optional opers)
+  "Return all the tags which could apply to the files related to OPERS."
+  (let ((entries (pcmpl-cvs-entries opers))
+       tags)
+    (with-temp-buffer
+      (apply 'call-process pcmpl-cvs-binary nil t nil
+            "status" "-v" entries)
+      (goto-char (point-min))
+      (while (re-search-forward "Existing Tags:" nil t)
+       (forward-line)
+       (while (not (looking-at "^$"))
+         (unless (looking-at "^\\s-+\\(\\S-+\\)\\s-+")
+           (error "Error in output from `cvs status -v'"))
+         (setq tags (cons (match-string 1) tags))
+         (forward-line))))
+    (pcomplete-uniqify-list tags)))
+
+(defun pcmpl-cvs-entries (&optional opers)
+  "Return the Entries for the current directory.
+If OPERS is a list of characters, return entries for which that
+operation character applies, as displayed by 'cvs -n update'."
+  (let* ((arg (pcomplete-arg))
+        (dir (file-name-as-directory
+              (or (file-name-directory arg) "")))
+        (nondir (or (file-name-nondirectory arg) ""))
+        entries)
+    (if opers
+       (with-temp-buffer
+         (and dir (cd dir))
+         (call-process pcmpl-cvs-binary nil t nil
+                       "-q" "-n" "-f" "update"); "-l")
+         (goto-char (point-min))
+         (while (re-search-forward "^\\(.\\) \\(.+\\)$" nil t)
+           (if (memq (string-to-char (match-string 1)) opers)
+               (setq entries (cons (match-string 2) entries)))))
+      (with-temp-buffer
+       (insert-file-contents (concat dir "CVS/Entries"))
+       (goto-char (point-min))
+       (while (not (eobp))
+         (let* ((line (buffer-substring (line-beginning-position)
+                                        (line-end-position)))
+                (fields (split-string line "/"))
+                text)
+           (if (eq (aref line 0) ?/)
+               (setq fields (cons "" fields)))
+           (setq text (nth 1 fields))
+           (when text
+             (if (string= (nth 0 fields) "D")
+                 (setq text (file-name-as-directory text)))
+             (setq entries (cons text entries))))
+         (forward-line))))
+    (setq pcomplete-stub nondir)
+    (pcomplete-uniqify-list entries)))
+
+;;; pcmpl-cvs.el ends here
diff --git a/lisp/pcmpl-gnu.el b/lisp/pcmpl-gnu.el
new file mode 100644 (file)
index 0000000..f390f54
--- /dev/null
@@ -0,0 +1,305 @@
+;;; pcmpl-gnu --- completions for GNU project tools
+
+;; Copyright (C) 1999, 2000 Free Software Foundation
+
+;; 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 2, 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
+
+(provide 'pcmpl-gnu)
+
+(require 'pcomplete)
+(require 'pcmpl-unix)
+
+(defgroup pcmpl-gnu nil
+  "Completions for GNU project tools."
+  :group 'pcomplete)
+
+;; User Variables:
+
+(defcustom pcmpl-gnu-makefile-regexps
+  '("\\`Makefile\\." "\\.mak\\'")
+  "*A list of regexps that will match Makefile names."
+  :type '(repeat regexp)
+  :group 'pcmpl-gnu)
+
+;; Functions:
+
+;;;###autoload
+(defun pcomplete/gzip ()
+  "Completion for `gzip'."
+  (let ((pcomplete-help "(gzip)"))
+    (pcomplete-opt "cdfhlLnNqrStvV123456789")
+    (while (pcomplete-here
+           (pcmpl-gnu-zipped-files
+            (catch 'has-d-flag
+              (let ((args pcomplete-args))
+                (while args
+                  (if (string-match "\\`-.*[dt]" (car args))
+                      (throw 'has-d-flag t))
+                  (setq args (cdr args))))))))))
+
+(defun pcmpl-gnu-zipped-files (unzip-p)
+  "Find all zipped or unzipped files: the inverse of UNZIP-P."
+  (pcomplete-entries
+   nil
+   (function
+    (lambda (entry)
+      (when (and (file-readable-p entry)
+                (file-regular-p entry))
+       (let ((zipped (string-match "\\.\\(t?gz\\|\\(ta\\)?Z\\)\\'"
+                                   entry)))
+         (or (and unzip-p zipped)
+             (and (not unzip-p) (not zipped)))))))))
+
+;;;###autoload
+(defun pcomplete/bzip2 ()
+  "Completion for `bzip2'."
+  (pcomplete-opt "hdzkftcqvLVs123456789")
+  (while (pcomplete-here
+         (pcmpl-gnu-bzipped-files
+          (catch 'has-d-flag
+            (let ((args pcomplete-args))
+              (while args
+                (if (string-match "\\`-.*[dt]" (car args))
+                    (throw 'has-d-flag t))
+                (setq args (cdr args)))))))))
+
+(defun pcmpl-gnu-bzipped-files (unzip-p)
+  "Find all zipped or unzipped files: the inverse of UNZIP-P."
+  (pcomplete-entries
+   nil
+   (function
+    (lambda (entry)
+      (when (and (file-readable-p entry)
+                (file-regular-p entry))
+       (let ((zipped (string-match "\\.\\(t?z2\\|bz2\\)\\'" entry)))
+         (or (and unzip-p zipped)
+             (and (not unzip-p) (not zipped)))))))))
+
+;;;###autoload
+(defun pcomplete/make ()
+  "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))))
+
+(defun pcmpl-gnu-makefile-names ()
+  "Return a list of possible makefile names."
+  (let ((names (list t))
+       (reg pcmpl-gnu-makefile-regexps))
+    (while reg
+      (nconc names (pcomplete-entries (car reg)))
+      (setq reg (cdr reg)))
+    (cdr names)))
+
+(defun pcmpl-gnu-make-rule-names ()
+  "Return a list of possible make rule names in MAKEFILE."
+  (let* ((minus-f (member "-f" pcomplete-args))
+        (makefile (or (cadr minus-f) "Makefile"))
+        rules)
+    (if (not (file-readable-p makefile))
+       (unless minus-f (list "-f"))
+      (with-temp-buffer
+       (insert-file-contents-literally 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\\)\\'"
+  "*A regexp which matches any tar archive."
+  :type 'regexp
+  :group 'pcmpl-gnu)
+
+(defvar pcmpl-gnu-tar-buffer nil)
+
+;;;###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))
+    (unless saw-option
+      (pcomplete-here
+       (mapcar 'char-to-string
+              (string-to-list
+               "01234567ABCFGIKLMNOPRSTUVWXZbcdfghiklmoprstuvwxz")))
+      (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))
+             (pcomplete-entries))
+           nil 'identity))))
+
+;;;###autoload
+(defalias 'pcomplete/gdb 'pcomplete/xargs)
+
+;;; pcmpl-gnu.el ends here
diff --git a/lisp/pcmpl-linux.el b/lisp/pcmpl-linux.el
new file mode 100644 (file)
index 0000000..26e5373
--- /dev/null
@@ -0,0 +1,108 @@
+;;; pcmpl-linux --- functions for dealing with cvs completions
+
+;; Copyright (C) 1999, 2000 Free Software Foundation
+
+;; 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 2, 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; These functions are for use with GNU/Linux.  Since they depend on a
+;; certain knowledge of the layout of such systems, they probably
+;; won't work very well on other operating systems.
+
+;;; Code:
+
+(provide 'pcmpl-linux)
+
+(require 'pcomplete)
+
+(defgroup pcmpl-linux nil
+  "Functions for dealing with GNU/Linux completions."
+  :group 'pcomplete)
+
+;; Functions:
+
+;;;###autoload
+(defun pcomplete/kill ()
+  "Completion for GNU/Linux `kill', using /proc filesystem."
+  (if (pcomplete-match "^-\\(.*\\)" 0)
+      (pcomplete-here
+       (pcomplete-uniqify-list
+       (split-string
+        (pcomplete-process-result "kill" "-l")))
+       (pcomplete-match-string 1 0)))
+  (while (pcomplete-here
+         (if (file-directory-p "/proc")
+             (let ((default-directory "/proc/"))
+               (mapcar 'directory-file-name
+                       (pcomplete-entries "[0-9]+/$"))))
+         nil 'identity)))
+
+;;;###autoload
+(defun pcomplete/umount ()
+  "Completion for GNU/Linux `umount'."
+  (pcomplete-opt "hVafrnvt(pcmpl-linux-fs-types)")
+  (while (pcomplete-here (pcmpl-linux-mounted-directories)
+                        nil 'identity)))
+
+;;;###autoload
+(defun pcomplete/mount ()
+  "Completion for GNU/Linux `mount'."
+  (pcomplete-opt "hVanfFrsvwt(pcmpl-linux-fs-types)o?L?U?")
+  (while (pcomplete-here (pcomplete-entries) nil 'identity)))
+
+(defun pcmpl-linux-fs-types ()
+  "Return a list of available fs modules on GNU/Linux systems."
+  (let ((kernel-ver (pcomplete-process-result "uname" "-r")))
+    (mapcar
+     (function
+      (lambda (fsobj)
+       (substring fsobj 0 (- (length fsobj) 2))))
+     (let ((default-directory
+            (concat "/lib/modules/" kernel-ver "/fs/")))
+       (pcomplete-entries "\\.o$")))))
+
+(defun pcmpl-linux-mounted-directories ()
+  "Return a list of mounted directory names."
+  (let (points)
+    (when (file-readable-p "/etc/mtab")
+      (with-temp-buffer
+       (insert-file-contents-literally "/etc/mtab")
+       (while (not (eobp))
+         (let* ((line (buffer-substring (point) (line-end-position)))
+                (args (split-string line " ")))
+           (setq points (cons (nth 1 args) points)))
+         (forward-line)))
+      (pcomplete-uniqify-list points))))
+
+(defun pcmpl-linux-mountable-directories ()
+  "Return a list of mountable directory names."
+  (let (points)
+    (when (file-readable-p "/etc/fstab")
+      (with-temp-buffer
+       (insert-file-contents-literally "/etc/fstab")
+       (while (not (eobp))
+         (let* ((line (buffer-substring (point) (line-end-position)))
+                (args (split-string line "\\s-+")))
+           (setq points (cons (nth 1 args) points)))
+         (forward-line)))
+      (pcomplete-pare-list
+       (pcomplete-uniqify-list points)
+       (cons "swap" (pcmpl-linux-mounted-directories))))))
+
+;;; pcmpl-linux.el ends here
diff --git a/lisp/pcmpl-rpm.el b/lisp/pcmpl-rpm.el
new file mode 100644 (file)
index 0000000..ae72e51
--- /dev/null
@@ -0,0 +1,329 @@
+;;; pcmpl-rpm --- functions for dealing with rpm completions
+
+;; Copyright (C) 1999, 2000 Free Software Foundation
+
+;; 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 2, 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; These functions provide completion rules for RedHat's `rpm' tool.
+
+;;; Code:
+
+(provide 'pcmpl-rpm)
+
+(require 'pcomplete)
+
+(defgroup pcmpl-rpm nil
+  "Functions for dealing with CVS completions"
+  :group 'pcomplete)
+
+;; Functions:
+
+(defsubst pcmpl-rpm-packages ()
+  (split-string (pcomplete-process-result "rpm" "-q" "-a")))
+
+(defun pcmpl-rpm-all-query (flag)
+  (message "Querying all packages with `%s'..." flag)
+  (let ((pkgs (pcmpl-rpm-packages))
+       (provs (list t)))
+    (while pkgs
+      (nconc provs (split-string
+                   (pcomplete-process-result
+                    "rpm" "-q" (car pkgs) flag)))
+      (setq pkgs (cdr pkgs)))
+    (pcomplete-uniqify-list (cdr provs))))
+
+(defsubst pcmpl-rpm-files ()
+  (pcomplete-dirs-or-entries "\\.rpm\\'"))
+
+;;;###autoload
+(defun pcomplete/rpm ()
+  "Completion for RedHat's `rpm' command.
+These rules were taken from the output of `rpm --help' on a RedHat 6.1
+system.  They follow my interpretation of what followed, but since I'm
+not a major rpm user/builder, please send me any corrections you find.
+You can use \\[eshell-report-bug] to do so."
+  (let (mode)
+    (while (<= pcomplete-index pcomplete-last)
+      (unless mode
+       (if (pcomplete-match "^--\\(.*\\)" 0)
+           (pcomplete-here*
+            '("--addsign"
+              "--checksig"
+              "--erase"
+              "--help"
+              "--initdb"
+              "--install"
+              "--pipe"
+              "--querytags"
+              "--rebuild"
+              "--rebuilddb"
+              "--recompile"
+              "--resign"
+              "--rmsource"
+              "--setperms"
+              "--setugids"
+              "--upgrade"
+              "--verify"
+              "--version"))
+         (pcomplete-opt "vqVyiUebtK")))
+;     -b<stage> <spec>
+;     -t<stage> <tarball>    - build package, where <stage> is one of:
+;        p                - prep (unpack sources and apply patches)
+;        l                - list check (do some cursory checks on %files)
+;        c                - compile (prep and compile)
+;        i                - install (prep, compile, install)
+;        b                - binary package (prep, compile, install, package)
+;        a                - bin/src package (prep, compile, install, package)
+      (cond
+       ((or (eq mode 'query)
+           (pcomplete-match "-[^-]*q"))
+       (setq mode 'query)
+       (if (pcomplete-match "^--\\(.*\\)" 0)
+           (progn
+             (pcomplete-here*
+              '("--changelog"
+                "--dbpath"
+                "--dump"
+                "--ftpport"            ;nyi for the next four
+                "--ftpproxy"
+                "--httpport"
+                "--httpproxy"
+                "--provides"
+                "--queryformat"
+                "--rcfile"
+                "--requires"
+                "--root"
+                "--scripts"
+                "--triggeredby"
+                "--whatprovides"
+                "--whatrequires"))
+             (cond
+              ((pcomplete-test "--dbpath")
+               (pcomplete-here* (pcomplete-dirs)))
+              ((pcomplete-test "--queryformat")
+               (pcomplete-here*))
+              ((pcomplete-test "--rcfile")
+               (pcomplete-here* (pcomplete-entries)))
+              ((pcomplete-test "--root")
+               (pcomplete-here* (pcomplete-dirs)))
+              ((pcomplete-test "--scripts")
+               (if (pcomplete-match "^--\\(.*\\)" 0)
+                   (pcomplete-here* '("--triggers"))))
+              ((pcomplete-test "--triggeredby")
+               (pcomplete-here* (pcmpl-rpm-packages)))
+              ((pcomplete-test "--whatprovides")
+               (pcomplete-here*
+                (pcmpl-rpm-all-query "--provides")))
+              ((pcomplete-test "--whatrequires")
+               (pcomplete-here*
+                (pcmpl-rpm-all-query "--requires")))))
+         (if (pcomplete-match "^-" 0)
+             (pcomplete-opt "af.p(pcmpl-rpm-files)ilsdcvR")
+           (pcomplete-here (pcmpl-rpm-packages)))))
+       ((pcomplete-test "--pipe")
+       (pcomplete-here* (funcall pcomplete-command-completion-function)))
+       ((pcomplete-test "--rmsource")
+       (pcomplete-here* (pcomplete-entries))
+       (throw 'pcomplete-completions nil))
+       ((pcomplete-match "\\`--re\\(build\\|compile\\)\\'")
+       (pcomplete-here (pcmpl-rpm-files))
+       (throw 'pcomplete-completions nil))
+       ((pcomplete-match "\\`--\\(resign\\|addsign\\)\\'")
+       (while (pcomplete-here (pcmpl-rpm-files))))
+       ((or (eq mode 'checksig)
+           (pcomplete-test "--checksig"))
+       (setq mode 'checksig)
+       (if (pcomplete-match "^--\\(.*\\)" 0)
+           (progn
+             (pcomplete-here*
+              '("--nopgp"
+                "--nogpg"
+                "--nomd5"
+                "--rcfile"))
+             (cond
+              ((pcomplete-test "--rcfile")
+               (pcomplete-here* (pcomplete-entries)))))
+         (if (pcomplete-match "^-" 0)
+             (pcomplete-opt "v")
+           (pcomplete-here (pcmpl-rpm-files)))))
+       ((or (eq mode 'rebuilddb)
+           (pcomplete-test "--rebuilddb"))
+       (setq mode 'rebuilddb)
+       (if (pcomplete-match "^--\\(.*\\)" 0)
+           (progn
+             (pcomplete-here*
+              '("--dbpath"
+                "--root"
+                "--rcfile"))
+             (cond
+              ((pcomplete-test "--dbpath")
+               (pcomplete-here* (pcomplete-dirs)))
+              ((pcomplete-test "--root")
+               (pcomplete-here* (pcomplete-dirs)))
+              ((pcomplete-test "--rcfile")
+               (pcomplete-here* (pcomplete-entries)))))
+         (if (pcomplete-match "^-" 0)
+             (pcomplete-opt "v")
+           (pcomplete-here))))
+       ((memq mode '(install upgrade))
+       (if (pcomplete-match "^--\\(.*\\)" 0)
+           (progn
+             (pcomplete-here*
+              (append
+               '("--allfiles"
+                 "--badreloc"
+                 "--dbpath"
+                 "--excludedocs"
+                 "--excludepath"
+                 "--force"
+                 "--hash"
+                 "--ignorearch"
+                 "--ignoreos"
+                 "--ignoresize"
+                 "--includedocs"
+                 "--justdb"
+                 "--nodeps"
+                 "--noorder"
+                 "--noscripts"
+                 "--notriggers")
+               (if (eq mode 'upgrade)
+                   '("--oldpackage"))
+               '("--percent"
+                 "--prefix"
+                 "--rcfile"
+                 "--relocate"
+                 "--replacefiles"
+                 "--replacepkgs"
+                 "--root")))
+             (cond
+              ((pcomplete-test "--dbpath")
+               (pcomplete-here* (pcomplete-dirs)))
+              ((pcomplete-test "--relocate")
+               (pcomplete-here*))
+              ((pcomplete-test "--rcfile")
+               (pcomplete-here* (pcomplete-entries)))
+              ((pcomplete-test "--excludepath")
+               (pcomplete-here* (pcomplete-entries)))
+              ((pcomplete-test "--root")
+               (pcomplete-here* (pcomplete-dirs)))
+              ((pcomplete-test "--prefix")
+               (pcomplete-here* (pcomplete-dirs)))))
+         (if (pcomplete-match "^-" 0)
+             (pcomplete-opt "vh")
+           (pcomplete-here (pcmpl-rpm-files)))))
+       ((or (pcomplete-test "--install")
+           (pcomplete-match "-[^-]*i"))
+       (setq mode 'install))
+       ((or (pcomplete-test "--upgrade")
+           (pcomplete-match "-[^-]*U"))
+       (setq mode 'upgrade))
+       ((or (eq mode 'erase)
+           (pcomplete-test "--erase")
+           (pcomplete-match "-[^-]*e"))
+       (setq mode 'erase)
+       (if (pcomplete-match "^--\\(.*\\)" 0)
+           (progn
+             (pcomplete-here*
+              '("--allmatches"
+                "--dbpath"
+                "--justdb"
+                "--nodeps"
+                "--noorder"
+                "--noscripts"
+                "--notriggers"
+                "--rcfile"
+                "--root"))
+             (cond
+              ((pcomplete-test "--dbpath")
+               (pcomplete-here* (pcomplete-dirs)))
+              ((pcomplete-test "--rcfile")
+               (pcomplete-here* (pcomplete-entries)))
+              ((pcomplete-test "--root")
+               (pcomplete-here* (pcomplete-dirs)))))
+         (if (pcomplete-match "^-" 0)
+             (pcomplete-opt "v")
+           (pcomplete-here (pcmpl-rpm-packages)))))
+       ((or (eq mode 'verify)
+           (pcomplete-test "--verify"))
+       (setq mode 'verify)
+       (if (pcomplete-match "^--\\(.*\\)" 0)
+           (progn
+             (pcomplete-here*
+              '("--dbpath"
+                "--nodeps"
+                "--nofiles"
+                "--nomd5"
+                "--rcfile"
+                "--root"
+                "--triggeredby"
+                "--whatprovides"
+                "--whatrequires"))
+             (cond
+              ((pcomplete-test "--dbpath")
+               (pcomplete-here* (pcomplete-dirs)))
+              ((pcomplete-test "--rcfile")
+               (pcomplete-here* (pcomplete-entries)))
+              ((pcomplete-test "--root")
+               (pcomplete-here* (pcomplete-dirs)))
+              ((pcomplete-test "--triggeredby")
+               (pcomplete-here* (pcmpl-rpm-packages)))
+              ((pcomplete-test "--whatprovides")
+               (pcomplete-here*
+                (pcmpl-rpm-all-query "--provides")))
+              ((pcomplete-test "--whatrequires")
+               (pcomplete-here*
+                (pcmpl-rpm-all-query "--requires")))))
+         (if (pcomplete-match "^-" 0)
+             (pcomplete-opt "af.p(pcmpl-rpm-files)v")
+           (pcomplete-here (pcmpl-rpm-packages)))))
+       ((or (memq mode '(build test))
+           (pcomplete-match "\\`-[bt]"))
+       (setq mode (if (pcomplete-match "\\`-b")
+                      'build
+                    'test))
+       (if (pcomplete-match "^--\\(.*\\)" 0)
+           (progn
+             (pcomplete-here*
+              '("--buildroot"
+                "--clean"
+                "--nobuild"
+                "--rcfile"
+                "--rmsource"
+                "--short-circuit"
+                "--sign"
+                "--target"
+                "--timecheck"))
+             (cond
+              ((pcomplete-test "--buildroot")
+               (pcomplete-here* (pcomplete-dirs)))
+              ((pcomplete-test "--rcfile")
+               (pcomplete-here* (pcomplete-entries)))
+              ((pcomplete-test "--timecheck")
+               (pcomplete-here*))))
+         (if (pcomplete-match "^-" 0)
+             (pcomplete-opt "v")
+           (pcomplete-here
+            (if (eq mode 'test)
+                (pcomplete-dirs-or-entries "\\.tar\\'")
+              (pcomplete-dirs-or-entries "\\.spec\\'"))))))
+       (t
+       (error "You must select a mode: -q, -i, -U, --verify, etc."))))))
+
+;;; pcmpl-rpm.el ends here
diff --git a/lisp/pcmpl-unix.el b/lisp/pcmpl-unix.el
new file mode 100644 (file)
index 0000000..b990cb7
--- /dev/null
@@ -0,0 +1,123 @@
+;;; pcmpl-unix --- standard UNIX completions
+
+;; Copyright (C) 1999, 2000 Free Software Foundation
+
+;; 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 2, 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
+
+(provide 'pcmpl-unix)
+
+(require 'pcomplete)
+
+;; User Variables:
+
+(defcustom pcmpl-unix-group-file "/etc/group"
+  "*If non-nil, a string naming the group file on your system."
+  :type 'file
+  :group 'pcmpl-unix)
+
+(defcustom pcmpl-unix-passwd-file "/etc/passwd"
+  "*If non-nil, a string naming the passwd file on your system."
+  :type 'file
+  :group 'pcmpl-unix)
+
+;; Functions:
+
+;;;###autoload
+(defun pcomplete/cd ()
+  "Completion for `cd'."
+  (pcomplete-here (pcomplete-dirs)))
+
+;;;###autoload
+(defalias 'pcomplete/pushd 'pcomplete/cd)
+
+;;;###autoload
+(defun pcomplete/rmdir ()
+  "Completion for `rmdir'."
+  (while (pcomplete-here (pcomplete-dirs))))
+
+;;;###autoload
+(defun pcomplete/rm ()
+  "Completion for `rm'."
+  (let ((pcomplete-help "(fileutils)rm invocation"))
+    (pcomplete-opt "dfirRv")
+    (while (pcomplete-here (pcomplete-all-entries) nil
+                          'expand-file-name))))
+
+;;;###autoload
+(defun pcomplete/xargs ()
+  "Completion for `xargs'."
+  (pcomplete-here (funcall pcomplete-command-completion-function))
+  (funcall (or (pcomplete-find-completion-function (pcomplete-arg 1))
+              pcomplete-default-completion-function)))
+
+;;;###autoload
+(defalias 'pcomplete/time 'pcomplete/xargs)
+
+;;;###autoload
+(defun pcomplete/which ()
+  "Completion for `which'."
+  (while (pcomplete-here (funcall pcomplete-command-completion-function))))
+
+(defun pcmpl-unix-read-passwd-file (file)
+  "Return an alist correlating gids to group names in FILE."
+  (let (names)
+    (when (file-readable-p file)
+      (with-temp-buffer
+       (insert-file-contents file)
+       (goto-char (point-min))
+       (while (not (eobp))
+         (let* ((fields
+                 (split-string (buffer-substring
+                                (point) (progn (end-of-line)
+                                               (point))) ":")))
+           (setq names (cons (nth 0 fields) names)))
+         (forward-line))))
+    (pcomplete-uniqify-list names)))
+
+(defsubst pcmpl-unix-group-names ()
+  "Read the contents of /etc/group for group names."
+  (if pcmpl-unix-group-file
+      (pcmpl-unix-read-passwd-file pcmpl-unix-group-file)))
+
+(defsubst pcmpl-unix-user-names ()
+  "Read the contents of /etc/passwd for user names."
+  (if pcmpl-unix-passwd-file
+      (pcmpl-unix-read-passwd-file pcmpl-unix-passwd-file)))
+
+;;;###autoload
+(defun pcomplete/chown ()
+  "Completion for the `chown' command."
+  (unless (pcomplete-match "\\`-")
+    (if (pcomplete-match "\\`[^.]*\\'" 0)
+       (pcomplete-here* (pcmpl-unix-user-names))
+      (if (pcomplete-match "\\.\\([^.]*\\)\\'" 0)
+         (pcomplete-here* (pcmpl-unix-group-names)
+                          (pcomplete-match-string 1 0))
+       (pcomplete-here*))))
+  (while (pcomplete-here (pcomplete-entries))))
+
+;;;###autoload
+(defun pcomplete/chgrp ()
+  "Completion for the `chgrp' command."
+  (unless (pcomplete-match "\\`-")
+    (pcomplete-here* (pcmpl-unix-group-names)))
+  (while (pcomplete-here (pcomplete-entries))))
+
+;;; pcmpl-unix.el ends here