Mercurial > emacs
annotate lisp/shell.el @ 5200:1006461bf759
(do-install): Use umask 022 in copying etc and lisp dirs.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sat, 27 Nov 1993 09:19:39 +0000 |
parents | 220ec2f456e0 |
children | 6c3cfa1f8188 |
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> |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
5 ;; Adapted-by: Simon Marshall <s.marshall@dcs.hull.ac.uk> |
814
38b2499cb3e9
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
6 ;; Keywords: processes |
787
3cece0106722
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
658
diff
changeset
|
7 |
658
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
8 ;;; This file is part of GNU Emacs. |
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
9 |
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
10 ;;; 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
|
11 ;;; 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
|
12 ;;; 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
|
13 ;;; any later version. |
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
14 |
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
15 ;;; 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
|
16 ;;; 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
|
17 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
18 ;;; GNU General Public License for more details. |
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
19 |
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
20 ;;; 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
|
21 ;;; 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
|
22 ;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
114 | 23 |
787
3cece0106722
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
658
diff
changeset
|
24 ;;; Commentary: |
3cece0106722
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
658
diff
changeset
|
25 |
252 | 26 ;;; Please send me bug reports, bug fixes, and extensions, so that I can |
27 ;;; merge them into the master source. | |
28 ;;; - Olin Shivers (shivers@cs.cmu.edu) | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
29 ;;; - Simon Marshall (s.marshall@dcs.hull.ac.uk) |
114 | 30 |
252 | 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 | 35 |
36 ;;; Since this mode is built on top of the general command-interpreter-in- | |
37 ;;; a-buffer mode (comint mode), it shares a common base functionality, | |
38 ;;; and a common set of bindings, with all modes derived from comint mode. | |
252 | 39 ;;; This makes these modes easier to use. |
114 | 40 |
41 ;;; For documentation on the functionality provided by comint mode, and | |
42 ;;; the hooks available for customising it, see the file comint.el. | |
252 | 43 ;;; For further information on shell mode, see the comments below. |
114 | 44 |
45 ;;; Needs fixin: | |
46 ;;; When sending text from a source file to a subprocess, the process-mark can | |
47 ;;; move off the window, so you can lose sight of the process interactions. | |
48 ;;; Maybe I should ensure the process mark is in the window when I send | |
49 ;;; text to the process? Switch selectable? | |
50 | |
252 | 51 ;; YOUR .EMACS FILE |
52 ;;============================================================================= | |
53 ;; Some suggestions for your .emacs file. | |
54 ;; | |
5163 | 55 ;; ;; Define C-c t to run my favorite command in shell mode: |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
56 ;; (setq shell-mode-hook |
252 | 57 ;; '((lambda () |
2351
bb1ff4e31fb6
Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
1801
diff
changeset
|
58 ;; (define-key shell-mode-map "\C-ct" 'favorite-cmd)))) |
252 | 59 |
60 | |
61 ;;; Brief Command Documentation: | |
62 ;;;============================================================================ | |
63 ;;; Comint Mode Commands: (common to shell and all comint-derived modes) | |
64 ;;; | |
65 ;;; m-p comint-previous-input Cycle backwards in input history | |
66 ;;; m-n comint-next-input Cycle forwards | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
67 ;;; m-r comint-previous-matching-input Previous input matching a regexp |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
68 ;;; m-R comint-previous-matching-input-from-input -"- matching input |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
69 ;;; m-s comint-next-matching-input Next input that matches |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
70 ;;; m-S comint-next-matching-input-from-input -"- matching input |
252 | 71 ;;; m-c-r comint-previous-input-matching Search backwards in input history |
72 ;;; return comint-send-input | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
73 ;;; c-a comint-bol Beginning of line; skip prompt |
252 | 74 ;;; c-d comint-delchar-or-maybe-eof Delete char unless at end of buff. |
75 ;;; c-c c-u comint-kill-input ^u | |
76 ;;; c-c c-w backward-kill-word ^w | |
77 ;;; c-c c-c comint-interrupt-subjob ^c | |
78 ;;; c-c c-z comint-stop-subjob ^z | |
79 ;;; c-c c-\ comint-quit-subjob ^\ | |
80 ;;; c-c c-o comint-kill-output Delete last batch of process output | |
81 ;;; c-c c-r comint-show-output Show last batch of process output | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
82 ;;; c-c c-h comint-dynamic-list-input-ring List input history |
252 | 83 ;;; send-invisible Read line w/o echo & send to proc |
84 ;;; comint-continue-subjob Useful if you accidentally suspend | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
85 ;;; top-level job |
252 | 86 ;;; comint-mode-hook is the comint mode hook. |
87 | |
88 ;;; Shell Mode Commands: | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
89 ;;; shell Fires up the shell process |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
90 ;;; tab comint-dynamic-complete Complete filename/command/history |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
91 ;;; m-? comint-dynamic-list-filename-completions List completions in help buffer |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
92 ;;; m-c-f shell-forward-command Forward a shell command |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
93 ;;; m-c-b shell-backward-command Backward a shell command |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
94 ;;; dirs Resync the buffer's dir stack |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
95 ;;; dirtrack-toggle Turn dir tracking on/off |
252 | 96 ;;; |
97 ;;; The shell mode hook is shell-mode-hook | |
98 ;;; comint-prompt-regexp is initialised to shell-prompt-pattern, for backwards | |
99 ;;; compatibility. | |
100 | |
101 ;;; Read the rest of this file for more information. | |
102 | |
658
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
103 ;;; SHELL.EL COMPATIBILITY |
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
104 ;;; 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
|
105 ;;; shell package. |
252 | 106 ;;;============================================================================ |
107 ;;; In brief: this package should have no trouble coexisting with shell.el. | |
108 ;;; | |
109 ;;; Most customising variables -- e.g., explicit-shell-file-name -- are the | |
110 ;;; 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
|
111 ;;; names, however, so you can customise shell mode differently from cmushell |
252 | 112 ;;; mode. You basically just have to remember to type M-x cmushell instead of |
113 ;;; M-x shell. | |
114 ;;; | |
115 ;;; It would be nice if this file was completely plug-compatible with the old | |
116 ;;; shell package -- if you could just name this file shell.el, and have it | |
117 ;;; transparently replace the old one. But you can't. Several other packages | |
118 ;;; (tex-mode, background, dbx, gdb, kermit, monkey, prolog, telnet) are also | |
119 ;;; clients of shell mode. These packages assume detailed knowledge of shell | |
120 ;;; mode internals in ways that are incompatible with cmushell mode (mostly | |
121 ;;; because of cmushell mode's greater functionality). So, unless we are | |
122 ;;; willing to port all of these packages, we can't have this file be a | |
123 ;;; complete replacement for shell.el -- that is, we can't name this file | |
124 ;;; shell.el, and its main entry point (shell), because dbx.el will break | |
125 ;;; when it loads it in and tries to use it. | |
126 ;;; | |
127 ;;; There are two ways to fix this. One: rewrite these other modes to use the | |
128 ;;; new package. This is a win, but can't be assumed. The other, backwards | |
129 ;;; compatible route, is to make this package non-conflict with shell.el, so | |
130 ;;; both files can be loaded in at the same time. And *that* is why some | |
131 ;;; functions and variables have different names: (cmushell), | |
132 ;;; cmushell-mode-map, that sort of thing. All the names have been carefully | |
133 ;;; chosen so that shell.el and cmushell.el won't tromp on each other. | |
134 | |
2557
a212ee1907fe
(shell-mode): isationization (doc fix).
Roland McGrath <roland@gnu.org>
parents:
2556
diff
changeset
|
135 ;;; Customization and Buffer Variables |
252 | 136 ;;; =========================================================================== |
137 ;;; | |
138 | |
787
3cece0106722
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
658
diff
changeset
|
139 ;;; Code: |
3cece0106722
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
658
diff
changeset
|
140 |
3cece0106722
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
658
diff
changeset
|
141 (require 'comint) |
3cece0106722
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
658
diff
changeset
|
142 |
658
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
143 ;;;###autoload |
4131
c9a0f06110bd
* shell.el (shell-process-pushd): Fix syntax error in
Jim Blandy <jimb@redhat.com>
parents:
3418
diff
changeset
|
144 (defvar shell-prompt-pattern "^[^#$%>\n]*[#$%>] *" |
252 | 145 "Regexp to match prompts in the inferior shell. |
4131
c9a0f06110bd
* shell.el (shell-process-pushd): Fix syntax error in
Jim Blandy <jimb@redhat.com>
parents:
3418
diff
changeset
|
146 Defaults to \"^[^#$%>\\n]*[#$%>] *\", which works pretty well. |
2609
af46e8faaa32
(shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents:
2573
diff
changeset
|
147 This variable is used to initialise `comint-prompt-regexp' in the |
252 | 148 shell buffer. |
149 | |
4131
c9a0f06110bd
* shell.el (shell-process-pushd): Fix syntax error in
Jim Blandy <jimb@redhat.com>
parents:
3418
diff
changeset
|
150 The pattern should probably not match more than one line. If it does, |
c9a0f06110bd
* shell.el (shell-process-pushd): Fix syntax error in
Jim Blandy <jimb@redhat.com>
parents:
3418
diff
changeset
|
151 shell-mode may become confused trying to distinguish prompt from input |
c9a0f06110bd
* shell.el (shell-process-pushd): Fix syntax error in
Jim Blandy <jimb@redhat.com>
parents:
3418
diff
changeset
|
152 on lines which don't start with a prompt. |
c9a0f06110bd
* shell.el (shell-process-pushd): Fix syntax error in
Jim Blandy <jimb@redhat.com>
parents:
3418
diff
changeset
|
153 |
2609
af46e8faaa32
(shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents:
2573
diff
changeset
|
154 This is a fine thing to set in your `.emacs' file.") |
252 | 155 |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
156 (defvar shell-delimiter-argument-list '("|" "&" "<" ">" "(" ")" ";") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
157 "List of characters to recognise as separate arguments. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
158 Defaults to \(\"|\" \"&\" \"\(\" \")\" \";\"), which works pretty well. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
159 This variable is used to initialise `comint-delimiter-argument-list' in the |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
160 shell buffer. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
161 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
162 This is a fine thing to set in your `.emacs' file.") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
163 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
164 (defvar shell-command-regexp "\\((.*)\\|[^;&|]\\)+" |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
165 "*Regexp to match shell commands. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
166 Elements of pipes are considered as separate commands, forks and redirections |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
167 as part of one command.") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
168 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
169 (defvar shell-completion-execonly t |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
170 "*If non-nil, use executable files only for completion candidates. |
4938 | 171 This mirrors the optional behavior of tcsh. |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
172 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
173 Detecting executability of files may slow command completion considerably.") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
174 |
114 | 175 (defvar shell-popd-regexp "popd" |
176 "*Regexp to match subshell commands equivalent to popd.") | |
177 | |
178 (defvar shell-pushd-regexp "pushd" | |
179 "*Regexp to match subshell commands equivalent to pushd.") | |
180 | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
181 (defvar shell-pushd-tohome nil |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
182 "*If non-nil, make pushd with no arg behave as \"pushd ~\" (like cd). |
4938 | 183 This mirrors the optional behavior of tcsh.") |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
184 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
185 (defvar shell-pushd-dextract nil |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
186 "*If non-nil, make \"pushd +n\" pop the nth dir to the stack top. |
4938 | 187 This mirrors the optional behavior of tcsh.") |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
188 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
189 (defvar shell-pushd-dunique nil |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
190 "*If non-nil, make pushd only add unique directories to the stack. |
4938 | 191 This mirrors the optional behavior of tcsh.") |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
192 |
114 | 193 (defvar shell-cd-regexp "cd" |
194 "*Regexp to match subshell commands equivalent to cd.") | |
195 | |
196 (defvar explicit-shell-file-name nil | |
197 "*If non-nil, is file name to use for explicitly requested inferior shell.") | |
198 | |
199 (defvar explicit-csh-args | |
200 (if (eq system-type 'hpux) | |
201 ;; -T persuades HP's csh not to think it is smarter | |
202 ;; than us about what terminal modes to use. | |
203 '("-i" "-T") | |
204 '("-i")) | |
205 "*Args passed to inferior shell by M-x shell, if the shell is csh. | |
206 Value is a list of strings, which may be nil.") | |
207 | |
658
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
208 ;;; All the above vars aren't prefixed "cmushell-" to make them |
252 | 209 ;;; backwards compatible w/shell.el and old .emacs files. |
210 | |
114 | 211 (defvar shell-dirstack nil |
658
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
212 "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
|
213 Thus, this does not include the shell's current directory.") |
114 | 214 |
2351
bb1ff4e31fb6
Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
1801
diff
changeset
|
215 (defvar shell-last-dir nil |
bb1ff4e31fb6
Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
1801
diff
changeset
|
216 "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
|
217 |
114 | 218 (defvar shell-dirstack-query "dirs" |
2609
af46e8faaa32
(shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents:
2573
diff
changeset
|
219 "Command used by `shell-resync-dir' to query the shell.") |
114 | 220 |
252 | 221 (defvar shell-mode-map '()) |
114 | 222 (cond ((not shell-mode-map) |
252 | 223 (setq shell-mode-map (full-copy-sparse-keymap comint-mode-map)) |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
224 (define-key shell-mode-map "\C-c\C-f" 'shell-forward-command) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
225 (define-key shell-mode-map "\C-c\C-b" 'shell-backward-command) |
114 | 226 (define-key shell-mode-map "\t" 'comint-dynamic-complete) |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
227 (define-key shell-mode-map "\M-?" |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
228 'comint-dynamic-list-filename-completions))) |
114 | 229 |
230 (defvar shell-mode-hook '() | |
2609
af46e8faaa32
(shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents:
2573
diff
changeset
|
231 "*Hook for customising Shell mode.") |
114 | 232 |
233 | |
234 ;;; Basic Procedures | |
235 ;;; =========================================================================== | |
236 ;;; | |
237 | |
238 (defun shell-mode () | |
239 "Major mode for interacting with an inferior shell. | |
240 Return after the end of the process' output sends the text from the | |
241 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
|
242 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
|
243 for the prompt) to the end of the buffer and sends it. |
114 | 244 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
|
245 the shell. This is useful for entering passwords. |
114 | 246 |
247 If you accidentally suspend your process, use \\[comint-continue-subjob] | |
248 to continue it. | |
249 | |
250 cd, pushd and popd commands given to the shell are watched by Emacs to keep | |
251 this buffer's default directory the same as the shell's working directory. | |
252 M-x dirs queries the shell and resyncs Emacs' idea of what the current | |
253 directory stack is. | |
254 M-x dirtrack-toggle turns directory tracking on and off. | |
255 | |
256 \\{shell-mode-map} | |
2609
af46e8faaa32
(shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents:
2573
diff
changeset
|
257 Customization: Entry to this mode runs the hooks on `comint-mode-hook' and |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
258 `shell-mode-hook' (in that order). After each shell output, the hooks on |
4938 | 259 `comint-output-filter-functions' are run. |
114 | 260 |
2609
af46e8faaa32
(shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents:
2573
diff
changeset
|
261 Variables `shell-cd-regexp', `shell-pushd-regexp' and `shell-popd-regexp' |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
262 are used to match their respective commands, while `shell-pushd-tohome', |
4938 | 263 `shell-pushd-dextract' and `shell-pushd-dunique' control the behavior of the |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
264 relevant command. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
265 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
266 Variables `comint-completion-autolist', `comint-completion-addsuffix' and |
4938 | 267 `comint-completion-recexact' control the behavior of file name, command name |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
268 and variable name completion. Variable `shell-completion-execonly' controls |
4938 | 269 the behavior of command name completion. |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
270 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
271 Variables `comint-input-ring-file-name' and `comint-input-autoexpand' control |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
272 the initialisation of the input ring history, and history expansion. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
273 |
4938 | 274 Variables `comint-output-filter-functions', `comint-scroll-to-bottom-on-input', |
275 and `comint-scroll-to-bottom-on-output' control whether input and output | |
276 cause the window to scroll to the end of the buffer." | |
114 | 277 (interactive) |
278 (comint-mode) | |
252 | 279 (setq major-mode 'shell-mode) |
2556
8b6c3d4256a0
(shell-mode): Capitalize mode name.
Roland McGrath <roland@gnu.org>
parents:
2469
diff
changeset
|
280 (setq mode-name "Shell") |
114 | 281 (use-local-map shell-mode-map) |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
282 (setq comint-prompt-regexp shell-prompt-pattern) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
283 (setq comint-delimiter-argument-list shell-delimiter-argument-list) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
284 (setq comint-after-partial-filename-command 'shell-after-partial-filename) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
285 (setq comint-get-current-command 'shell-get-current-command) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
286 (setq comint-dynamic-complete-command-command 'shell-dynamic-complete-command) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
287 (make-local-variable 'paragraph-start) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
288 (setq paragraph-start comint-prompt-regexp) |
114 | 289 (make-local-variable 'shell-dirstack) |
252 | 290 (setq shell-dirstack nil) |
2351
bb1ff4e31fb6
Brent Benson's patch to support `cd -'.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
1801
diff
changeset
|
291 (setq shell-last-dir nil) |
252 | 292 (make-local-variable 'shell-dirtrackp) |
293 (setq shell-dirtrackp t) | |
294 (setq comint-input-sentinel 'shell-directory-tracker) | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
295 ;; shell-dependent assignments. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
296 (let ((shell (car (process-command (get-buffer-process (current-buffer)))))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
297 (setq comint-input-ring-file-name |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
298 (or (getenv "HISTFILE") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
299 (cond ((string-match "csh$" shell) "~/.history") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
300 ((string-match "bash$" shell) "~/.bash_history") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
301 ((string-match "ksh$" shell) "~/.sh_history") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
302 (t "~/.history"))))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
303 (run-hooks 'shell-mode-hook) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
304 (comint-read-input-ring) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
305 (shell-dirstack-message)) |
114 | 306 |
658
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
307 ;;;###autoload |
114 | 308 (defun shell () |
309 "Run an inferior shell, with I/O through buffer *shell*. | |
310 If buffer exists but shell process is not running, make new shell. | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
311 If buffer exists and shell process is running, just switch to buffer `*shell*'. |
2609
af46e8faaa32
(shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents:
2573
diff
changeset
|
312 Program used comes from variable `explicit-shell-file-name', |
252 | 313 or (if that is nil) from the ESHELL environment variable, |
314 or else from SHELL if there is no ESHELL. | |
1076 | 315 If a file `~/.emacs_SHELLNAME' exists, it is given as initial input |
252 | 316 (Note that this may lose due to a timing error if the shell |
317 discards input when it starts up.) | |
1076 | 318 The buffer is put in Shell mode, giving commands for sending input |
319 and controlling the subjobs of the shell. See `shell-mode'. | |
320 See also the variable `shell-prompt-pattern'. | |
114 | 321 |
252 | 322 The shell file name (sans directories) is used to make a symbol name |
1801 | 323 such as `explicit-csh-args'. If that symbol is a variable, |
114 | 324 its value is used as a list of arguments when invoking the shell. |
325 Otherwise, one argument `-i' is passed to the shell. | |
326 | |
327 \(Type \\[describe-mode] in the shell buffer for a list of commands.)" | |
328 (interactive) | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
329 (if (not (comint-check-proc "*shell*")) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
330 (let* ((prog (or explicit-shell-file-name |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
331 (getenv "ESHELL") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
332 (getenv "SHELL") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
333 "/bin/sh")) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
334 (name (file-name-nondirectory prog)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
335 (startfile (concat "~/.emacs_" name)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
336 (xargs-name (intern-soft (concat "explicit-" name "-args")))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
337 (set-buffer (apply 'make-comint "shell" prog |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
338 (if (file-exists-p startfile) startfile) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
339 (if (and xargs-name (boundp xargs-name)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
340 (symbol-value xargs-name) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
341 '("-i")))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
342 (shell-mode))) |
114 | 343 (switch-to-buffer "*shell*")) |
344 | |
345 ;;; Directory tracking | |
346 ;;; =========================================================================== | |
347 ;;; This code provides the shell mode input sentinel | |
348 ;;; SHELL-DIRECTORY-TRACKER | |
349 ;;; that tracks cd, pushd, and popd commands issued to the shell, and | |
350 ;;; changes the current directory of the shell buffer accordingly. | |
351 ;;; | |
352 ;;; This is basically a fragile hack, although it's more accurate than | |
2469 | 353 ;;; the version in Emacs 18's shell.el. It has the following failings: |
114 | 354 ;;; 1. It doesn't know about the cdpath shell variable. |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
355 ;;; 2. It cannot infallibly deal with command sequences, though it does well |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
356 ;;; with these and with ignoring commands forked in another shell with ()s. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
357 ;;; 3. More generally, any complex command is going to throw it. Otherwise, |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
358 ;;; you'd have to build an entire shell interpreter in emacs lisp. Failing |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
359 ;;; that, there's no way to catch shell commands where cd's are buried |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
360 ;;; inside conditional expressions, aliases, and so forth. |
114 | 361 ;;; |
362 ;;; The whole approach is a crock. Shell aliases mess it up. File sourcing | |
363 ;;; messes it up. You run other processes under the shell; these each have | |
364 ;;; separate working directories, and some have commands for manipulating | |
365 ;;; their w.d.'s (e.g., the lcd command in ftp). Some of these programs have | |
252 | 366 ;;; commands that do *not* affect the current w.d. at all, but look like they |
114 | 367 ;;; do (e.g., the cd command in ftp). In shells that allow you job |
368 ;;; control, you can switch between jobs, all having different w.d.'s. So | |
369 ;;; simply saying %3 can shift your w.d.. | |
370 ;;; | |
371 ;;; The solution is to relax, not stress out about it, and settle for | |
372 ;;; a hack that works pretty well in typical circumstances. Remember | |
373 ;;; that a half-assed solution is more in keeping with the spirit of Unix, | |
374 ;;; anyway. Blech. | |
375 ;;; | |
376 ;;; One good hack not implemented here for users of programmable shells | |
377 ;;; is to program up the shell w.d. manipulation commands to output | |
378 ;;; a coded command sequence to the tty. Something like | |
379 ;;; ESC | <cwd> | | |
380 ;;; where <cwd> is the new current working directory. Then trash the | |
381 ;;; directory tracking machinery currently used in this package, and | |
382 ;;; replace it with a process filter that watches for and strips out | |
383 ;;; these messages. | |
384 | |
385 (defun shell-directory-tracker (str) | |
386 "Tracks cd, pushd and popd commands issued to the shell. | |
387 This function is called on each input passed to the shell. | |
388 It watches for cd, pushd and popd commands and sets the buffer's | |
389 default directory to track these commands. | |
390 | |
391 You may toggle this tracking on and off with M-x dirtrack-toggle. | |
392 If emacs gets confused, you can resync with the shell with M-x dirs. | |
393 | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
394 See variables `shell-cd-regexp', `shell-pushd-regexp', and `shell-popd-regexp', |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
395 while `shell-pushd-tohome', `shell-pushd-dextract' and `shell-pushd-dunique' |
4938 | 396 control the behavior of the relevant command. |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
397 |
2609
af46e8faaa32
(shell-prompt-pattern): Undo last change.
Richard M. Stallman <rms@gnu.org>
parents:
2573
diff
changeset
|
398 Environment variables are expanded, see function `substitute-in-file-name'." |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
399 (if shell-dirtrackp |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
400 ;; We fail gracefully if we think the command will fail in the shell. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
401 (condition-case chdir-failure |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
402 (let ((start (progn (string-match "^[;\\s ]*" str) ; skip whitespace |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
403 (match-end 0))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
404 end cmd arg1) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
405 (while (string-match shell-command-regexp str start) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
406 (setq end (match-end 0) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
407 cmd (comint-arguments (substring str start end) 0 0) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
408 arg1 (comint-arguments (substring str start end) 1 1)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
409 (cond ((eq (string-match shell-popd-regexp cmd) 0) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
410 (shell-process-popd (substitute-in-file-name arg1))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
411 ((eq (string-match shell-pushd-regexp cmd) 0) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
412 (shell-process-pushd (substitute-in-file-name arg1))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
413 ((eq (string-match shell-cd-regexp cmd) 0) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
414 (shell-process-cd (substitute-in-file-name arg1)))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
415 (setq start (progn (string-match "[;\\s ]*" str end) ; skip again |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
416 (match-end 0))))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
417 (error (message "Couldn't cd"))))) |
114 | 418 |
419 | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
420 ;; Like `cd', but prepends comint-file-name-prefix to absolute names. |
4677
835ecfabae68
(shell-cd): New function, like `cd' but prepend comint-filename-prefix.
Roland McGrath <roland@gnu.org>
parents:
4676
diff
changeset
|
421 (defsubst shell-cd (directory) |
835ecfabae68
(shell-cd): New function, like `cd' but prepend comint-filename-prefix.
Roland McGrath <roland@gnu.org>
parents:
4676
diff
changeset
|
422 (if (file-name-absolute-p directory) |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
423 (cd-absolute (concat comint-file-name-prefix directory)) |
4677
835ecfabae68
(shell-cd): New function, like `cd' but prepend comint-filename-prefix.
Roland McGrath <roland@gnu.org>
parents:
4676
diff
changeset
|
424 (cd directory))) |
835ecfabae68
(shell-cd): New function, like `cd' but prepend comint-filename-prefix.
Roland McGrath <roland@gnu.org>
parents:
4676
diff
changeset
|
425 |
114 | 426 ;;; popd [+n] |
427 (defun shell-process-popd (arg) | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
428 (let ((num (or (shell-extract-num arg) 0))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
429 (cond ((and num (= num 0) shell-dirstack) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
430 (shell-cd (car shell-dirstack)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
431 (setq shell-dirstack (cdr shell-dirstack)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
432 (shell-dirstack-message)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
433 ((and num (> num 0) (<= num (length shell-dirstack))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
434 (let* ((ds (cons nil shell-dirstack)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
435 (cell (nthcdr (1- num) ds))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
436 (rplacd cell (cdr (cdr cell))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
437 (setq shell-dirstack (cdr ds)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
438 (shell-dirstack-message))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
439 (t |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
440 (error (message "Couldn't popd.")))))) |
114 | 441 |
442 ;;; cd [dir] | |
443 (defun shell-process-cd (arg) | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
444 (let ((new-dir (cond ((zerop (length arg)) (getenv "HOME")) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
445 ((string-equal "-" arg) shell-last-dir) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
446 (t arg)))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
447 (setq shell-last-dir default-directory) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
448 (shell-cd new-dir) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
449 (shell-dirstack-message))) |
114 | 450 |
451 ;;; pushd [+n | dir] | |
452 (defun shell-process-pushd (arg) | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
453 (let ((num (shell-extract-num arg))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
454 (cond ((zerop (length arg)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
455 ;; no arg -- swap pwd and car of stack unless shell-pushd-tohome |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
456 (cond (shell-pushd-tohome |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
457 (shell-process-pushd "~")) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
458 (shell-dirstack |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
459 (let ((old default-directory)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
460 (shell-cd (car shell-dirstack)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
461 (setq shell-dirstack |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
462 (cons old (cdr shell-dirstack))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
463 (shell-dirstack-message))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
464 (t |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
465 (message "Directory stack empty.")))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
466 ((numberp num) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
467 ;; pushd +n |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
468 (cond ((> num (length shell-dirstack)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
469 (message "Directory stack not that deep.")) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
470 ((= num 0) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
471 (error (message "Couldn't cd."))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
472 (shell-pushd-dextract |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
473 (let ((dir (nth (1- num) shell-dirstack))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
474 (shell-process-popd arg) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
475 (shell-process-pushd default-directory) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
476 (shell-cd dir) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
477 (shell-dirstack-message))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
478 (t |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
479 (let* ((ds (cons default-directory shell-dirstack)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
480 (dslen (length ds)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
481 (front (nthcdr num ds)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
482 (back (reverse (nthcdr (- dslen num) (reverse ds)))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
483 (new-ds (append front back))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
484 (shell-cd (car new-ds)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
485 (setq shell-dirstack (cdr new-ds)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
486 (shell-dirstack-message))))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
487 (t |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
488 ;; pushd <dir> |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
489 (let ((old-wd default-directory)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
490 (shell-cd arg) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
491 (if (or (null shell-pushd-dunique) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
492 (not (member old-wd shell-dirstack))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
493 (setq shell-dirstack (cons old-wd shell-dirstack))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
494 (shell-dirstack-message)))))) |
114 | 495 |
496 ;; If STR is of the form +n, for n>0, return n. Otherwise, nil. | |
497 (defun shell-extract-num (str) | |
498 (and (string-match "^\\+[1-9][0-9]*$" str) | |
499 (string-to-int str))) | |
500 | |
501 | |
502 (defun shell-dirtrack-toggle () | |
503 "Turn directory tracking on and off in a shell buffer." | |
504 (interactive) | |
505 (setq shell-dirtrackp (not shell-dirtrackp)) | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
506 (message "Directory tracking %s" (if shell-dirtrackp "ON" "OFF"))) |
114 | 507 |
508 ;;; For your typing convenience: | |
2571
b65cf676a09b
All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2557
diff
changeset
|
509 (defalias 'dirtrack-toggle 'shell-dirtrack-toggle) |
114 | 510 |
511 | |
512 (defun shell-resync-dirs () | |
513 "Resync the buffer's idea of the current directory stack. | |
514 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
|
515 `shell-dirstack-query' (default \"dirs\"), reads the next |
114 | 516 line output and parses it to form the new directory stack. |
517 DON'T issue this command unless the buffer is at a shell prompt. | |
518 Also, note that if some other subprocess decides to do output | |
519 immediately after the query, its output will be taken as the | |
520 new directory stack -- you lose. If this happens, just do the | |
521 command again." | |
522 (interactive) | |
523 (let* ((proc (get-buffer-process (current-buffer))) | |
524 (pmark (process-mark proc))) | |
525 (goto-char pmark) | |
526 (insert shell-dirstack-query) (insert "\n") | |
527 (sit-for 0) ; force redisplay | |
528 (comint-send-string proc shell-dirstack-query) | |
529 (comint-send-string proc "\n") | |
530 (set-marker pmark (point)) | |
531 (let ((pt (point))) ; wait for 1 line | |
532 ;; This extra newline prevents the user's pending input from spoofing us. | |
533 (insert "\n") (backward-char 1) | |
534 (while (not (looking-at ".+\n")) | |
535 (accept-process-output proc) | |
536 (goto-char pt))) | |
537 (goto-char pmark) (delete-char 1) ; remove the extra newline | |
538 ;; That's the dirlist. grab it & parse it. | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
539 (let* ((dl (buffer-substring (match-beginning 0) (1- (match-end 0)))) |
114 | 540 (dl-len (length dl)) |
541 (ds '()) ; new dir stack | |
542 (i 0)) | |
543 (while (< i dl-len) | |
544 ;; regexp = optional whitespace, (non-whitespace), optional whitespace | |
545 (string-match "\\s *\\(\\S +\\)\\s *" dl i) ; pick off next dir | |
546 (setq ds (cons (substring dl (match-beginning 1) (match-end 1)) | |
547 ds)) | |
548 (setq i (match-end 0))) | |
549 (let ((ds (reverse ds))) | |
550 (condition-case nil | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
551 (progn (cd (car ds)) |
114 | 552 (setq shell-dirstack (cdr ds)) |
553 (shell-dirstack-message)) | |
554 (error (message "Couldn't cd."))))))) | |
555 | |
556 ;;; For your typing convenience: | |
2571
b65cf676a09b
All fsets changed to defaliases.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2557
diff
changeset
|
557 (defalias 'dirs 'shell-resync-dirs) |
114 | 558 |
559 | |
560 ;;; Show the current dirstack on the message line. | |
561 ;;; Pretty up dirs a bit by changing "/usr/jqr/foo" to "~/foo". | |
562 ;;; (This isn't necessary if the dirlisting is generated with a simple "dirs".) | |
563 ;;; All the commands that mung the buffer's dirstack finish by calling | |
564 ;;; this guy. | |
565 (defun shell-dirstack-message () | |
4679
ed9240986f40
(shell-dirstack-message): Recognize ~ by matching the expansion of "~" with
Roland McGrath <roland@gnu.org>
parents:
4677
diff
changeset
|
566 (let* ((msg "") |
ed9240986f40
(shell-dirstack-message): Recognize ~ by matching the expansion of "~" with
Roland McGrath <roland@gnu.org>
parents:
4677
diff
changeset
|
567 (ds (cons default-directory shell-dirstack)) |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
568 (home (expand-file-name (concat comint-file-name-prefix "~/"))) |
4679
ed9240986f40
(shell-dirstack-message): Recognize ~ by matching the expansion of "~" with
Roland McGrath <roland@gnu.org>
parents:
4677
diff
changeset
|
569 (homelen (length home))) |
114 | 570 (while ds |
571 (let ((dir (car ds))) | |
4679
ed9240986f40
(shell-dirstack-message): Recognize ~ by matching the expansion of "~" with
Roland McGrath <roland@gnu.org>
parents:
4677
diff
changeset
|
572 (and (>= (length dir) homelen) (string= home (substring dir 0 homelen)) |
ed9240986f40
(shell-dirstack-message): Recognize ~ by matching the expansion of "~" with
Roland McGrath <roland@gnu.org>
parents:
4677
diff
changeset
|
573 (setq dir (concat "~/" (substring dir homelen)))) |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
574 ;; Strip off comint-file-name-prefix if present. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
575 (and comint-file-name-prefix |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
576 (>= (length dir) (length comint-file-name-prefix)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
577 (string= comint-file-name-prefix |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
578 (substring dir 0 (length comint-file-name-prefix))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
579 (setq dir (substring dir (length comint-file-name-prefix))) |
4679
ed9240986f40
(shell-dirstack-message): Recognize ~ by matching the expansion of "~" with
Roland McGrath <roland@gnu.org>
parents:
4677
diff
changeset
|
580 (setcar ds dir)) |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
581 (setq msg (concat msg (directory-file-name dir) " ")) |
114 | 582 (setq ds (cdr ds)))) |
583 (message msg))) | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
584 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
585 (defun shell-forward-command (&optional arg) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
586 "Move forward across ARG shell command(s). Does not cross lines. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
587 See `shell-command-regexp'." |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
588 (interactive "p") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
589 (let ((limit (save-excursion (end-of-line nil) (point)))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
590 (if (re-search-forward (concat shell-command-regexp "\\([;&|][\\s ]*\\)+") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
591 limit 'move arg) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
592 (skip-syntax-backward "^\\s ")))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
593 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
594 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
595 (defun shell-backward-command (&optional arg) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
596 "Move backward across ARG shell command(s). Does not cross lines. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
597 See `shell-command-regexp'." |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
598 (interactive "p") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
599 (let ((limit (save-excursion (comint-bol nil) (point)))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
600 (skip-syntax-backward "\\s " limit) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
601 (if (re-search-backward |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
602 (format "[;&|]+[\\s ]*\\(%s\\)" shell-command-regexp) limit 'move arg) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
603 (progn (goto-char (match-beginning 1)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
604 (skip-syntax-backward "^\\s "))))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
605 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
606 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
607 (defun shell-get-current-command () |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
608 "Function that returns the current command including arguments." |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
609 (save-excursion |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
610 (if (looking-at "\\s *[^;&|]") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
611 (goto-char (match-end 0))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
612 (buffer-substring |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
613 (progn (shell-backward-command 1) (point)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
614 (progn (shell-forward-command 1) (if (eolp) (point) (match-end 1)))))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
615 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
616 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
617 (defun shell-after-partial-filename () |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
618 "Returns t if point is after a file name. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
619 File names are assumed to contain `/'s or not be the first item in the command. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
620 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
621 See also `shell-backward-command'." |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
622 (let ((filename (comint-match-partial-filename))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
623 (or (save-match-data (string-match "/" filename)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
624 (not (eq (match-beginning 0) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
625 (save-excursion (shell-backward-command 1) (point))))))) |
252 | 626 |
627 | |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
628 (defun shell-dynamic-complete-command () |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
629 "Dynamically complete the command at point. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
630 This function is similar to `comint-dynamic-complete-filename', except that it |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
631 searches `exec-path' (minus the trailing emacs library path) for completion |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
632 candidates. Note that this may not be the same as the shell's idea of the |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
633 path. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
634 |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
635 Completion is dependent on the value of `shell-completion-execonly', plus |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
636 those that effect file completion. See `comint-dynamic-complete-filename'." |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
637 (interactive) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
638 (let* ((completion-ignore-case nil) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
639 (filename (comint-match-partial-filename)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
640 (pathnondir (file-name-nondirectory filename)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
641 (paths (cdr (reverse exec-path))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
642 (cwd (file-name-as-directory (expand-file-name default-directory))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
643 (ignored-extensions |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
644 (mapconcat (function (lambda (x) (concat (regexp-quote x) "$"))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
645 completion-ignored-extensions "\\|")) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
646 (path "") (comps-in-path ()) (file "") (filepath "") (completions ())) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
647 ;; Go thru each path in the search path, finding completions. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
648 (while paths |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
649 (setq path (file-name-as-directory (comint-directory (or (car paths) "."))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
650 comps-in-path (and (file-accessible-directory-p path) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
651 (file-name-all-completions pathnondir path))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
652 ;; Go thru each completion found, to see whether it should be used. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
653 (while comps-in-path |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
654 (setq file (car comps-in-path) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
655 filepath (concat path file)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
656 (if (and (not (member file completions)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
657 (not (string-match ignored-extensions file)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
658 (or (string-equal path cwd) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
659 (not (file-directory-p filepath))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
660 (or (null shell-completion-execonly) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
661 (file-executable-p filepath))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
662 (setq completions (cons file completions))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
663 (setq comps-in-path (cdr comps-in-path))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
664 (setq paths (cdr paths))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
665 ;; OK, we've got a list of completions. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
666 (cond ((null completions) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
667 (message "No completions of %s" filename) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
668 (ding)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
669 ((= 1 (length completions)) ; Gotcha! |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
670 (let ((completion (car completions))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
671 (if (string-equal completion pathnondir) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
672 (message "Sole completion") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
673 (insert (substring (directory-file-name completion) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
674 (length pathnondir))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
675 (message "Completed")) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
676 (if comint-completion-addsuffix |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
677 (insert (if (file-directory-p completion) "/" " "))))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
678 (t ; There's no unique completion. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
679 (let ((completion |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
680 (try-completion pathnondir (mapcar (function (lambda (x) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
681 (list x))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
682 completions)))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
683 ;; Insert the longest substring. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
684 (insert (substring (directory-file-name completion) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
685 (length pathnondir))) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
686 (cond ((and comint-completion-recexact comint-completion-addsuffix |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
687 (string-equal pathnondir completion) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
688 (member completion completions)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
689 ;; It's not unique, but user wants shortest match. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
690 (insert (if (file-directory-p completion) "/" " ")) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
691 (message "Completed shortest")) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
692 ((or comint-completion-autolist |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
693 (string-equal pathnondir completion)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
694 ;; It's not unique, list possible completions. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
695 (comint-dynamic-list-completions completions)) |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
696 (t |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
697 (message "Partially completed")))))))) |
252 | 698 |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
699 ;;; Do the user's customization... |
252 | 700 ;;; |
4871
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
701 ;;; Isn't this what eval-after-load is for? |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
702 ;;;(defvar shell-load-hook nil |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
703 ;;; "This hook is run when shell is loaded in. |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
704 ;;;This is a good place to put keybindings.") |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
705 ;;; |
30a614eb52f7
(shell-after-partial-filename): Renamed from
Richard M. Stallman <rms@gnu.org>
parents:
4679
diff
changeset
|
706 ;;;(run-hooks 'shell-load-hook) |
252 | 707 |
658
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
708 (provide 'shell) |
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
709 |
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
252
diff
changeset
|
710 ;;; shell.el ends here |