Mercurial > hg > xemacs-beta
comparison lisp/modes/view-process-mode.el @ 165:5a88923fcbfe r20-3b9
Import from CVS: tag r20-3b9
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:44:42 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
164:4e0740e5aab2 | 165:5a88923fcbfe |
---|---|
1 ;;; view-process-mode.el --- Display current running processes | |
2 | |
3 ;; Copyright (C) 1994, 1995, 1996 Heiko Muenkel | |
4 | |
5 ;; Author: Heiko Muenkel <muenkel@tnt.uni-hannover.de> | |
6 ;; Keywords: processes | |
7 | |
8 ;; This file is part of XEmacs. | |
9 | |
10 ;; XEmacs is free software; you can redistribute it and/or modify it | |
11 ;; under the terms of the GNU General Public License as published by | |
12 ;; the Free Software Foundation; either version 2, or (at your | |
13 ;; option) any later version. | |
14 | |
15 ;; XEmacs is distributed in the hope that it will be useful, but | |
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
18 ;; General Public License for more details. | |
19 | |
20 ;; You should have received a copy of the GNU General Public License | |
21 ;; along with XEmacs; See the file COPYING. if not, write to the Free | |
22 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
23 ;; 02111-1307, USA. | |
24 | |
25 ;;; Synched up with: Emacs 20.1 | |
26 | |
27 ;;; Commentary: | |
28 | |
29 ;; DollarId: view-process-mode.el,v 1.113 1996/08/17 15:12:01 muenkel Exp $ | |
30 ;; This file defines the the view-process-mode, a mode for displaying | |
31 ;; the current processes with ps on UNIX systems. There are also | |
32 ;; commands to sort and filter the output and to send signals to the | |
33 ;; processes. | |
34 | |
35 ;; You can display the processes with the command `view-processes'. | |
36 ;; If you are familar with the UNIX ps command and its switches, | |
37 ;; then you can also use the command `View-process-status' or | |
38 ;; it's short cut `ps', which are asking for the command | |
39 ;; switches. You can also run the commands on a remote system | |
40 ;; via rsh. For that you must give a prefix arg to the | |
41 ;; commands. This leads to a question for the remote host name. | |
42 | |
43 ;; You need also the files: adapt.el | |
44 ;; view-process-system-specific.el | |
45 ;; view-process-xemacs.el | |
46 ;; view-process-emacs-19.el | |
47 ;; | |
48 ;; Installation: | |
49 ;; | |
50 ;; Put this file and the file adapt.el | |
51 ;; in one of your your load-path directories and | |
52 ;; the following line in your ~/.emacs (without leading ;;;): | |
53 ;; (autoload 'ps "view-process-mode" | |
54 ;; "Prints a list with processes in the buffer `View-process-buffer-name'. | |
55 ;; COMMAND-SWITCHES is a string with the command switches (ie: -aux). | |
56 ;; IF the optional argument REMOTE-HOST is given, then the command will | |
57 ;; be executed on the REMOTE-HOST. If an prefix arg is given, then the | |
58 ;; function asks for the name of the remote host." | |
59 ;; t) | |
60 ;; | |
61 ;; In the FSF Emacs 19 you should (but must not) put the following | |
62 ;; line in your ~/.emacs: | |
63 ;;; (transient-mark-mode nil) | |
64 | |
65 ;;; Code: | |
66 | |
67 (provide 'view-process-mode) | |
68 (require 'view-process-system-specific) | |
69 | |
70 (defconst View-process-package-version "2.4") | |
71 | |
72 (defconst View-process-package-name "hm--view-process") | |
73 | |
74 (defconst View-process-package-maintainer "muenkel@tnt.uni-hannover.de") | |
75 | |
76 (defun View-process-xemacs-p () | |
77 "Returns non nil if the editor is the XEmacs or lemacs." | |
78 (or (string-match "Lucid" emacs-version) | |
79 (string-match "XEmacs" emacs-version))) | |
80 | |
81 (defun View-process-lemacs-p () | |
82 "Returns non nil if the editor is the lemacs." | |
83 (string-match "Lucid" emacs-version)) | |
84 | |
85 (if (not (View-process-xemacs-p)) | |
86 (require 'view-process-adapt) | |
87 ) | |
88 | |
89 (defvar View-process-status-command "ps" | |
90 "*Command which reports process status (ps). | |
91 The variable is buffer local.") | |
92 | |
93 (make-variable-buffer-local 'View-process-status-command) | |
94 | |
95 (defvar View-process-status-command-switches-bsd "-auxw" | |
96 "*Switches for the command `view-processes' on BSD systems. | |
97 Switches which suppresses the header line are not allowed here.") | |
98 | |
99 (defvar View-process-status-command-switches-system-v "-edaf" | |
100 "*Switches for the command `view-processes' on System V systems. | |
101 Switches which suppresses the header line are not allowed here.") | |
102 | |
103 (defvar View-process-status-last-command-switches nil | |
104 "Switches of the last `View-process-status-command'. | |
105 The variable is buffer local.") | |
106 | |
107 (make-variable-buffer-local 'View-process-status-last-command-switches) | |
108 | |
109 (defvar View-process-signal-command "kill" | |
110 "*Command which sends a signal to a process (kill). | |
111 The variable is buffer local.") | |
112 | |
113 (make-variable-buffer-local 'View-process-signal-command) | |
114 | |
115 (defvar View-process-renice-command "renice" | |
116 "*Command which alter priority of running processes.") | |
117 | |
118 (make-variable-buffer-local 'View-process-renice-command) | |
119 | |
120 (defvar View-process-default-nice-value "4" | |
121 "*Default nice value for altering the priority of running processes.") | |
122 | |
123 (defvar View-process-rsh-command "rsh" | |
124 "*Remote shell command (rsh). | |
125 The variable is buffer local.") | |
126 | |
127 (make-variable-buffer-local 'View-process-rsh-command) | |
128 | |
129 (defvar View-process-uname-command "uname" | |
130 "*The uname command (It returns the system name). | |
131 The variable is buffer local.") | |
132 | |
133 (make-variable-buffer-local 'View-process-uname-command) | |
134 | |
135 (defvar View-process-uname-switches "-sr" | |
136 "*Switches for uname, so that it returns the sysname and the release.") | |
137 | |
138 (defvar View-process-test-command "test" | |
139 "*The test command.") | |
140 | |
141 (make-variable-buffer-local 'View-process-test-command) | |
142 | |
143 (defvar View-process-test-switches "-x" | |
144 "*Switches for test, to test if an executable exists.") | |
145 | |
146 (defvar View-process-uptime-command "uptime" | |
147 "*The uptime command. | |
148 No idea at the moment, if this exists on all systems. | |
149 It should return some informations over the system.") | |
150 | |
151 (make-variable-buffer-local 'View-process-uptime-command) | |
152 | |
153 (defvar View-process-buffer-name "*ps*" | |
154 "Name of the output buffer for the 'View-process-mode'. | |
155 The variable is buffer local.") | |
156 | |
157 (make-variable-buffer-local 'View-process-buffer-name) | |
158 | |
159 (defvar View-process-mode-hook nil | |
160 "*This hook is run after reading in the processes.") | |
161 | |
162 (defvar View-process-motion-help t | |
163 "*If non nil, then help messages are displayed during mouse motion. | |
164 The variable is buffer local.") | |
165 | |
166 (make-variable-buffer-local 'View-process-motion-help) | |
167 | |
168 (defvar View-process-display-with-2-windows t | |
169 "*Determines the display type of the `View-process-mode'. | |
170 If it is non nil, then 2 windows are used instead of one window. | |
171 In the second window are the header lines displayed.") | |
172 | |
173 (defvar View-process-hide-header t | |
174 "*The header lines in the view processes buffer are hide, if this is t.") | |
175 | |
176 (make-variable-buffer-local 'View-process-hide-header) | |
177 | |
178 (defvar View-process-truncate-lines t | |
179 "*Truncates the liens in the view process buffer if t.") | |
180 | |
181 (make-variable-buffer-local 'View-process-truncate-lines) | |
182 | |
183 (defvar View-process-display-short-key-descriptions t | |
184 "*Controls, whether short key descriptions are displayed or not.") | |
185 | |
186 (defvar View-process-display-uptime t | |
187 "*Controls, whether the uptime is displayed or not.") | |
188 | |
189 (defvar View-process-use-font-lock t | |
190 "*Determines, if the `font-lock-mode' should be used or not.") | |
191 | |
192 (defvar View-process-ps-header-window-offset 2 | |
193 "Offset for the size of the ps header window.") | |
194 | |
195 (defvar View-process-ps-header-window-size 0 | |
196 "Internal variable. The size of the window with the *ps header* buffer.") | |
197 | |
198 (make-variable-buffer-local 'View-process-ps-header-window-size) | |
199 | |
200 (defvar View-process-stop-motion-help nil | |
201 "Internal variable. Stops motion help temporarily.") | |
202 | |
203 (defvar View-process-deleted-lines nil | |
204 "Internal variable. A list with lines, which are deleted by a filter.") | |
205 | |
206 (make-variable-buffer-local 'View-process-deleted-lines) | |
207 | |
208 (defvar View-process-header-buffer-name "*ps header*" | |
209 "Name of the view process header buffer.") | |
210 | |
211 (make-variable-buffer-local 'View-process-header-buffer-name) | |
212 | |
213 (defvar View-process-header-mode-name "psheader" | |
214 "Name of the `view process header mode'.") | |
215 | |
216 (defvar View-process-header-mode-hook nil | |
217 "*This hook is run after building the header buffer.") | |
218 | |
219 (defvar View-process-header-mode-line-off t | |
220 "t means do not display modeline in view-process-header-mode. | |
221 This does only work in the XEmacs 19.12 or higher.") | |
222 | |
223 (defvar View-process-header-line-detection-list '("PID" "COMMAND" "COMD" "CMD") | |
224 "*The header line is detected with the help of this list. | |
225 At least one of these words must be in a header line. Otherwise | |
226 an error is signaled. YOu must only change this list, if your ps | |
227 prodices header lines with strings, that are not in this list.") | |
228 | |
229 (defvar View-process-header-line-background "yellow" | |
230 "*Background color of the header line.") | |
231 | |
232 (defvar View-process-header-line-foreground "blue" | |
233 "*Foreground color of the header line.") | |
234 | |
235 (defvar View-process-header-line-font (face-font 'bold) | |
236 "*Font of the header line") | |
237 | |
238 (defvar View-process-header-line-underline-p t | |
239 "*T, if the header line should be underlined.") | |
240 | |
241 (defvar View-process-no-mark ?_ | |
242 "*A character with specifies, that a line isn't marked.") | |
243 | |
244 (defvar View-process-signaled-line-background nil | |
245 "*Background color of the line with a signaled or reniced process.") | |
246 | |
247 (defvar View-process-signaled-line-foreground "grey80" | |
248 "*Foreground color of the line with a signaled or reniced process.") | |
249 | |
250 (defvar View-process-signaled-line-font (face-font 'italic) | |
251 "*Font of the line with a signaled or reniced process.") | |
252 | |
253 (defvar View-process-signaled-line-underline-p nil | |
254 "*T, if the \"signaled line\" should be underlined.") | |
255 | |
256 (defvar View-process-signaled-line-mark ?s | |
257 "*A character, which is used as a mark for \"signaled lines\".") | |
258 | |
259 (defvar View-process-signal-line-background nil | |
260 "*Background color of the line with the process which should be signaled.") | |
261 | |
262 (defvar View-process-signal-line-foreground "red" | |
263 "*Foreground color of the line with the process which should be signaled.") | |
264 | |
265 (defvar View-process-signal-line-font (face-font 'bold) | |
266 "*Font of the line with the process which should be signaled.") | |
267 | |
268 (defvar View-process-signal-line-underline-p nil | |
269 "*T, if the \"signal line\" should be underlined.") | |
270 | |
271 (defvar View-process-signal-line-mark ?K | |
272 "*A character, which is used as a mark for \"signal lines\".") | |
273 | |
274 (defvar View-process-renice-line-background nil | |
275 "*Background color of the line with the process which should be reniced.") | |
276 | |
277 (defvar View-process-renice-line-foreground "red" | |
278 "*Foreground color of the line with the process which should be reniced.") | |
279 | |
280 (defvar View-process-renice-line-font (face-font 'bold) | |
281 "*Font of the line with the process which should be reniced.") | |
282 | |
283 (defvar View-process-renice-line-underline-p nil | |
284 "*T, if the \"renice line\" should be underlined.") | |
285 | |
286 (defvar View-process-renice-line-mark ?N | |
287 "*A character, which is used as a mark for \"renice lines\".") | |
288 | |
289 (defvar View-process-child-line-background nil | |
290 "*Background color of a line with a child process.") | |
291 | |
292 (defvar View-process-child-line-foreground "darkviolet" | |
293 "*Foreground color of a line with a child process.") | |
294 | |
295 (defvar View-process-child-line-font (face-font 'italic) | |
296 "*Font color of a line with a child process.") | |
297 | |
298 (defvar View-process-child-line-underline-p nil | |
299 "*T, if the \"line with a child process\" should be underlined.") | |
300 | |
301 (defvar View-process-child-line-mark ?C | |
302 "*A character, which is used as a mark for child processes.") | |
303 | |
304 (defvar View-process-parent-line-background "LightBlue" | |
305 "*Background color of a line with a parent process.") | |
306 | |
307 (defvar View-process-parent-line-foreground "darkviolet" | |
308 "*Foreground color of a line with a parent process.") | |
309 | |
310 (defvar View-process-parent-line-font (face-font 'bold) | |
311 "*Font color of a line with a parent process.") | |
312 | |
313 (defvar View-process-parent-line-underline-p t | |
314 "*T, if the \"line with a parent\" should be underlined.") | |
315 | |
316 (defvar View-process-parent-line-mark ?P | |
317 "*A character, which is used as a mark for parent processes.") | |
318 | |
319 (defvar View-process-single-line-background nil | |
320 "*Background color of a line with a single line mark.") | |
321 | |
322 (defvar View-process-single-line-foreground "darkblue" | |
323 "*Foreground color of a line with a single line mark.") | |
324 | |
325 (defvar View-process-single-line-font (face-font 'bold) | |
326 "*Font color of a line with a single line mark.") | |
327 | |
328 (defvar View-process-single-line-underline-p t | |
329 "*T, if the \"line with a single line mark\" should be underlined.") | |
330 | |
331 (defvar View-process-single-line-mark ?* | |
332 "*A character, which is used as a single line mark.") | |
333 | |
334 (defvar View-process-font-lock-keywords | |
335 (list | |
336 (cons (concat "^" | |
337 (char-to-string View-process-child-line-mark) | |
338 " .*") | |
339 'View-process-child-line-face) | |
340 (cons (concat "^" | |
341 (char-to-string View-process-parent-line-mark) | |
342 " .*") | |
343 'View-process-parent-line-face) | |
344 (cons (concat "^\\" | |
345 (char-to-string View-process-single-line-mark) | |
346 " .*") | |
347 'View-process-single-line-face) | |
348 (cons (concat "^" | |
349 (char-to-string View-process-signaled-line-mark) | |
350 " .*") | |
351 'View-process-signaled-line-face) | |
352 (cons (concat "^" | |
353 (char-to-string View-process-signal-line-mark) | |
354 " .*") | |
355 'View-process-signal-line-face) | |
356 (cons (concat "^" | |
357 (char-to-string View-process-renice-line-mark) | |
358 " .*") | |
359 'View-process-renice-line-face) | |
360 ) | |
361 "The font lock keywords for the `View-process-mode'." | |
362 ) | |
363 | |
364 (defvar View-process-pid-mark-alist nil | |
365 "Internal variable. An alist with marks and pids.") | |
366 | |
367 (make-variable-buffer-local 'View-process-pid-mark-alist) | |
368 | |
369 (defvar View-process-last-pid-mark-alist nil | |
370 "Internal variable. An alist withthe last marks and pids.") | |
371 | |
372 (make-variable-buffer-local 'View-process-last-pid-mark-alist) | |
373 | |
374 (defvar View-process-sorter-and-filter nil | |
375 "*A list, which specifies sorter and filter commands. | |
376 These commands will be run over the ps output, every time after | |
377 ps has create a new output. | |
378 The list consists of sublists, whereby every sublist specifies a | |
379 command. The first element of each list is a keyword, which | |
380 determines a command. | |
381 The following keywords are allowed: | |
382 sort - Sort the output by an output field | |
383 filter - Filter the output by an output field, delete non matching l. | |
384 exclude-filter - Filter the output by an output field, delete matching lines | |
385 grep - Filter the output by the whole line, delete non matching l. | |
386 exclude-grep - Filter the output by the whole line, delete matching lines | |
387 reverse - Reverse the order of the output lines. | |
388 | |
389 The cdr of each sublist depends on the keyword. The following shows | |
390 the syntax of the different sublist types: | |
391 (sort <fieldname>) | |
392 (filter <fieldname> <regexp>) | |
393 (exclude-filter <fieldname> <regexp>) | |
394 (grep <regexp>) | |
395 (exclude-grep <regexp>) | |
396 (reverse) | |
397 | |
398 Where <fieldname> is a string with determines the name of an output field | |
399 and <regexp> is a string with an regular expression. The output field names | |
400 are derived from the header line of the ps output.") | |
401 | |
402 (defvar View-process-actual-sorter-and-filter nil | |
403 "Internal variable. It holds the actual sorter and filter commands. | |
404 Don't change it!") | |
405 | |
406 (make-variable-buffer-local 'View-process-actual-sorter-and-filter) | |
407 | |
408 (defvar View-process-itimer-value 5 | |
409 "*Value of the view process itimer.") | |
410 | |
411 (defvar View-process-system-type nil | |
412 "Internal variable. Type of the system, on which the ps command is called. | |
413 The variable is buffer local.") | |
414 | |
415 (make-variable-buffer-local 'View-process-system-type) | |
416 | |
417 (defvar View-process-remote-host nil | |
418 "Internal variable. Name of the remote host or nil. | |
419 The variable is buffer local.") | |
420 | |
421 (make-variable-buffer-local 'View-process-remote-host) | |
422 | |
423 (defvar View-process-header-start nil | |
424 "Internal variable. Start of the ps output header line. | |
425 The variable is buffer local.") | |
426 | |
427 (make-variable-buffer-local 'View-process-header-start) | |
428 | |
429 (defvar View-process-header-end nil | |
430 "Internal variable. End of the ps output header line. | |
431 The variable is buffer local.") | |
432 | |
433 (make-variable-buffer-local 'View-process-header-end) | |
434 | |
435 (defvar View-process-output-start nil | |
436 "Internal variable. Start of the ps output (after the header). | |
437 The variable is buffer local.") | |
438 | |
439 (make-variable-buffer-local 'View-process-output-start) | |
440 | |
441 (defvar View-process-output-end nil | |
442 "Internal variable. End of the ps output (after the header). | |
443 The variable is buffer local.") | |
444 | |
445 (make-variable-buffer-local 'View-process-output-end) | |
446 | |
447 (defvar View-process-old-window-configuration nil | |
448 "Internal variable. Window configuration before the first ps command.") | |
449 | |
450 (make-variable-buffer-local 'View-process-old-window-configuration) | |
451 | |
452 (defvar View-process-max-fields nil | |
453 "Internal variable. Number of output fields. | |
454 The variable is buffer local.") | |
455 | |
456 (make-variable-buffer-local 'View-process-max-fields) | |
457 | |
458 (defvar View-process-field-names nil | |
459 "Internal variable. An alist with the fieldnames and fieldnumbers. | |
460 The variable is buffer local.") | |
461 | |
462 (make-variable-buffer-local 'View-process-max-fields) | |
463 | |
464 (defvar View-process-field-blanks-already-replaced nil | |
465 "Internal variable. It is t, if blanks in fields are already replaced.") | |
466 | |
467 (make-variable-buffer-local 'View-process-field-blanks-already-replaced) | |
468 | |
469 (defvar View-process-kill-signals nil | |
470 "An alist with the possible signals for the kill command. | |
471 Don't change it by hand! | |
472 The variable is initialised each time after running ps. | |
473 The variable is buffer local.") | |
474 | |
475 (make-variable-buffer-local 'View-process-kill-signals) | |
476 | |
477 (defvar View-process-kill-signals-general | |
478 '(("SIGHUP" "1") ("SIGKILL" "9") ("SIGTERM" "15") | |
479 ("1" "1") ("2" "2") ("3" "3") ("4" "4") ("5" "5") ("6" "6") ("7" "7") | |
480 ("8" "8") ("9" "9") ("10" "10") ("11" "11") ("12" "12") ("13" "13") | |
481 ("14" "14") ("15" "15") ("16" "16") ("17" "17") ("18" "18") | |
482 ("19" "19") ("20" "20") ("21" "21") ("22" "22") ("23" "23") | |
483 ("24" "24") ("25" "25") ("26" "26") ("27" "27") ("28" "28") | |
484 ("29" "29") ("30" "30") ("31" "31")) | |
485 "An alist with the possible signals for the kill command. | |
486 This list is used, if no system specific list is defined. | |
487 It may be that you've other signals on your system. Try to test | |
488 it with \"kill -l\" in a shell.") | |
489 | |
490 (defvar View-process-default-kill-signal "SIGTERM" | |
491 "*Default signal for the function `View-process-send-signal-to-process'. | |
492 The string must be also in the alist `View-process-kill-signals'!") | |
493 | |
494 (defvar View-process-pid-field-name "PID" | |
495 "*The name of the field with the PID's. | |
496 The name must be the same as in the first outputline of the | |
497 command `View-process-status-command' (ps). | |
498 The variable is buffer local.") | |
499 | |
500 (make-variable-buffer-local 'View-process-pid-field-name) | |
501 | |
502 (defvar View-process-ppid-field-name "PPID" | |
503 "*The name of the field with the PPID's. | |
504 The name must be the same as in the first outputline of the | |
505 command `View-process-status-command' (ps). | |
506 The variable is buffer local.") | |
507 | |
508 (make-variable-buffer-local 'View-process-ppid-field-name) | |
509 | |
510 (defvar View-process-host-names-and-system-types nil | |
511 "A list with the names and the system types of hosts. | |
512 Each entry of the list looks like the following: | |
513 (<hostname> (<system-type> <version-number> <bsd-or-system-v> | |
514 <field-name-descriptions> | |
515 <kill-signals>)) | |
516 Here are some examples: | |
517 (\"daedalus\" (\"sunos\" \"4\" \"bsd\" | |
518 View-process-field-name-descriptions-sunos4 | |
519 View-process-kill-signals-sunos4)) | |
520 (\"bach\" (\"linux\" nil \"bsd\" | |
521 nil | |
522 View-process-kill-signals-linux | |
523 )) | |
524 (\"cesar\" (nil nil \"bsd\")) | |
525 The list will be anhanced by the program, each time you run ps on | |
526 a new system. But you can also set this variable by hand in your | |
527 .emacs. If the host name is found in this list, then the system | |
528 type will not be checked again." | |
529 ) | |
530 | |
531 (defvar View-process-status-history nil | |
532 "A list with the command switch history of the status command (ps).") | |
533 | |
534 (defvar View-process-remote-host-history nil | |
535 "A list with the remote host history.") | |
536 | |
537 (defvar View-process-field-name-history nil | |
538 "A list with the field name history.") | |
539 | |
540 (defvar View-process-filter-history nil | |
541 "A list with the filter history.") | |
542 | |
543 (defvar View-process-signal-history nil | |
544 "A list with the signal history.") | |
545 | |
546 (defvar View-process-field-name-descriptions nil | |
547 "Help list with the descriptions of ps fields. | |
548 Don't change it by hand! | |
549 The variable is initialised each time after running ps. | |
550 The variable is buffer local.") | |
551 | |
552 (make-variable-buffer-local 'View-process-field-name-descriptions) | |
553 | |
554 (defvar View-process-field-name-descriptions-general | |
555 '( | |
556 ("m" "Mark column of the View Processes Mode.") ; not a real field name | |
557 ("ADDR" "The memory address of the process. ") | |
558 ("%CPU" "CPU usage in percentage.") | |
559 ("%MEM" "Real Memory usage in percentage.") | |
560 ("COMMAND" "Command Name.") | |
561 ("F" ("Status= " | |
562 ("0" "0=not in main memory.") | |
563 ("1" "1=in main memory.") | |
564 ("2" "2=system process.") | |
565 ("4" "4=blocked in the main memory.") | |
566 ("10" "10=swapped out.") | |
567 ("20" "20=controlled by another one."))) | |
568 ("NI" "UNIX nice value, a positive value means less CPU time.") | |
569 ("PAGEIN" "Number of major page faults.") | |
570 ("PGID" "Process group id. ") | |
571 ("PID" "The process id.") | |
572 ("PPID" "The process id of the parent process.") | |
573 ("PRI" "Priority, a big value is a small priority.") | |
574 ("RSS" "Real (resident set) size, KBytes of program in memory.") | |
575 ("SHARE" "Shared memory") | |
576 ("SID" "ID of the session to which the process belongs. ") | |
577 ("SIZE" "Virtual image size, size of text+data+stack (in KByte ?).") | |
578 ("START" "Start time.") | |
579 ("STAT" ("Status. " | |
580 ("R" "R=runnable. ") | |
581 ("S" "S=sleeping. ") | |
582 ("D" "D=un-interruptible sleep (eg disk or NFS I/O). ") | |
583 ("T" "T=stopped or traced. ") | |
584 ("Z" "Z=zombie (terminated). ") | |
585 ("W" "W=waiting on an event. ") | |
586 ("I" "I=intermediate status. ") | |
587 ("N" "N=started with nice. ") | |
588 )) | |
589 ("SWAP" "Kilobytes (with -p pages) on swap device.") | |
590 ("TIME" "Elapsed process time.") | |
591 ("TPGID" "Process group id of the associated terminal. ") | |
592 ("TRS" "Text resident size.") | |
593 ("TT" ("Dialog station. " ("?" "?=No dialog station"))) | |
594 ("TTY" ("Dialog station. " ("?" "?=No dialog station"))) | |
595 ("UID" "User Id.") | |
596 ("USER" "Owner of the process.") | |
597 ("WCHAN" "Name of the kernel function where the process is sleeping.") | |
598 ) | |
599 "Help list with the descriptions of ps fields. | |
600 This is a general list, which should be true for many systems. | |
601 This list will only be used, if there is no entry in a special | |
602 list for the system.") | |
603 | |
604 (defvar View-process-insert-blank-alist | |
605 '(("SZ" behind-predecessor 0) | |
606 ("SIZE" behind-predecessor 0) | |
607 ("RSS" behind-predecessor 0) | |
608 ("START" behind 1)) | |
609 "Determines places in the output, where a blank should be inserted. | |
610 It is an alist and each sublist has the following structure: | |
611 (field-name position-descriptor offset) | |
612 The field-name is a string with the name of the field. | |
613 The position-descriptor determines a position. It has one of the | |
614 following values: | |
615 `in-front' => insert in front of the field. | |
616 `in-front-successor' => insert in front of the successor of the field. | |
617 `behind' => insert behind of the field. | |
618 `behind-predecessor' => insert behind the predecessor of the field. | |
619 The offset is an integer , which specifies an offset.") | |
620 | |
621 (defvar View-process-mode-syntax-table nil | |
622 "Syntax table for the `View-process-mode'.") | |
623 | |
624 (if (not View-process-mode-syntax-table) | |
625 (let ((i 0)) | |
626 (setq View-process-mode-syntax-table (make-syntax-table)) | |
627 (setq i ?!) | |
628 (while (<= i ?#) | |
629 (modify-syntax-entry i "w" View-process-mode-syntax-table) | |
630 (setq i (1+ i))) | |
631 (modify-syntax-entry ?, "w" View-process-mode-syntax-table) | |
632 (modify-syntax-entry ?. "w" View-process-mode-syntax-table) | |
633 (setq i ?:) | |
634 (while (<= i ?\;) | |
635 (modify-syntax-entry i "w" View-process-mode-syntax-table) | |
636 (setq i (1+ i))) | |
637 (setq i ??) | |
638 (while (<= i ?@) | |
639 (modify-syntax-entry i "w" View-process-mode-syntax-table) | |
640 (setq i (1+ i))) | |
641 (modify-syntax-entry ?\\ "w" View-process-mode-syntax-table) | |
642 (modify-syntax-entry ?^ "w" View-process-mode-syntax-table) | |
643 (modify-syntax-entry ?` "w" View-process-mode-syntax-table) | |
644 (modify-syntax-entry ?' "w" View-process-mode-syntax-table) | |
645 (modify-syntax-entry ?~ "w" View-process-mode-syntax-table) | |
646 (modify-syntax-entry ?Ħ "w" View-process-mode-syntax-table) | |
647 )) | |
648 | |
649 (defvar View-process-digit-bindings-send-signal nil | |
650 "The digits 1 to 9 will be bind to send signal commands, if t.") | |
651 | |
652 (defvar View-process-mode-mark-map nil | |
653 "Local subkeymap for View-process-mode buffers.") | |
654 | |
655 (if View-process-mode-mark-map | |
656 nil | |
657 (setq View-process-mode-mark-map (make-keymap)) | |
658 (define-key View-process-mode-mark-map "m" 'View-process-mark-current-line) | |
659 (define-key View-process-mode-mark-map "u" 'View-process-unmark-current-line) | |
660 (define-key View-process-mode-mark-map "U" 'View-process-unmark-all) | |
661 (define-key View-process-mode-mark-map "c" | |
662 'View-process-mark-childs-in-current-line) | |
663 (define-key View-process-mode-mark-map "l" 'View-process-reset-last-marks) | |
664 ) | |
665 | |
666 (defvar View-process-mode-i-map nil | |
667 "Local subkeymap for View-process-mode buffers.") | |
668 | |
669 (if View-process-mode-i-map | |
670 nil | |
671 (setq View-process-mode-i-map (make-keymap)) | |
672 (define-key View-process-mode-i-map "s" 'View-process-start-itimer) | |
673 (define-key View-process-mode-i-map "d" 'View-process-delete-itimer) | |
674 ) | |
675 | |
676 (defvar View-process-mode-comma-map nil | |
677 "Local subkeymap for View-process-mode buffers.") | |
678 | |
679 (if View-process-mode-comma-map | |
680 nil | |
681 (setq View-process-mode-comma-map (make-keymap)) | |
682 (define-key View-process-mode-comma-map "k" | |
683 'View-process-send-signal-to-processes-with-mark) | |
684 (define-key View-process-mode-comma-map "a" | |
685 'View-process-renice-processes-with-mark)) | |
686 | |
687 (defvar View-process-mode-period-map nil | |
688 "Local subkeymap for View-process-mode buffers.") | |
689 | |
690 (if View-process-mode-period-map | |
691 nil | |
692 (setq View-process-mode-period-map (make-keymap)) | |
693 (define-key View-process-mode-period-map "f" | |
694 'View-process-filter-region-by-current-field) | |
695 (define-key View-process-mode-period-map "l" | |
696 'View-process-filter-region) | |
697 (define-key View-process-mode-period-map "s" | |
698 'View-process-sort-region-by-current-field) | |
699 (define-key View-process-mode-period-map "r" | |
700 'View-process-reverse-region) | |
701 (define-key View-process-mode-period-map "k" | |
702 'View-process-send-signal-to-processes-in-region) | |
703 (define-key View-process-mode-period-map "a" | |
704 'View-process-renice-processes-in-region) | |
705 (define-key View-process-mode-period-map "v" | |
706 'View-process-status)) | |
707 | |
708 | |
709 (defvar View-process-mode-map nil | |
710 "Local keymap for View-process-mode buffers.") | |
711 | |
712 (if View-process-mode-map | |
713 nil | |
714 (setq View-process-mode-map (make-keymap)) | |
715 (define-key View-process-mode-map "q" 'View-process-quit) | |
716 (define-key View-process-mode-map "V" 'View-process-display-version) | |
717 (define-key View-process-mode-map " " 'scroll-up) | |
718 (define-key View-process-mode-map "b" 'scroll-down) | |
719 (define-key View-process-mode-map "t" 'View-process-toggle-truncate-lines) | |
720 (define-key View-process-mode-map "u" 'View-process-status-update) | |
721 (define-key View-process-mode-map "U" | |
722 'View-process-remove-all-filter-and-sorter) | |
723 (define-key View-process-mode-map "g" 'revert-buffer) | |
724 ; (define-key View-process-mode-map "v" 'View-process-status) | |
725 (define-key View-process-mode-map "v" 'view-processes) | |
726 (define-key View-process-mode-map "f" | |
727 'View-process-filter-by-current-field-g) | |
728 (define-key View-process-mode-map "F" | |
729 'View-process-filter-output-by-current-field) | |
730 (define-key View-process-mode-map "l" | |
731 'View-process-filter-g) | |
732 (define-key View-process-mode-map "L" | |
733 'View-process-filter-output) | |
734 (define-key View-process-mode-map "s" | |
735 'View-process-sort-by-current-field-g) | |
736 (define-key View-process-mode-map "S" | |
737 'View-process-sort-output-by-current-field) | |
738 (define-key View-process-mode-map "r" | |
739 'View-process-reverse-g) | |
740 (define-key View-process-mode-map "R" | |
741 'View-process-reverse-output) | |
742 (define-key View-process-mode-map "k" | |
743 'View-process-send-signal-to-processes-g) | |
744 (define-key View-process-mode-map "K" | |
745 'View-process-send-signal-to-process-in-line) | |
746 (define-key View-process-mode-map "a" | |
747 'View-process-renice-processes-g) | |
748 (define-key View-process-mode-map "A" | |
749 'View-process-renice-process-in-line) | |
750 ; (define-key View-process-mode-map "k" | |
751 ; 'View-process-send-signal-to-process) | |
752 (define-key View-process-mode-map "?" | |
753 'View-process-which-field-name) | |
754 (define-key View-process-mode-map "h" | |
755 'View-process-show-field-names) | |
756 (define-key View-process-mode-map "e" | |
757 'View-process-display-emacs-pid) | |
758 (define-key View-process-mode-map "w" 'View-process-show-pid-and-command) | |
759 (define-key View-process-mode-map "n" 'View-process-next-field) | |
760 (define-key View-process-mode-map "p" 'View-process-previous-field) | |
761 (define-key View-process-mode-map "<" 'View-process-output-start) | |
762 (define-key View-process-mode-map ">" 'View-process-output-end) | |
763 (define-key View-process-mode-map [return] | |
764 'View-process-goto-first-field-next-line) | |
765 (define-key View-process-mode-map "M" 'View-process-submit-bug-report) | |
766 (define-key View-process-mode-map "m" View-process-mode-mark-map) | |
767 (define-key View-process-mode-map "." View-process-mode-period-map) | |
768 (define-key View-process-mode-map "," View-process-mode-comma-map) | |
769 (define-key View-process-mode-map "i" View-process-mode-i-map) | |
770 ) | |
771 | |
772 (defvar View-process-pulldown-menu-name "Processes" | |
773 "Name of the pulldown menu in the `View-process-mode'.") | |
774 | |
775 (defvar View-process-pulldown-menu nil | |
776 "Pulldown menu list for the `View-process-mode'.") | |
777 | |
778 (defvar View-process-region-menu nil | |
779 "Menu list for the `View-process-mode', used if a region is active.") | |
780 | |
781 (defvar View-process-marked-menu nil | |
782 "Menu list for the `View-process-mode', used if marked lines exists. | |
783 Not used, if a region is active.") | |
784 | |
785 (defvar View-process-non-region-menu nil | |
786 "Menu list for the `View-process-mode', used if a region is not active.") | |
787 | |
788 (defvar View-process-mode-name "Processes" | |
789 "Name of the `view process mode'.") | |
790 | |
791 (defun View-process-make-field-postition-alist-1 () | |
792 "Internal function of View-process-make-field-postition-alist." | |
793 (if (>= (point) View-process-header-end) | |
794 nil | |
795 (let (start end) | |
796 (skip-chars-forward " ") | |
797 (setq start (current-column)) | |
798 (skip-chars-forward "^ ") | |
799 (setq end (current-column)) | |
800 (cons (list start end) | |
801 (View-process-make-field-postition-alist-1)))) | |
802 ) | |
803 | |
804 (defun View-process-make-field-postition-alist () | |
805 "Returns an alist with the start and end positions of each field. | |
806 The list looks like ((start1 end1) (start2 end2) ...)." | |
807 (save-restriction | |
808 (widen) | |
809 (goto-char View-process-header-start) | |
810 (View-process-make-field-postition-alist-1))) | |
811 | |
812 (defun View-process-overwrite-chars-in-region (begin end char) | |
813 "Overwrite region between BEGIN and END with CHAR." | |
814 (let ((region-begin (if (< begin end) begin end)) | |
815 (region-end (if (> end begin) end begin))) | |
816 (save-excursion | |
817 (goto-char region-begin) | |
818 (while (> region-end (point)) | |
819 (delete-char 1) | |
820 (View-process-insert-and-inherit char))))) | |
821 | |
822 (defun View-process-replaces-blanks-in-the-fields-of-this-line | |
823 (field-position-alist) | |
824 "Replaces the blanks in the fields of this line with underscores. | |
825 FIELD-POSITION-ALIST is an alist with the name and the | |
826 aproximated start and end positions of each field." | |
827 (if (cdr field-position-alist) ; don't change the last field | |
828 (let ((field-start (+ (View-process-return-beginning-of-line) | |
829 (car (car field-position-alist)))) | |
830 (field-end (+ (View-process-return-beginning-of-line) | |
831 (car (cdr (car field-position-alist))))) | |
832 (next-field-start (+ (View-process-return-beginning-of-line) | |
833 (car (car | |
834 (cdr field-position-alist)))))) | |
835 (goto-char field-start) | |
836 (skip-chars-forward " ") | |
837 (if (> (point) field-end) | |
838 (progn (goto-char field-start) | |
839 (delete-char 1) | |
840 (View-process-insert-and-inherit "_")) | |
841 (let ((search-result (search-forward-regexp "[ ]+" field-end t)) | |
842 (match-beginning nil)) | |
843 (if search-result | |
844 (if (not (= search-result field-end)) | |
845 (View-process-overwrite-chars-in-region (match-beginning 0) | |
846 (match-end 0) | |
847 ?_) | |
848 (setq match-beginning (match-beginning 0)) | |
849 (if (and (search-forward-regexp "[^ ]+" next-field-start t) | |
850 (not (eq (point) next-field-start))) | |
851 (View-process-overwrite-chars-in-region | |
852 match-beginning | |
853 (match-beginning 0) | |
854 ?_)))) | |
855 )) | |
856 (View-process-replaces-blanks-in-the-fields-of-this-line | |
857 (cdr field-position-alist))))) | |
858 | |
859 (defun View-process-replaces-blanks-in-fields () | |
860 "Replaces the blanks in fields with underscrores." | |
861 (save-excursion | |
862 (save-window-excursion | |
863 (let ((field-position-alist (View-process-make-field-postition-alist)) | |
864 (read-only buffer-read-only)) | |
865 (setq buffer-read-only nil) | |
866 (goto-char View-process-output-start) | |
867 (while (< (point) View-process-output-end) | |
868 (beginning-of-line) | |
869 (View-process-replaces-blanks-in-the-fields-of-this-line | |
870 field-position-alist) | |
871 (forward-line)) | |
872 (setq buffer-read-only read-only))))) | |
873 | |
874 (defun View-process-replaces-blanks-in-fields-if-necessary () | |
875 "Replaces blanks in fields, if necessary. | |
876 For that it checks `View-process-field-blanks-already-replaced'." | |
877 (if View-process-field-blanks-already-replaced | |
878 nil | |
879 (View-process-replaces-blanks-in-fields) | |
880 (setq View-process-field-blanks-already-replaced t))) | |
881 | |
882 (defun View-process-insert-column-in-region (char | |
883 column | |
884 begin | |
885 end | |
886 &optional overwrite | |
887 not-looking-at) | |
888 "Inserts the CHAR at the COLUMN in the region from BEGIN TO END. | |
889 The first line must have sufficient columns. No tabs are allowed. | |
890 If the optional argument OVERWRITE is non nil, then the CHAR | |
891 overwrites the char in the COLUMN. | |
892 The optional argument NOT-LOOKING-AT is nil or a regular expression. | |
893 In the second case the insertation will only be done, if NOT-LOOKING-AT | |
894 isn't a string starting at the column." | |
895 (save-excursion | |
896 (let ((no-of-lines (count-lines begin end)) | |
897 (line 1)) | |
898 (goto-char begin) | |
899 (beginning-of-line) | |
900 (while (<= line no-of-lines) | |
901 (forward-char column) | |
902 (if (not (= (current-column) column)) | |
903 (View-process-insert-and-inherit | |
904 (make-string (- column (current-column)) ? ))) | |
905 (if overwrite | |
906 (progn | |
907 (delete-char -1) | |
908 (View-process-insert-and-inherit char)) | |
909 (if (or (not not-looking-at) | |
910 (not (looking-at not-looking-at))) | |
911 (progn | |
912 (View-process-insert-and-inherit char) | |
913 (forward-char -1) | |
914 ))) | |
915 (forward-line 1) | |
916 (setq line (1+ line)))))) | |
917 | |
918 (defun View-process-insert-blank-in-column (column | |
919 &optional overwrite | |
920 not-looking-at) | |
921 "Inserts a blank in all lines of the ps output in column COLUMN. | |
922 If OVERWRITE is non nil, then it overwrites the old column char. | |
923 The optional argument NOT-LOOKING-AT is nil or a regular expression. | |
924 In the second case the insertation will only be done, if NOT-LOOKING-AT | |
925 isn't a string starting at the column." | |
926 (let ((read-only buffer-read-only)) | |
927 (setq buffer-read-only nil) | |
928 (View-process-insert-column-in-region ? | |
929 column | |
930 View-process-header-start | |
931 View-process-output-end | |
932 overwrite | |
933 not-looking-at) | |
934 (setq View-process-output-end (point-max)) | |
935 (setq buffer-read-only read-only))) | |
936 | |
937 ;(defun View-process-insert-blanks-at-line-start () | |
938 ; "Inserts some blanks at the beginning of each output line. | |
939 ;This space is used for the marks." | |
940 ; (save-excursion | |
941 ; (goto-char View-process-header-start) | |
942 ; (insert "m ") | |
943 ; (forward-line) | |
944 ; (while (< (point) View-process-output-end) | |
945 ; (insert "_ ") | |
946 ; (forward-line)))) | |
947 | |
948 (defun View-process-insert-blanks-at-line-start () | |
949 "Inserts some blanks at the beginning of each output line. | |
950 This space is used for the marks." | |
951 (save-excursion | |
952 (goto-char View-process-output-end) | |
953 (forward-line -1) | |
954 (while (> (point) View-process-header-start) | |
955 (insert "_ ") | |
956 (forward-line -1)) | |
957 (insert "m "))) | |
958 | |
959 (defun View-process-return-position (field-name position-descriptor) | |
960 "Returns a position deppending on the FIELD-NAME and the POSITION-DESCRIPTOR. | |
961 The POSITION-DESCRIPTOR must be one of the 4 values: `in-front', | |
962 `in-front-successor', `behind' and `behind-predecessor'. | |
963 If the FIELD-NAME isn't in the header-line, then it return nil." | |
964 (save-excursion | |
965 (goto-char View-process-header-start) | |
966 (beginning-of-line) | |
967 (if (search-forward field-name (View-process-return-end-of-line) t) | |
968 (cond ((eq position-descriptor 'behind-predecessor) | |
969 (goto-char (match-beginning 0)) | |
970 (skip-chars-backward " ") | |
971 (current-column)) | |
972 ((eq position-descriptor 'behind) | |
973 (current-column)) | |
974 ((eq position-descriptor 'in-front) | |
975 (goto-char (match-beginning 0)) | |
976 (current-column)) | |
977 ((eq position-descriptor 'in-front-successor) | |
978 (skip-chars-forward " ") | |
979 (current-column)))))) | |
980 | |
981 (defun View-process-split-merged-fields (insert-blank-alist) | |
982 "Tries to split merged fields. | |
983 At the moment this is done by inserting a blank between fields, | |
984 which are often merged together. The fields are determined by the | |
985 alist INSERT-BLANK-ALIST." | |
986 (cond (insert-blank-alist | |
987 (let ((position (View-process-return-position | |
988 (car (car insert-blank-alist)) | |
989 (car (cdr (car insert-blank-alist)))))) | |
990 (if position | |
991 (View-process-insert-blank-in-column | |
992 (+ position | |
993 (car (cdr (cdr (car insert-blank-alist))))) | |
994 nil | |
995 "[^ ][^ ]? "))) | |
996 (View-process-split-merged-fields (cdr insert-blank-alist))) | |
997 (t))) | |
998 | |
999 (defun View-process-replace-colons-with-blanks () | |
1000 "Replaces colons with blanks, if a colon is also in the header line. | |
1001 This fixes the output of the IRIX ps on SGI's." | |
1002 (save-excursion | |
1003 (goto-char View-process-header-start) | |
1004 (while (search-forward ":" (View-process-return-end-of-line) t) | |
1005 (View-process-insert-blank-in-column (current-column) | |
1006 t)))) | |
1007 | |
1008 (defun View-process-mode () | |
1009 "Mode for displaying and killing processes. | |
1010 The mode has the following keybindings: | |
1011 \\{View-process-mode-map}. | |
1012 | |
1013 The first column of each outputline will be used to display marked lines. | |
1014 The following mark signs are possible (one can change them by changing | |
1015 the variables in the second column of the following table): | |
1016 | |
1017 Sign Variable Description | |
1018 _ View-process-no-mark Process isn't marked | |
1019 * View-process-single-line-mark The normal mark. | |
1020 C View-process-child-line-mark Marked as a child of P (see also P) | |
1021 K View-process-signal-line-mark Used during signaling | |
1022 N View-process-renice-line-mark Used during renicing | |
1023 P View-process-parent-line-mark Marked as the parent of P (see also C) | |
1024 s View-process-signaled-line-mark Process was signaled or reniced. | |
1025 | |
1026 The signal and renice commands are working also on marked processes!" | |
1027 ; (kill-all-local-variables) | |
1028 (make-local-variable 'revert-buffer-function) | |
1029 (setq revert-buffer-function 'View-process-revert-buffer) | |
1030 (View-process-change-display-type View-process-display-with-2-windows) | |
1031 (use-local-map View-process-mode-map) | |
1032 (set-syntax-table View-process-mode-syntax-table) | |
1033 (setq major-mode 'View-process-mode | |
1034 mode-name View-process-mode-name) | |
1035 ; (View-process-replaces-blanks-in-fields) | |
1036 (setq View-process-deleted-lines nil) | |
1037 (View-process-call-sorter-and-filter View-process-actual-sorter-and-filter) | |
1038 (setq truncate-lines View-process-truncate-lines) | |
1039 (View-process-install-pulldown-menu) | |
1040 ; (View-process-install-mode-motion) | |
1041 (View-process-hide-header (and View-process-display-with-2-windows | |
1042 View-process-hide-header)) | |
1043 (View-process-install-font-lock) | |
1044 (View-process-install-mode-motion) | |
1045 (run-hooks 'View-process-mode-hook) | |
1046 ) | |
1047 | |
1048 (defun View-process-build-field-name-list () | |
1049 "Returns an alist with the field names and the field number. | |
1050 The list looks like ((\"USER\" 1) (\"PID\" 2) (\"COMMAND\" 3))." | |
1051 (goto-char View-process-header-start) | |
1052 (forward-word 1) | |
1053 (setq View-process-field-names '()) | |
1054 (let ((i 1)) | |
1055 (while (<= (point) View-process-header-end) | |
1056 (setq View-process-field-names (cons (list (current-word) i) | |
1057 View-process-field-names)) | |
1058 (setq i (1+ i)) | |
1059 (forward-word 1)))) | |
1060 | |
1061 (defun View-process-field-name-exists-p (field-name) | |
1062 "Returns non nil, if the field FIELD_NAME exists." | |
1063 (assoc field-name View-process-field-names)) | |
1064 | |
1065 (defun View-process-translate-field-name-to-position (field-name) | |
1066 "Returns the position of the field with the name FIELD-NAME." | |
1067 (car (cdr (assoc field-name View-process-field-names))) | |
1068 ) | |
1069 | |
1070 (defun View-process-translate-field-position-to-name (position) | |
1071 "Returns the field name of the field with the position POSITION." | |
1072 (if (> position View-process-max-fields) | |
1073 (car (View-process-assoc-2th View-process-max-fields | |
1074 View-process-field-names)) | |
1075 (car (View-process-assoc-2th position View-process-field-names)) | |
1076 )) | |
1077 | |
1078 (defun View-process-get-system-type-from-host-list (host-name) | |
1079 "Returns nil, or the system type of the host with the name HOST-NAME." | |
1080 (car (cdr (assoc host-name View-process-host-names-and-system-types)))) | |
1081 | |
1082 (defun View-process-put-system-type-in-host-list (host-name system-type) | |
1083 "Puts the HOST-NAME and the SYSTEM-TYPE in a special host list. | |
1084 The list has the name `View-process-host-names-and-system-types'." | |
1085 (if (not (member (list host-name system-type) | |
1086 View-process-host-names-and-system-types)) | |
1087 (setq View-process-host-names-and-system-types | |
1088 (cons (list host-name system-type) | |
1089 View-process-host-names-and-system-types)))) | |
1090 | |
1091 (defun View-process-bsd-or-system-v (&optional remote-host) | |
1092 "This function determines, if the system is a BSD or a System V. | |
1093 For that it uses the ps command. | |
1094 If REMOTE-HOST is non nil, then the system of the REMOTE-HOST will | |
1095 be tested." | |
1096 (if remote-host | |
1097 (if (eq 0 (call-process View-process-rsh-command | |
1098 nil | |
1099 nil | |
1100 nil | |
1101 remote-host | |
1102 (concat View-process-status-command | |
1103 " " | |
1104 "-dfj"))) | |
1105 "system-v" | |
1106 "bsd") | |
1107 (if (eq 0 (call-process View-process-status-command | |
1108 nil | |
1109 nil | |
1110 nil | |
1111 "-dfj")) | |
1112 "system-v" | |
1113 "bsd"))) | |
1114 | |
1115 (defun View-process-program-exists-p (program &optional remote-host) | |
1116 "Returns t, if the PROGRAM exists. | |
1117 If REMOTE_HOST is non nil, then the program will be searched remote | |
1118 on that host." | |
1119 (if remote-host | |
1120 (or (= 0 (call-process View-process-rsh-command | |
1121 nil | |
1122 nil | |
1123 nil | |
1124 remote-host | |
1125 (concat View-process-test-command | |
1126 " " | |
1127 View-process-test-switches | |
1128 " " | |
1129 program))) | |
1130 (= 0 (call-process View-process-rsh-command | |
1131 nil | |
1132 nil | |
1133 nil | |
1134 remote-host | |
1135 (concat View-process-test-command | |
1136 " " | |
1137 View-process-test-switches | |
1138 " " | |
1139 "/bin/" | |
1140 program))) | |
1141 (= 0 (call-process View-process-rsh-command | |
1142 nil | |
1143 nil | |
1144 nil | |
1145 remote-host | |
1146 (concat View-process-test-command | |
1147 " " | |
1148 View-process-test-switches | |
1149 " " | |
1150 "/usr/bin/" | |
1151 program)))) | |
1152 (or (= 0 (call-process View-process-test-command | |
1153 nil | |
1154 nil | |
1155 nil | |
1156 View-process-test-switches | |
1157 program)) | |
1158 (= 0 (call-process View-process-test-command | |
1159 nil | |
1160 nil | |
1161 nil | |
1162 View-process-test-switches | |
1163 (concat "/bin/" program))) | |
1164 (= 0 (call-process View-process-test-command | |
1165 nil | |
1166 nil | |
1167 nil | |
1168 View-process-test-switches | |
1169 (concat "/usr/bin/" program)))))) | |
1170 | |
1171 (defun View-process-search-system-type-in-system-list-1 (system-type | |
1172 system-list) | |
1173 "Internal function of `View-process-search-system-type-in-system-list'." | |
1174 (cond ((not system-list) nil) | |
1175 ((equal system-type (car (car system-list))) | |
1176 (cons (car system-list) | |
1177 (View-process-search-system-type-in-system-list-1 | |
1178 system-type | |
1179 (cdr system-list)))) | |
1180 (t (View-process-search-system-type-in-system-list-1 system-type | |
1181 (cdr system-list)) | |
1182 ))) | |
1183 | |
1184 (defun View-process-search-system-type-in-system-list (system-type system-list) | |
1185 "Searches the SYSTEM-TYPE in SYSTEM-LIST. | |
1186 It returns the entry or nil, if the SYSTEM-TYPE isn't in the list. | |
1187 If more then one entry with the same SYSTEM-TYPE are found, then the | |
1188 version number is also checked. If the version number isn't in the | |
1189 list, then nil is returned." | |
1190 (let ((system-type-entries (View-process-search-system-type-in-system-list-1 | |
1191 (car system-type) | |
1192 system-list))) | |
1193 (if system-type-entries | |
1194 (if (= 1 (length system-type-entries)) | |
1195 (car system-type-entries) | |
1196 (View-process-assoc-2th (car (cdr system-type)) system-type-entries)) | |
1197 nil))) | |
1198 | |
1199 | |
1200 (defun View-process-generalize-system-type (system-type &optional remote-host) | |
1201 "Generalize the SYSTEM-TYPE. | |
1202 Determines, if the system is in the `View-process-specific-system-list' | |
1203 and if it is a BSD or a System V system. It returns a list which looks | |
1204 like the following: (<system-type> <version-no> <bsd-or-system-v>). | |
1205 The elements <system-type> and <version-no> are set to nil, if the | |
1206 <system-type> isn't in the `View-process-specific-system-list'. In that | |
1207 case the third element (<bsd-or-system-v>) is determined with the help | |
1208 of the ps output. if REMOTE-HOST is non nil, the the ps command to check | |
1209 the system type is run on the remote host REMOTE-HOST." | |
1210 (let ((new-system-type (View-process-search-system-type-in-system-list | |
1211 system-type | |
1212 View-process-specific-system-list))) | |
1213 (if new-system-type | |
1214 new-system-type | |
1215 (list nil nil (View-process-bsd-or-system-v))))) | |
1216 | |
1217 (defun View-process-get-local-system-type () | |
1218 "Returns the system type of the local host." | |
1219 (let ((system-type (View-process-get-system-type-from-host-list | |
1220 (system-name)))) | |
1221 (if (not system-type) ; t, if the host isn't in the list | |
1222 (progn | |
1223 (if (View-process-program-exists-p View-process-uname-command) | |
1224 (save-excursion | |
1225 (let ((buffer (generate-new-buffer "*system-type*"))) | |
1226 (call-process View-process-uname-command | |
1227 nil | |
1228 buffer | |
1229 nil | |
1230 View-process-uname-switches) | |
1231 (set-buffer buffer) | |
1232 (forward-line -1) | |
1233 (setq system-type (downcase (current-word))) | |
1234 (forward-word 2) | |
1235 (setq system-type | |
1236 (list system-type (downcase (current-word)))) | |
1237 (kill-buffer buffer) | |
1238 ;; determine, if the system is in the | |
1239 ;; View-process-specific-system-list and if it is | |
1240 ;; a BSD or a System V system; | |
1241 ;; The system type will be set to nil, | |
1242 ;; if it isn't in the list | |
1243 (setq system-type (View-process-generalize-system-type | |
1244 system-type)) | |
1245 )) | |
1246 (setq system-type (list nil nil (View-process-bsd-or-system-v)))) | |
1247 (View-process-put-system-type-in-host-list (system-name) | |
1248 system-type) | |
1249 system-type) | |
1250 system-type))) | |
1251 | |
1252 (defun View-process-get-remote-system-type () | |
1253 "Returns the system type of the remote host `View-process-remote-host'." | |
1254 (let ((system-type (View-process-get-system-type-from-host-list | |
1255 View-process-remote-host))) | |
1256 (if system-type ; nil, if the host isn't in the list | |
1257 system-type | |
1258 (if (View-process-program-exists-p View-process-uname-command | |
1259 View-process-remote-host) | |
1260 (let ((buffer (generate-new-buffer "*system-type*"))) | |
1261 (save-excursion | |
1262 (call-process View-process-rsh-command | |
1263 nil | |
1264 buffer | |
1265 nil | |
1266 View-process-remote-host | |
1267 (concat View-process-uname-command | |
1268 " " | |
1269 View-process-uname-switches)) | |
1270 (set-buffer buffer) | |
1271 (forward-line -1) | |
1272 (setq system-type (downcase (current-word))) | |
1273 (forward-word 2) | |
1274 (setq system-type | |
1275 (list system-type (downcase (current-word)))) | |
1276 (kill-buffer buffer) | |
1277 ;; determine, if the system is in the | |
1278 ;; View-process-specific-system-list and if it is | |
1279 ;; a BSD or a System V system; | |
1280 ;; The system type will be set to nil, | |
1281 ;; if it isn't in the list | |
1282 (setq system-type (View-process-generalize-system-type | |
1283 system-type | |
1284 View-process-remote-host)) | |
1285 )) | |
1286 (setq system-type (list nil nil (View-process-bsd-or-system-v | |
1287 View-process-remote-host)))) | |
1288 (View-process-put-system-type-in-host-list View-process-remote-host | |
1289 system-type) | |
1290 system-type))) | |
1291 | |
1292 (defun View-process-get-system-type () | |
1293 "Returns the type of the system on which ps was executed." | |
1294 (if View-process-remote-host | |
1295 (View-process-get-remote-system-type) | |
1296 (View-process-get-local-system-type) | |
1297 )) | |
1298 | |
1299 (defun View-process-get-kill-signal-list (system-type) | |
1300 "Returns a kill signal list for the SYSTEM-TYPE." | |
1301 (if (= 3 (length system-type)) | |
1302 (if (string= "bsd" (nth 2 system-type)) | |
1303 (if View-process-kill-signals-bsd | |
1304 View-process-kill-signals-bsd | |
1305 View-process-kill-signals-general) | |
1306 (if View-process-kill-signals-system-v | |
1307 View-process-kill-signals-system-v | |
1308 View-process-kill-signals-general)) | |
1309 (if (eval (nth 4 system-type)) | |
1310 (eval (nth 4 system-type)) | |
1311 (if (string= "bsd" (nth 2 system-type)) | |
1312 (if View-process-kill-signals-bsd | |
1313 View-process-kill-signals-bsd | |
1314 View-process-kill-signals-general) | |
1315 (if View-process-kill-signals-system-v | |
1316 View-process-kill-signals-system-v | |
1317 View-process-kill-signals-general))))) | |
1318 | |
1319 (defun View-process-get-field-name-description-list (system-type) | |
1320 "Returns a field name description list for the SYSTEM-TYPE. | |
1321 It returns nil, if no system specific list exists." | |
1322 (if (= 3 (length system-type)) | |
1323 (if (string= "bsd" (nth 2 system-type)) | |
1324 (if View-process-field-name-descriptions-bsd | |
1325 View-process-field-name-descriptions-bsd) | |
1326 (if View-process-field-name-descriptions-system-v | |
1327 View-process-field-name-descriptions-system-v)) | |
1328 (if (eval (nth 3 system-type)) | |
1329 (eval (nth 3 system-type)) | |
1330 (if (string= "bsd" (nth 2 system-type)) | |
1331 (if View-process-field-name-descriptions-bsd | |
1332 View-process-field-name-descriptions-bsd) | |
1333 (if View-process-field-name-descriptions-system-v | |
1334 View-process-field-name-descriptions-system-v))))) | |
1335 | |
1336 (defun View-process-init-internal-variables (use-last-sorter-and-filer) | |
1337 "Init internal variables. | |
1338 (without `View-process-header-start'). | |
1339 If USE-LAST-SORTER-AND-FILER is t, then | |
1340 'View-process-actual-sorter-and-filter' will not be changed" | |
1341 ;; don't replace blanks now | |
1342 (setq View-process-field-blanks-already-replaced t) | |
1343 | |
1344 (goto-char View-process-header-start) | |
1345 (end-of-line) | |
1346 (setq View-process-header-end (point)) | |
1347 ;; (newline) | |
1348 (forward-line) | |
1349 (setq View-process-output-start (point)) | |
1350 (setq View-process-output-end (point-max)) | |
1351 (goto-char View-process-header-end) | |
1352 (forward-word -1) | |
1353 (setq View-process-max-fields (View-process-current-field-number)) | |
1354 (View-process-build-field-name-list) | |
1355 (setq View-process-system-type (View-process-get-system-type)) | |
1356 (setq View-process-kill-signals (View-process-get-kill-signal-list | |
1357 View-process-system-type)) | |
1358 (setq View-process-field-name-descriptions | |
1359 (View-process-get-field-name-description-list View-process-system-type) | |
1360 ) | |
1361 ;; Replace the blanks the next time if it is necessary | |
1362 (setq View-process-field-blanks-already-replaced nil) | |
1363 (if (not use-last-sorter-and-filer) | |
1364 (setq View-process-actual-sorter-and-filter | |
1365 View-process-sorter-and-filter)) | |
1366 | |
1367 (if View-process-pid-mark-alist | |
1368 (progn | |
1369 (setq View-process-last-pid-mark-alist View-process-pid-mark-alist) | |
1370 (setq View-process-pid-mark-alist nil))) | |
1371 ) | |
1372 | |
1373 (defun View-process-insert-short-key-descriptions () | |
1374 "Insert short key descriptions at the current point. | |
1375 If `View-process-display-short-key-descriptions' is nil, then | |
1376 nothing will be inserted." | |
1377 (if View-process-display-short-key-descriptions | |
1378 (let ((local-map (current-local-map))) | |
1379 (use-local-map View-process-mode-map) | |
1380 (insert | |
1381 (substitute-command-keys | |
1382 (concat | |
1383 " \\[view-processes]: new output " | |
1384 "\\[View-process-status]: new output with new options " | |
1385 " \\[revert-buffer]: update output \n" | |
1386 " \\[View-process-filter-by-current-field-g]: field filter " | |
1387 "\\[View-process-filter-g]: line filter " | |
1388 "\\[View-process-sort-by-current-field-g]: sort " | |
1389 "\\[View-process-reverse-g]: reverse " | |
1390 "\\[View-process-send-signal-to-processes-g]: send signal " | |
1391 "\\[View-process-quit]: quit\n"))) | |
1392 (use-local-map local-map)))) | |
1393 | |
1394 (defun View-process-insert-uptime (&optional remote-host) | |
1395 "Inserts uptime information at the current point. | |
1396 if `View-process-display-uptime' is nil, then nothing will be inserted. | |
1397 If REMOTE-HOST is non nil, then its the name of the remote host." | |
1398 (if View-process-display-uptime | |
1399 (progn | |
1400 ; (newline) | |
1401 (if remote-host | |
1402 (call-process View-process-rsh-command | |
1403 nil | |
1404 t | |
1405 nil | |
1406 remote-host | |
1407 View-process-uptime-command) | |
1408 (call-process View-process-uptime-command | |
1409 nil | |
1410 t | |
1411 nil))))) | |
1412 | |
1413 (defun View-process-insert-title-lines (command-switches | |
1414 remote-host | |
1415 use-last-sorter-and-filter) | |
1416 "Insert the title lines in the output lines. | |
1417 REMOTE-HOST is nil or the name of the host on which the | |
1418 ps command was executed. USE-LAST-SORTER-AND-FILTER determines, if | |
1419 the last sorter and filter (from `View-process-actual-sorter-and-filter') | |
1420 are used." | |
1421 (insert (or remote-host (system-name) "") | |
1422 ;;(getenv "HOST") (getenv "HOSTNAME") "") | |
1423 ", " | |
1424 (current-time-string) | |
1425 ", " | |
1426 View-process-status-command | |
1427 " " | |
1428 command-switches | |
1429 "\n") | |
1430 (View-process-insert-uptime remote-host) | |
1431 (View-process-insert-short-key-descriptions) | |
1432 (if (or (and use-last-sorter-and-filter | |
1433 View-process-actual-sorter-and-filter) | |
1434 View-process-sorter-and-filter) | |
1435 (insert | |
1436 "This output is filtered! Look at `View-process-sorter-and-filter'.\n")) | |
1437 (newline 1) | |
1438 (setq View-process-ps-header-window-size | |
1439 (+ View-process-ps-header-window-offset | |
1440 (count-lines (point-min) (point)) | |
1441 (if (and (View-process-xemacs-p) | |
1442 (not (View-process-lemacs-p)) | |
1443 View-process-header-mode-line-off) | |
1444 -1 | |
1445 0)))) | |
1446 | |
1447 (defun View-process-search-header-line-1 (header-dectection-list | |
1448 no-error-message) | |
1449 "Internal funtion of `View-process-search-header-line'." | |
1450 (cond (header-dectection-list | |
1451 (goto-char View-process-header-start) | |
1452 (if (search-forward (car header-dectection-list) nil t) | |
1453 (setq View-process-header-start | |
1454 (View-process-return-beginning-of-line)) | |
1455 (View-process-search-header-line-1 (cdr header-dectection-list) | |
1456 no-error-message))) | |
1457 (t (setq mode-motion-hook nil) ; otherwise emacs hangs | |
1458 (if no-error-message | |
1459 nil | |
1460 (error (concat "ERROR: No header line detected! " | |
1461 "Look at View-process-header-line-detection-list!") | |
1462 ))))) | |
1463 | |
1464 | |
1465 (defun View-process-search-header-line (&optional no-error-message) | |
1466 "Function searches the headerline and sets `View-process-header-start'. | |
1467 The header line must have at least one of the words of the list | |
1468 `View-process-header-line-detection-list'. | |
1469 If NO-ERROR-MESSAGE is t and no header-line is found, then only | |
1470 nil (without an error message) will be returned." | |
1471 (save-excursion | |
1472 (View-process-search-header-line-1 View-process-header-line-detection-list | |
1473 no-error-message) | |
1474 )) | |
1475 | |
1476 (defun View-process-save-position () | |
1477 "Saves the current line and column in a cons cell and returns it." | |
1478 (save-restriction | |
1479 (widen) | |
1480 (if (< View-process-header-start (point-max)) | |
1481 (cons (- (count-lines (or View-process-header-start (point-min)) | |
1482 (point)) | |
1483 (if (= 0 (current-column)) | |
1484 0 | |
1485 1)) | |
1486 (current-column)) | |
1487 nil))) | |
1488 | |
1489 (defun View-process-goto-position (position) | |
1490 "Sets the point to the POSITION. | |
1491 POSITION is a cons cell with a linenumber and a column." | |
1492 (if position | |
1493 (save-restriction | |
1494 (widen) | |
1495 (goto-char View-process-header-start) | |
1496 (forward-line (car position)) | |
1497 (move-to-column (cdr position) t) | |
1498 ; (setq temporary-goal-column (cdr position)) ; doesn't work :-( | |
1499 ))) | |
1500 | |
1501 (defun View-process-status (command-switches | |
1502 &optional remote-host | |
1503 use-last-sorter-and-filter) | |
1504 "Prints a list with processes in the buffer `View-process-buffer-name'. | |
1505 COMMAND-SWITCHES is a string with the command switches (ie: -aux). | |
1506 IF the optional argument REMOTE-HOST is given, then the command will | |
1507 be executed on the REMOTE-HOST. If an prefix arg is given, then the | |
1508 function asks for the name of the remote host. | |
1509 If USE-LAST-SORTER-AND-FILTER is t, then the last sorter and filter | |
1510 commands are used. Otherwise the sorter and filter from the list | |
1511 'View-process-sorter-and-filter' are used." | |
1512 (interactive | |
1513 (let ((View-process-stop-motion-help t)) | |
1514 (list | |
1515 (read-string "Command switches: " | |
1516 (or View-process-status-last-command-switches | |
1517 (if (bufferp (get-buffer View-process-buffer-name)) | |
1518 (cdr | |
1519 (assoc | |
1520 'View-process-status-last-command-switches | |
1521 (buffer-local-variables | |
1522 (get-buffer View-process-buffer-name))))) | |
1523 (if (string= "bsd" (View-process-bsd-or-system-v)) | |
1524 View-process-status-command-switches-bsd | |
1525 View-process-status-command-switches-system-v)) | |
1526 'View-process-status-history) | |
1527 (if current-prefix-arg | |
1528 (setq View-process-remote-host | |
1529 (read-string "Remote host name: " | |
1530 View-process-remote-host | |
1531 'View-process-remote-host-history)) | |
1532 (setq View-process-remote-host nil))))) | |
1533 (View-process-save-old-window-configuration) | |
1534 (let ((buffer (get-buffer-create View-process-buffer-name)) | |
1535 (position nil)) | |
1536 ; (point-after-ps nil)) | |
1537 (if (window-minibuffer-p (selected-window)) | |
1538 (set-buffer buffer) | |
1539 (switch-to-buffer buffer)) | |
1540 | |
1541 ;; set switches for the next view process command | |
1542 (setq View-process-status-last-command-switches command-switches) | |
1543 (if (string= "bsd" (View-process-bsd-or-system-v)) | |
1544 (setq View-process-status-command-switches-bsd command-switches) | |
1545 (setq View-process-status-command-switches-system-v command-switches)) | |
1546 | |
1547 (setq buffer-read-only nil) | |
1548 (if (not (= (point-min) (point-max))) | |
1549 (progn | |
1550 (setq position (View-process-save-position)) | |
1551 ; (setq point-after-ps (point-min)) | |
1552 ; (setq point-after-ps (point)) | |
1553 (erase-buffer))) | |
1554 (View-process-insert-title-lines command-switches | |
1555 remote-host | |
1556 use-last-sorter-and-filter) | |
1557 (setq View-process-header-start (point)) | |
1558 (if remote-host | |
1559 (call-process View-process-rsh-command | |
1560 nil | |
1561 t | |
1562 t | |
1563 remote-host | |
1564 (concat View-process-status-command | |
1565 " " | |
1566 command-switches)) | |
1567 (call-process View-process-status-command | |
1568 nil | |
1569 t | |
1570 t | |
1571 command-switches)) | |
1572 (View-process-search-header-line) | |
1573 (setq View-process-output-end (point-max)) | |
1574 (View-process-replace-colons-with-blanks) | |
1575 (View-process-insert-blanks-at-line-start) | |
1576 (View-process-split-merged-fields View-process-insert-blank-alist) | |
1577 (View-process-init-internal-variables use-last-sorter-and-filter) | |
1578 (View-process-highlight-header-line) | |
1579 (goto-char View-process-output-start) | |
1580 (View-process-goto-position position) | |
1581 ; (goto-char (cond ((> point-after-ps (point-max)) (point-max)) | |
1582 ; ((= point-after-ps (point-min)) View-process-output-start) | |
1583 ; ((< point-after-ps View-process-output-start) | |
1584 ; View-process-output-start) | |
1585 ; (t point-after-ps))) | |
1586 (setq buffer-read-only t) | |
1587 (let ((View-process-stop-motion-help t)) | |
1588 ; (setq View-process-stop-motion-help t) | |
1589 (View-process-mode) | |
1590 ; (setq View-process-stop-motion-help nil) | |
1591 ; (View-process-redraw) ; only the first time (fixes an Emacs 19 bug) | |
1592 ) | |
1593 )) | |
1594 | |
1595 (defun View-process-status-update () | |
1596 "Runs the `View-process-status' with the last switches | |
1597 and sorter and filter commands." | |
1598 (interactive) | |
1599 (if View-process-status-last-command-switches | |
1600 (View-process-status View-process-status-last-command-switches | |
1601 View-process-remote-host | |
1602 t) | |
1603 (error "ERROR: No view process buffer exists for update!"))) | |
1604 | |
1605 (defun view-processes (&optional remote-host) | |
1606 "Prints a list with processes in the buffer `View-process-buffer-name'. | |
1607 It calls the function `View-process-status' with default switches. | |
1608 As the default switches on BSD like systems the value of the variable | |
1609 `View-process-status-command-switches-bsd' is used. | |
1610 On System V like systems the value of the variable | |
1611 `View-process-status-command-switches-system-v' is used. | |
1612 IF the optional argument REMOTE-HOST is given, then the command will | |
1613 be executed on the REMOTE-HOST. If an prefix arg is given, then the | |
1614 function asks for the name of the remote host." | |
1615 (interactive | |
1616 (let ((View-process-stop-motion-help t)) | |
1617 (list (if current-prefix-arg | |
1618 (setq View-process-remote-host | |
1619 (read-string "Remote host name: " | |
1620 View-process-remote-host | |
1621 'View-process-remote-host-history)) | |
1622 (setq View-process-remote-host nil))))) | |
1623 (if (string= "bsd" (nth 2 (View-process-get-system-type))) | |
1624 (View-process-status View-process-status-command-switches-bsd | |
1625 View-process-remote-host) | |
1626 (View-process-status View-process-status-command-switches-system-v | |
1627 remote-host))) | |
1628 | |
1629 ;;; itimer functions (to repeat the ps output) | |
1630 | |
1631 (defun View-process-status-itimer-function () | |
1632 "Itimer function for updating the ps output." | |
1633 (save-excursion | |
1634 (save-window-excursion | |
1635 (View-process-status-update))) | |
1636 ;;(View-process-start-itimer) | |
1637 ) | |
1638 | |
1639 | |
1640 ;;; help functions | |
1641 | |
1642 (defun View-process-show-pid-and-command-or-field-name () | |
1643 "Displays the pid and the command of the current line or the field name. | |
1644 If the point is at a blank, then the pid and the command of the current | |
1645 line are displayed. Otherwise the name of the field and its description | |
1646 are displayed." | |
1647 (interactive) | |
1648 (if (looking-at " ") | |
1649 (View-process-show-pid-and-command) | |
1650 (View-process-which-field-name))) | |
1651 | |
1652 (defun View-process-show-pid-and-command () | |
1653 "Displays the pid and the command of the current line. | |
1654 It assumes, that the command is displayed at the end of the line." | |
1655 (interactive) | |
1656 (if (>= (point) View-process-output-start) | |
1657 (message "PID= %s, %s" | |
1658 (View-process-get-pid-from-current-line) | |
1659 (View-process-get-field-value-from-current-line | |
1660 View-process-max-fields | |
1661 View-process-max-fields)))) | |
1662 | |
1663 (defun View-process-show-field-names () | |
1664 "Displays the name(s) of the ps output field(s). | |
1665 If the point is at a blank, then the header line with all field names | |
1666 is displayed. Otherwise only the name of the field at the point is | |
1667 displayed." | |
1668 (interactive) | |
1669 (if (looking-at " ") | |
1670 (View-process-show-header-line) | |
1671 (View-process-which-field-name))) | |
1672 | |
1673 (defun View-process-show-header-line () | |
1674 "Displays the header line in the buffer at the current line." | |
1675 (interactive) | |
1676 (save-window-excursion | |
1677 (let ((header-line (save-restriction | |
1678 (widen) | |
1679 (concat | |
1680 (buffer-substring View-process-header-start | |
1681 View-process-header-end) | |
1682 "\n")))) | |
1683 (momentary-string-display header-line | |
1684 (View-process-return-beginning-of-line))))) | |
1685 | |
1686 (defun View-process-which-field-name () | |
1687 "Displays the name of the field under the point in the echo area." | |
1688 (interactive) | |
1689 (if (>= (point) View-process-header-start) | |
1690 (let ((field-name (View-process-translate-field-position-to-name | |
1691 (View-process-current-field-number)))) | |
1692 (message | |
1693 (View-process-replace-in-string | |
1694 "%" | |
1695 "%%" | |
1696 (concat field-name | |
1697 ": " | |
1698 (View-process-get-field-name-description field-name))))))) | |
1699 | |
1700 (defun View-process-get-field-name-description (field-name) | |
1701 "Returns a string with a desciption of the ps output field FIELD-NAME." | |
1702 (let ((description | |
1703 (or (car (cdr (assoc field-name | |
1704 View-process-field-name-descriptions))) | |
1705 (car (cdr (assoc field-name | |
1706 View-process-field-name-descriptions-general)))) | |
1707 )) | |
1708 (if (stringp description) | |
1709 description | |
1710 (concat (car description) | |
1711 (View-process-get-value-description | |
1712 (View-process-get-field-value-from-current-line | |
1713 (View-process-translate-field-name-to-position field-name) | |
1714 View-process-max-fields) | |
1715 (cdr description)))))) | |
1716 | |
1717 (defun View-process-get-value-description (values value-descriptions) | |
1718 "Returns a string with the description of the VALUES. | |
1719 VALUE-DESCRIPTIONS is an alist with the possible values and its | |
1720 descriptions." | |
1721 (cond ((string= values "") "") | |
1722 ((or (eq (aref values 0) ?_) (eq (aref values 0) ? )) | |
1723 (View-process-get-value-description (substring values 1) | |
1724 value-descriptions)) | |
1725 (t (concat | |
1726 (car | |
1727 (cdr | |
1728 (assoc | |
1729 (substring values 0 (string-match "[ _]" values)) | |
1730 value-descriptions))) | |
1731 (if (string-match "[ _]" values) | |
1732 (View-process-get-value-description | |
1733 (substring values (string-match "[ _]" values)) | |
1734 value-descriptions) | |
1735 ""))))) | |
1736 | |
1737 | |
1738 ;;; sort functions | |
1739 | |
1740 (defun View-process-current-field-number () | |
1741 "Returns the field number of the point. | |
1742 The functions fails with an error message, if the character under | |
1743 the point is a blank." | |
1744 (View-process-replaces-blanks-in-fields-if-necessary) | |
1745 (save-excursion | |
1746 (if (looking-at " ") | |
1747 (error "Point is on a blank and not in a field!") | |
1748 (if (and (eq (point) (point-max)) | |
1749 (eq (current-column) 0)) | |
1750 (error "Point is not in a field!") | |
1751 (let ((field-point (point)) | |
1752 (i 0)) | |
1753 (beginning-of-line) | |
1754 (skip-chars-forward " ") | |
1755 (while (>= field-point (point)) | |
1756 (setq i (1+ i)) | |
1757 (skip-chars-forward "^ ") | |
1758 (skip-chars-forward " ")) | |
1759 i))))) | |
1760 | |
1761 (defun View-process-sort-fields-in-region (field | |
1762 beg | |
1763 end | |
1764 &optional sort-function) | |
1765 "Sort lines in region by the ARGth field of each line. | |
1766 Fields are separated by whitespace and numbered from 1 up. | |
1767 With a negative arg, sorts by the ARGth field counted from the right. | |
1768 BEG and END specify region to sort. | |
1769 If the optional SORT-FUNCTION is nil, then the region is at first | |
1770 sorted with the function `sort-fields' and then with the function | |
1771 `sort-float-fields'. Otherwise a sort function like `sort-fields' | |
1772 must be specified." | |
1773 (let ((position (View-process-save-position)) | |
1774 ; (point (point)) ;; that's, because save-excursion | |
1775 ; (column (current-column)) ;; doesn't work :-( | |
1776 (field-no (if (< field View-process-max-fields) | |
1777 field | |
1778 View-process-max-fields))) | |
1779 (if sort-function | |
1780 (eval (list sort-function field-no beg end)) | |
1781 (sort-fields field-no beg end) | |
1782 (sort-float-fields field-no beg end)) | |
1783 (View-process-goto-position position))) | |
1784 ; (goto-char point) | |
1785 ; (goto-char (+ point (- column (current-column)))))) | |
1786 | |
1787 (defun View-process-remove-sorter (sorter alist) | |
1788 "Removes the SORTER entry from the ALIST." | |
1789 (cond ((not alist) nil) | |
1790 ((eq sorter (car (car alist))) (cdr alist)) | |
1791 (t (cons (car alist) | |
1792 (View-process-remove-sorter sorter (cdr alist)))))) | |
1793 | |
1794 (defun View-process-sort-output-by-field (field-name | |
1795 &optional dont-remember) | |
1796 "Sort the ps output by the field FIELD-NAME. | |
1797 If DONT-REMEMBER is t, then the filter command isn't inserted | |
1798 in the `View-process-actual-sorter-and-filter' list." | |
1799 (interactive | |
1800 (let ((View-process-stop-motion-help t)) | |
1801 (list | |
1802 (completing-read "Field Name for sorting: " | |
1803 View-process-field-names | |
1804 nil | |
1805 t | |
1806 (car View-process-field-name-history) | |
1807 View-process-field-name-history)))) | |
1808 (setq buffer-read-only nil) | |
1809 (View-process-sort-fields-in-region | |
1810 (View-process-translate-field-name-to-position field-name) | |
1811 View-process-output-start | |
1812 View-process-output-end) | |
1813 (setq buffer-read-only t) | |
1814 (if (not dont-remember) | |
1815 (setq View-process-actual-sorter-and-filter | |
1816 (append (View-process-remove-sorter | |
1817 'reverse | |
1818 (View-process-remove-sorter | |
1819 'sort | |
1820 View-process-actual-sorter-and-filter)) | |
1821 (list (list 'sort field-name)))))) | |
1822 | |
1823 (defun View-process-sort-by-current-field-g () | |
1824 "Sort the ps output by the field under the point. | |
1825 It is a generic interface to `View-process-sort-region-by-current-field' | |
1826 and `View-process-sort-output-by-current-field'.The first will be called | |
1827 if a region is active and the other one if not. | |
1828 With a prefix arg, it uses the NTH field instead of the current one." | |
1829 (interactive) | |
1830 (if (View-process-region-active-p) | |
1831 (call-interactively 'View-process-sort-region-by-current-field) | |
1832 (call-interactively 'View-process-sort-output-by-current-field))) | |
1833 | |
1834 (defun View-process-sort-output-by-current-field (&optional nth dont-remember) | |
1835 "Sort the whole ps output by the field under the point. | |
1836 With a prefix arg, it uses the NTH field instead of the current one. | |
1837 If DONT-REMEMBER is t, then the filter command isn't inserted | |
1838 in the `View-process-actual-sorter-and-filter' list." | |
1839 (interactive "P") | |
1840 (let ((field-number (if nth | |
1841 (if (and (>= nth 1) (<= nth View-process-max-fields)) | |
1842 nth | |
1843 (error "ERROR: Wrong field number!")) | |
1844 (View-process-current-field-number)))) | |
1845 (setq buffer-read-only nil) | |
1846 (View-process-sort-fields-in-region field-number | |
1847 View-process-output-start | |
1848 View-process-output-end) | |
1849 (setq buffer-read-only t) | |
1850 (if (not dont-remember) | |
1851 (setq View-process-actual-sorter-and-filter | |
1852 (append (View-process-remove-sorter | |
1853 'reverse | |
1854 (View-process-remove-sorter | |
1855 'sort | |
1856 View-process-actual-sorter-and-filter)) | |
1857 (list | |
1858 (list 'sort | |
1859 (View-process-translate-field-position-to-name | |
1860 field-number)))))))) | |
1861 | |
1862 (defun View-process-sort-region-by-current-field (&optional nth) | |
1863 "Sort the region by the field under the point. | |
1864 With a prefix arg, it uses the NTH field instead of the current one." | |
1865 (interactive "P") | |
1866 (let ((field-number (if nth | |
1867 (if (and (>= nth 1) (<= nth View-process-max-fields)) | |
1868 nth | |
1869 (error "ERROR: Wrong field number!")) | |
1870 (View-process-current-field-number)))) | |
1871 (setq buffer-read-only nil) | |
1872 (View-process-sort-fields-in-region | |
1873 field-number | |
1874 (save-excursion | |
1875 (goto-char (region-beginning)) | |
1876 (View-process-return-beginning-of-line)) | |
1877 (save-excursion | |
1878 (goto-char (region-end)) | |
1879 (View-process-return-end-of-line))) | |
1880 (setq buffer-read-only t))) | |
1881 | |
1882 (defun View-process-reverse-output (&optional dont-remember) | |
1883 "Reverses the whole output lines. | |
1884 If DONT-REMEMBER is t, then the filter command isn't inserted | |
1885 in the `View-process-actual-sorter-and-filter' list." | |
1886 (interactive) | |
1887 (setq buffer-read-only nil) | |
1888 (let ((position (View-process-save-position))) | |
1889 ; (line (count-lines (point-min) (point))) | |
1890 ; (column (current-column))) | |
1891 (reverse-region View-process-output-start View-process-output-end) | |
1892 (View-process-goto-position position)) | |
1893 ; (goto-line line) | |
1894 ; (beginning-of-line) | |
1895 ; (forward-char column)) | |
1896 (setq buffer-read-only t) | |
1897 (if (not dont-remember) | |
1898 (setq View-process-actual-sorter-and-filter | |
1899 (if (assq 'reverse View-process-actual-sorter-and-filter) | |
1900 (View-process-remove-sorter | |
1901 'reverse | |
1902 View-process-actual-sorter-and-filter) | |
1903 (append View-process-actual-sorter-and-filter | |
1904 (list (list 'reverse))))))) | |
1905 | |
1906 (defun View-process-reverse-region () | |
1907 "Reverses the output lines in the region." | |
1908 (interactive) | |
1909 (setq buffer-read-only nil) | |
1910 (let ((region-beginning (if (< (region-beginning) (region-end)) | |
1911 (region-beginning) | |
1912 (region-end))) | |
1913 (region-end (if (> (region-end) (region-beginning)) | |
1914 (region-end) | |
1915 (region-beginning))) | |
1916 (position (View-process-save-position))) | |
1917 ; (line (count-lines (point-min) (point))) | |
1918 ; (column (current-column))) | |
1919 (reverse-region (if (< region-beginning View-process-output-start) | |
1920 View-process-output-start | |
1921 (goto-char region-beginning) | |
1922 (View-process-return-beginning-of-line)) | |
1923 (if (> region-end View-process-output-end) | |
1924 View-process-output-end | |
1925 (goto-char region-end) | |
1926 (View-process-return-end-of-line))) | |
1927 (View-process-goto-position position)) | |
1928 ; (goto-line line) | |
1929 ; (beginning-of-line) | |
1930 ; (forward-char column)) | |
1931 (setq buffer-read-only t)) | |
1932 | |
1933 (defun View-process-reverse-g () | |
1934 "Reverses the output lines. | |
1935 It is a generic interface to `View-process-reverse-region' | |
1936 and `View-process-reverse-output'. The first will be called | |
1937 if a region is active and the other one if not." | |
1938 (interactive) | |
1939 (if (View-process-region-active-p) | |
1940 (call-interactively 'View-process-reverse-region) | |
1941 (call-interactively 'View-process-reverse-output))) | |
1942 | |
1943 ;;; filter functions | |
1944 | |
1945 (defun View-process-delete-region (start end) | |
1946 "Stores deleted lines in `View-process-deleted-lines'." | |
1947 (setq View-process-deleted-lines | |
1948 (cons (buffer-substring start end) | |
1949 View-process-deleted-lines)) | |
1950 (delete-region start end)) | |
1951 | |
1952 (defun View-process-remove-all-filter-and-sorter () | |
1953 "Undeletes all filtered lines from `View-process-deleted-lines'. | |
1954 It removes also all filter and sorter from the list | |
1955 `View-process-actual-sorter-and-filter'." | |
1956 (interactive) | |
1957 (let ((buffer-read-only)) | |
1958 (goto-char View-process-output-end) | |
1959 (mapcar '(lambda (line) | |
1960 (insert line)) | |
1961 View-process-deleted-lines) | |
1962 (setq View-process-output-end (point)) | |
1963 (setq View-process-actual-sorter-and-filter nil) | |
1964 (goto-char View-process-output-start))) | |
1965 | |
1966 (defun View-process-filter-fields-in-region (regexp | |
1967 field-no | |
1968 beg | |
1969 end | |
1970 &optional exclude) | |
1971 "Filters a region with a REGEXP in the field FIELD-NO. | |
1972 The region start is at BEG and the end at END. If FIELD-NO | |
1973 is nil, then the whole line is used. All lines which passes | |
1974 not the filter are deleted in the buffer, if EXCLUDE is nil. | |
1975 Otherwise only these lines are not deleted." | |
1976 (save-restriction | |
1977 (widen) | |
1978 (let ((region-start (if (< beg end) beg end)) | |
1979 (region-end (if (> beg end) beg end))) | |
1980 (if (< region-start View-process-output-start) | |
1981 (setq region-start View-process-output-start)) | |
1982 (goto-char region-end) | |
1983 (if field-no | |
1984 (while (>= (point) region-start) | |
1985 (if (string-match regexp | |
1986 (View-process-get-field-value-from-current-line | |
1987 field-no | |
1988 View-process-max-fields)) | |
1989 (if exclude | |
1990 (View-process-delete-region | |
1991 (1- (View-process-return-beginning-of-line)) | |
1992 (View-process-return-end-of-line)) | |
1993 (forward-line -1)) | |
1994 (if exclude | |
1995 (forward-line -1) | |
1996 (View-process-delete-region | |
1997 (1- (View-process-return-beginning-of-line)) | |
1998 (View-process-return-end-of-line))) | |
1999 )) | |
2000 (beginning-of-line) | |
2001 (while (>= (point) region-start) | |
2002 (if (search-forward-regexp regexp | |
2003 (View-process-return-end-of-line) t) | |
2004 (if exclude | |
2005 (progn | |
2006 (View-process-delete-region | |
2007 (1- (View-process-return-beginning-of-line)) | |
2008 (View-process-return-end-of-line)) | |
2009 (beginning-of-line)) | |
2010 (forward-line -1)) | |
2011 (if exclude | |
2012 (forward-line -1) | |
2013 (View-process-delete-region | |
2014 (1- (View-process-return-beginning-of-line)) | |
2015 (View-process-return-end-of-line)) | |
2016 (beginning-of-line)) | |
2017 ))) | |
2018 (goto-char region-start)) | |
2019 (setq View-process-output-end (point-max)) | |
2020 (if (> View-process-output-start View-process-output-end) | |
2021 (progn | |
2022 (newline) | |
2023 (setq View-process-output-end View-process-output-start))))) | |
2024 | |
2025 (defun View-process-filter-output-by-field (field-name | |
2026 regexp | |
2027 &optional exclude | |
2028 dont-remember) | |
2029 "Filter the whole output by the field FIELD-NAME with REGEXP. | |
2030 The matching lines are deleted, if EXCLUDE is t. The non matching | |
2031 lines are deleted, if EXCLUDE is nil. If you call this function | |
2032 interactive, then you can give a prefix arg to set EXCLUDE to non nil. | |
2033 If DONT-REMEMBER is t, then the filter command isn't inserted | |
2034 in the `View-process-actual-sorter-and-filter' list." | |
2035 (interactive | |
2036 (let ((View-process-stop-motion-help t)) | |
2037 (list | |
2038 (completing-read "Field Name for filtering: " | |
2039 View-process-field-names | |
2040 nil | |
2041 t | |
2042 (car View-process-field-name-history) | |
2043 View-process-field-name-history) | |
2044 (read-string "Regexp for filtering the output in the field: " | |
2045 (car View-process-filter-history) | |
2046 View-process-filter-history) | |
2047 current-prefix-arg | |
2048 ))) | |
2049 (setq buffer-read-only nil) | |
2050 (View-process-filter-fields-in-region | |
2051 regexp | |
2052 (View-process-translate-field-name-to-position field-name) | |
2053 View-process-output-start | |
2054 View-process-output-end | |
2055 exclude) | |
2056 (setq buffer-read-only t) | |
2057 (if (not dont-remember) | |
2058 (setq View-process-actual-sorter-and-filter | |
2059 (append View-process-actual-sorter-and-filter | |
2060 (list (list (if exclude 'exclude-filter 'filter) | |
2061 field-name | |
2062 regexp)))))) | |
2063 | |
2064 (defun View-process-filter-output-by-current-field (regexp | |
2065 &optional exclude | |
2066 dont-remember) | |
2067 "Filter the whole output by the field under the point with REGEXP. | |
2068 The matching lines are deleted, if EXCLUDE is t. The non matching | |
2069 lines are deleted, if EXCLUDE is nil. If you call this function | |
2070 interactive, then you can give a prefix arg to set EXCLUDE to non nil. | |
2071 If DONT-REMEMBER is t, then the filter command isn't inserted | |
2072 in the `View-process-actual-sorter-and-filter' list." | |
2073 ; (interactive "sRegexp for filtering the output in the current field: \nP") | |
2074 (interactive | |
2075 (let* ((View-process-stop-motion-help t) | |
2076 (regexp (read-string | |
2077 "sRegexp for filtering the output in the current field: ")) | |
2078 (exclude current-prefix-arg)) | |
2079 (list regexp exclude))) | |
2080 (let ((current-field-number (View-process-current-field-number))) | |
2081 (setq buffer-read-only nil) | |
2082 (View-process-filter-fields-in-region regexp | |
2083 current-field-number | |
2084 View-process-output-start | |
2085 View-process-output-end | |
2086 exclude) | |
2087 (setq buffer-read-only t) | |
2088 (if (not dont-remember) | |
2089 (setq View-process-actual-sorter-and-filter | |
2090 (append View-process-actual-sorter-and-filter | |
2091 (list | |
2092 (list (if exclude 'exclude-filter 'filter) | |
2093 (View-process-translate-field-position-to-name | |
2094 current-field-number) | |
2095 regexp))))))) | |
2096 | |
2097 (defun View-process-filter-region-by-current-field (regexp &optional exclude) | |
2098 "Filter the region by the field under the point with REGEXP. | |
2099 The matching lines are deleted, if EXCLUDE is t. The non matching | |
2100 lines are deleted, if EXCLUDE is nil. If you call this function | |
2101 interactive, then you can give a prefix arg to set EXCLUDE to non nil." | |
2102 ; (interactive "sRegexp for filtering the region in the current field: \nP") | |
2103 (interactive | |
2104 (let* ((View-process-stop-motion-help t) | |
2105 (regexp (read-string | |
2106 "sRegexp for filtering the region in the current field: ")) | |
2107 (exclude current-prefix-arg)) | |
2108 (list regexp exclude))) | |
2109 (setq buffer-read-only nil) | |
2110 (View-process-filter-fields-in-region | |
2111 regexp | |
2112 (View-process-current-field-number) | |
2113 (save-excursion | |
2114 (goto-char (region-beginning)) | |
2115 (View-process-return-beginning-of-line)) | |
2116 (save-excursion | |
2117 (goto-char (region-end)) | |
2118 (View-process-return-end-of-line)) | |
2119 exclude) | |
2120 (setq buffer-read-only t)) | |
2121 | |
2122 (defun View-process-filter-by-current-field-g (&optional exclude) | |
2123 "Filter the whole output by the field under the point with an Regexp. | |
2124 It is a generic interface to `View-process-filter-region-by-current-field' | |
2125 and `View-process-filter-output-by-current-field'. The first will be called | |
2126 if a region is active and the other one if not. | |
2127 The matching lines are deleted, if EXCLUDE is t. The non matching | |
2128 lines are deleted, if EXCLUDE is nil. If you call this function | |
2129 interactive, then you can give a prefix arg to set EXCLUDE to non nil." | |
2130 (interactive "P") | |
2131 (setq prefix-arg current-prefix-arg) | |
2132 (if (View-process-region-active-p) | |
2133 (call-interactively 'View-process-filter-region-by-current-field) | |
2134 (call-interactively 'View-process-filter-output-by-current-field))) | |
2135 | |
2136 (defun View-process-filter-output (regexp &optional exclude dont-remember) | |
2137 "Filter the whole output with REGEXP. | |
2138 The matching lines are deleted, if EXCLUDE is t. The non matching | |
2139 lines are deleted, if EXCLUDE is nil. If you call this function | |
2140 interactive, then you can give a prefix arg to set EXCLUDE to non nil. | |
2141 If DONT-REMEMBER is t, then the filter command isn't inserted | |
2142 in the `View-process-actual-sorter-and-filter' list." | |
2143 ; (interactive "sRegexp for filtering the output: \nP") | |
2144 (interactive | |
2145 (let* ((View-process-stop-motion-help t) | |
2146 (regexp (read-string | |
2147 "sRegexp for filtering the output: ")) | |
2148 (exclude current-prefix-arg)) | |
2149 (list regexp exclude))) | |
2150 (setq buffer-read-only nil) | |
2151 (View-process-filter-fields-in-region regexp | |
2152 nil | |
2153 View-process-output-start | |
2154 View-process-output-end | |
2155 exclude) | |
2156 (setq buffer-read-only t) | |
2157 (if (not dont-remember) | |
2158 (setq View-process-actual-sorter-and-filter | |
2159 (append View-process-actual-sorter-and-filter | |
2160 (list (list (if exclude 'exclude-grep 'grep) | |
2161 regexp)))))) | |
2162 | |
2163 (defun View-process-filter-region (regexp &optional exclude) | |
2164 "Filter the region with REGEXP. | |
2165 The matching lines are deleted, if EXCLUDE is t. The non matching | |
2166 lines are deleted, if EXCLUDE is nil. If you call this function | |
2167 interactive, then you can give a prefix arg to set EXCLUDE to non nil." | |
2168 ; (interactive "sRegexp for filtering the region: \nP") | |
2169 (interactive | |
2170 (let* ((View-process-stop-motion-help t) | |
2171 (regexp (read-string | |
2172 "sRegexp for filtering the region: ")) | |
2173 (exclude current-prefix-arg)) | |
2174 (list regexp exclude))) | |
2175 (setq buffer-read-only nil) | |
2176 (View-process-filter-fields-in-region | |
2177 regexp | |
2178 nil | |
2179 (save-excursion | |
2180 (goto-char (region-beginning)) | |
2181 (View-process-return-beginning-of-line)) | |
2182 (save-excursion | |
2183 (goto-char (region-end)) | |
2184 (View-process-return-end-of-line)) | |
2185 exclude) | |
2186 (setq buffer-read-only t)) | |
2187 | |
2188 (defun View-process-filter-g (&optional exclude) | |
2189 "Filters the output by the field under the point with an Regexp. | |
2190 It is a generic interface to `View-process-filter-region' | |
2191 and `View-process-filter-output'. The first will be called | |
2192 if a region is active and the other one if not. | |
2193 The matching lines are deleted, if EXCLUDE is t. The non matching | |
2194 lines are deleted, if EXCLUDE is nil. If you call this function | |
2195 interactive, then you can give a prefix arg to set EXCLUDE to non nil." | |
2196 (interactive "P") | |
2197 (setq prefix-arg current-prefix-arg) | |
2198 (if (View-process-region-active-p) | |
2199 (call-interactively 'View-process-filter-region) | |
2200 (call-interactively 'View-process-filter-output))) | |
2201 | |
2202 | |
2203 ;;; call sorter, filter or grep after running ps | |
2204 | |
2205 (defun View-process-call-sorter-and-filter (sorter-and-filter-list) | |
2206 "Call sorter, filter or grep after running ps. | |
2207 The sorter, filter or grep commands and its parameters are called | |
2208 from SORTER-AND-FILTER-LIST." | |
2209 (cond ((not sorter-and-filter-list) t) | |
2210 ((eq 'grep (car (car sorter-and-filter-list))) | |
2211 (View-process-filter-output (car (cdr (car sorter-and-filter-list))) | |
2212 nil | |
2213 t) | |
2214 (View-process-call-sorter-and-filter (cdr sorter-and-filter-list))) | |
2215 ((eq 'exclude-grep (car (car sorter-and-filter-list))) | |
2216 (View-process-filter-output (car (cdr (car sorter-and-filter-list))) | |
2217 t | |
2218 t) | |
2219 (View-process-call-sorter-and-filter (cdr sorter-and-filter-list))) | |
2220 ((eq 'sort (car (car sorter-and-filter-list))) | |
2221 (if (assoc (car (cdr (car sorter-and-filter-list))) | |
2222 View-process-field-names) | |
2223 (View-process-sort-output-by-field | |
2224 (car (cdr (car sorter-and-filter-list))) | |
2225 t)) | |
2226 (View-process-call-sorter-and-filter (cdr sorter-and-filter-list))) | |
2227 ((eq 'filter (car (car sorter-and-filter-list))) | |
2228 (if (assoc (car (cdr (car sorter-and-filter-list))) | |
2229 View-process-field-names) | |
2230 (View-process-filter-output-by-field | |
2231 (car (cdr (car sorter-and-filter-list))) | |
2232 (car (cdr (cdr (car sorter-and-filter-list)))) | |
2233 nil | |
2234 t)) | |
2235 (View-process-call-sorter-and-filter (cdr sorter-and-filter-list))) | |
2236 ((eq 'exclude-filter (car (car sorter-and-filter-list))) | |
2237 (if (assoc (car (cdr (car sorter-and-filter-list))) | |
2238 View-process-field-names) | |
2239 (View-process-filter-output-by-field | |
2240 (car (cdr (car sorter-and-filter-list))) | |
2241 (car (cdr (cdr (car sorter-and-filter-list)))) | |
2242 t | |
2243 t)) | |
2244 (View-process-call-sorter-and-filter (cdr sorter-and-filter-list))) | |
2245 ((eq 'reverse (car (car sorter-and-filter-list))) | |
2246 (View-process-reverse-output t) | |
2247 (View-process-call-sorter-and-filter (cdr sorter-and-filter-list))) | |
2248 (t (error "Filter/Sorter command not implemented!")))) | |
2249 | |
2250 | |
2251 ;;; Child processes | |
2252 | |
2253 (defun View-process-get-child-process-list-1 (pid pid-ppid-alist) | |
2254 "Internal function of `View-process-get-child-process-list'." | |
2255 (cond ((car pid-ppid-alist) | |
2256 (if (not (string= pid (cdr (car pid-ppid-alist)))) | |
2257 (View-process-get-child-process-list-1 pid (cdr pid-ppid-alist)) | |
2258 (cons (car (car pid-ppid-alist)) | |
2259 (View-process-get-child-process-list-1 pid | |
2260 (cdr pid-ppid-alist)) | |
2261 ))))) | |
2262 | |
2263 (defun View-process-get-child-process-list (pid pid-ppid-alist) | |
2264 "Returns a list with all direct childs of the processes with the PID. | |
2265 The list PID-PPID-ALIST is an alist with the pid's as car's | |
2266 and ppid's as cdr's. | |
2267 Example list: (\"0\" \"10\" \"20\") | |
2268 With \"0\" eq PID as the parent of the direct childs \"10\" and \"20\"." | |
2269 (cons pid (View-process-get-child-process-list-1 pid pid-ppid-alist))) | |
2270 | |
2271 (defun View-process-get-child-process-tree (pid) | |
2272 "Returns a list with all childs and subchilds of the processes with the PID. | |
2273 Example list: (\"0\" (\"10\") (\"20\" (\"30\" \"40\"))) | |
2274 With \"0\" eq PID as the parent of the direct childs \"10\" and \"20\" | |
2275 and with \"20\" as the parent of the direct childs \"30\" and \"40\"." | |
2276 (cons pid | |
2277 (mapcar 'View-process-get-child-process-tree | |
2278 (cdr (View-process-get-child-process-list | |
2279 pid | |
2280 (save-excursion | |
2281 (View-process-get-pid-ppid-list-from-region | |
2282 View-process-output-start | |
2283 View-process-output-end))))))) | |
2284 | |
2285 ;(defun View-process-highlight-process-tree (process-tree) | |
2286 ; "Highlights all processes in the list process-tree." | |
2287 ; (cond ((not process-tree)) | |
2288 ; ((listp (car process-tree)) | |
2289 ; (View-process-highlight-process-tree (car process-tree)) | |
2290 ; (View-process-highlight-process-tree (cdr process-tree))) | |
2291 ; ((stringp (car process-tree)) | |
2292 ; (View-process-highlight-line-with-pid (car process-tree) | |
2293 ; 'View-process-child-line-face | |
2294 ; View-process-child-line-mark) | |
2295 ; (View-process-highlight-process-tree (cdr process-tree))) | |
2296 ; (t (error "Bug in 'View-process-highlight-process-tree' !")))) | |
2297 | |
2298 ;(defun View-process-highlight-recursive-all-childs (pid) | |
2299 ; "Highlights all childs of the process with the PID." | |
2300 ; (interactive "sParent PID: ") | |
2301 ; (if (not | |
2302 ; (View-process-field-name-exists-p View-process-ppid-field-name)) | |
2303 ; (error "ERROR: No field `%s' in the output. Try `M-x ps -j' to get it." | |
2304 ; View-process-ppid-field-name) | |
2305 ; (View-process-highlight-line-with-pid pid | |
2306 ; 'View-process-parent-line-face | |
2307 ; View-process-parent-line-mark) | |
2308 ; (View-process-highlight-process-tree | |
2309 ; (cdr (View-process-get-child-process-tree pid))))) | |
2310 | |
2311 ;(defun View-process-highlight-recursive-all-childs-in-line () | |
2312 ; "Highlights all the child processes of the process in the current line." | |
2313 ; (interactive) | |
2314 ; (View-process-highlight-recursive-all-childs | |
2315 ; (View-process-get-pid-from-current-line))) | |
2316 | |
2317 ;;; kill processes | |
2318 | |
2319 (defun View-process-send-signal-to-processes-with-mark (signal) | |
2320 "Sends a SIGNAL to all processes, which are marked." | |
2321 (interactive | |
2322 (let* ((View-process-stop-motion-help t) | |
2323 (signal (completing-read "Signal: " | |
2324 View-process-kill-signals | |
2325 nil | |
2326 t | |
2327 View-process-default-kill-signal | |
2328 View-process-signal-history))) | |
2329 (list signal))) | |
2330 (if View-process-pid-mark-alist | |
2331 (View-process-call-function-on-pid-and-mark-list | |
2332 'View-process-send-signal-to-process-in-line | |
2333 View-process-pid-mark-alist | |
2334 t | |
2335 signal) | |
2336 (error "ERROR: There is no marked process!."))) | |
2337 | |
2338 (defun View-process-send-signal-to-processes-in-region (signal) | |
2339 "Sends a SIGNAL to all processes in the current region." | |
2340 (interactive | |
2341 (let* ((View-process-stop-motion-help t) | |
2342 (signal (completing-read "Signal: " | |
2343 View-process-kill-signals | |
2344 nil | |
2345 t | |
2346 View-process-default-kill-signal | |
2347 View-process-signal-history))) | |
2348 (list signal))) | |
2349 (let ((region-start (if (> (region-beginning) View-process-output-start) | |
2350 (region-beginning) | |
2351 View-process-output-start)) | |
2352 (region-end (if (< (region-end) View-process-output-end) | |
2353 (region-end) | |
2354 View-process-output-end))) | |
2355 (save-excursion | |
2356 (goto-char region-start) | |
2357 (beginning-of-line) | |
2358 (let ((pid-list (View-process-get-pid-list-from-region (point) | |
2359 region-end))) | |
2360 (View-process-send-signal-to-processes-in-pid-list signal | |
2361 pid-list | |
2362 nil | |
2363 t) | |
2364 )))) | |
2365 | |
2366 (defun View-process-send-signal-to-processes-in-pid-list (signal | |
2367 pid-list | |
2368 &optional | |
2369 dont-ask | |
2370 dont-update) | |
2371 "Sends a SIGNAL to all processes with a pid in PID-LIST. | |
2372 If DONT-ASK is non nil, then no confirmation question will be asked. | |
2373 If DONT-UPDATE is non nil, then the command `View-process-status-update' | |
2374 will not be run after sending a signal." | |
2375 (if (not pid-list) | |
2376 t | |
2377 (View-process-send-signal-to-process signal | |
2378 (car pid-list) | |
2379 dont-ask | |
2380 dont-update) | |
2381 (View-process-send-signal-to-processes-in-pid-list signal | |
2382 (cdr pid-list) | |
2383 dont-ask | |
2384 dont-update))) | |
2385 | |
2386 (defun View-process-send-signal-to-process-in-line (signal) | |
2387 "Sends a SIGNAL to the process in the current line." | |
2388 (interactive | |
2389 (let* ((View-process-stop-motion-help t) | |
2390 (signal (completing-read "Signal: " | |
2391 View-process-kill-signals | |
2392 nil | |
2393 t | |
2394 View-process-default-kill-signal | |
2395 View-process-signal-history))) | |
2396 (list signal))) | |
2397 (if (and (>= (point) View-process-output-start) | |
2398 (< (point) View-process-output-end)) | |
2399 (View-process-send-signal-to-process | |
2400 signal | |
2401 (View-process-get-pid-from-current-line) | |
2402 nil | |
2403 t))) | |
2404 | |
2405 (defun View-process-send-key-as-signal-to-processes () | |
2406 "Converts the key which invokes this command to a signal. | |
2407 After that it sends this signal to the process in the current line, | |
2408 or, if an active region exists, to all processes in the region. | |
2409 For this function only numbers could be used as keys." | |
2410 (interactive) | |
2411 (let ((signal (View-process-return-current-command-key-as-string))) | |
2412 (if (not (= 0 (string-to-int signal))) | |
2413 (if (View-process-region-active-p) | |
2414 (View-process-send-signal-to-processes-in-region signal) | |
2415 (View-process-send-signal-to-process-in-line signal)) | |
2416 (error "ERROR: This command must be bind to and call by an integer!") | |
2417 ))) | |
2418 | |
2419 (defun View-process-send-signal-to-processes-g () | |
2420 "Sends a signal to processes. | |
2421 It is a generic interface to `View-process-send-signal-to-processes-in-region' | |
2422 and `View-process-send-signal-to-process-in-line'. The first will be called | |
2423 if a region is active and the other one if not. If the region isn't | |
2424 active, but marks are set, then the function is called on every | |
2425 marked process." | |
2426 (interactive) | |
2427 (cond ((View-process-region-active-p) | |
2428 (call-interactively 'View-process-send-signal-to-processes-in-region)) | |
2429 (View-process-pid-mark-alist | |
2430 (call-interactively 'View-process-send-signal-to-processes-with-mark)) | |
2431 (t | |
2432 (call-interactively 'View-process-send-signal-to-process-in-line)))) | |
2433 | |
2434 (defun View-process-send-signal-to-process (signal | |
2435 pid | |
2436 &optional | |
2437 dont-ask | |
2438 dont-update) | |
2439 "Sends the SIGNAL to the process with the PID. | |
2440 If DONT-ASK is non nil, then no confirmation question will be asked. | |
2441 If DONT-UPDATE is non nil, then the command `View-process-status-update' | |
2442 will not be run after sending the signal." | |
2443 (interactive | |
2444 (let* ((View-process-stop-motion-help t) | |
2445 (signal (completing-read "Signal: " | |
2446 View-process-kill-signals | |
2447 nil | |
2448 t | |
2449 View-process-default-kill-signal | |
2450 View-process-signal-history)) | |
2451 (pid (int-to-string (read-number "Process Id (PID): ")))) | |
2452 (list signal pid))) | |
2453 (if (and (eq (string-to-int pid) (emacs-pid)) | |
2454 (or (not View-process-remote-host) | |
2455 (string= View-process-remote-host (getenv "HOSTNAME")))) | |
2456 (error "Hey, are you a murderer? You've just tried to kill me!") | |
2457 (let ( | |
2458 ; (signal-line-extent | |
2459 ; (View-process-highlight-line-with-pid | |
2460 ; pid | |
2461 ; 'View-process-signal-line-face | |
2462 ; View-process-signal-line-mark)) | |
2463 (signal-number (car (cdr (assoc signal View-process-kill-signals))))) | |
2464 (View-process-mark-line-with-pid pid View-process-signal-line-mark) | |
2465 (if (or dont-ask | |
2466 (if (string= signal-number signal) | |
2467 (y-or-n-p (format | |
2468 "Do you realy want to send signal %s to PID %s " | |
2469 signal | |
2470 pid)) | |
2471 (y-or-n-p | |
2472 (format "Do you realy want to send signal %s (%s) to PID %s " | |
2473 signal | |
2474 signal-number | |
2475 pid)))) | |
2476 (progn | |
2477 (if View-process-remote-host | |
2478 (call-process View-process-rsh-command | |
2479 nil | |
2480 nil | |
2481 nil | |
2482 View-process-remote-host | |
2483 (concat View-process-signal-command | |
2484 " -" | |
2485 signal-number | |
2486 " " | |
2487 pid)) | |
2488 (call-process View-process-signal-command | |
2489 nil | |
2490 nil | |
2491 nil | |
2492 (concat "-" signal-number) | |
2493 pid)) | |
2494 (if (not dont-update) | |
2495 (View-process-status-update) | |
2496 (View-process-mark-line-with-pid pid | |
2497 View-process-signaled-line-mark) | |
2498 )) | |
2499 ; (View-process-delete-extent signal-line-extent) | |
2500 (if (View-process-goto-line-with-pid pid) | |
2501 (View-process-unmark-current-line)) | |
2502 )))) | |
2503 | |
2504 | |
2505 ;;; renice processes | |
2506 | |
2507 (defun View-process-read-nice-value () | |
2508 "Reads and returns a valid nice value." | |
2509 (let ((nice-value nil) | |
2510 (min-value (if (string= (user-real-login-name) "root") -20 1)) | |
2511 (prompt "Add nice value [%d ... 20]: ")) | |
2512 (while (not nice-value) | |
2513 (setq nice-value (read-string (format prompt min-value) | |
2514 View-process-default-nice-value)) | |
2515 (if (and (string= (int-to-string (string-to-int nice-value)) | |
2516 nice-value) | |
2517 (>= (string-to-int nice-value) min-value) | |
2518 (<= (string-to-int nice-value) 20) | |
2519 (not (= (string-to-int nice-value) 0))) | |
2520 (if (> (string-to-int nice-value) 0) | |
2521 (setq nice-value | |
2522 (concat "+" (int-to-string (string-to-int nice-value))))) | |
2523 (setq nice-value nil) | |
2524 (setq prompt | |
2525 "Wrong Format! Try again. Add nice value [%d ... 20]: "))) | |
2526 nice-value)) | |
2527 | |
2528 (defun View-process-renice-process (nice-value | |
2529 pid | |
2530 &optional | |
2531 dont-ask | |
2532 dont-update) | |
2533 "Alter priority of the process with the PID. | |
2534 NICE-VALUE is the value, which will be added to the old nice value. | |
2535 If DONT-ASK is non nil, then no confirmation question will be asked. | |
2536 If DONT-UPDATE is non nil, then the command `View-process-status-update' | |
2537 will not be run after renicing." | |
2538 (interactive | |
2539 (let* ((View-process-stop-motion-help t) | |
2540 (nice-value (View-process-read-nice-value)) | |
2541 (pid (int-to-string (read-number "Process Id (PID): ")))) | |
2542 (list nice-value pid))) | |
2543 ; (let ((signal-line-extent | |
2544 ; (View-process-highlight-line-with-pid | |
2545 ; pid | |
2546 ; 'View-process-signal-line-face | |
2547 ; View-process-renice-line-mark))) | |
2548 (View-process-mark-line-with-pid pid View-process-renice-line-mark) | |
2549 (if (or dont-ask | |
2550 (y-or-n-p (format | |
2551 "Do you realy want to renice PID %s with %s " | |
2552 pid | |
2553 nice-value))) | |
2554 (progn | |
2555 (if View-process-remote-host | |
2556 (call-process View-process-rsh-command | |
2557 nil | |
2558 nil | |
2559 nil | |
2560 View-process-remote-host | |
2561 (concat View-process-renice-command | |
2562 " " | |
2563 nice-value | |
2564 " " | |
2565 pid)) | |
2566 (call-process View-process-renice-command | |
2567 nil | |
2568 nil | |
2569 nil | |
2570 nice-value | |
2571 pid)) | |
2572 (if (not dont-update) | |
2573 (View-process-status-update) | |
2574 (View-process-mark-line-with-pid pid View-process-signaled-line-mark) | |
2575 )) | |
2576 ; (View-process-delete-extent signal-line-extent) | |
2577 (if (View-process-goto-line-with-pid pid) | |
2578 (View-process-unmark-current-line)))) | |
2579 | |
2580 (defun View-process-renice-processes-with-mark (nice-value) | |
2581 "Alter priority of all processes, which are marked. | |
2582 NICE-VALUE is the value, which will be added to the old nice value." | |
2583 (interactive | |
2584 (let* ((View-process-stop-motion-help t) | |
2585 (nice-value (View-process-read-nice-value))) | |
2586 (list nice-value))) | |
2587 (if View-process-pid-mark-alist | |
2588 (View-process-call-function-on-pid-and-mark-list | |
2589 'View-process-renice-process-in-line | |
2590 View-process-pid-mark-alist | |
2591 t | |
2592 nice-value) | |
2593 (error "ERROR: There is no marked process!."))) | |
2594 | |
2595 (defun View-process-renice-processes-in-region (nice-value) | |
2596 "Alter priority of all processes in the current region. | |
2597 NICE-VALUE is the value, which will be added to the old nice value." | |
2598 (interactive | |
2599 (let* ((View-process-stop-motion-help t) | |
2600 (nice-value (View-process-read-nice-value))) | |
2601 (list nice-value))) | |
2602 (let ((region-start (if (> (region-beginning) View-process-output-start) | |
2603 (region-beginning) | |
2604 View-process-output-start)) | |
2605 (region-end (if (< (region-end) View-process-output-end) | |
2606 (region-end) | |
2607 View-process-output-end))) | |
2608 (save-excursion | |
2609 (goto-char region-start) | |
2610 (beginning-of-line) | |
2611 (let ((pid-list (View-process-get-pid-list-from-region (point) | |
2612 region-end))) | |
2613 (View-process-renice-processes-in-pid-list nice-value pid-list nil t) | |
2614 )))) | |
2615 | |
2616 (defun View-process-renice-processes-in-pid-list (nice-value | |
2617 pid-list | |
2618 &optional | |
2619 dont-ask | |
2620 dont-update) | |
2621 "Alter priority all processes with a pid in PID-LIST. | |
2622 NICE-VALUE is the value, which will be added to the old nice value. | |
2623 If DONT-ASK is non nil, then no confirmation question will be asked. | |
2624 If DONT-UPDATE is non nil, then the command `View-process-status-update' | |
2625 will not be run after renicing" | |
2626 (if (not pid-list) | |
2627 t | |
2628 (View-process-renice-process nice-value | |
2629 (car pid-list) | |
2630 dont-ask | |
2631 dont-update) | |
2632 (View-process-renice-processes-in-pid-list nice-value | |
2633 (cdr pid-list) | |
2634 dont-ask | |
2635 dont-update))) | |
2636 | |
2637 (defun View-process-renice-process-in-line (nice-value) | |
2638 "Alter priority of to the process in the current line. | |
2639 NICE-VALUE is the value, which will be added to the old nice value." | |
2640 (interactive | |
2641 (let* ((View-process-stop-motion-help t) | |
2642 (nice-value (View-process-read-nice-value))) | |
2643 (list nice-value))) | |
2644 (if (and (>= (point) View-process-output-start) | |
2645 (< (point) View-process-output-end)) | |
2646 (View-process-renice-process | |
2647 nice-value | |
2648 (View-process-get-pid-from-current-line) | |
2649 nil | |
2650 t))) | |
2651 | |
2652 (defun View-process-renice-processes-g () | |
2653 "Alter priority of processes. | |
2654 It is a generic interface to `View-process-renice-processes-in-region' | |
2655 and `View-process-renice-process-in-line'. The first will be called | |
2656 if a region is active and the other one if not. If the region isn't | |
2657 active, but marks are set, then the function is called on every | |
2658 marked process." | |
2659 (interactive) | |
2660 (cond ((View-process-region-active-p) | |
2661 (call-interactively 'View-process-renice-processes-in-region)) | |
2662 (View-process-pid-mark-alist | |
2663 (call-interactively 'View-process-renice-processes-with-mark)) | |
2664 (t | |
2665 (call-interactively 'View-process-renice-process-in-line)))) | |
2666 | |
2667 | |
2668 ;;; Returning field values | |
2669 | |
2670 (defun View-process-get-pid-from-current-line () | |
2671 "Returns a string with the pid of the process in the current line." | |
2672 (View-process-get-field-value-from-current-line | |
2673 (View-process-translate-field-name-to-position View-process-pid-field-name) | |
2674 View-process-max-fields) | |
2675 ) | |
2676 | |
2677 (defun View-process-get-ppid-from-current-line () | |
2678 "Returns a string with the ppid of the process in the current line." | |
2679 (View-process-get-field-value-from-current-line | |
2680 (View-process-translate-field-name-to-position View-process-ppid-field-name) | |
2681 View-process-max-fields) | |
2682 ) | |
2683 | |
2684 (defun View-process-get-pid-list-from-region (begin end) | |
2685 "Returns a list with all PID's in the region from BEGIN to END." | |
2686 (goto-char begin) | |
2687 (if (>= (point) end) | |
2688 nil | |
2689 (cons (View-process-get-pid-from-current-line) | |
2690 (progn (forward-line) | |
2691 (View-process-get-pid-list-from-region (point) end))))) | |
2692 | |
2693 (defun View-process-get-pid-ppid-list-from-region (begin end) | |
2694 "Returns a list with all PID's ant its PPID's in the region | |
2695 from BEGIN to END. END must be greater than BEGIN." | |
2696 (goto-char begin) | |
2697 (if (>= (point) end) | |
2698 nil | |
2699 (cons (cons (View-process-get-pid-from-current-line) | |
2700 (View-process-get-ppid-from-current-line)) | |
2701 (progn (forward-line) | |
2702 (View-process-get-pid-ppid-list-from-region (point) end))))) | |
2703 | |
2704 (defun View-process-get-field-value-from-current-line (field-no max-fields) | |
2705 "Returns the value of the field FIELD-NO from the current line as string. | |
2706 If the FIELD-NO is >= max-fields, then the rest of the line after the | |
2707 start of the field FIELD-NO will be returned." | |
2708 (save-excursion | |
2709 (View-process-jump-to-field field-no max-fields) | |
2710 (if (>= field-no max-fields) | |
2711 (buffer-substring (point) (View-process-return-end-of-line)) | |
2712 (current-word))) | |
2713 ) | |
2714 | |
2715 (defun View-process-jump-to-field (field-no max-fields) | |
2716 "Sets the point at the start of field FIELD-NO in the current line. | |
2717 MAX_FIELDS is used instead of FIELD-NO, if FIELD-NO > MAX_FIELDS." | |
2718 (View-process-replaces-blanks-in-fields-if-necessary) | |
2719 (beginning-of-line) | |
2720 (skip-chars-forward " ") | |
2721 (if (< field-no 1) | |
2722 (error "Parameter FIELD-NO must be >= 1")) | |
2723 (if (> field-no max-fields) | |
2724 (setq field-no max-fields)) | |
2725 (if (= field-no 1) | |
2726 (point) | |
2727 (skip-chars-forward "^ ") | |
2728 (skip-chars-forward " ") | |
2729 (View-process-jump-to-field-1 (1- field-no)))) | |
2730 | |
2731 (defun View-process-jump-to-field-1 (field-no) | |
2732 "Internal function of View-process-jump-to-field" | |
2733 (if (= field-no 1) | |
2734 (point) | |
2735 (skip-chars-forward "^ ") | |
2736 (skip-chars-forward " ") | |
2737 (View-process-jump-to-field-1 (1- field-no)))) | |
2738 | |
2739 | |
2740 (defun View-process-display-emacs-pid () | |
2741 "Sets the point to the line with the emacs process." | |
2742 (interactive) | |
2743 (message (format "This emacs has the PID `%d'!" (emacs-pid)))) | |
2744 | |
2745 | |
2746 ;;; mouse functions | |
2747 | |
2748 (defun View-process-mouse-kill (event) | |
2749 "Function for kill a process with the mouse." | |
2750 (interactive "e") | |
2751 (mouse-set-point event) | |
2752 (View-process-send-signal-to-process-in-line "SIGTERM")) | |
2753 | |
2754 | |
2755 ;;; Highlighting functions | |
2756 | |
2757 (defun View-process-highlight-current-line (face) | |
2758 "Highlights the current line with the FACE." | |
2759 (let ((read-only buffer-read-only)) | |
2760 (setq buffer-read-only nil) | |
2761 (let ((extent (make-extent (View-process-return-beginning-of-line) | |
2762 (View-process-return-end-of-line)))) | |
2763 (set-extent-face extent face) | |
2764 (setq buffer-read-only read-only) | |
2765 extent) | |
2766 )) | |
2767 | |
2768 (defun View-process-goto-line-with-pid (pid) | |
2769 "Sets the point in the line with the PID. | |
2770 It returns nil, if there is no line with the PID in the output." | |
2771 (if (string= pid (View-process-get-pid-from-current-line)) | |
2772 t | |
2773 (goto-char View-process-output-start) | |
2774 (while (and (< (point) View-process-output-end) | |
2775 (not (string= pid (View-process-get-pid-from-current-line)))) | |
2776 (forward-line)) | |
2777 (< (point) View-process-output-end))) | |
2778 | |
2779 ;(defun View-process-highlight-line-with-pid (pid face mark) | |
2780 ; "Highlights the line with the PID with the FACE and sets the MARK. | |
2781 ;It returns the extent of the line." | |
2782 ; (save-excursion | |
2783 ; (View-process-goto-line-with-pid pid) | |
2784 ; (View-process-set-mark-in-current-line mark) | |
2785 ; (View-process-save-pid-and-mark pid mark) | |
2786 ; (View-process-highlight-current-line face) | |
2787 ; )) | |
2788 | |
2789 ;(defun View-process-delete-extent (extent) | |
2790 ; "Deletes the extent EXTENT." | |
2791 ; (let ((read-only buffer-read-only)) | |
2792 ; (save-excursion | |
2793 ; (goto-char (extent-start-position extent)) | |
2794 ; (View-process-set-mark-in-current-line View-process-no-mark) | |
2795 ; (setq buffer-read-only nil) | |
2796 ; (delete-extent extent) | |
2797 ; (setq buffer-read-only read-only)))) | |
2798 | |
2799 ;;; mark functions | |
2800 | |
2801 (defun View-process-save-pid-and-mark (pid mark) | |
2802 "Saves the PID and the MARK in a special alist. | |
2803 The name of the alist is `View-process-pid-mark-alist'." | |
2804 (if (assoc pid View-process-pid-mark-alist) | |
2805 (setcdr (assoc pid View-process-pid-mark-alist) (list mark )) | |
2806 (setq View-process-pid-mark-alist | |
2807 (cons (list pid mark) View-process-pid-mark-alist)))) | |
2808 | |
2809 (defun View-process-remove-pid-and-mark-1 (pid pid-mark-alist) | |
2810 "Internal function of `View-process-remove-pid-and-mark'." | |
2811 (cond ((not pid-mark-alist) | |
2812 nil) | |
2813 ((string= pid (car (car pid-mark-alist))) | |
2814 (View-process-remove-pid-and-mark-1 pid (cdr pid-mark-alist))) | |
2815 (t | |
2816 (cons (car pid-mark-alist) | |
2817 (View-process-remove-pid-and-mark-1 pid (cdr pid-mark-alist))) | |
2818 ))) | |
2819 | |
2820 (defun View-process-remove-pid-and-mark (pid) | |
2821 "Removes the PID from the alist `View-process-pid-mark-alist'." | |
2822 (setq View-process-pid-mark-alist | |
2823 (View-process-remove-pid-and-mark-1 pid View-process-pid-mark-alist)) | |
2824 ) | |
2825 | |
2826 (defun View-process-set-mark-in-current-line (mark) | |
2827 "Sets the MARK at the start of the current line." | |
2828 (let ((buffer-read-only nil)) | |
2829 (save-excursion | |
2830 (beginning-of-line) | |
2831 (delete-char 1) | |
2832 (insert mark)))) | |
2833 | |
2834 (defun View-process-mark-line-with-pid (pid &optional mark) | |
2835 "Sets the MARK in the line with the PID. | |
2836 It uses the 'View-process-single-line-mark', if mark is nil." | |
2837 ; (interactive "sPID: ") | |
2838 (interactive (let ((View-process-stop-motion-help t)) | |
2839 (list (read-string "PID: ")))) | |
2840 (save-excursion | |
2841 (View-process-goto-line-with-pid pid) | |
2842 (View-process-set-mark-in-current-line (or mark | |
2843 View-process-single-line-mark)) | |
2844 (View-process-save-pid-and-mark pid | |
2845 (or mark | |
2846 View-process-single-line-mark)) | |
2847 )) | |
2848 | |
2849 (defun View-process-mark-current-line (&optional mark) | |
2850 "Sets a mark in the current line. | |
2851 It uses the 'View-process-single-line-mark' if MARK is nil." | |
2852 (interactive) | |
2853 (if (or (< (point) View-process-output-start) | |
2854 (> (point) View-process-output-end)) | |
2855 (error "ERROR: Not in a process line!") | |
2856 (View-process-set-mark-in-current-line (or mark | |
2857 View-process-single-line-mark)) | |
2858 (View-process-save-pid-and-mark (View-process-get-pid-from-current-line) | |
2859 (or mark | |
2860 View-process-single-line-mark)))) | |
2861 | |
2862 | |
2863 (defun View-process-unmark-current-line () | |
2864 "Unsets a mark in the current line." | |
2865 (interactive) | |
2866 (if (and (>= (point) View-process-output-start) | |
2867 (<= (point) View-process-output-end)) | |
2868 (progn | |
2869 (View-process-remove-pid-and-mark | |
2870 (View-process-get-pid-from-current-line)) | |
2871 (View-process-set-mark-in-current-line View-process-no-mark) | |
2872 ) | |
2873 (error "ERROR: Not in a process line!"))) | |
2874 | |
2875 (defun View-process-mark-process-tree (process-tree) | |
2876 "Marks all processes in the list process-tree." | |
2877 (cond ((not process-tree)) | |
2878 ((listp (car process-tree)) | |
2879 (View-process-mark-process-tree (car process-tree)) | |
2880 (View-process-mark-process-tree (cdr process-tree))) | |
2881 ((stringp (car process-tree)) | |
2882 (View-process-mark-line-with-pid (car process-tree) | |
2883 View-process-child-line-mark) | |
2884 (View-process-mark-process-tree (cdr process-tree))) | |
2885 (t (error "Bug in 'View-process-mark-process-tree' !")))) | |
2886 | |
2887 (defun View-process-mark-childs (pid) | |
2888 "Marks all childs of the process with the PID." | |
2889 ; (interactive "sParent PID: ") | |
2890 (interactive (let ((View-process-stop-motion-help t)) | |
2891 (list (read-string "Parent PID: ")))) | |
2892 (if (not | |
2893 (View-process-field-name-exists-p View-process-ppid-field-name)) | |
2894 (error "ERROR: No field `%s' in the output. Try `M-x ps -j' to get it." | |
2895 View-process-ppid-field-name) | |
2896 (View-process-mark-line-with-pid pid View-process-parent-line-mark) | |
2897 (View-process-mark-process-tree | |
2898 (cdr (View-process-get-child-process-tree pid))))) | |
2899 | |
2900 (defun View-process-mark-childs-in-current-line () | |
2901 "Marks all the child processes of the process in the current line." | |
2902 (interactive) | |
2903 (View-process-mark-childs | |
2904 (View-process-get-pid-from-current-line))) | |
2905 | |
2906 (defun View-process-call-function-on-pid-and-mark-list (function | |
2907 pid-mark-alist | |
2908 &optional | |
2909 not-interactive | |
2910 &rest | |
2911 non-interactive-args) | |
2912 "Calls the FUNCTION on every process in the PID-MARK-ALIST. | |
2913 FUNCTION must be an interactive function, which works on the | |
2914 process in the current line, if INTERACTIVE is nil. | |
2915 If INTERACTIVE is t, then the function will be called non interactive | |
2916 with the NON-INTERACTIVE-ARGS." | |
2917 (cond ((not pid-mark-alist)) | |
2918 ((View-process-goto-line-with-pid (car (car pid-mark-alist))) | |
2919 (if not-interactive | |
2920 (eval (cons function non-interactive-args)) | |
2921 (call-interactively function)) | |
2922 (eval (append (list 'View-process-call-function-on-pid-and-mark-list | |
2923 'function | |
2924 '(cdr pid-mark-alist) | |
2925 'not-interactive) | |
2926 non-interactive-args))) | |
2927 (t | |
2928 (eval (append (list 'View-process-call-function-on-pid-and-mark-list | |
2929 'function | |
2930 '(cdr pid-mark-alist) | |
2931 'not-interactive) | |
2932 non-interactive-args))) | |
2933 )) | |
2934 | |
2935 (defun View-process-set-marks-from-pid-mark-alist (pid-mark-alist) | |
2936 "Sets the marks of the PID-MARK-ALIST to the pids of the PID-MARK-ALIST." | |
2937 (cond ((not pid-mark-alist)) | |
2938 ((View-process-goto-line-with-pid (car (car pid-mark-alist))) | |
2939 (View-process-mark-current-line (car (cdr (car pid-mark-alist)))) | |
2940 (View-process-set-marks-from-pid-mark-alist (cdr pid-mark-alist))) | |
2941 (t | |
2942 (View-process-set-marks-from-pid-mark-alist (cdr pid-mark-alist))))) | |
2943 | |
2944 (defun View-process-reset-last-marks () | |
2945 "Resets the last marks." | |
2946 (interactive) | |
2947 (View-process-set-marks-from-pid-mark-alist View-process-last-pid-mark-alist) | |
2948 ) | |
2949 | |
2950 (defun View-process-unmark-all () | |
2951 "Unmarks all processes." | |
2952 (interactive) | |
2953 (View-process-call-function-on-pid-and-mark-list | |
2954 'View-process-unmark-current-line | |
2955 View-process-pid-mark-alist | |
2956 t)) | |
2957 | |
2958 | |
2959 ;;; commands to moving around in a ps buffer | |
2960 | |
2961 (defun View-process-output-start () | |
2962 "Set point to the first field after the output start." | |
2963 (interactive) | |
2964 (goto-char View-process-output-start) | |
2965 (skip-chars-forward " ")) | |
2966 | |
2967 (defun View-process-output-end () | |
2968 "Set point to the first field before the output end." | |
2969 (interactive) | |
2970 (goto-char View-process-output-end) | |
2971 (skip-chars-backward " ") | |
2972 (skip-chars-backward "^ ")) | |
2973 | |
2974 (defun View-process-next-field () | |
2975 "Moves forward one field." | |
2976 (interactive) | |
2977 (if (< (point) View-process-output-start) | |
2978 (View-process-output-start) | |
2979 (skip-chars-forward " ") | |
2980 (if (< (point) View-process-output-end) | |
2981 (if (= View-process-max-fields (View-process-current-field-number)) | |
2982 (progn | |
2983 (forward-line) | |
2984 (skip-chars-forward " ") | |
2985 (if (>= (point) View-process-output-end) | |
2986 (progn | |
2987 (goto-char View-process-output-start) | |
2988 (skip-chars-forward " ")))) | |
2989 (skip-chars-forward "^ ") | |
2990 (skip-chars-forward " ") | |
2991 ) | |
2992 (goto-char View-process-output-start) | |
2993 (skip-chars-forward " ")))) | |
2994 | |
2995 (defun View-process-previous-field () | |
2996 "Moves backward one field." | |
2997 (interactive) | |
2998 (skip-chars-backward " ") | |
2999 (backward-char) | |
3000 (if (> (point) View-process-output-start) | |
3001 (if (= View-process-max-fields (View-process-current-field-number)) | |
3002 (View-process-jump-to-field View-process-max-fields | |
3003 View-process-max-fields) | |
3004 (skip-chars-backward "^ \n") | |
3005 (if (< (point) View-process-output-start) | |
3006 (progn | |
3007 (goto-char View-process-output-end) | |
3008 (forward-line -1) | |
3009 (View-process-jump-to-field View-process-max-fields | |
3010 View-process-max-fields)))) | |
3011 (goto-char View-process-output-end) | |
3012 (forward-line -1) | |
3013 (View-process-jump-to-field View-process-max-fields | |
3014 View-process-max-fields))) | |
3015 | |
3016 (defun View-process-goto-first-field-next-line () | |
3017 "Set point to the first field in the next line." | |
3018 (interactive) | |
3019 (if (< (point) View-process-output-start) | |
3020 (View-process-output-start) | |
3021 (forward-line) | |
3022 (if (>= (point) View-process-output-end) | |
3023 (View-process-output-start) | |
3024 (View-process-jump-to-field 1 View-process-max-fields)))) | |
3025 | |
3026 | |
3027 ;;; buffer renaming | |
3028 | |
3029 (defun View-process-rename-current-output-buffer (new-buffer-name) | |
3030 "Renames the ps output buffer to NEW-BUFFER-NAME." | |
3031 (interactive | |
3032 (let ((View-process-stop-motion-help t)) | |
3033 (list | |
3034 (read-string "New PS output buffer name: " | |
3035 (generate-new-buffer-name | |
3036 (concat "*ps-" | |
3037 (or View-process-remote-host | |
3038 (getenv "HOSTNAME")) | |
3039 "*")))))) | |
3040 (if (not (string= mode-name View-process-mode-name)) | |
3041 (error "ERROR: Not in a View-process-mode buffer!") | |
3042 (if (get-buffer new-buffer-name) | |
3043 (error "ERROR: Buffer %s exists!" new-buffer-name) | |
3044 (rename-buffer new-buffer-name) | |
3045 (setq View-process-buffer-name new-buffer-name) | |
3046 (if (or View-process-display-with-2-windows | |
3047 (get-buffer View-process-header-buffer-name)) | |
3048 (let ((new-header-buffer-name | |
3049 (generate-new-buffer-name | |
3050 (concat (substring new-buffer-name 0 -1) | |
3051 " header*"))) | |
3052 (buffer (current-buffer))) | |
3053 (set-buffer View-process-header-buffer-name) | |
3054 (rename-buffer new-header-buffer-name) | |
3055 (set-buffer buffer) | |
3056 (setq View-process-header-buffer-name new-header-buffer-name)) | |
3057 )))) | |
3058 | |
3059 ;;; For newer versions of field.el | |
3060 (if (not (fboundp 'sort-float-fields)) | |
3061 (defalias 'sort-float-fields 'sort-numeric-fields)) | |
3062 | |
3063 | |
3064 ;;; Display Functions | |
3065 | |
3066 (defun View-process-header-mode () | |
3067 "The mode of the buffer with the view process header." | |
3068 (set-syntax-table View-process-mode-syntax-table) | |
3069 (setq major-mode 'View-process-header-mode | |
3070 mode-name View-process-header-mode-name) | |
3071 (setq truncate-lines View-process-truncate-lines) | |
3072 ; (setq buffer-modeline (not View-process-header-mode-line-off)) | |
3073 (view-process-switch-buffer-modeline (not View-process-header-mode-line-off)) | |
3074 (run-hooks 'View-process-header-mode-hook) | |
3075 ) | |
3076 | |
3077 (defun View-process-top-window-p (&optional window) | |
3078 "Returns t, if the WINDOW is the top one. | |
3079 If WINDOW is nil, then the current window is tested." | |
3080 (eq 0 (car (cdr (window-pixel-edges window))))) | |
3081 | |
3082 (defun View-process-change-display-type (display-with-2-windows) | |
3083 "If DISPLAY-WITH-2-WINDOWS is non nil, then a 2 windows display is used." | |
3084 (if display-with-2-windows | |
3085 (let ((window-size View-process-ps-header-window-size)) | |
3086 (cond ((eq (count-windows 'NO-MINI) 1) | |
3087 ;; split window | |
3088 (split-window nil window-size) | |
3089 (select-window (next-window nil 'no-minibuf)) | |
3090 ) | |
3091 ((= (count-windows 'NO-MINI) 2) | |
3092 (if (View-process-top-window-p) | |
3093 (progn | |
3094 ;; delete other windows | |
3095 (delete-other-windows) | |
3096 ;; split window | |
3097 (split-window nil window-size)) | |
3098 (select-window (next-window nil 'no-minibuf)) | |
3099 ; (shrink-window (- (window-height) window-size)) | |
3100 ) | |
3101 (select-window (next-window nil 'no-minibuf)) | |
3102 ) | |
3103 ((> (count-windows 'NO-MINI) 2) | |
3104 ;; delete other windows | |
3105 (delete-other-windows) | |
3106 ;; split window | |
3107 (split-window nil window-size) | |
3108 (select-window (next-window nil 'no-minibuf)) | |
3109 )) | |
3110 ;; copy header lines | |
3111 (let ((header-lines (buffer-substring (point-min) | |
3112 View-process-header-end)) | |
3113 (buffer (get-buffer-create View-process-header-buffer-name))) | |
3114 (select-window (next-window nil 'no-minibuf)) | |
3115 ;; load *ps-header* buffer in window | |
3116 (set-window-buffer (get-buffer-window (current-buffer)) buffer) | |
3117 (setq buffer-read-only nil) | |
3118 (erase-buffer) | |
3119 ;; insert header lines | |
3120 (insert header-lines) | |
3121 (setq buffer-read-only t) | |
3122 (goto-char (point-min)) | |
3123 (View-process-header-mode) | |
3124 (if (not (= (window-height) window-size)) | |
3125 (shrink-window (- (window-height) window-size))) | |
3126 (select-window (next-window nil 'no-minibuf)) | |
3127 )) | |
3128 (let ((header-buffer (get-buffer View-process-header-buffer-name))) | |
3129 (if header-buffer | |
3130 (progn | |
3131 (if (get-buffer-window header-buffer) | |
3132 (delete-window (get-buffer-window header-buffer))) | |
3133 (kill-buffer header-buffer)))))) | |
3134 | |
3135 (defun View-process-toggle-display-with-2-windows (&optional arg) | |
3136 "Change whether the view process output is displayed with two windows. | |
3137 With ARG, set `View-process-display-with-2-windows' to t, if ARG is | |
3138 positive. ARG is a prefix arg." | |
3139 (interactive "P") | |
3140 (if arg | |
3141 (if (>= (prefix-numeric-value arg) 0) | |
3142 (setq View-process-display-with-2-windows t) | |
3143 (setq View-process-display-with-2-windows nil)) | |
3144 (if View-process-display-with-2-windows | |
3145 (setq View-process-display-with-2-windows nil) | |
3146 (setq View-process-display-with-2-windows t))) | |
3147 (View-process-change-display-type View-process-display-with-2-windows) | |
3148 (if View-process-display-with-2-windows | |
3149 (View-process-toggle-hide-header '(1)) | |
3150 (View-process-toggle-hide-header '(-1)))) | |
3151 | |
3152 (defun View-process-save-old-window-configuration () | |
3153 "Saves the window configuration before the first call of view process." | |
3154 (if (not View-process-old-window-configuration) | |
3155 (setq View-process-old-window-configuration | |
3156 (current-window-configuration)) | |
3157 )) | |
3158 | |
3159 (defun View-process-hide-header (hide-header) | |
3160 "Hides the header lines in the view processes buffer, if HIDE-HEADER is t." | |
3161 (if hide-header | |
3162 (if (<= View-process-output-start (point-max)) | |
3163 (narrow-to-region View-process-output-start (point-max)) | |
3164 (narrow-to-region (point-max) (point-max))) | |
3165 (widen))) | |
3166 | |
3167 (defun View-process-toggle-hide-header (&optional arg) | |
3168 "Change whether the header are hided. | |
3169 With ARG, set `View-process-hide-header' to t, if ARG is positive. | |
3170 ARG is a prefix arg." | |
3171 (interactive "P") | |
3172 (if arg | |
3173 (if (>= (prefix-numeric-value arg) 0) | |
3174 (setq View-process-hide-header t) | |
3175 (setq View-process-hide-header nil)) | |
3176 (if View-process-hide-header | |
3177 (setq View-process-hide-header nil) | |
3178 (setq View-process-hide-header t))) | |
3179 (View-process-hide-header View-process-hide-header)) | |
3180 | |
3181 ;;; Misc. commands | |
3182 | |
3183 (defun View-process-quit () | |
3184 "Kills the *ps* buffer." | |
3185 (interactive) | |
3186 (if (y-or-n-p | |
3187 "Do you want really want to quit the view process mode? ") | |
3188 (progn | |
3189 (if (get-buffer View-process-buffer-name) | |
3190 (kill-buffer View-process-buffer-name)) | |
3191 (if (or View-process-display-with-2-windows | |
3192 (get-buffer View-process-header-buffer-name)) | |
3193 (kill-buffer View-process-header-buffer-name)) | |
3194 (set-window-configuration View-process-old-window-configuration) | |
3195 (setq View-process-old-window-configuration nil) | |
3196 ))) | |
3197 | |
3198 (defun View-process-submit-bug-report () | |
3199 "Submit via mail a bug report on View-process-mode." | |
3200 (interactive) | |
3201 (require 'reporter) | |
3202 (let ((bsd-or-system-v (View-process-bsd-or-system-v))) | |
3203 (reporter-submit-bug-report | |
3204 View-process-package-maintainer | |
3205 (concat View-process-package-name " " View-process-package-version) | |
3206 (list 'emacs-version | |
3207 'major-mode | |
3208 'View-process-buffer-name | |
3209 'View-process-header-buffer-name | |
3210 'View-process-sorter-and-filter | |
3211 'View-process-actual-sorter-and-filter | |
3212 'View-process-display-with-2-windows | |
3213 'View-process-hide-header | |
3214 'View-process-truncate-lines | |
3215 'View-process-motion-help | |
3216 'View-process-old-window-configuration | |
3217 'View-process-field-names | |
3218 'View-process-max-fields | |
3219 'View-process-output-start | |
3220 'View-process-output-end | |
3221 'View-process-header-start | |
3222 'View-process-header-end | |
3223 'View-process-host-names-and-system-types | |
3224 'View-process-remote-host | |
3225 'View-process-system-type | |
3226 'bsd-or-system-v | |
3227 'View-process-rsh-command | |
3228 'View-process-signal-command | |
3229 'View-process-status-command-switches-bsd | |
3230 'View-process-status-command-switches-system-v | |
3231 'View-process-status-last-command-switches | |
3232 'View-process-status-command | |
3233 'View-process-test-command | |
3234 'View-process-test-switches | |
3235 'View-process-uname-command | |
3236 'View-process-uname-switches | |
3237 ) | |
3238 nil | |
3239 nil | |
3240 (concat | |
3241 "If it is possible, you should send this bug report from the buffer\n" | |
3242 "with the view process mode. Please answer the following questions.\n" | |
3243 "Which is the name of your system? \n" | |
3244 "Is your system a BSD Unix? \n" | |
3245 "Is your system a System V Unix? \n" | |
3246 "Describe your bug: " | |
3247 )))) | |
3248 | |
3249 (defun View-process-display-version () | |
3250 "Displays the current version of the mode." | |
3251 (interactive) | |
3252 (message "View Process Mode, %s, Author: Heiko Münkel." | |
3253 View-process-package-version)) | |
3254 | |
3255 (defun View-process-toggle-truncate-lines (&optional arg) | |
3256 "Change whether the lines in this buffer are truncated. | |
3257 With ARG, set `truncate-lines' to t, if ARG is positive. | |
3258 ARG is a prefix arg. | |
3259 It saves also the state of `truncate-lines' for the next | |
3260 view process command in `View-process-truncate-lines'. | |
3261 It truncates also the lines in the view process header buffer, | |
3262 if it is run in a view process mode buffer." | |
3263 (interactive "P") | |
3264 (if arg | |
3265 (if (>= (prefix-numeric-value arg) 0) | |
3266 (setq truncate-lines t) | |
3267 (setq truncate-lines nil)) | |
3268 (if truncate-lines | |
3269 (setq truncate-lines nil) | |
3270 (setq truncate-lines t))) | |
3271 (setq View-process-truncate-lines truncate-lines) | |
3272 (setq-default View-process-truncate-lines truncate-lines) | |
3273 (if (and (eq major-mode 'View-process-mode) | |
3274 (or View-process-display-with-2-windows | |
3275 (get-buffer View-process-header-buffer-name))) | |
3276 (let ((buffer (current-buffer)) | |
3277 (truncate truncate-lines)) | |
3278 (set-buffer View-process-header-buffer-name) | |
3279 (setq truncate-lines truncate) | |
3280 (set-buffer buffer)))) | |
3281 | |
3282 (defun View-process-return-beginning-of-line () | |
3283 "Returns the beginning of the current line. | |
3284 The point isn't changed." | |
3285 (save-excursion | |
3286 (beginning-of-line) | |
3287 (point))) | |
3288 | |
3289 (defun View-process-return-end-of-line () | |
3290 "Returns the end of the current line. | |
3291 The point isn't changed." | |
3292 (save-excursion | |
3293 (end-of-line) | |
3294 (point))) | |
3295 | |
3296 (defun View-process-assoc-2th (key list) | |
3297 "Return non-nil if KEY is `equal' to the 2th of an element of LIST. | |
3298 The value is actually the element of LIST whose 2th is KEY." | |
3299 (cond ((not list) nil) | |
3300 ((equal (car (cdr (car list))) key) (car list)) | |
3301 (t (View-process-assoc-2th key (cdr list))))) | |
3302 | |
3303 | |
3304 (defun View-process-replace-in-string (from-string | |
3305 to-string | |
3306 in-string | |
3307 &optional start) | |
3308 "Replace FROM-STRING with TO-STRING in IN-STRING. | |
3309 The optional argument START set the start position > 0. | |
3310 FROM-STRING is a regular expression." | |
3311 (setq start (or start 0)) | |
3312 (let ((start-of-from-string (string-match from-string in-string start))) | |
3313 (if start-of-from-string | |
3314 (concat (substring in-string start start-of-from-string) | |
3315 to-string | |
3316 (View-process-replace-in-string from-string | |
3317 to-string | |
3318 in-string | |
3319 (match-end 0))) | |
3320 (substring in-string start)))) | |
3321 | |
3322 | |
3323 (defun View-process-toggle-digit-bindings (&optional arg) | |
3324 "Change whether the digit keys sends signals to the processes. | |
3325 With ARG, set `View-process-digit-bindings-send-signal' to t, | |
3326 if ARG is positive. ARG is a prefix arg." | |
3327 (interactive "P") | |
3328 (if arg | |
3329 (if (>= (prefix-numeric-value arg) 0) | |
3330 (setq View-process-digit-bindings-send-signal t) | |
3331 (setq View-process-digit-bindings-send-signal nil)) | |
3332 (if View-process-digit-bindings-send-signal | |
3333 (setq View-process-digit-bindings-send-signal nil) | |
3334 (setq View-process-digit-bindings-send-signal t))) | |
3335 (if View-process-digit-bindings-send-signal | |
3336 (progn | |
3337 (define-key View-process-mode-map "0" | |
3338 'undefined) | |
3339 (define-key View-process-mode-map "1" | |
3340 'View-process-send-key-as-signal-to-processes) | |
3341 (define-key View-process-mode-map "2" | |
3342 'View-process-send-key-as-signal-to-processes) | |
3343 (define-key View-process-mode-map "3" | |
3344 'View-process-send-key-as-signal-to-processes) | |
3345 (define-key View-process-mode-map "4" | |
3346 'View-process-send-key-as-signal-to-processes) | |
3347 (define-key View-process-mode-map "5" | |
3348 'View-process-send-key-as-signal-to-processes) | |
3349 (define-key View-process-mode-map "6" | |
3350 'View-process-send-key-as-signal-to-processes) | |
3351 (define-key View-process-mode-map "7" | |
3352 'View-process-send-key-as-signal-to-processes) | |
3353 (define-key View-process-mode-map "8" | |
3354 'View-process-send-key-as-signal-to-processes) | |
3355 (define-key View-process-mode-map "9" | |
3356 'View-process-send-key-as-signal-to-processes) | |
3357 ) | |
3358 (define-key View-process-mode-map "0" | |
3359 'digit-argument) | |
3360 (define-key View-process-mode-map "1" | |
3361 'digit-argument) | |
3362 (define-key View-process-mode-map "2" | |
3363 'digit-argument) | |
3364 (define-key View-process-mode-map "3" | |
3365 'digit-argument) | |
3366 (define-key View-process-mode-map "4" | |
3367 'digit-argument) | |
3368 (define-key View-process-mode-map "5" | |
3369 'digit-argument) | |
3370 (define-key View-process-mode-map "6" | |
3371 'digit-argument) | |
3372 (define-key View-process-mode-map "7" | |
3373 'digit-argument) | |
3374 (define-key View-process-mode-map "8" | |
3375 'digit-argument) | |
3376 (define-key View-process-mode-map "9" | |
3377 'digit-argument) | |
3378 )) | |
3379 | |
3380 (if View-process-digit-bindings-send-signal | |
3381 (View-process-toggle-digit-bindings 1) | |
3382 (View-process-toggle-digit-bindings -1)) | |
3383 | |
3384 (defun View-process-revert-buffer (&optional ignore-auto noconfirm) | |
3385 "Updates the view-process buffer with `View-process-status-update'." | |
3386 (View-process-status-update)) | |
3387 | |
3388 | |
3389 ;;; Emacs version specific stuff | |
3390 | |
3391 (if (View-process-xemacs-p) | |
3392 (require 'view-process-xemacs) | |
3393 (require 'view-process-emacs-19)) | |
3394 | |
3395 | |
3396 ;;; face setting | |
3397 | |
3398 (if (facep 'View-process-child-line-face) | |
3399 nil | |
3400 (make-face 'View-process-child-line-face) | |
3401 (if (View-process-search-color View-process-child-line-foreground) | |
3402 (set-face-foreground 'View-process-child-line-face | |
3403 (View-process-search-color | |
3404 View-process-child-line-foreground))) | |
3405 (if (View-process-search-color View-process-child-line-background) | |
3406 (set-face-background 'View-process-child-line-face | |
3407 (View-process-search-color | |
3408 View-process-child-line-background))) | |
3409 (set-face-font 'View-process-child-line-face | |
3410 View-process-child-line-font) | |
3411 (set-face-underline-p 'View-process-child-line-face | |
3412 View-process-child-line-underline-p)) | |
3413 | |
3414 (if (facep 'View-process-parent-line-face) | |
3415 nil | |
3416 (make-face 'View-process-parent-line-face) | |
3417 (if (View-process-search-color View-process-parent-line-foreground) | |
3418 (set-face-foreground 'View-process-parent-line-face | |
3419 (View-process-search-color | |
3420 View-process-parent-line-foreground))) | |
3421 (if (View-process-search-color View-process-parent-line-background) | |
3422 (set-face-background 'View-process-parent-line-face | |
3423 (View-process-search-color | |
3424 View-process-parent-line-background))) | |
3425 (set-face-font 'View-process-parent-line-face | |
3426 View-process-parent-line-font) | |
3427 (set-face-underline-p 'View-process-parent-line-face | |
3428 View-process-parent-line-underline-p)) | |
3429 | |
3430 (if (facep 'View-process-single-line-face) | |
3431 nil | |
3432 (make-face 'View-process-single-line-face) | |
3433 (if (View-process-search-color View-process-single-line-foreground) | |
3434 (set-face-foreground 'View-process-single-line-face | |
3435 (View-process-search-color | |
3436 View-process-single-line-foreground))) | |
3437 (if (View-process-search-color View-process-single-line-background) | |
3438 (set-face-background 'View-process-single-line-face | |
3439 (View-process-search-color | |
3440 View-process-single-line-background))) | |
3441 (set-face-font 'View-process-single-line-face | |
3442 View-process-single-line-font) | |
3443 (set-face-underline-p 'View-process-single-line-face | |
3444 View-process-single-line-underline-p)) | |
3445 | |
3446 (if (facep 'View-process-signaled-line-face) | |
3447 nil | |
3448 (make-face 'View-process-signaled-line-face) | |
3449 (if (View-process-search-color View-process-signaled-line-foreground) | |
3450 (set-face-foreground 'View-process-signaled-line-face | |
3451 (View-process-search-color | |
3452 View-process-signaled-line-foreground))) | |
3453 (if (View-process-search-color View-process-signaled-line-background) | |
3454 (set-face-background 'View-process-signaled-line-face | |
3455 (View-process-search-color | |
3456 View-process-signaled-line-background))) | |
3457 (set-face-font 'View-process-signaled-line-face | |
3458 View-process-signaled-line-font) | |
3459 (set-face-underline-p 'View-process-signaled-line-face | |
3460 View-process-signaled-line-underline-p)) | |
3461 | |
3462 (if (facep 'View-process-signal-line-face) | |
3463 nil | |
3464 (make-face 'View-process-signal-line-face) | |
3465 (if (View-process-search-color View-process-signal-line-foreground) | |
3466 (set-face-foreground 'View-process-signal-line-face | |
3467 (View-process-search-color | |
3468 View-process-signal-line-foreground))) | |
3469 (if (View-process-search-color View-process-signal-line-background) | |
3470 (set-face-background 'View-process-signal-line-face | |
3471 (View-process-search-color | |
3472 View-process-signal-line-background))) | |
3473 (set-face-font 'View-process-signal-line-face | |
3474 View-process-signal-line-font) | |
3475 (set-face-underline-p 'View-process-signal-line-face | |
3476 View-process-signal-line-underline-p)) | |
3477 | |
3478 (if (facep 'View-process-renice-line-face) | |
3479 nil | |
3480 (make-face 'View-process-renice-line-face) | |
3481 (if (View-process-search-color View-process-renice-line-foreground) | |
3482 (set-face-foreground 'View-process-renice-line-face | |
3483 (View-process-search-color | |
3484 View-process-renice-line-foreground))) | |
3485 (if (View-process-search-color View-process-renice-line-background) | |
3486 (set-face-background 'View-process-renice-line-face | |
3487 (View-process-search-color | |
3488 View-process-renice-line-background))) | |
3489 (set-face-font 'View-process-renice-line-face | |
3490 View-process-renice-line-font) | |
3491 (set-face-underline-p 'View-process-renice-line-face | |
3492 View-process-renice-line-underline-p)) | |
3493 | |
3494 (if (facep 'View-process-header-line-face) | |
3495 nil | |
3496 (make-face 'View-process-header-line-face) | |
3497 (if (View-process-search-color View-process-header-line-foreground) | |
3498 (set-face-foreground 'View-process-header-line-face | |
3499 (View-process-search-color | |
3500 View-process-header-line-foreground))) | |
3501 (if (View-process-search-color View-process-header-line-background) | |
3502 (set-face-background 'View-process-header-line-face | |
3503 (View-process-search-color | |
3504 View-process-header-line-background))) | |
3505 (set-face-font 'View-process-header-line-face | |
3506 View-process-header-line-font) | |
3507 (set-face-underline-p 'View-process-header-line-face | |
3508 View-process-header-line-underline-p)) | |
3509 | |
3510 (defun View-process-highlight-header-line () | |
3511 "Highlights the headerline with the face `View-process-header-line-face'." | |
3512 (let ((extent | |
3513 (make-extent View-process-header-start View-process-header-end) | |
3514 )) | |
3515 (set-extent-face extent 'View-process-header-line-face) | |
3516 (set-extent-property extent 'duplicable t)) | |
3517 ) | |
3518 | |
3519 ;;; A short cut for the View-process-status command | |
3520 | |
3521 (defalias 'ps 'View-process-status) | |
3522 | |
3523 ;;; view-process-mode.el ends here |