pcmpl-unix.el 5.47 KB
Newer Older
1
;;; pcmpl-unix.el --- standard UNIX completions
Gerd Moellmann's avatar
Gerd Moellmann committed
2

Glenn Morris's avatar
Glenn Morris committed
3
;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
Glenn Morris's avatar
Glenn Morris committed
4
;;   2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
Gerd Moellmann's avatar
Gerd Moellmann committed
5 6 7

;; This file is part of GNU Emacs.

8
;; GNU Emacs is free software: you can redistribute it and/or modify
Gerd Moellmann's avatar
Gerd Moellmann committed
9
;; it under the terms of the GNU General Public License as published by
10 11
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
Gerd Moellmann's avatar
Gerd Moellmann committed
12 13 14 15 16 17 18

;; 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
19
;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
Gerd Moellmann's avatar
Gerd Moellmann committed
20

21 22
;;; Commentary:

Gerd Moellmann's avatar
Gerd Moellmann committed
23 24 25 26 27 28 29
;;; Code:

(require 'pcomplete)

;; User Variables:

(defcustom pcmpl-unix-group-file "/etc/group"
30 31
  "If non-nil, a string naming the group file on your system."
  :type '(choice file (const nil))
Gerd Moellmann's avatar
Gerd Moellmann committed
32 33 34
  :group 'pcmpl-unix)

(defcustom pcmpl-unix-passwd-file "/etc/passwd"
35 36
  "If non-nil, a string naming the passwd file on your system."
  :type '(choice file (const nil))
Gerd Moellmann's avatar
Gerd Moellmann committed
37 38
  :group 'pcmpl-unix)

39
(defcustom pcmpl-ssh-known-hosts-file "~/.ssh/known_hosts"
40 41 42 43 44 45 46 47
  "If non-nil, a string naming your SSH \"known_hosts\" file.
This allows completion of SSH host names.  Note that newer
versions of ssh hash the hosts by default to prevent
Island-hopping SSH attacks.  This can be disabled, at some risk,
with the SSH option \"HashKnownHosts no\"."
  :type '(choice file (const nil))
  :group 'pcmpl-unix
  :version "23.1")
48

Gerd Moellmann's avatar
Gerd Moellmann committed
49 50 51 52 53
;; Functions:

;;;###autoload
(defun pcomplete/cd ()
  "Completion for `cd'."
54
  (while (pcomplete-here (pcomplete-dirs))))
Gerd Moellmann's avatar
Gerd Moellmann committed
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131

;;;###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))))

132

133 134 135
;; ssh support by Phil Hagelberg.
;; http://www.emacswiki.org/cgi-bin/wiki/pcmpl-ssh.el

136 137 138 139 140 141 142 143 144 145 146 147 148 149
(defun pcmpl-ssh-hosts ()
  "Return a list of hosts found in `pcmpl-ssh-known-hosts-file'."
  (when (and pcmpl-ssh-known-hosts-file
             (file-readable-p pcmpl-ssh-known-hosts-file))
    (with-temp-buffer
      (insert-file-contents-literally pcmpl-ssh-known-hosts-file)
      (let (ssh-hosts-list)
        (while (re-search-forward "^ *\\([-.[:alnum:]]+\\)[, ]" nil t)
          (add-to-list 'ssh-hosts-list (match-string 1))
          (while (and (looking-back ",")
                      (re-search-forward "\\([-.[:alnum:]]+\\)[, ]"
                                         (line-end-position) t))
            (add-to-list 'ssh-hosts-list (match-string 1))))
        ssh-hosts-list))))
150 151 152 153 154 155 156 157 158 159 160 161 162

;;;###autoload
(defun pcomplete/ssh ()
  "Completion rules for the `ssh' command."
  (pcomplete-opt "1246AaCfgKkMNnqsTtVvXxYbcDeFiLlmOopRSw" nil t)
  (pcomplete-here (pcmpl-ssh-hosts)))

;;;###autoload
(defun pcomplete/scp ()
  "Completion rules for the `scp' command.
Includes files as well as host names followed by a colon."
  (pcomplete-opt "1246BCpqrvcFiloPS")
  (while t (pcomplete-here (append (pcomplete-all-entries)
163 164 165
                                   (mapcar (lambda (host)
                                             (concat host ":"))
                                           (pcmpl-ssh-hosts))))))
166

167 168 169
(provide 'pcmpl-unix)

;; arch-tag: 3f9eb5af-7e0e-449d-b586-381cbbf8fc5c
Gerd Moellmann's avatar
Gerd Moellmann committed
170
;;; pcmpl-unix.el ends here