diff options
-rw-r--r-- | lisp/ChangeLog | 5 | ||||
-rw-r--r-- | lisp/pcmpl-cvs.el | 186 | ||||
-rw-r--r-- | lisp/pcmpl-gnu.el | 305 | ||||
-rw-r--r-- | lisp/pcmpl-linux.el | 108 | ||||
-rw-r--r-- | lisp/pcmpl-rpm.el | 329 | ||||
-rw-r--r-- | lisp/pcmpl-unix.el | 123 |
6 files changed, 1056 insertions, 0 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index c4d6fc6eec4..d5cf54fe107 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -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 index 00000000000..854479d4305 --- /dev/null +++ b/lisp/pcmpl-cvs.el @@ -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 index 00000000000..f390f541e25 --- /dev/null +++ b/lisp/pcmpl-gnu.el @@ -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 index 00000000000..26e5373f66f --- /dev/null +++ b/lisp/pcmpl-linux.el @@ -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 index 00000000000..ae72e51ae55 --- /dev/null +++ b/lisp/pcmpl-rpm.el @@ -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 index 00000000000..b990cb722d9 --- /dev/null +++ b/lisp/pcmpl-unix.el @@ -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 |