Mercurial > emacs
annotate lisp/progmodes/executable.el @ 51242:661e2fe7e775
(autoconf-mode setups): Recognise AH_ and AU_ entries in "(autoconf)Autoconf
Macro Index". Add "(autoconf)M4 Macro Index" and "(autoconf)Autotest Macro
Index". Remove duplicate copy of "(automake)Macro and Variable Index". Keep
automake after all autoconf possibilities, so as to prefer those.
author | Juanma Barranquero <lekktu@gmail.com> |
---|---|
date | Sun, 25 May 2003 21:03:57 +0000 |
parents | 52ad052cb312 |
children | 695cf19ef79e |
rev | line source |
---|---|
29526 | 1 ;;; executable.el --- base functionality for executable interpreter scripts -*- byte-compile-dynamic: t -*- |
14169 | 2 |
51083
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
3 ;; Copyright (C) 1994, 1995, 1996, 2000, 2003 by Free Software Foundation, Inc. |
12504 | 4 |
23869 | 5 ;; Author: Daniel Pfeiffer <occitan@esperanto.org> |
12504 | 6 ;; Keywords: languages, unix |
7 | |
8 ;; This file is part of GNU Emacs. | |
9 | |
10 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
11 ;; it under the terms of the GNU General Public License as published by | |
12 ;; the Free Software Foundation; either version 2, or (at your option) | |
13 ;; any later version. | |
14 | |
15 ;; GNU Emacs is distributed in the hope that it will be useful, | |
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 ;; GNU General Public License for more details. | |
19 | |
20 ;; You should have received a copy of the GNU General Public License | |
14169 | 21 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
23 ;; Boston, MA 02111-1307, USA. | |
12504 | 24 |
25 ;;; Commentary: | |
12818 | 26 |
27 ;; executable.el is used by certain major modes to insert a suitable | |
28 ;; #! line at the beginning of the file, if the file does not already | |
29 ;; have one. | |
30 | |
14722 | 31 ;; Unless it has a magic number, a Unix file with executable mode is passed to |
32 ;; a new instance of the running shell (or to a Bourne shell if a csh is | |
33 ;; running and the file starts with `:'). Only a shell can start such a file, | |
34 ;; exec() cannot, which is why it is important to have a magic number in every | |
35 ;; executable script. Such a magic number is made up by the characters `#!' | |
36 ;; the filename of an interpreter (in COFF, ELF or somesuch format) and one | |
37 ;; optional argument. | |
38 | |
39 ;; This library is for certain major modes like sh-, awk-, perl-, tcl- or | |
40 ;; makefile-mode to insert or update a suitable #! line at the beginning of | |
41 ;; the file, if the file does not already have one and the file is not a | |
42 ;; default file of that interpreter (like .profile or makefile). It also | |
43 ;; makes the file executable if it wasn't, as soon as it's saved. | |
44 | |
45 ;; It also allows debugging scripts, with an adaptation of compile, as far | |
46 ;; as interpreters give out meaningful error messages. | |
47 | |
48 ;; Modes that use this should nconc `executable-map' to the end of their own | |
49 ;; keymap and `executable-font-lock-keywords' to the end of their own font | |
50 ;; lock keywords. Their mode-setting commands should call | |
51 ;; `executable-set-magic'. | |
12812
39e721f1681f
(interpreter-mode-alist): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents:
12504
diff
changeset
|
52 |
12504 | 53 ;;; Code: |
54 | |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
55 (defgroup executable nil |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
56 "Base functionality for executable interpreter scripts" |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
57 :group 'processes) |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
58 |
29526 | 59 ;; This used to default to `other', but that doesn't seem to have any |
60 ;; significance. fx 2000-02-11. | |
61 (defcustom executable-insert t ; 'other | |
16128
7af77f490166
(executable-insert): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
15750
diff
changeset
|
62 "*Non-nil means offer to add a magic number to a file. |
7af77f490166
(executable-insert): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
15750
diff
changeset
|
63 This takes effect when you switch to certain major modes, |
7af77f490166
(executable-insert): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
15750
diff
changeset
|
64 including Shell-script mode (`sh-mode'). |
7af77f490166
(executable-insert): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
15750
diff
changeset
|
65 When you type \\[executable-set-magic], it always offers to add or |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
66 update the magic number." |
29526 | 67 ;;; :type '(choice (const :tag "off" nil) |
68 ;;; (const :tag "on" t) | |
69 ;;; symbol) | |
70 :type 'boolean | |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
71 :group 'executable) |
12504 | 72 |
73 | |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
74 (defcustom executable-query 'function |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
75 "*If non-nil, ask user before changing an existing magic number. |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
76 When this is `function', only ask when called non-interactively." |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
77 :type '(choice (const :tag "Don't Ask" nil) |
22595
39510277d6a0
(executable-query): Use `other' widget
Andreas Schwab <schwab@suse.de>
parents:
22559
diff
changeset
|
78 (const :tag "Ask when non-interactive" function) |
39510277d6a0
(executable-query): Use `other' widget
Andreas Schwab <schwab@suse.de>
parents:
22559
diff
changeset
|
79 (other :tag "Ask" t)) |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
80 :group 'executable) |
12504 | 81 |
82 | |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
83 (defcustom executable-magicless-file-regexp "/[Mm]akefile$\\|/\\.\\(z?profile\\|bash_profile\\|z?login\\|bash_login\\|z?logout\\|bash_logout\\|.+shrc\\|esrc\\|rcrc\\|[kz]shenv\\)$" |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
84 "*On files with this kind of name no magic is inserted or changed." |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
85 :type 'regexp |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
86 :group 'executable) |
12504 | 87 |
88 | |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
89 (defcustom executable-prefix "#! " |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
90 "*Interpreter magic number prefix inserted when there was no magic number." |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
91 :type 'string |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
92 :group 'executable) |
12504 | 93 |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
94 |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
95 (defcustom executable-chmod 73 |
12504 | 96 "*After saving, if the file is not executable, set this mode. |
97 This mode passed to `set-file-modes' is taken absolutely when negative, or | |
98 relative to the files existing modes. Do nothing if this is nil. | |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
99 Typical values are 73 (+x) or -493 (rwxr-xr-x)." |
19830
521f5765e7ce
(executable-chmod): Fix customize type.
Richard M. Stallman <rms@gnu.org>
parents:
17977
diff
changeset
|
100 :type '(choice integer |
521f5765e7ce
(executable-chmod): Fix customize type.
Richard M. Stallman <rms@gnu.org>
parents:
17977
diff
changeset
|
101 (const nil)) |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
102 :group 'executable) |
12504 | 103 |
104 | |
105 (defvar executable-command nil) | |
106 | |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
107 (defcustom executable-self-display "tail" |
12504 | 108 "*Command you use with argument `+2' to make text files self-display. |
29526 | 109 Note that the like of `more' doesn't work too well under Emacs \\[shell]." |
17411
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
110 :type 'string |
f0ff96a35eb8
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16128
diff
changeset
|
111 :group 'executable) |
12504 | 112 |
113 | |
114 (defvar executable-font-lock-keywords | |
115 '(("\\`#!.*/\\([^ \t\n]+\\)" 1 font-lock-keyword-face t)) | |
116 "*Rules for highlighting executable scripts' magic number. | |
117 This can be included in `font-lock-keywords' by modes that call `executable'.") | |
118 | |
119 | |
120 (defvar executable-error-regexp-alist | |
121 '(;; /bin/xyz: syntax error at line 14: `(' unexpected | |
122 ;; /bin/xyz[5]: syntax error at line 8 : ``' unmatched | |
123 ("^\\(.*[^[/]\\)\\(\\[[0-9]+\\]\\)?: .* error .* line \\([0-9]+\\)" 1 3) | |
124 ;; /bin/xyz[27]: ehco: not found | |
125 ("^\\(.*[^/]\\)\\[\\([0-9]+\\)\\]: .*: " 1 2) | |
126 ;; /bin/xyz: syntax error near unexpected token `)' | |
127 ;; /bin/xyz: /bin/xyz: line 2: `)' | |
128 ("^\\(.*[^/]\\): [^0-9\n]+\n\\1: \\1: line \\([0-9]+\\):" 1 2) | |
129 ;; /usr/bin/awk: syntax error at line 5 of file /bin/xyz | |
130 (" error .* line \\([0-9]+\\) of file \\(.+\\)$" 2 1) | |
131 ;; /usr/bin/awk: calling undefined function toto | |
132 ;; input record number 3, file awktestdata | |
133 ;; source line 4 of file /bin/xyz | |
134 ("^[^ ].+\n\\( .+\n\\)* line \\([0-9]+\\) of file \\(.+\\)$" 3 2) | |
135 ;; makefile:1: *** target pattern contains no `%'. Stop. | |
136 ("^\\(.+\\):\\([0-9]+\\): " 1 2)) | |
137 "Alist of regexps used to match script errors. | |
138 See `compilation-error-regexp-alist'.") | |
139 | |
14111
787061ad42ba
(executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents:
14024
diff
changeset
|
140 ;; The C function openp slightly modified would do the trick fine |
39933
89f6eeae2af3
(executable-binary-suffixes): Make varalias.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38713
diff
changeset
|
141 (defvaralias 'executable-binary-suffixes 'exec-suffixes) |
29526 | 142 |
143 ;;;###autoload | |
14111
787061ad42ba
(executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents:
14024
diff
changeset
|
144 (defun executable-find (command) |
39933
89f6eeae2af3
(executable-binary-suffixes): Make varalias.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38713
diff
changeset
|
145 "Search for COMMAND in `exec-path' and return the absolute file name. |
15750
347aa710b4a9
(executable-find): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
15744
diff
changeset
|
146 Return nil if COMMAND is not found anywhere in `exec-path'." |
12504 | 147 (let ((list exec-path) |
14111
787061ad42ba
(executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents:
14024
diff
changeset
|
148 file) |
12504 | 149 (while list |
22559
d9e33b33a02f
(executable-binary-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19830
diff
changeset
|
150 (setq list |
d9e33b33a02f
(executable-binary-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19830
diff
changeset
|
151 (if (and (setq file (expand-file-name command (car list))) |
39933
89f6eeae2af3
(executable-binary-suffixes): Make varalias.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38713
diff
changeset
|
152 (let ((suffixes exec-suffixes) |
22559
d9e33b33a02f
(executable-binary-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19830
diff
changeset
|
153 candidate) |
d9e33b33a02f
(executable-binary-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19830
diff
changeset
|
154 (while suffixes |
d9e33b33a02f
(executable-binary-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19830
diff
changeset
|
155 (setq candidate (concat file (car suffixes))) |
d9e33b33a02f
(executable-binary-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19830
diff
changeset
|
156 (if (and (file-executable-p candidate) |
d9e33b33a02f
(executable-binary-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19830
diff
changeset
|
157 (not (file-directory-p candidate))) |
d9e33b33a02f
(executable-binary-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19830
diff
changeset
|
158 (setq suffixes nil) |
d9e33b33a02f
(executable-binary-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19830
diff
changeset
|
159 (setq suffixes (cdr suffixes)) |
d9e33b33a02f
(executable-binary-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19830
diff
changeset
|
160 (setq candidate nil))) |
d9e33b33a02f
(executable-binary-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19830
diff
changeset
|
161 (setq file candidate))) |
d9e33b33a02f
(executable-binary-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19830
diff
changeset
|
162 nil |
d9e33b33a02f
(executable-binary-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19830
diff
changeset
|
163 (setq file nil) |
d9e33b33a02f
(executable-binary-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19830
diff
changeset
|
164 (cdr list)))) |
14111
787061ad42ba
(executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents:
14024
diff
changeset
|
165 file)) |
12504 | 166 |
167 (defun executable-chmod () | |
168 "This gets called after saving a file to assure that it be executable. | |
169 You can set the absolute or relative mode in variable `executable-chmod' for | |
170 non-executable files." | |
171 (and executable-chmod | |
172 buffer-file-name | |
173 (or (file-executable-p buffer-file-name) | |
174 (set-file-modes buffer-file-name | |
175 (if (< executable-chmod 0) | |
176 (- executable-chmod) | |
177 (logior executable-chmod | |
178 (file-modes buffer-file-name))))))) | |
179 | |
180 | |
181 (defun executable-interpret (command) | |
182 "Run script with user-specified args, and collect output in a buffer. | |
183 While script runs asynchronously, you can use the \\[next-error] command | |
184 to find the next error." | |
185 (interactive (list (read-string "Run script: " | |
186 (or executable-command | |
187 buffer-file-name)))) | |
188 (require 'compile) | |
189 (save-some-buffers (not compilation-ask-about-save)) | |
190 (make-local-variable 'executable-command) | |
191 (compile-internal (setq executable-command command) | |
192 "No more errors." "Interpretation" | |
193 ;; Give it a simpler regexp to match. | |
194 nil executable-error-regexp-alist)) | |
195 | |
196 | |
197 | |
198 ;;;###autoload | |
14111
787061ad42ba
(executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents:
14024
diff
changeset
|
199 (defun executable-set-magic (interpreter &optional argument |
787061ad42ba
(executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents:
14024
diff
changeset
|
200 no-query-flag insert-flag) |
12504 | 201 "Set this buffer's interpreter to INTERPRETER with optional ARGUMENT. |
202 The variables `executable-magicless-file-regexp', `executable-prefix', | |
203 `executable-insert', `executable-query' and `executable-chmod' control | |
204 when and how magic numbers are inserted or replaced and scripts made | |
205 executable." | |
14111
787061ad42ba
(executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents:
14024
diff
changeset
|
206 (interactive |
787061ad42ba
(executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents:
14024
diff
changeset
|
207 (let* ((name (read-string "Name or file name of interpreter: ")) |
787061ad42ba
(executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents:
14024
diff
changeset
|
208 (arg (read-string (format "Argument for %s: " name)))) |
787061ad42ba
(executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents:
14024
diff
changeset
|
209 (list name arg (eq executable-query 'function) t))) |
38713 | 210 |
12504 | 211 (setq interpreter (if (file-name-absolute-p interpreter) |
212 interpreter | |
14111
787061ad42ba
(executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents:
14024
diff
changeset
|
213 (or (executable-find interpreter) |
38713 | 214 (error "Interpreter %s not recognized" |
215 interpreter)))) | |
216 | |
217 (setq argument (concat (if (string-match "\\`/:" interpreter) | |
218 (replace-match "" nil nil interpreter) | |
219 interpreter) | |
12504 | 220 (and argument (string< "" argument) " ") |
221 argument)) | |
38713 | 222 |
12504 | 223 (or buffer-read-only |
224 (if buffer-file-name | |
225 (string-match executable-magicless-file-regexp | |
226 buffer-file-name)) | |
14111
787061ad42ba
(executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents:
14024
diff
changeset
|
227 (not (or insert-flag executable-insert)) |
12504 | 228 (> (point-min) 1) |
14111
787061ad42ba
(executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents:
14024
diff
changeset
|
229 (save-excursion |
51083
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
230 (goto-char (point-min)) |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
231 (add-hook 'after-save-hook 'executable-chmod nil t) |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
232 (if (looking-at "#![ \t]*\\(.*\\)$") |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
233 (and (goto-char (match-beginning 1)) |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
234 ;; If the line ends in a space, |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
235 ;; don't offer to change it. |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
236 (not (= (char-after (1- (match-end 1))) ?\ )) |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
237 (not (string= argument |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
238 (buffer-substring (point) (match-end 1)))) |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
239 (if (or (not executable-query) no-query-flag |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
240 (save-window-excursion |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
241 ;; Make buffer visible before question. |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
242 (switch-to-buffer (current-buffer)) |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
243 (y-or-n-p (concat "Replace magic number by `" |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
244 executable-prefix argument "'? ")))) |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
245 (progn |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
246 (replace-match argument t t nil 1) |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
247 (message "Magic number changed to `%s'" |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
248 (concat executable-prefix argument))))) |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
249 (insert executable-prefix argument ?\n) |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
250 (message "Magic number changed to `%s'" |
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
251 (concat executable-prefix argument))))) |
38713 | 252 interpreter) |
12504 | 253 |
254 | |
255 | |
256 ;;;###autoload | |
257 (defun executable-self-display () | |
258 "Turn a text file into a self-displaying Un*x command. | |
259 The magic number of such a command displays all lines but itself." | |
260 (interactive) | |
261 (if (eq this-command 'executable-self-display) | |
262 (setq this-command 'executable-set-magic)) | |
263 (executable-set-magic executable-self-display "+2")) | |
264 | |
29526 | 265 ;;;###autoload |
29530
2485d23636b2
(executable-make-buffer-file-executable-if-script-p): Renamed and
Dave Love <fx@gnu.org>
parents:
29526
diff
changeset
|
266 (defun executable-make-buffer-file-executable-if-script-p () |
29526 | 267 "Make file executable according to umask if not already executable. |
268 If file already has any execute bits set at all, do not change existing | |
269 file modes." | |
31281
87580ecaceee
(executable-make-buffer-file-executable-if-script-p): Check that
Gerd Moellmann <gerd@gnu.org>
parents:
29530
diff
changeset
|
270 (and (>= (buffer-size) 2) |
87580ecaceee
(executable-make-buffer-file-executable-if-script-p): Check that
Gerd Moellmann <gerd@gnu.org>
parents:
29530
diff
changeset
|
271 (save-restriction |
29530
2485d23636b2
(executable-make-buffer-file-executable-if-script-p): Renamed and
Dave Love <fx@gnu.org>
parents:
29526
diff
changeset
|
272 (widen) |
51083
52ad052cb312
(executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39933
diff
changeset
|
273 (string= "#!" (buffer-substring (point-min) (+ 2 (point-min))))) |
29526 | 274 (let* ((current-mode (file-modes (buffer-file-name))) |
275 (add-mode (logand ?\111 (default-file-modes)))) | |
276 (or (/= (logand ?\111 current-mode) 0) | |
277 (zerop add-mode) | |
278 (set-file-modes (buffer-file-name) | |
279 (logior current-mode add-mode)))))) | |
12504 | 280 |
281 (provide 'executable) | |
282 | |
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
31281
diff
changeset
|
283 ;;; executable.el ends here |