* A Nix mode for Emacs.
This commit is contained in:
parent
5e4a2272bf
commit
e8411948ff
|
@ -1,4 +1,4 @@
|
||||||
SUBDIRS = externals src scripts corepkgs doc tests
|
SUBDIRS = externals src scripts corepkgs doc misc tests
|
||||||
EXTRA_DIST = substitute.mk nix.spec nix.spec.in
|
EXTRA_DIST = substitute.mk nix.spec nix.spec.in
|
||||||
|
|
||||||
include ./substitute.mk
|
include ./substitute.mk
|
||||||
|
|
|
@ -154,6 +154,8 @@ AC_CONFIG_FILES([Makefile
|
||||||
corepkgs/channels/Makefile
|
corepkgs/channels/Makefile
|
||||||
doc/Makefile
|
doc/Makefile
|
||||||
doc/manual/Makefile
|
doc/manual/Makefile
|
||||||
|
misc/Makefile
|
||||||
|
misc/emacs/Makefile
|
||||||
tests/Makefile
|
tests/Makefile
|
||||||
])
|
])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
|
@ -5,7 +5,7 @@ set -e
|
||||||
rm -f current-load
|
rm -f current-load
|
||||||
touch current-load
|
touch current-load
|
||||||
|
|
||||||
storeExpr=$(nix-instantiate ~/nixpkgs/pkgs/system/test.nix)
|
storeExpr=$(nix-instantiate ~/nixpkgs/pkgs/system/all.nix)
|
||||||
|
|
||||||
export NIX_BUILD_HOOK="build-remote.pl"
|
export NIX_BUILD_HOOK="build-remote.pl"
|
||||||
|
|
||||||
|
|
1
misc/Makefile.am
Normal file
1
misc/Makefile.am
Normal file
|
@ -0,0 +1 @@
|
||||||
|
SUBDIRS = emacs
|
5
misc/emacs/Makefile.am
Normal file
5
misc/emacs/Makefile.am
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
EXTRA_DIST = nix-mode.el
|
||||||
|
|
||||||
|
install-data-local:
|
||||||
|
$(INSTALL) -d $(DESTDIR)$(datadir)/emacs/site-lisp
|
||||||
|
$(INSTALL_DATA) nix-mode.el $(DESTDIR)$(datadir)/emacs/site-lisp
|
108
misc/emacs/nix-mode.el
Normal file
108
misc/emacs/nix-mode.el
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
(defun nix-mode ()
|
||||||
|
"Major mode for editing Nix expressions.
|
||||||
|
|
||||||
|
The following commands may be useful:
|
||||||
|
|
||||||
|
'\\[newline-and-indent]'
|
||||||
|
Insert a newline and move the cursor to align with the previous
|
||||||
|
non-empty line.
|
||||||
|
|
||||||
|
'\\[fill-paragraph]'
|
||||||
|
Refill a paragraph so that all lines are at most `fill-column'
|
||||||
|
lines long. This should do the right thing for comments beginning
|
||||||
|
with `#'. However, this command doesn't work properly yet if the
|
||||||
|
comment is adjacent to code (i.e., no intervening empty lines).
|
||||||
|
In that case, select the text to be refilled and use
|
||||||
|
`\\[fill-region]' instead.
|
||||||
|
|
||||||
|
The hook `nix-mode-hook' is run when Nix mode is started.
|
||||||
|
|
||||||
|
\\{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)
|
||||||
|
|
||||||
|
;; Font lock support.
|
||||||
|
(setq font-lock-defaults '(nix-keywords nil nil nil nil))
|
||||||
|
|
||||||
|
;; Automatic indentation [C-j].
|
||||||
|
(make-local-variable 'indent-line-function)
|
||||||
|
(setq indent-line-function 'nix-indent-line)
|
||||||
|
|
||||||
|
;; Indenting of comments.
|
||||||
|
(make-local-variable 'comment-start)
|
||||||
|
(setq comment-start "# ")
|
||||||
|
(make-local-variable 'comment-end)
|
||||||
|
(setq comment-end "")
|
||||||
|
(make-local-variable 'comment-start-skip)
|
||||||
|
(setq comment-start-skip "\\(^\\|\\s-\\);?#+ *")
|
||||||
|
|
||||||
|
;; Filling of comments.
|
||||||
|
(make-local-variable 'adaptive-fill-mode)
|
||||||
|
(setq adaptive-fill-mode t)
|
||||||
|
(make-local-variable '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
|
||||||
|
"Keymap for Nix mode.")
|
||||||
|
|
||||||
|
(setq nix-mode-map (make-sparse-keymap))
|
||||||
|
;(define-key nix-mode-map [tab] 'tab-to-tab-stop)
|
||||||
|
|
||||||
|
|
||||||
|
(defvar nix-keywords
|
||||||
|
'("\\<if\\>" "\\<then\\>" "\\<else\\>" "\\<assert\\>"
|
||||||
|
"\\<let\\>" "\\<rec\\>" "\\<inherit\\>"
|
||||||
|
("\\<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_']*\\)[ \t]*="
|
||||||
|
(1 font-lock-variable-name-face nil nil))
|
||||||
|
("[a-zA-Z][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))
|
Loading…
Reference in a new issue