forked from lix-project/lix
Add autoloads, make code more concise & idiomatic
- Use define-derived-mode to declare nix-mode - Use autoloads to ensure nix-mode is usable (and enabled) without needing `require` - Use set + make-local-variable instead of longer 2-step equivalent
This commit is contained in:
parent
ee7fe64c0a
commit
61c464f252
|
@ -1,10 +1,51 @@
|
||||||
;;; nix-mode.el --- Major mode for editing Nix expressions.
|
;;; nix-mode.el --- Major mode for editing Nix expressions
|
||||||
|
|
||||||
;; Author: Eelco Dolstra
|
;; Author: Eelco Dolstra
|
||||||
;; URL: https://github.com/NixOS/nix/tree/master/misc/emacs
|
;; URL: https://github.com/NixOS/nix/tree/master/misc/emacs
|
||||||
;; Version: 1.0
|
;; Version: 1.0
|
||||||
|
|
||||||
(defun nix-mode ()
|
;;; Commentary:
|
||||||
|
|
||||||
|
;;; Code:
|
||||||
|
|
||||||
|
(defconst nix-font-lock-keywords
|
||||||
|
'("\\<if\\>" "\\<then\\>" "\\<else\\>" "\\<assert\\>" "\\<with\\>"
|
||||||
|
"\\<let\\>" "\\<in\\>" "\\<rec\\>" "\\<inherit\\>" "\\<or\\>"
|
||||||
|
("\\<true\\>" . font-lock-builtin-face)
|
||||||
|
("\\<false\\>" . font-lock-builtin-face)
|
||||||
|
("\\<null\\>" . font-lock-builtin-face)
|
||||||
|
("\\<import\\>" . font-lock-builtin-face)
|
||||||
|
("\\<derivation\\>" . font-lock-builtin-face)
|
||||||
|
("\\<baseNameOf\\>" . font-lock-builtin-face)
|
||||||
|
("\\<toString\\>" . font-lock-builtin-face)
|
||||||
|
("\\<isNull\\>" . font-lock-builtin-face)
|
||||||
|
("[a-zA-Z][a-zA-Z0-9\\+-\\.]*:[a-zA-Z0-9%/\\?:@&=\\+\\$,_\\.!~\\*'-]+"
|
||||||
|
. font-lock-constant-face)
|
||||||
|
("\\<\\([a-zA-Z_][a-zA-Z0-9_'\-\.]*\\)[ \t]*="
|
||||||
|
(1 font-lock-variable-name-face nil nil))
|
||||||
|
("<[a-zA-Z0-9._\\+-]+\\(/[a-zA-Z0-9._\\+-]+\\)*>"
|
||||||
|
. font-lock-constant-face)
|
||||||
|
("[a-zA-Z0-9._\\+-]*\\(/[a-zA-Z0-9._\\+-]+\\)+"
|
||||||
|
. font-lock-constant-face))
|
||||||
|
"Font lock keywords for nix.")
|
||||||
|
|
||||||
|
(defvar nix-mode-syntax-table
|
||||||
|
(let ((table (make-syntax-table)))
|
||||||
|
(modify-syntax-entry ?/ ". 14" table)
|
||||||
|
(modify-syntax-entry ?* ". 23" table)
|
||||||
|
(modify-syntax-entry ?# "< b" table)
|
||||||
|
(modify-syntax-entry ?\n "> b" table)
|
||||||
|
table)
|
||||||
|
"Syntax table for Nix mode.")
|
||||||
|
|
||||||
|
(defun nix-indent-line ()
|
||||||
|
"Indent current line in a Nix expression."
|
||||||
|
(interactive)
|
||||||
|
(indent-relative-maybe))
|
||||||
|
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(define-derived-mode nix-mode fundamental-mode "Nix"
|
||||||
"Major mode for editing Nix expressions.
|
"Major mode for editing Nix expressions.
|
||||||
|
|
||||||
The following commands may be useful:
|
The following commands may be useful:
|
||||||
|
@ -25,93 +66,29 @@ The hook `nix-mode-hook' is run when Nix mode is started.
|
||||||
|
|
||||||
\\{nix-mode-map}
|
\\{nix-mode-map}
|
||||||
"
|
"
|
||||||
|
|
||||||
(interactive)
|
|
||||||
|
|
||||||
(kill-all-local-variables)
|
|
||||||
|
|
||||||
(setq major-mode 'nix-mode)
|
|
||||||
(setq mode-name "Nix")
|
|
||||||
|
|
||||||
(use-local-map nix-mode-map)
|
|
||||||
|
|
||||||
(set-syntax-table nix-mode-syntax-table)
|
(set-syntax-table nix-mode-syntax-table)
|
||||||
|
|
||||||
;; Font lock support.
|
;; Font lock support.
|
||||||
(setq font-lock-defaults '(nix-keywords nil nil nil nil))
|
(setq font-lock-defaults '(nix-font-lock-keywords nil nil nil nil))
|
||||||
|
|
||||||
;; Automatic indentation [C-j].
|
;; Automatic indentation [C-j].
|
||||||
(make-local-variable 'indent-line-function)
|
(set (make-local-variable 'indent-line-function) 'nix-indent-line)
|
||||||
(setq indent-line-function 'nix-indent-line)
|
|
||||||
|
|
||||||
;; Indenting of comments.
|
;; Indenting of comments.
|
||||||
(make-local-variable 'comment-start)
|
(set (make-local-variable 'comment-start) "# ")
|
||||||
(setq comment-start "# ")
|
(set (make-local-variable 'comment-end) "")
|
||||||
(make-local-variable 'comment-end)
|
(set (make-local-variable 'comment-start-skip) "\\(^\\|\\s-\\);?#+ *")
|
||||||
(setq comment-end "")
|
|
||||||
(make-local-variable 'comment-start-skip)
|
|
||||||
(setq comment-start-skip "\\(^\\|\\s-\\);?#+ *")
|
|
||||||
|
|
||||||
;; Filling of comments.
|
;; Filling of comments.
|
||||||
(make-local-variable 'adaptive-fill-mode)
|
(set (make-local-variable 'adaptive-fill-mode) t)
|
||||||
(setq adaptive-fill-mode t)
|
(set (make-local-variable 'paragraph-start) "[ \t]*\\(#+[ \t]*\\)?$")
|
||||||
(make-local-variable 'paragraph-start)
|
(set (make-local-variable 'paragraph-separate) paragraph-start))
|
||||||
(setq paragraph-start "[ \t]*\\(#+[ \t]*\\)?$")
|
|
||||||
(make-local-variable 'paragraph-separate)
|
|
||||||
(setq paragraph-separate paragraph-start)
|
|
||||||
|
|
||||||
(run-hooks 'nix-mode-hook))
|
|
||||||
|
|
||||||
|
|
||||||
(defvar nix-mode-map nil
|
;;;###autoload
|
||||||
"Keymap for Nix mode.")
|
(progn
|
||||||
|
(add-to-list 'auto-mode-alist '("\\.nix\\'" . nix-mode))
|
||||||
(setq nix-mode-map (make-sparse-keymap))
|
(add-to-list 'auto-mode-alist '("\\.nix.in\\'" . nix-mode)))
|
||||||
;(define-key nix-mode-map [tab] 'tab-to-tab-stop)
|
|
||||||
|
|
||||||
|
|
||||||
(defvar nix-keywords
|
|
||||||
'("\\<if\\>" "\\<then\\>" "\\<else\\>" "\\<assert\\>" "\\<with\\>"
|
|
||||||
"\\<let\\>" "\\<in\\>" "\\<rec\\>" "\\<inherit\\>" "\\<or\\>"
|
|
||||||
("\\<true\\>" . font-lock-builtin-face)
|
|
||||||
("\\<false\\>" . font-lock-builtin-face)
|
|
||||||
("\\<null\\>" . font-lock-builtin-face)
|
|
||||||
("\\<import\\>" . font-lock-builtin-face)
|
|
||||||
("\\<derivation\\>" . font-lock-builtin-face)
|
|
||||||
("\\<baseNameOf\\>" . font-lock-builtin-face)
|
|
||||||
("\\<toString\\>" . font-lock-builtin-face)
|
|
||||||
("\\<isNull\\>" . font-lock-builtin-face)
|
|
||||||
("[a-zA-Z][a-zA-Z0-9\\+-\\.]*:[a-zA-Z0-9%/\\?:@&=\\+\\$,_\\.!~\\*'-]+"
|
|
||||||
. font-lock-constant-face)
|
|
||||||
("\\<\\([a-zA-Z_][a-zA-Z0-9_'\-\.]*\\)[ \t]*="
|
|
||||||
(1 font-lock-variable-name-face nil nil))
|
|
||||||
("<[a-zA-Z0-9._\\+-]+\\(/[a-zA-Z0-9._\\+-]+\\)*>"
|
|
||||||
. font-lock-constant-face)
|
|
||||||
("[a-zA-Z0-9._\\+-]*\\(/[a-zA-Z0-9._\\+-]+\\)+"
|
|
||||||
. font-lock-constant-face)))
|
|
||||||
|
|
||||||
|
|
||||||
(defvar nix-mode-syntax-table nil
|
|
||||||
"Syntax table for Nix mode.")
|
|
||||||
|
|
||||||
(if nix-mode-syntax-table
|
|
||||||
nil
|
|
||||||
(progn
|
|
||||||
(setq nix-mode-syntax-table (make-syntax-table))
|
|
||||||
(modify-syntax-entry ?/ ". 14" nix-mode-syntax-table)
|
|
||||||
(modify-syntax-entry ?* ". 23" nix-mode-syntax-table)
|
|
||||||
(modify-syntax-entry ?# "< b" nix-mode-syntax-table)
|
|
||||||
(modify-syntax-entry ?\n "> b" nix-mode-syntax-table)))
|
|
||||||
|
|
||||||
|
|
||||||
(defun nix-indent-line ()
|
|
||||||
"Indent current line in a Nix expression."
|
|
||||||
(interactive)
|
|
||||||
(indent-relative-maybe))
|
|
||||||
|
|
||||||
|
|
||||||
(setq auto-mode-alist (cons '("\\.nix\\'" . nix-mode) auto-mode-alist))
|
|
||||||
(setq auto-mode-alist (cons '("\\.nix.in\\'" . nix-mode) auto-mode-alist))
|
|
||||||
|
|
||||||
(provide 'nix-mode)
|
(provide 'nix-mode)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue