Function: executable-set-magic
executable-set-magic is an autoloaded, interactive and byte-compiled
function defined in executable.el.gz.
Signature
(executable-set-magic INTERPRETER &optional ARGUMENT NO-QUERY-FLAG INSERT-FLAG)
Documentation
Set this buffer's interpreter to INTERPRETER with optional ARGUMENT.
The variables executable-magicless-file-regexp, executable-prefix-env,
executable-insert, executable-query and executable-chmod(var)/executable-chmod(fun) control
when and how magic numbers are inserted or replaced and scripts made
executable.
Probably introduced at or before Emacs version 19.30.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/executable.el.gz
;;;###autoload
(defun executable-set-magic (interpreter &optional argument
no-query-flag insert-flag)
"Set this buffer's interpreter to INTERPRETER with optional ARGUMENT.
The variables `executable-magicless-file-regexp', `executable-prefix-env',
`executable-insert', `executable-query' and `executable-chmod' control
when and how magic numbers are inserted or replaced and scripts made
executable."
(interactive
(let* ((name (read-string "Name or file name of interpreter: "))
(arg (read-string (format "Argument for %s: " name))))
(list name arg (eq executable-query 'function) t)))
(setq interpreter (if (file-name-absolute-p interpreter)
interpreter
(or (executable-find interpreter)
(error "Interpreter %s not recognized"
interpreter))))
(setq argument (concat (if (string-match "\\`/:" interpreter)
(replace-match "" nil nil interpreter)
interpreter)
(and argument (string< "" argument) " ")
argument))
;; For backward compatibility, allow `executable-prefix-env' to be
;; overridden by custom `executable-prefix'.
(if (string-match "#!\\([ \t]*/usr/bin/env[ \t]*\\)?$" executable-prefix)
(if executable-prefix-env
(setq argument (concat "/usr/bin/env "
(file-name-nondirectory argument))))
(setq argument (concat (substring executable-prefix 2) argument)))
(or buffer-read-only
(if buffer-file-name
(string-match executable-magicless-file-regexp
buffer-file-name))
(not (or insert-flag executable-insert))
(> (point-min) 1)
(save-excursion
(goto-char (point-min))
(add-hook 'after-save-hook 'executable-chmod nil t)
(if (looking-at "#![ \t]*\\(.*\\)$")
(and (goto-char (match-beginning 1))
;; If the line ends in a space,
;; don't offer to change it.
(not (= (char-after (1- (match-end 1))) ?\s))
(not (string= argument
(buffer-substring (point) (match-end 1))))
(if (or (not executable-query) no-query-flag
(save-match-data
(save-window-excursion
;; Make buffer visible before question.
(switch-to-buffer (current-buffer))
(y-or-n-p (format-message
"Replace magic number by `#!%s'? "
argument)))))
(progn
(replace-match argument t t nil 1)
(message "Magic number changed to `#!%s'" argument))))
(insert "#!" argument ?\n)
(message "Magic number changed to `#!%s'" argument))))
interpreter)