* A Nix mode for Emacs.
This commit is contained in:
		
							parent
							
								
									5e4a2272bf
								
							
						
					
					
						commit
						e8411948ff
					
				
					 6 changed files with 118 additions and 2 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue