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-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)