annotate lisp/shell.el @ 4005:da8962f65741

* intervals.c (find_interval): Doc fixes, computation of tree->position rearranged for clarity. * intervals.c (find_interval): Consistently treat POSITION as an actual buffer position, i.e. origin 1. The old code seemed undecided on this point. Treat the end of the buffer as being part of the rightmost interval. (adjust_intervals_for_insertion): Consistently treat POSITION as origin 1. (interval_deletion_adjustment): The exception: FROM should be origin zero here. Consistently treat it as such. Simplify code which shrinks and possibly deletes intervals. (adjust_intervals_for_deletion): Treat start as origin 1; our caller does. (set_point): Use buffer positions throughout, not a mix of buffer posns and origin zero posns. (get_local_map): Remove special case for POSITION at end of buffer; find_interval handles that case correctly. (verify_interval_modification): Remove special case for START at end of buffer. * textprop.c (validate_interval_range): End-of-buffer/string positions no longer need special handling. * intervals.c (make_new_interval): #if 0 this out. Nobody calls it.
author Jim Blandy <jimb@redhat.com>
date Tue, 06 Jul 1993 14:53:54 +0000
parents fe1623f77956
children c9a0f06110bd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
925
6295ac3be480 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 844
diff changeset
1 ;;; shell.el --- specialized comint.el for running the shell.
2609
af46e8faaa32 (shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents: 2573
diff changeset
2 ;;; Copyright (C) 1988, 1993 Free Software Foundation, Inc.
844
bf829a2d63b4 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 814
diff changeset
3
787
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
4 ;; Author: Olin Shivers <shivers@cs.cmu.edu>
814
38b2499cb3e9 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 807
diff changeset
5 ;; Keywords: processes
787
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
6
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
7 ;;; This file is part of GNU Emacs.
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
8
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
9 ;;; GNU Emacs is free software; you can redistribute it and/or modify
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
10 ;;; it under the terms of the GNU General Public License as published by
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 787
diff changeset
11 ;;; the Free Software Foundation; either version 2, or (at your option)
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
12 ;;; any later version.
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
13
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
14 ;;; GNU Emacs is distributed in the hope that it will be useful,
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
15 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
16 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
17 ;;; GNU General Public License for more details.
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
18
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
19 ;;; You should have received a copy of the GNU General Public License
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
20 ;;; along with GNU Emacs; see the file COPYING. If not, write to
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
21 ;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
22
787
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
23 ;;; Commentary:
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
24
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
25 ;;; The changelog is at the end of file.
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
26
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
27 ;;; Please send me bug reports, bug fixes, and extensions, so that I can
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
28 ;;; merge them into the master source.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
29 ;;; - Olin Shivers (shivers@cs.cmu.edu)
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
30
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
31 ;;; This file defines a a shell-in-a-buffer package (shell mode) built
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
32 ;;; on top of comint mode. This is actually cmushell with things
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
33 ;;; renamed to replace its counterpart in Emacs 18. cmushell is more
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
34 ;;; featureful, robust, and uniform than the Emacs 18 version.
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
35
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
36 ;;; Since this mode is built on top of the general command-interpreter-in-
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
37 ;;; a-buffer mode (comint mode), it shares a common base functionality,
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
38 ;;; and a common set of bindings, with all modes derived from comint mode.
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
39 ;;; This makes these modes easier to use.
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
40
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
41 ;;; For documentation on the functionality provided by comint mode, and
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
42 ;;; the hooks available for customising it, see the file comint.el.
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
43 ;;; For further information on shell mode, see the comments below.
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
44
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
45 ;;; Needs fixin:
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
46 ;;; When sending text from a source file to a subprocess, the process-mark can
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
47 ;;; move off the window, so you can lose sight of the process interactions.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
48 ;;; Maybe I should ensure the process mark is in the window when I send
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
49 ;;; text to the process? Switch selectable?
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
50
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
51 ;; YOUR .EMACS FILE
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
52 ;;=============================================================================
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
53 ;; Some suggestions for your .emacs file.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
54 ;;
2351
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
55 ;; ; If shell lives in some non-standard directory, you must tell emacs
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
56 ;; ; where to get it. This may or may not be necessary.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
57 ;; (setq load-path (cons (expand-file-name "~jones/lib/emacs") load-path))
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
58 ;;
2351
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
59 ;; ; Autoload shell from file shell.el
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
60 ;; (autoload 'shell "shell"
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
61 ;; "Run an inferior shell process."
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
62 ;; t)
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
63 ;;
2351
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
64 ;; ; Define C-c t to run my favorite command in shell mode:
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
65 ;; (setq shell-load-hook
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
66 ;; '((lambda ()
2351
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
67 ;; (define-key shell-mode-map "\C-ct" 'favorite-cmd))))
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
68
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
69
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
70 ;;; Brief Command Documentation:
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
71 ;;;============================================================================
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
72 ;;; Comint Mode Commands: (common to shell and all comint-derived modes)
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
73 ;;;
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
74 ;;; m-p comint-previous-input Cycle backwards in input history
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
75 ;;; m-n comint-next-input Cycle forwards
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
76 ;;; m-c-r comint-previous-input-matching Search backwards in input history
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
77 ;;; return comint-send-input
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
78 ;;; c-a comint-bol Beginning of line; skip prompt.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
79 ;;; c-d comint-delchar-or-maybe-eof Delete char unless at end of buff.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
80 ;;; c-c c-u comint-kill-input ^u
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
81 ;;; c-c c-w backward-kill-word ^w
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
82 ;;; c-c c-c comint-interrupt-subjob ^c
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
83 ;;; c-c c-z comint-stop-subjob ^z
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
84 ;;; c-c c-\ comint-quit-subjob ^\
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
85 ;;; c-c c-o comint-kill-output Delete last batch of process output
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
86 ;;; c-c c-r comint-show-output Show last batch of process output
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
87 ;;; send-invisible Read line w/o echo & send to proc
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
88 ;;; comint-continue-subjob Useful if you accidentally suspend
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
89 ;;; top-level job.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
90 ;;; comint-mode-hook is the comint mode hook.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
91
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
92 ;;; Shell Mode Commands:
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
93 ;;; shell Fires up the shell process.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
94 ;;; tab comint-dynamic-complete Complete a partial file name
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
95 ;;; m-? comint-dynamic-list-completions List completions in help buffer
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
96 ;;; dirs Resync the buffer's dir stack.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
97 ;;; dirtrack-toggle Turn dir tracking on/off.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
98 ;;;
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
99 ;;; The shell mode hook is shell-mode-hook
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
100 ;;; The shell-load-hook is run after this file is loaded.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
101 ;;; comint-prompt-regexp is initialised to shell-prompt-pattern, for backwards
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
102 ;;; compatibility.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
103
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
104 ;;; Read the rest of this file for more information.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
105
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
106 ;;; SHELL.EL COMPATIBILITY
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
107 ;;; Notes from when this was called cmushell, and was not the standard emacs
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
108 ;;; shell package.
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
109 ;;;============================================================================
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
110 ;;; In brief: this package should have no trouble coexisting with shell.el.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
111 ;;;
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
112 ;;; Most customising variables -- e.g., explicit-shell-file-name -- are the
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
113 ;;; same, so the users shouldn't have much trouble. Hooks have different
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
114 ;;; names, however, so you can customise shell mode differently from cmushell
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
115 ;;; mode. You basically just have to remember to type M-x cmushell instead of
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
116 ;;; M-x shell.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
117 ;;;
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
118 ;;; It would be nice if this file was completely plug-compatible with the old
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
119 ;;; shell package -- if you could just name this file shell.el, and have it
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
120 ;;; transparently replace the old one. But you can't. Several other packages
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
121 ;;; (tex-mode, background, dbx, gdb, kermit, monkey, prolog, telnet) are also
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
122 ;;; clients of shell mode. These packages assume detailed knowledge of shell
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
123 ;;; mode internals in ways that are incompatible with cmushell mode (mostly
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
124 ;;; because of cmushell mode's greater functionality). So, unless we are
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
125 ;;; willing to port all of these packages, we can't have this file be a
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
126 ;;; complete replacement for shell.el -- that is, we can't name this file
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
127 ;;; shell.el, and its main entry point (shell), because dbx.el will break
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
128 ;;; when it loads it in and tries to use it.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
129 ;;;
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
130 ;;; There are two ways to fix this. One: rewrite these other modes to use the
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
131 ;;; new package. This is a win, but can't be assumed. The other, backwards
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
132 ;;; compatible route, is to make this package non-conflict with shell.el, so
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
133 ;;; both files can be loaded in at the same time. And *that* is why some
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
134 ;;; functions and variables have different names: (cmushell),
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
135 ;;; cmushell-mode-map, that sort of thing. All the names have been carefully
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
136 ;;; chosen so that shell.el and cmushell.el won't tromp on each other.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
137
2557
a212ee1907fe (shell-mode): isationization (doc fix).
Roland McGrath <roland@gnu.org>
parents: 2556
diff changeset
138 ;;; Customization and Buffer Variables
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
139 ;;; ===========================================================================
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
140 ;;;
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
141
787
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
142 ;;; Code:
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
143
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
144 (require 'comint)
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
145
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
146 ;;;###autoload
3418
fe1623f77956 (shell-prompt-pattern): Use defvar.
Richard M. Stallman <rms@gnu.org>
parents: 2609
diff changeset
147 (defvar shell-prompt-pattern "^[^#$%>]*[#$%>] *"
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
148 "Regexp to match prompts in the inferior shell.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
149 Defaults to \"^[^#$%>]*[#$%>] *\", which works pretty well.
2609
af46e8faaa32 (shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents: 2573
diff changeset
150 This variable is used to initialise `comint-prompt-regexp' in the
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
151 shell buffer.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
152
2609
af46e8faaa32 (shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents: 2573
diff changeset
153 This is a fine thing to set in your `.emacs' file.")
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
154
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
155 (defvar shell-popd-regexp "popd"
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
156 "*Regexp to match subshell commands equivalent to popd.")
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
157
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
158 (defvar shell-pushd-regexp "pushd"
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
159 "*Regexp to match subshell commands equivalent to pushd.")
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
160
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
161 (defvar shell-cd-regexp "cd"
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
162 "*Regexp to match subshell commands equivalent to cd.")
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
163
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
164 (defvar explicit-shell-file-name nil
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
165 "*If non-nil, is file name to use for explicitly requested inferior shell.")
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
166
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
167 (defvar explicit-csh-args
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
168 (if (eq system-type 'hpux)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
169 ;; -T persuades HP's csh not to think it is smarter
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
170 ;; than us about what terminal modes to use.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
171 '("-i" "-T")
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
172 '("-i"))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
173 "*Args passed to inferior shell by M-x shell, if the shell is csh.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
174 Value is a list of strings, which may be nil.")
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
175
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
176 ;;; All the above vars aren't prefixed "cmushell-" to make them
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
177 ;;; backwards compatible w/shell.el and old .emacs files.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
178
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
179 (defvar shell-dirstack nil
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
180 "List of directories saved by pushd in this buffer's shell.
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
181 Thus, this does not include the shell's current directory.")
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
182
2351
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
183 (defvar shell-last-dir nil
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
184 "Keep track of last directory for ksh `cd -' command.")
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
185
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
186 (defvar shell-dirstack-query "dirs"
2609
af46e8faaa32 (shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents: 2573
diff changeset
187 "Command used by `shell-resync-dir' to query the shell.")
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
188
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
189 (defvar shell-mode-map '())
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
190 (cond ((not shell-mode-map)
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
191 (setq shell-mode-map (full-copy-sparse-keymap comint-mode-map))
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
192 (define-key shell-mode-map "\t" 'comint-dynamic-complete)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
193 (define-key shell-mode-map "\M-?" 'comint-dynamic-list-completions)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
194
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
195 (defvar shell-mode-hook '()
2609
af46e8faaa32 (shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents: 2573
diff changeset
196 "*Hook for customising Shell mode.")
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
197
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
198
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
199 ;;; Basic Procedures
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
200 ;;; ===========================================================================
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
201 ;;;
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
202
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
203 (defun shell-mode ()
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
204 "Major mode for interacting with an inferior shell.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
205 Return after the end of the process' output sends the text from the
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
206 end of process to the end of the current line.
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
207 Return before end of process output copies the current line (except
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
208 for the prompt) to the end of the buffer and sends it.
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
209 M-x send-invisible reads a line of text without echoing it, and sends it to
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
210 the shell. This is useful for entering passwords.
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
211
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
212 If you accidentally suspend your process, use \\[comint-continue-subjob]
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
213 to continue it.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
214
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
215 cd, pushd and popd commands given to the shell are watched by Emacs to keep
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
216 this buffer's default directory the same as the shell's working directory.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
217 M-x dirs queries the shell and resyncs Emacs' idea of what the current
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
218 directory stack is.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
219 M-x dirtrack-toggle turns directory tracking on and off.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
220
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
221 \\{shell-mode-map}
2609
af46e8faaa32 (shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents: 2573
diff changeset
222 Customization: Entry to this mode runs the hooks on `comint-mode-hook' and
af46e8faaa32 (shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents: 2573
diff changeset
223 `shell-mode-hook' (in that order).
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
224
2609
af46e8faaa32 (shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents: 2573
diff changeset
225 Variables `shell-cd-regexp', `shell-pushd-regexp' and `shell-popd-regexp'
af46e8faaa32 (shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents: 2573
diff changeset
226 are used to match their respective commands."
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
227 (interactive)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
228 (comint-mode)
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
229 (setq comint-prompt-regexp shell-prompt-pattern)
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
230 (setq major-mode 'shell-mode)
2556
8b6c3d4256a0 (shell-mode): Capitalize mode name.
Roland McGrath <roland@gnu.org>
parents: 2469
diff changeset
231 (setq mode-name "Shell")
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
232 (use-local-map shell-mode-map)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
233 (make-local-variable 'shell-dirstack)
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
234 (setq shell-dirstack nil)
2351
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
235 (setq shell-last-dir nil)
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
236 (make-local-variable 'shell-dirtrackp)
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
237 (setq shell-dirtrackp t)
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
238 (setq comint-input-sentinel 'shell-directory-tracker)
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
239 (run-hooks 'shell-mode-hook))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
240
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
241
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
242 ;;;###autoload
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
243 (defun shell ()
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
244 "Run an inferior shell, with I/O through buffer *shell*.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
245 If buffer exists but shell process is not running, make new shell.
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
246 If buffer exists and shell process is running,
1076
8a936037cedc entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 925
diff changeset
247 just switch to buffer `*shell*'.
2609
af46e8faaa32 (shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents: 2573
diff changeset
248 Program used comes from variable `explicit-shell-file-name',
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
249 or (if that is nil) from the ESHELL environment variable,
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
250 or else from SHELL if there is no ESHELL.
1076
8a936037cedc entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 925
diff changeset
251 If a file `~/.emacs_SHELLNAME' exists, it is given as initial input
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
252 (Note that this may lose due to a timing error if the shell
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
253 discards input when it starts up.)
1076
8a936037cedc entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 925
diff changeset
254 The buffer is put in Shell mode, giving commands for sending input
8a936037cedc entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 925
diff changeset
255 and controlling the subjobs of the shell. See `shell-mode'.
8a936037cedc entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 925
diff changeset
256 See also the variable `shell-prompt-pattern'.
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
257
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
258 The shell file name (sans directories) is used to make a symbol name
1801
dd8e5024b4f9 (shell): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 1076
diff changeset
259 such as `explicit-csh-args'. If that symbol is a variable,
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
260 its value is used as a list of arguments when invoking the shell.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
261 Otherwise, one argument `-i' is passed to the shell.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
262
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
263 \(Type \\[describe-mode] in the shell buffer for a list of commands.)"
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
264 (interactive)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
265 (cond ((not (comint-check-proc "*shell*"))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
266 (let* ((prog (or explicit-shell-file-name
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
267 (getenv "ESHELL")
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
268 (getenv "SHELL")
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
269 "/bin/sh"))
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
270 (name (file-name-nondirectory prog))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
271 (startfile (concat "~/.emacs_" name))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
272 (xargs-name (intern-soft (concat "explicit-" name "-args"))))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
273 (set-buffer (apply 'make-comint "shell" prog
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
274 (if (file-exists-p startfile) startfile)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
275 (if (and xargs-name (boundp xargs-name))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
276 (symbol-value xargs-name)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
277 '("-i"))))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
278 (shell-mode))))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
279 (switch-to-buffer "*shell*"))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
280
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
281
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
282 ;;; Directory tracking
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
283 ;;; ===========================================================================
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
284 ;;; This code provides the shell mode input sentinel
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
285 ;;; SHELL-DIRECTORY-TRACKER
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
286 ;;; that tracks cd, pushd, and popd commands issued to the shell, and
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
287 ;;; changes the current directory of the shell buffer accordingly.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
288 ;;;
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
289 ;;; This is basically a fragile hack, although it's more accurate than
2469
250c60d32a5a Doc fix.
Jim Blandy <jimb@redhat.com>
parents: 2351
diff changeset
290 ;;; the version in Emacs 18's shell.el. It has the following failings:
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
291 ;;; 1. It doesn't know about the cdpath shell variable.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
292 ;;; 2. It only spots the first command in a command sequence. E.g., it will
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
293 ;;; miss the cd in "ls; cd foo"
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
294 ;;; 3. More generally, any complex command (like ";" sequencing) is going to
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
295 ;;; throw it. Otherwise, you'd have to build an entire shell interpreter in
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
296 ;;; emacs lisp. Failing that, there's no way to catch shell commands where
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
297 ;;; cd's are buried inside conditional expressions, aliases, and so forth.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
298 ;;;
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
299 ;;; The whole approach is a crock. Shell aliases mess it up. File sourcing
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
300 ;;; messes it up. You run other processes under the shell; these each have
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
301 ;;; separate working directories, and some have commands for manipulating
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
302 ;;; their w.d.'s (e.g., the lcd command in ftp). Some of these programs have
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
303 ;;; commands that do *not* affect the current w.d. at all, but look like they
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
304 ;;; do (e.g., the cd command in ftp). In shells that allow you job
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
305 ;;; control, you can switch between jobs, all having different w.d.'s. So
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
306 ;;; simply saying %3 can shift your w.d..
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
307 ;;;
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
308 ;;; The solution is to relax, not stress out about it, and settle for
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
309 ;;; a hack that works pretty well in typical circumstances. Remember
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
310 ;;; that a half-assed solution is more in keeping with the spirit of Unix,
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
311 ;;; anyway. Blech.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
312 ;;;
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
313 ;;; One good hack not implemented here for users of programmable shells
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
314 ;;; is to program up the shell w.d. manipulation commands to output
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
315 ;;; a coded command sequence to the tty. Something like
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
316 ;;; ESC | <cwd> |
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
317 ;;; where <cwd> is the new current working directory. Then trash the
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
318 ;;; directory tracking machinery currently used in this package, and
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
319 ;;; replace it with a process filter that watches for and strips out
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
320 ;;; these messages.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
321
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
322 ;;; REGEXP is a regular expression. STR is a string. START is a fixnum.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
323 ;;; Returns T if REGEXP matches STR where the match is anchored to start
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
324 ;;; at position START in STR. Sort of like LOOKING-AT for strings.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
325 (defun shell-front-match (regexp str start)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
326 (eq start (string-match regexp str start)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
327
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
328 (defun shell-directory-tracker (str)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
329 "Tracks cd, pushd and popd commands issued to the shell.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
330 This function is called on each input passed to the shell.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
331 It watches for cd, pushd and popd commands and sets the buffer's
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
332 default directory to track these commands.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
333
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
334 You may toggle this tracking on and off with M-x dirtrack-toggle.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
335 If emacs gets confused, you can resync with the shell with M-x dirs.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
336
2609
af46e8faaa32 (shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents: 2573
diff changeset
337 See variables `shell-cd-regexp', `shell-pushd-regexp', and `shell-popd-regexp'.
af46e8faaa32 (shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents: 2573
diff changeset
338 Environment variables are expanded, see function `substitute-in-file-name'."
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
339 (condition-case err
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
340 (cond (shell-dirtrackp
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
341 (string-match "^\\s *" str) ; skip whitespace
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
342 (let ((bos (match-end 0))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
343 (x nil))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
344 (cond ((setq x (shell-match-cmd-w/optional-arg shell-popd-regexp
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
345 str bos))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
346 (shell-process-popd (substitute-in-file-name x)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
347 ((setq x (shell-match-cmd-w/optional-arg shell-pushd-regexp
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
348 str bos))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
349 (shell-process-pushd (substitute-in-file-name x)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
350 ((setq x (shell-match-cmd-w/optional-arg shell-cd-regexp
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
351 str bos))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
352 (shell-process-cd (substitute-in-file-name x)))))))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
353 (error (message (car (cdr err))))))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
354
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
355
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
356 ;;; Try to match regexp CMD to string, anchored at position START.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
357 ;;; CMD may be followed by a single argument. If a match, then return
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
358 ;;; the argument, if there is one, or the empty string if not. If
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
359 ;;; no match, return nil.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
360
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
361 (defun shell-match-cmd-w/optional-arg (cmd str start)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
362 (and (shell-front-match cmd str start)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
363 (let ((eoc (match-end 0))) ; end of command
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
364 (cond ((shell-front-match "\\s *\\(\;\\|$\\)" str eoc)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
365 "") ; no arg
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
366 ((shell-front-match "\\s +\\([^ \t\;]+\\)\\s *\\(\;\\|$\\)"
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
367 str eoc)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
368 (substring str (match-beginning 1) (match-end 1))) ; arg
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
369 (t nil))))) ; something else.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
370 ;;; The first regexp is [optional whitespace, (";" or the end of string)].
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
371 ;;; The second regexp is [whitespace, (an arg), optional whitespace,
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
372 ;;; (";" or end of string)].
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
373
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
374
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
375 ;;; popd [+n]
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
376 (defun shell-process-popd (arg)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
377 (let ((num (if (zerop (length arg)) 0 ; no arg means +0
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
378 (shell-extract-num arg))))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
379 (if (and num (< num (length shell-dirstack)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
380 (if (= num 0) ; condition-case because the CD could lose.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
381 (condition-case nil (progn (cd (car shell-dirstack))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
382 (setq shell-dirstack
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
383 (cdr shell-dirstack))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
384 (shell-dirstack-message))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
385 (error (message "Couldn't cd.")))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
386 (let* ((ds (cons nil shell-dirstack))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
387 (cell (nthcdr (- num 1) ds)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
388 (rplacd cell (cdr (cdr cell)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
389 (setq shell-dirstack (cdr ds))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
390 (shell-dirstack-message)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
391 (message "Bad popd."))))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
392
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
393
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
394 ;;; cd [dir]
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
395 (defun shell-process-cd (arg)
2351
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
396 (condition-case nil
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
397 (let ((new-dir (cond
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
398 ((zerop (length arg)) (getenv "HOME"))
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
399 ((string-equal "-" arg) shell-last-dir)
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
400 (t arg))))
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
401 (setq shell-last-dir default-directory)
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
402 (cd new-dir)
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
403 (shell-dirstack-message))
bb1ff4e31fb6 Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1801
diff changeset
404 (error (message "Couldn't cd."))))
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
405
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
406 ;;; pushd [+n | dir]
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
407 (defun shell-process-pushd (arg)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
408 (if (zerop (length arg))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
409 ;; no arg -- swap pwd and car of shell stack
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
410 (condition-case nil (if shell-dirstack
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
411 (let ((old default-directory))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
412 (cd (car shell-dirstack))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
413 (setq shell-dirstack
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
414 (cons old (cdr shell-dirstack)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
415 (shell-dirstack-message))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
416 (message "Directory stack empty."))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
417 (message "Couldn't cd."))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
418
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
419 (let ((num (shell-extract-num arg)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
420 (if num ; pushd +n
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
421 (if (> num (length shell-dirstack))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
422 (message "Directory stack not that deep.")
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
423 (let* ((ds (cons default-directory shell-dirstack))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
424 (dslen (length ds))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
425 (front (nthcdr num ds))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
426 (back (reverse (nthcdr (- dslen num) (reverse ds))))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
427 (new-ds (append front back)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
428 (condition-case nil
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
429 (progn (cd (car new-ds))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
430 (setq shell-dirstack (cdr new-ds))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
431 (shell-dirstack-message))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
432 (error (message "Couldn't cd.")))))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
433
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
434 ;; pushd <dir>
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
435 (let ((old-wd default-directory))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
436 (condition-case nil
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
437 (progn (cd arg)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
438 (setq shell-dirstack
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
439 (cons old-wd shell-dirstack))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
440 (shell-dirstack-message))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
441 (error (message "Couldn't cd."))))))))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
442
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
443 ;; If STR is of the form +n, for n>0, return n. Otherwise, nil.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
444 (defun shell-extract-num (str)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
445 (and (string-match "^\\+[1-9][0-9]*$" str)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
446 (string-to-int str)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
447
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
448
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
449 (defun shell-dirtrack-toggle ()
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
450 "Turn directory tracking on and off in a shell buffer."
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
451 (interactive)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
452 (setq shell-dirtrackp (not shell-dirtrackp))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
453 (message "directory tracking %s."
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
454 (if shell-dirtrackp "ON" "OFF")))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
455
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
456 ;;; For your typing convenience:
2571
b65cf676a09b All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2557
diff changeset
457 (defalias 'dirtrack-toggle 'shell-dirtrack-toggle)
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
458
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
459
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
460 (defun shell-resync-dirs ()
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
461 "Resync the buffer's idea of the current directory stack.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
462 This command queries the shell with the command bound to
2609
af46e8faaa32 (shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents: 2573
diff changeset
463 `shell-dirstack-query' (default \"dirs\"), reads the next
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
464 line output and parses it to form the new directory stack.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
465 DON'T issue this command unless the buffer is at a shell prompt.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
466 Also, note that if some other subprocess decides to do output
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
467 immediately after the query, its output will be taken as the
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
468 new directory stack -- you lose. If this happens, just do the
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
469 command again."
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
470 (interactive)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
471 (let* ((proc (get-buffer-process (current-buffer)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
472 (pmark (process-mark proc)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
473 (goto-char pmark)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
474 (insert shell-dirstack-query) (insert "\n")
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
475 (sit-for 0) ; force redisplay
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
476 (comint-send-string proc shell-dirstack-query)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
477 (comint-send-string proc "\n")
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
478 (set-marker pmark (point))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
479 (let ((pt (point))) ; wait for 1 line
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
480 ;; This extra newline prevents the user's pending input from spoofing us.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
481 (insert "\n") (backward-char 1)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
482 (while (not (looking-at ".+\n"))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
483 (accept-process-output proc)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
484 (goto-char pt)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
485 (goto-char pmark) (delete-char 1) ; remove the extra newline
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
486 ;; That's the dirlist. grab it & parse it.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
487 (let* ((dl (buffer-substring (match-beginning 0) (- (match-end 0) 1)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
488 (dl-len (length dl))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
489 (ds '()) ; new dir stack
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
490 (i 0))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
491 (while (< i dl-len)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
492 ;; regexp = optional whitespace, (non-whitespace), optional whitespace
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
493 (string-match "\\s *\\(\\S +\\)\\s *" dl i) ; pick off next dir
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
494 (setq ds (cons (substring dl (match-beginning 1) (match-end 1))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
495 ds))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
496 (setq i (match-end 0)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
497 (let ((ds (reverse ds)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
498 (condition-case nil
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
499 (progn (cd (car ds))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
500 (setq shell-dirstack (cdr ds))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
501 (shell-dirstack-message))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
502 (error (message "Couldn't cd.")))))))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
503
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
504 ;;; For your typing convenience:
2571
b65cf676a09b All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2557
diff changeset
505 (defalias 'dirs 'shell-resync-dirs)
114
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
506
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
507
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
508 ;;; Show the current dirstack on the message line.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
509 ;;; Pretty up dirs a bit by changing "/usr/jqr/foo" to "~/foo".
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
510 ;;; (This isn't necessary if the dirlisting is generated with a simple "dirs".)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
511 ;;; All the commands that mung the buffer's dirstack finish by calling
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
512 ;;; this guy.
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
513 (defun shell-dirstack-message ()
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
514 (let ((msg "")
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
515 (ds (cons default-directory shell-dirstack)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
516 (while ds
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
517 (let ((dir (car ds)))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
518 (if (string-match (format "^%s\\(/\\|$\\)" (getenv "HOME")) dir)
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
519 (setq dir (concat "~/" (substring dir (match-end 0)))))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
520 (if (string-equal dir "~/") (setq dir "~"))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
521 (setq msg (concat msg dir " "))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
522 (setq ds (cdr ds))))
899728e6052a Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
523 (message msg)))
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
524
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
525
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
526
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
527 ;;; Interfacing to client packages (and converting them)
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
528 ;;; Notes from when this was called cmushell, and was not the standard emacs
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
529 ;;; shell package. Many of the conversions discussed here have been done.
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
530 ;;;============================================================================
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
531 ;;; Several gnu packages (tex-mode, background, dbx, gdb, kermit, prolog,
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
532 ;;; telnet are some) use the shell package as clients. Most of them would
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
533 ;;; be better off using the comint package directly, but they predate it.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
534 ;;; The catch is that most of these packages (dbx, gdb, prolog, telnet)
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
535 ;;; assume total knowledge of all the local variables that shell mode
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
536 ;;; functions depend on. So they (kill-all-local-variables), then create
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
537 ;;; the few local variables that shell.el functions depend on. Alas,
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
538 ;;; cmushell.el functions depend on a different set of vars (for example,
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
539 ;;; the input history ring is a local variable in cmushell.el's shell mode,
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
540 ;;; whereas there is no input history ring in shell.el's shell mode).
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
541 ;;; So we have a situation where the greater functionality of cmushell.el
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
542 ;;; is biting us -- you can't just replace shell will cmushell.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
543 ;;;
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
544 ;;; Altering these packages to use comint mode directly should *greatly*
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
545 ;;; improve their functionality, and is actually pretty easy. It's
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
546 ;;; mostly a matter of renaming a few variable names. See comint.el for more.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
547 ;;; -Olin
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
548
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
549
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
550
2557
a212ee1907fe (shell-mode): isationization (doc fix).
Roland McGrath <roland@gnu.org>
parents: 2556
diff changeset
551 ;;; Do the user's customization...
252
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
552 ;;;===============================
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
553 (defvar shell-load-hook nil
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
554 "This hook is run when shell is loaded in.
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
555 This is a good place to put keybindings.")
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
556
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
557 (run-hooks 'shell-load-hook)
1ef0a9b58e63 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 114
diff changeset
558
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
559 (provide 'shell)
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
560
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 252
diff changeset
561 ;;; shell.el ends here