Commit | Line | Data |
---|---|---|
60370d40 | 1 | ;;; pcmpl-linux.el --- functions for dealing with GNU/Linux completions |
4fa9f636 | 2 | |
ba318903 | 3 | ;; Copyright (C) 1999-2014 Free Software Foundation, Inc. |
4fa9f636 | 4 | |
bd78fa1d CY |
5 | ;; Package: pcomplete |
6 | ||
4fa9f636 GM |
7 | ;; This file is part of GNU Emacs. |
8 | ||
eb3fa2cf | 9 | ;; GNU Emacs is free software: you can redistribute it and/or modify |
4fa9f636 | 10 | ;; it under the terms of the GNU General Public License as published by |
eb3fa2cf GM |
11 | ;; the Free Software Foundation, either version 3 of the License, or |
12 | ;; (at your option) any later version. | |
4fa9f636 GM |
13 | |
14 | ;; GNU Emacs is distributed in the hope that it will be useful, | |
15 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | ;; GNU General Public License for more details. | |
18 | ||
19 | ;; You should have received a copy of the GNU General Public License | |
eb3fa2cf | 20 | ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
4fa9f636 GM |
21 | |
22 | ;;; Commentary: | |
23 | ||
24 | ;; These functions are for use with GNU/Linux. Since they depend on a | |
25 | ;; certain knowledge of the layout of such systems, they probably | |
26 | ;; won't work very well on other operating systems. | |
27 | ||
28 | ;;; Code: | |
29 | ||
30 | (provide 'pcmpl-linux) | |
31 | ||
32 | (require 'pcomplete) | |
33 | ||
ed8be7ff GM |
34 | ;; Unused. |
35 | ;;; (defgroup pcmpl-linux nil | |
36 | ;;; "Functions for dealing with GNU/Linux completions." | |
37 | ;;; :group 'pcomplete) | |
4fa9f636 GM |
38 | |
39 | ;; Functions: | |
40 | ||
41 | ;;;###autoload | |
42 | (defun pcomplete/kill () | |
43 | "Completion for GNU/Linux `kill', using /proc filesystem." | |
44 | (if (pcomplete-match "^-\\(.*\\)" 0) | |
45 | (pcomplete-here | |
46 | (pcomplete-uniqify-list | |
47 | (split-string | |
48 | (pcomplete-process-result "kill" "-l"))) | |
49 | (pcomplete-match-string 1 0))) | |
50 | (while (pcomplete-here | |
51 | (if (file-directory-p "/proc") | |
48c23a25 | 52 | (directory-files "/proc" nil "\\`[0-9]+\\'")) |
4fa9f636 GM |
53 | nil 'identity))) |
54 | ||
55 | ;;;###autoload | |
56 | (defun pcomplete/umount () | |
57 | "Completion for GNU/Linux `umount'." | |
58 | (pcomplete-opt "hVafrnvt(pcmpl-linux-fs-types)") | |
59 | (while (pcomplete-here (pcmpl-linux-mounted-directories) | |
60 | nil 'identity))) | |
61 | ||
62 | ;;;###autoload | |
63 | (defun pcomplete/mount () | |
64 | "Completion for GNU/Linux `mount'." | |
65 | (pcomplete-opt "hVanfFrsvwt(pcmpl-linux-fs-types)o?L?U?") | |
66 | (while (pcomplete-here (pcomplete-entries) nil 'identity))) | |
67 | ||
68 | (defun pcmpl-linux-fs-types () | |
69 | "Return a list of available fs modules on GNU/Linux systems." | |
70 | (let ((kernel-ver (pcomplete-process-result "uname" "-r"))) | |
48c23a25 SM |
71 | (directory-files |
72 | (concat "/lib/modules/" kernel-ver "/kernel/fs/")))) | |
4fa9f636 GM |
73 | |
74 | (defun pcmpl-linux-mounted-directories () | |
75 | "Return a list of mounted directory names." | |
76 | (let (points) | |
77 | (when (file-readable-p "/etc/mtab") | |
78 | (with-temp-buffer | |
79 | (insert-file-contents-literally "/etc/mtab") | |
80 | (while (not (eobp)) | |
81 | (let* ((line (buffer-substring (point) (line-end-position))) | |
82 | (args (split-string line " "))) | |
83 | (setq points (cons (nth 1 args) points))) | |
84 | (forward-line))) | |
85 | (pcomplete-uniqify-list points)))) | |
86 | ||
8fa39615 SM |
87 | (defun pcomplete-pare-list (l r) |
88 | "Destructively remove from list L all elements matching any in list R. | |
89 | Test is done using `equal'." | |
90 | (while (and l (and r (member (car l) r))) | |
91 | (setq l (cdr l))) | |
92 | (let ((m l)) | |
93 | (while m | |
94 | (while (and (cdr m) | |
95 | (and r (member (cadr m) r))) | |
96 | (setcdr m (cddr m))) | |
97 | (setq m (cdr m)))) | |
98 | l) | |
99 | ||
4fa9f636 GM |
100 | (defun pcmpl-linux-mountable-directories () |
101 | "Return a list of mountable directory names." | |
102 | (let (points) | |
103 | (when (file-readable-p "/etc/fstab") | |
104 | (with-temp-buffer | |
105 | (insert-file-contents-literally "/etc/fstab") | |
106 | (while (not (eobp)) | |
107 | (let* ((line (buffer-substring (point) (line-end-position))) | |
108 | (args (split-string line "\\s-+"))) | |
109 | (setq points (cons (nth 1 args) points))) | |
110 | (forward-line))) | |
111 | (pcomplete-pare-list | |
112 | (pcomplete-uniqify-list points) | |
113 | (cons "swap" (pcmpl-linux-mounted-directories)))))) | |
114 | ||
115 | ;;; pcmpl-linux.el ends here |