branch: elpa/nix-mode
commit c758b179e9cbdacef044bb19b336c1b608a8de6b
Author: Matthew Bauer <[email protected]>
Commit: Matthew Bauer <[email protected]>
Add nix-shebang
Fixes #38
---
nix-mode.el | 1 +
nix-shebang.el | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 51 insertions(+)
diff --git a/nix-mode.el b/nix-mode.el
index c778e522d3..2e9df4db20 100644
--- a/nix-mode.el
+++ b/nix-mode.el
@@ -16,6 +16,7 @@
;;; Code:
(require 'nix-format nil 'noerror)
+(require 'nix-shebang nil 'noerror)
(defgroup nix nil
"Nix-related customizations"
diff --git a/nix-shebang.el b/nix-shebang.el
new file mode 100644
index 0000000000..f710703d73
--- /dev/null
+++ b/nix-shebang.el
@@ -0,0 +1,50 @@
+;;; nix-shebang.el --- Handle nix shebang header -*- lexical-binding: t -*-
+
+;; Author: Matthew Bauer <[email protected]>
+;; Homepage: https://github.com/matthewbauer/nix-mode
+;; Version: 1.2.1
+;; Keywords: nix, languages, tools, unix
+;; Package-Requires: ((emacs "24.3"))
+
+;; This file is NOT part of GNU Emacs.
+
+;;; Commentary:
+
+;; This detects file headers that look like:
+;; #!/usr/bin/env nix-shell
+;; #!nix-shell -i bash
+
+;; and correctly detects their file modes.
+
+;;; Code:
+
+(require 'files)
+
+(defvar nix-shebang-interpreter-regexp "#!nix-shell -i \\([^ \t\n]+\\)"
+ "Regexp for nix-shell -i header.")
+
+(defun nix-shebang-get-interpreter ()
+ "Get interpreter string from nix-shell -i file."
+ (save-excursion
+ (goto-char (point-min))
+ (forward-line 1)
+ (when (looking-at nix-shebang-interpreter-regexp)
+ (match-string 1))))
+
+(defun nix-shebang-mode ()
+ "Detect and run file’s interpreter mode."
+ (let ((mode (nix-shebang-get-interpreter)))
+ (funcall (assoc-default mode
+ (mapcar (lambda (e)
+ (cons
+ (format "\\`%s\\'" (car e))
+ (cdr e)))
+ interpreter-mode-alist)
+ #'string-match-p))))
+
+;; WARNING: this will automatically modify interpreter-mode-alist
+;; ideally we could make this opt-in
+(add-to-list 'interpreter-mode-alist '("nix-shell" . nix-shebang-mode))
+
+(provide 'nix-shebang)
+;;; nix-shebang.el ends here