changeset 29959:d4e54e70814f

*** empty log message ***
author Gerd Moellmann <gerd@gnu.org>
date Tue, 27 Jun 2000 10:55:46 +0000
parents 7507f083dcc5
children 8aa954de8db9
files lisp/ChangeLog lisp/pcmpl-cvs.el lisp/pcmpl-gnu.el lisp/pcmpl-linux.el lisp/pcmpl-rpm.el lisp/pcmpl-unix.el
diffstat 6 files changed, 1056 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Tue Jun 27 10:54:26 2000 +0000
+++ b/lisp/ChangeLog	Tue Jun 27 10:55:46 2000 +0000
@@ -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.
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/pcmpl-cvs.el	Tue Jun 27 10:55:46 2000 +0000
@@ -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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/pcmpl-gnu.el	Tue Jun 27 10:55:46 2000 +0000
@@ -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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/pcmpl-linux.el	Tue Jun 27 10:55:46 2000 +0000
@@ -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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/pcmpl-rpm.el	Tue Jun 27 10:55:46 2000 +0000
@@ -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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/pcmpl-unix.el	Tue Jun 27 10:55:46 2000 +0000
@@ -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