Commit | Line | Data |
---|---|---|
60370d40 | 1 | ;;; pcmpl-linux.el --- functions for dealing with GNU/Linux completions |
4fa9f636 | 2 | |
acaf905b | 3 | ;; Copyright (C) 1999-2012 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 | ||
34 | (defgroup pcmpl-linux nil | |
35 | "Functions for dealing with GNU/Linux completions." | |
36 | :group 'pcomplete) | |
37 | ||
38 | ;; Functions: | |
39 | ||
40 | ;;;###autoload | |
41 | (defun pcomplete/kill () | |
42 | "Completion for GNU/Linux `kill', using /proc filesystem." | |
43 | (if (pcomplete-match "^-\\(.*\\)" 0) | |
44 | (pcomplete-here | |
45 | (pcomplete-uniqify-list | |
46 | (split-string | |
47 | (pcomplete-process-result "kill" "-l"))) | |
48 | (pcomplete-match-string 1 0))) | |
49 | (while (pcomplete-here | |
50 | (if (file-directory-p "/proc") | |
48c23a25 | 51 | (directory-files "/proc" nil "\\`[0-9]+\\'")) |
4fa9f636 GM |
52 | nil 'identity))) |
53 | ||
54 | ;;;###autoload | |
55 | (defun pcomplete/umount () | |
56 | "Completion for GNU/Linux `umount'." | |
57 | (pcomplete-opt "hVafrnvt(pcmpl-linux-fs-types)") | |
58 | (while (pcomplete-here (pcmpl-linux-mounted-directories) | |
59 | nil 'identity))) | |
60 | ||
61 | ;;;###autoload | |
62 | (defun pcomplete/mount () | |
63 | "Completion for GNU/Linux `mount'." | |
64 | (pcomplete-opt "hVanfFrsvwt(pcmpl-linux-fs-types)o?L?U?") | |
65 | (while (pcomplete-here (pcomplete-entries) nil 'identity))) | |
66 | ||
67 | (defun pcmpl-linux-fs-types () | |
68 | "Return a list of available fs modules on GNU/Linux systems." | |
69 | (let ((kernel-ver (pcomplete-process-result "uname" "-r"))) | |
48c23a25 SM |
70 | (directory-files |
71 | (concat "/lib/modules/" kernel-ver "/kernel/fs/")))) | |
4fa9f636 GM |
72 | |
73 | (defun pcmpl-linux-mounted-directories () | |
74 | "Return a list of mounted directory names." | |
75 | (let (points) | |
76 | (when (file-readable-p "/etc/mtab") | |
77 | (with-temp-buffer | |
78 | (insert-file-contents-literally "/etc/mtab") | |
79 | (while (not (eobp)) | |
80 | (let* ((line (buffer-substring (point) (line-end-position))) | |
81 | (args (split-string line " "))) | |
82 | (setq points (cons (nth 1 args) points))) | |
83 | (forward-line))) | |
84 | (pcomplete-uniqify-list points)))) | |
85 | ||
8fa39615 SM |
86 | (defun pcomplete-pare-list (l r) |
87 | "Destructively remove from list L all elements matching any in list R. | |
88 | Test is done using `equal'." | |
89 | (while (and l (and r (member (car l) r))) | |
90 | (setq l (cdr l))) | |
91 | (let ((m l)) | |
92 | (while m | |
93 | (while (and (cdr m) | |
94 | (and r (member (cadr m) r))) | |
95 | (setcdr m (cddr m))) | |
96 | (setq m (cdr m)))) | |
97 | l) | |
98 | ||
4fa9f636 GM |
99 | (defun pcmpl-linux-mountable-directories () |
100 | "Return a list of mountable directory names." | |
101 | (let (points) | |
102 | (when (file-readable-p "/etc/fstab") | |
103 | (with-temp-buffer | |
104 | (insert-file-contents-literally "/etc/fstab") | |
105 | (while (not (eobp)) | |
106 | (let* ((line (buffer-substring (point) (line-end-position))) | |
107 | (args (split-string line "\\s-+"))) | |
108 | (setq points (cons (nth 1 args) points))) | |
109 | (forward-line))) | |
110 | (pcomplete-pare-list | |
111 | (pcomplete-uniqify-list points) | |
112 | (cons "swap" (pcmpl-linux-mounted-directories)))))) | |
113 | ||
114 | ;;; pcmpl-linux.el ends here |