doomemacs/modules/lang/nix/autoload.el
Henrik Lissner 15d85a5c74 Fix nix-mode for nix-shell shell scripts
Wasn't correctly detecting the interpreter argument for nix-shell
shebangs. It must be done in two parts in case cached-nix-shell is
used (which means the shebang will span 2+ lines).
2021-02-04 07:32:26 -05:00

71 lines
2.5 KiB
EmacsLisp

;;; lang/nix/autoload.el -*- lexical-binding: t; -*-
(defun +nix--options-action (candidate)
(switch-to-buffer-other-window
(nixos-options-doc-buffer
(nixos-options-get-documentation-for-option candidate))))
;;;###autoload
(defun +nix/open-repl ()
"Open a nix repl."
(interactive)
(nix-repl-show)
(current-buffer))
;;;###autoload
(defun +nix/lookup-option (&optional initial-input)
"Look up documentation on a nix option."
(interactive
(list
;; REVIEW Must be a better way to do this
(when (and (looking-at-p "[a-zA-Z0-9-_\\.]")
(not (doom-point-in-string-or-comment-p)))
(buffer-substring-no-properties
(save-excursion
(skip-chars-backward "^ ")
(point))
(save-excursion
(skip-chars-forward "^ ")
(point))))))
(cond ((featurep! :completion helm)
(require 'helm-nixos-options)
;; REVIEW We reimplment `helm-nixos-options' so we can supply
;; `initial-input'. Maybe use `helm-attrset' instead?
(helm :sources `(,(helm-source-nixos-options-search))
:buffer "*helm-nixos-options*"
:input initial-input))
((featurep! :completion ivy)
(require 'nixos-options)
(ivy-read "NixOS options: "
nixos-options
:require-match t
:initial-input initial-input
:action #'+nix--options-action
:caller '+nix/options))
;; TODO Add general `completing-read' support
((user-error "No search engine is enabled. Enable helm or ivy!")))
;; Tell lookup module to let us handle things from here
'deferred)
;;;###autoload
(defun +nix-shell-init-mode ()
"Resolve a (cached-)?nix-shell shebang to the correct major mode."
(save-excursion
(goto-char (point-min))
(save-match-data
(if (not (and (re-search-forward "\\_<nix-shell " (line-end-position 2) t)
(re-search-forward "-i +\"?\\([^ \"\n]+\\)" (line-end-position) t)))
(message "Couldn't determine mode for this script")
(let* ((interp (match-string 1))
(mode
(assoc-default
interp
(mapcar (lambda (e)
(cons (format "\\`%s\\'" (car e))
(cdr e)))
interpreter-mode-alist)
#'string-match-p)))
(when mode
(prog1 (set-auto-mode-0 mode)
(when (eq major-mode 'sh-mode)
(sh-set-shell interp)))))))))