diff --git a/Makefile.am b/Makefile.am index fcd3405b5..97f590cc8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 include ./substitute.mk diff --git a/configure.ac b/configure.ac index bb2f7ac14..4b221bf31 100644 --- a/configure.ac +++ b/configure.ac @@ -154,6 +154,8 @@ AC_CONFIG_FILES([Makefile corepkgs/channels/Makefile doc/Makefile doc/manual/Makefile + misc/Makefile + misc/emacs/Makefile tests/Makefile ]) AC_OUTPUT diff --git a/distributed/test.sh b/distributed/test.sh index 78f83095e..c91595da0 100755 --- a/distributed/test.sh +++ b/distributed/test.sh @@ -5,7 +5,7 @@ set -e rm -f 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" diff --git a/misc/Makefile.am b/misc/Makefile.am new file mode 100644 index 000000000..ef10d1e98 --- /dev/null +++ b/misc/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = emacs diff --git a/misc/emacs/Makefile.am b/misc/emacs/Makefile.am new file mode 100644 index 000000000..9ca6ec9e3 --- /dev/null +++ b/misc/emacs/Makefile.am @@ -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 diff --git a/misc/emacs/nix-mode.el b/misc/emacs/nix-mode.el new file mode 100644 index 000000000..9d9934ab4 --- /dev/null +++ b/misc/emacs/nix-mode.el @@ -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 + '("\\" "\\" "\\" "\\" + "\\" "\\" "\\" + ("\\" . font-lock-builtin-face) + ("\\" . font-lock-builtin-face) + ("\\" . font-lock-builtin-face) + ("\\" . font-lock-builtin-face) + ("\\" . font-lock-builtin-face) + ("\\" . font-lock-builtin-face) + ("\\" . font-lock-builtin-face) + ("\\" . 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))