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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
29526
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
1 ;;; executable.el --- base functionality for executable interpreter scripts -*- byte-compile-dynamic: t -*-
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14111
diff changeset
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
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4
23869
8d2bb5d1416a Update comment.
Karl Heuer <kwzh@gnu.org>
parents: 22595
diff changeset
5 ;; Author: Daniel Pfeiffer <occitan@esperanto.org>
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6 ;; Keywords: languages, unix
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
9
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
11 ;; it under the terms of the GNU General Public License as published by
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
13 ;; any later version.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
14
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
15 ;; GNU Emacs is distributed in the hope that it will be useful,
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
18 ;; GNU General Public License for more details.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
19
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14111
diff changeset
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14111
diff changeset
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14111
diff changeset
23 ;; Boston, MA 02111-1307, USA.
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
24
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
25 ;;; Commentary:
12818
3ef9f196e634 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 12817
diff changeset
26
3ef9f196e634 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 12817
diff changeset
27 ;; executable.el is used by certain major modes to insert a suitable
3ef9f196e634 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 12817
diff changeset
28 ;; #! line at the beginning of the file, if the file does not already
3ef9f196e634 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 12817
diff changeset
29 ;; have one.
3ef9f196e634 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 12817
diff changeset
30
14722
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
31 ;; Unless it has a magic number, a Unix file with executable mode is passed to
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
32 ;; a new instance of the running shell (or to a Bourne shell if a csh is
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
33 ;; running and the file starts with `:'). Only a shell can start such a file,
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
34 ;; exec() cannot, which is why it is important to have a magic number in every
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
35 ;; executable script. Such a magic number is made up by the characters `#!'
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
36 ;; the filename of an interpreter (in COFF, ELF or somesuch format) and one
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
37 ;; optional argument.
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
38
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
39 ;; This library is for certain major modes like sh-, awk-, perl-, tcl- or
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
40 ;; makefile-mode to insert or update a suitable #! line at the beginning of
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
41 ;; the file, if the file does not already have one and the file is not a
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
42 ;; default file of that interpreter (like .profile or makefile). It also
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
43 ;; makes the file executable if it wasn't, as soon as it's saved.
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
44
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
45 ;; It also allows debugging scripts, with an adaptation of compile, as far
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
46 ;; as interpreters give out meaningful error messages.
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
47
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
48 ;; Modes that use this should nconc `executable-map' to the end of their own
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
49 ;; keymap and `executable-font-lock-keywords' to the end of their own font
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
50 ;; lock keywords. Their mode-setting commands should call
4f6baee20482 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
51 ;; `executable-set-magic'.
12812
39e721f1681f (interpreter-mode-alist): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12504
diff changeset
52
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
53 ;;; Code:
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
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
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
59 ;; This used to default to `other', but that doesn't seem to have any
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
60 ;; significance. fx 2000-02-11.
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
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
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
67 ;;; :type '(choice (const :tag "off" nil)
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
68 ;;; (const :tag "on" t)
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
69 ;;; symbol)
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
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
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
72
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
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
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
81
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
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
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
87
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
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
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
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
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
96 "*After saving, if the file is not executable, set this mode.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
97 This mode passed to `set-file-modes' is taken absolutely when negative, or
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
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
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
103
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
104
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
105 (defvar executable-command nil)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
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
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
108 "*Command you use with argument `+2' to make text files self-display.
29526
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
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
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
112
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
113
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
114 (defvar executable-font-lock-keywords
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
115 '(("\\`#!.*/\\([^ \t\n]+\\)" 1 font-lock-keyword-face t))
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
116 "*Rules for highlighting executable scripts' magic number.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
117 This can be included in `font-lock-keywords' by modes that call `executable'.")
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
118
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
119
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
120 (defvar executable-error-regexp-alist
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
121 '(;; /bin/xyz: syntax error at line 14: `(' unexpected
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
122 ;; /bin/xyz[5]: syntax error at line 8 : ``' unmatched
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
123 ("^\\(.*[^[/]\\)\\(\\[[0-9]+\\]\\)?: .* error .* line \\([0-9]+\\)" 1 3)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
124 ;; /bin/xyz[27]: ehco: not found
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
125 ("^\\(.*[^/]\\)\\[\\([0-9]+\\)\\]: .*: " 1 2)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
126 ;; /bin/xyz: syntax error near unexpected token `)'
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
127 ;; /bin/xyz: /bin/xyz: line 2: `)'
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
128 ("^\\(.*[^/]\\): [^0-9\n]+\n\\1: \\1: line \\([0-9]+\\):" 1 2)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
129 ;; /usr/bin/awk: syntax error at line 5 of file /bin/xyz
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
130 (" error .* line \\([0-9]+\\) of file \\(.+\\)$" 2 1)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
131 ;; /usr/bin/awk: calling undefined function toto
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
132 ;; input record number 3, file awktestdata
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
133 ;; source line 4 of file /bin/xyz
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
134 ("^[^ ].+\n\\( .+\n\\)* line \\([0-9]+\\) of file \\(.+\\)$" 3 2)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
135 ;; makefile:1: *** target pattern contains no `%'. Stop.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
136 ("^\\(.+\\):\\([0-9]+\\): " 1 2))
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
137 "Alist of regexps used to match script errors.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
138 See `compilation-error-regexp-alist'.")
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
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
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
142
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
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
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
147 (let ((list exec-path)
14111
787061ad42ba (executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents: 14024
diff changeset
148 file)
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
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
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
166
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
167 (defun executable-chmod ()
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
168 "This gets called after saving a file to assure that it be executable.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
169 You can set the absolute or relative mode in variable `executable-chmod' for
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
170 non-executable files."
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
171 (and executable-chmod
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
172 buffer-file-name
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
173 (or (file-executable-p buffer-file-name)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
174 (set-file-modes buffer-file-name
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
175 (if (< executable-chmod 0)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
176 (- executable-chmod)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
177 (logior executable-chmod
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
178 (file-modes buffer-file-name)))))))
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
179
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
180
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
181 (defun executable-interpret (command)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
182 "Run script with user-specified args, and collect output in a buffer.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
183 While script runs asynchronously, you can use the \\[next-error] command
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
184 to find the next error."
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
185 (interactive (list (read-string "Run script: "
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
186 (or executable-command
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
187 buffer-file-name))))
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
188 (require 'compile)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
189 (save-some-buffers (not compilation-ask-about-save))
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
190 (make-local-variable 'executable-command)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
191 (compile-internal (setq executable-command command)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
192 "No more errors." "Interpretation"
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
193 ;; Give it a simpler regexp to match.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
194 nil executable-error-regexp-alist))
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
195
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
196
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
197
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
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
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
201 "Set this buffer's interpreter to INTERPRETER with optional ARGUMENT.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
202 The variables `executable-magicless-file-regexp', `executable-prefix',
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
203 `executable-insert', `executable-query' and `executable-chmod' control
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
204 when and how magic numbers are inserted or replaced and scripts made
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
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
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
210
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
211 (setq interpreter (if (file-name-absolute-p interpreter)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
212 interpreter
14111
787061ad42ba (executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents: 14024
diff changeset
213 (or (executable-find interpreter)
38713
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
214 (error "Interpreter %s not recognized"
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
215 interpreter))))
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
216
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
217 (setq argument (concat (if (string-match "\\`/:" interpreter)
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
218 (replace-match "" nil nil interpreter)
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
219 interpreter)
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
220 (and argument (string< "" argument) " ")
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
221 argument))
38713
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
222
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
223 (or buffer-read-only
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
224 (if buffer-file-name
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
225 (string-match executable-magicless-file-regexp
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
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
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
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
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
252 interpreter)
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
253
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
254
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
255
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
256 ;;;###autoload
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
257 (defun executable-self-display ()
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
258 "Turn a text file into a self-displaying Un*x command.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
259 The magic number of such a command displays all lines but itself."
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
260 (interactive)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
261 (if (eq this-command 'executable-self-display)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
262 (setq this-command 'executable-set-magic))
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
263 (executable-set-magic executable-self-display "+2"))
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
264
29526
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
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
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
267 "Make file executable according to umask if not already executable.
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
268 If file already has any execute bits set at all, do not change existing
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
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
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
274 (let* ((current-mode (file-modes (buffer-file-name)))
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
275 (add-mode (logand ?\111 (default-file-modes))))
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
276 (or (/= (logand ?\111 current-mode) 0)
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
277 (zerop add-mode)
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
278 (set-file-modes (buffer-file-name)
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
279 (logior current-mode add-mode))))))
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
280
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
281 (provide 'executable)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
282
38436
b174db545cfd Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 31281
diff changeset
283 ;;; executable.el ends here