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 changed files with 55 additions and 78 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue