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

Reply via email to