annotate lisp/progmodes/executable.el @ 63308:51d38cfbe542

Warn about using "cvs up -kb" if one intends to commit changes. Add a pointer to another site with detailed configure and build instructions. Suggest to look at config.log when configure fails. Add MinGW Make 3.80 to the list of successful combinations.
author Eli Zaretskii <eliz@gnu.org>
date Sat, 11 Jun 2005 11:31:29 +0000
parents 8cffa2d0ef26
children 56910476003b 62afea0771d8
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
53772
11ae9146993f (executable-command-find-posix-p): Doc fix.
Andreas Schwab <schwab@suse.de>
parents: 53749
diff changeset
3 ;; Copyright (C) 1994, 1995, 1996, 2000, 2003, 2004 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
53749
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
144 (defun executable-command-find-posix-p (&optional program)
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
145 "Check if PROGRAM handles arguments Posix-style.
53772
11ae9146993f (executable-command-find-posix-p): Doc fix.
Andreas Schwab <schwab@suse.de>
parents: 53749
diff changeset
146 If PROGRAM is non-nil, use that instead of \"find\"."
53749
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
147 ;; Pick file to search from location we know
54065
18ada18b62be (executable-command-find-posix-p): Fix choice of the directory.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 53772
diff changeset
148 (let* ((dir (file-truename data-directory))
18ada18b62be (executable-command-find-posix-p): Fix choice of the directory.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 53772
diff changeset
149 (file (car (directory-files dir nil "^[^.]"))))
53749
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
150 (with-temp-buffer
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
151 (call-process (or program "find")
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
152 nil
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
153 (current-buffer)
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
154 nil
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
155 dir
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
156 "-name"
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
157 file
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
158 "-maxdepth"
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
159 "1")
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
160 (goto-char (point-min))
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
161 (if (search-forward file nil t)
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
162 t))))
fef39a2085e4 (executable-command-find-posix-p):
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
163
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
164 (defun executable-chmod ()
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
165 "This gets called after saving a file to assure that it be executable.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
166 You can set the absolute or relative mode in variable `executable-chmod' for
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
167 non-executable files."
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
168 (and executable-chmod
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
169 buffer-file-name
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
170 (or (file-executable-p buffer-file-name)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
171 (set-file-modes buffer-file-name
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
172 (if (< executable-chmod 0)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
173 (- executable-chmod)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
174 (logior executable-chmod
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
175 (file-modes buffer-file-name)))))))
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
176
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
177
58983
2e6b67f7b5c9 (executable-interpret): Eliminate obsolete compile-internal, and switch to comint for interaction.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 54065
diff changeset
178 ;;;###autoload
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
179 (defun executable-interpret (command)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
180 "Run script with user-specified args, and collect output in a buffer.
58983
2e6b67f7b5c9 (executable-interpret): Eliminate obsolete compile-internal, and switch to comint for interaction.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 54065
diff changeset
181 While script runs asynchronously, you can use the \\[next-error]
2e6b67f7b5c9 (executable-interpret): Eliminate obsolete compile-internal, and switch to comint for interaction.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 54065
diff changeset
182 command to find the next error. The buffer is also in `comint-mode' and
2e6b67f7b5c9 (executable-interpret): Eliminate obsolete compile-internal, and switch to comint for interaction.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 54065
diff changeset
183 `compilation-shell-minor-mode', so that you can answer any prompts."
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
184 (interactive (list (read-string "Run script: "
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
185 (or executable-command
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
186 buffer-file-name))))
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
187 (require 'compile)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
188 (save-some-buffers (not compilation-ask-about-save))
58983
2e6b67f7b5c9 (executable-interpret): Eliminate obsolete compile-internal, and switch to comint for interaction.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 54065
diff changeset
189 (set (make-local-variable 'executable-command) command)
2e6b67f7b5c9 (executable-interpret): Eliminate obsolete compile-internal, and switch to comint for interaction.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 54065
diff changeset
190 (let ((compilation-error-regexp-alist executable-error-regexp-alist))
2e6b67f7b5c9 (executable-interpret): Eliminate obsolete compile-internal, and switch to comint for interaction.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 54065
diff changeset
191 (compilation-start command t (lambda (x) "*interpretation*"))))
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
192
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
193
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
194
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
195 ;;;###autoload
14111
787061ad42ba (executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents: 14024
diff changeset
196 (defun executable-set-magic (interpreter &optional argument
787061ad42ba (executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents: 14024
diff changeset
197 no-query-flag insert-flag)
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
198 "Set this buffer's interpreter to INTERPRETER with optional ARGUMENT.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
199 The variables `executable-magicless-file-regexp', `executable-prefix',
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
200 `executable-insert', `executable-query' and `executable-chmod' control
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
201 when and how magic numbers are inserted or replaced and scripts made
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
202 executable."
14111
787061ad42ba (executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents: 14024
diff changeset
203 (interactive
787061ad42ba (executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents: 14024
diff changeset
204 (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
205 (arg (read-string (format "Argument for %s: " name))))
787061ad42ba (executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents: 14024
diff changeset
206 (list name arg (eq executable-query 'function) t)))
38713
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
207
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
208 (setq interpreter (if (file-name-absolute-p interpreter)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
209 interpreter
14111
787061ad42ba (executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents: 14024
diff changeset
210 (or (executable-find interpreter)
38713
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
211 (error "Interpreter %s not recognized"
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
212 interpreter))))
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
213
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
214 (setq argument (concat (if (string-match "\\`/:" interpreter)
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
215 (replace-match "" nil nil interpreter)
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
216 interpreter)
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
217 (and argument (string< "" argument) " ")
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
218 argument))
38713
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
219
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
220 (or buffer-read-only
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
221 (if buffer-file-name
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
222 (string-match executable-magicless-file-regexp
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
223 buffer-file-name))
14111
787061ad42ba (executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents: 14024
diff changeset
224 (not (or insert-flag executable-insert))
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
225 (> (point-min) 1)
14111
787061ad42ba (executable-find): Renamed from `executable'.
Karl Heuer <kwzh@gnu.org>
parents: 14024
diff changeset
226 (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
227 (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
228 (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
229 (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
230 (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
231 ;; 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
232 ;; 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
233 (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
234 (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
235 (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
236 (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
237 (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
238 ;; 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
239 (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
240 (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
241 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
242 (progn
52ad052cb312 (executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39933
diff changeset
243 (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
244 (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
245 (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
246 (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
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)))))
38713
0e498f6c5404 (executable-set-magic): If
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
249 interpreter)
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
250
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
251
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
252
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
253 ;;;###autoload
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
254 (defun executable-self-display ()
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
255 "Turn a text file into a self-displaying Un*x command.
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
256 The magic number of such a command displays all lines but itself."
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
257 (interactive)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
258 (if (eq this-command 'executable-self-display)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
259 (setq this-command 'executable-set-magic))
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
260 (executable-set-magic executable-self-display "+2"))
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
261
29526
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
262 ;;;###autoload
29530
2485d23636b2 (executable-make-buffer-file-executable-if-script-p): Renamed and
Dave Love <fx@gnu.org>
parents: 29526
diff changeset
263 (defun executable-make-buffer-file-executable-if-script-p ()
29526
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
264 "Make file executable according to umask if not already executable.
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
265 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
266 file modes."
31281
87580ecaceee (executable-make-buffer-file-executable-if-script-p): Check that
Gerd Moellmann <gerd@gnu.org>
parents: 29530
diff changeset
267 (and (>= (buffer-size) 2)
87580ecaceee (executable-make-buffer-file-executable-if-script-p): Check that
Gerd Moellmann <gerd@gnu.org>
parents: 29530
diff changeset
268 (save-restriction
29530
2485d23636b2 (executable-make-buffer-file-executable-if-script-p): Renamed and
Dave Love <fx@gnu.org>
parents: 29526
diff changeset
269 (widen)
51083
52ad052cb312 (executable-set-magic): Remove unused vars `point' and `buffer-modified-p'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39933
diff changeset
270 (string= "#!" (buffer-substring (point-min) (+ 2 (point-min)))))
29526
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
271 (let* ((current-mode (file-modes (buffer-file-name)))
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
272 (add-mode (logand ?\111 (default-file-modes))))
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
273 (or (/= (logand ?\111 current-mode) 0)
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
274 (zerop add-mode)
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
275 (set-file-modes (buffer-file-name)
64d6ad22bce7 Byte compile dynamic.
Dave Love <fx@gnu.org>
parents: 23869
diff changeset
276 (logior current-mode add-mode))))))
12504
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
277
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
278 (provide 'executable)
9f5037515993 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
279
62236
8cffa2d0ef26 (executable-find): Move to files.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58983
diff changeset
280 ;; arch-tag: 58458d1c-d9db-45ec-942b-8bbb1d5e319d
38436
b174db545cfd Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 31281
diff changeset
281 ;;; executable.el ends here