(provide 'pcmpl-unix)
(require 'pcomplete)
(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)
(defun pcomplete/cd ()
"Completion for `cd'."
(pcomplete-here (pcomplete-dirs)))
(defalias 'pcomplete/pushd 'pcomplete/cd)
(defun pcomplete/rmdir ()
"Completion for `rmdir'."
(while (pcomplete-here (pcomplete-dirs))))
(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))))
(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)))
(defalias 'pcomplete/time 'pcomplete/xargs)
(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)))
(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))))
(defun pcomplete/chgrp ()
"Completion for the `chgrp' command."
(unless (pcomplete-match "\\`-")
(pcomplete-here* (pcmpl-unix-group-names)))
(while (pcomplete-here (pcomplete-entries))))