From 1baebdafb3b14e05351090d04e46bfcf33c36bf3 Mon Sep 17 00:00:00 2001 From: Sorawee Porncharoenwase Date: Wed, 11 Sep 2024 05:51:49 -0400 Subject: [PATCH] feat(racket): add +hash-lang `racket-mode` recently added `racket-hash-lang-mode` as an alternative major mode. Close: #7543 Co-authored-by: hlissner --- modules/lang/racket/README.org | 8 +- modules/lang/racket/config.el | 178 ++++++++++++++++++--------------- 2 files changed, 104 insertions(+), 82 deletions(-) diff --git a/modules/lang/racket/README.org b/modules/lang/racket/README.org index 26e759c7e..3d2354a59 100644 --- a/modules/lang/racket/README.org +++ b/modules/lang/racket/README.org @@ -14,8 +14,12 @@ This module adds support for the [[https://www.racket-lang.org/][Racket programm Enable support for ~racket-mode~. Requires [[doom-module::tools lsp]] and a langserver (supports [[https://github.com/jeapostrophe/racket-langserver][racket-langserver]]). - +xp :: - Enable the explore mode (~racket-xp-mode~), which "analyzes expanded code to - explain and explore." + Enable the explore minor mode (~racket-xp-mode~), which "analyzes expanded + code to explain and explore." +- +hash-lang :: + Enable the hash-lang major mode (~racket-hash-lang-mode~), which "uses + color-lexer, indent, and navigation supplied by a #lang." This flag can be + used along with the ~+xp~ flag. ** Packages - [[doom-package:racket-mode]] diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index 46700f830..5bb524f8a 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -8,88 +8,106 @@ ;; ;;; Packages -(use-package! racket-mode - :mode "\\.rkt\\'" ; give it precedence over :lang scheme - :config - (set-repl-handler! 'racket-mode #'+racket/open-repl) - (set-lookup-handlers! '(racket-mode racket-repl-mode) - :definition #'+racket-lookup-definition - :documentation #'+racket-lookup-documentation) - (set-docsets! 'racket-mode "Racket") - (set-ligatures! 'racket-mode - :lambda "lambda" - :map "map" - :dot ".") - (set-rotate-patterns! 'racket-mode - :symbols '(("#true" "#false"))) - (set-formatter! 'raco-fmt '("raco" "fmt") :modes '(racket-mode)) +(let (mode + mode-map + mode-exts + mode-hook + mode-local-vars-hook) + (if (modulep! +hash-lang) + (setq mode 'racket-hash-lang-mode + mode-exts '("\\.rkt\\'" ; Racket + "\\.scrbl\\'" ; Scribble + "\\.rhm\\'")) ; Rhombus + (setq mode 'racket-mode + mode-exts `("\\.rkt\\'"))) + (let ((mode-name (symbol-name mode))) + (setq mode-map (intern (format "%s-map" mode-name)) + mode-hook (intern (format "%s-hook" mode-name)) + mode-local-vars-hook (intern (format "%s-local-vars-hook" mode-name)))) - (add-hook! 'racket-mode-hook - #'rainbow-delimiters-mode - #'highlight-quoted-mode) + (use-package! racket-mode + :defer t + :init + (dolist (entry mode-exts) + (add-to-list 'auto-mode-alist (cons entry mode))) + :config + (set-repl-handler! mode #'+racket/open-repl) + (set-lookup-handlers! `(,mode racket-repl-mode) + :definition #'+racket-lookup-definition + :documentation #'+racket-lookup-documentation) + (set-docsets! mode "Racket") + (set-ligatures! mode + :lambda "lambda" + :map "map" + :dot ".") + (set-rotate-patterns! mode :symbols '(("#true" "#false"))) + (set-formatter! 'raco-fmt '("raco" "fmt") :modes (list mode)) - (when (modulep! +lsp) - (add-hook 'racket-mode-local-vars-hook #'lsp! 'append)) + (add-hook mode-hook #'rainbow-delimiters-mode) + (add-hook mode-hook #'highlight-quoted-mode) - (when (modulep! +xp) - (add-hook 'racket-mode-local-vars-hook #'racket-xp-mode) - ;; Both flycheck and racket-xp produce error popups, but racket-xp's are - ;; higher quality so disable flycheck's: - (when (modulep! :checkers syntax) - (add-hook! 'racket-xp-mode-hook - (defun +racket-disable-flycheck-h () - (cl-pushnew 'racket flycheck-disabled-checkers))))) + (when (modulep! +lsp) + (add-hook mode-local-vars-hook #'lsp! 'append)) - (unless (or (modulep! :editor parinfer) - (modulep! :editor lispy)) - (add-hook 'racket-mode-hook #'racket-smart-open-bracket-mode)) + (when (modulep! +xp) + (add-hook mode-local-vars-hook #'racket-xp-mode) + ;; Both flycheck and racket-xp produce error popups, but racket-xp's are + ;; higher quality so disable flycheck's: + (when (modulep! :checkers syntax) + (add-hook! 'racket-xp-mode-hook + (defun +racket-disable-flycheck-h () + (cl-pushnew 'racket flycheck-disabled-checkers))))) - (map! (:map racket-xp-mode-map - [remap racket-doc] #'racket-xp-documentation - [remap racket-visit-definition] #'racket-xp-visit-definition - [remap next-error] #'racket-xp-next-error - [remap previous-error] #'racket-xp-previous-error) - (:localleader - :map racket-mode-map - "a" #'racket-align - "A" #'racket-unalign - "f" #'racket-fold-all-tests - "F" #'racket-unfold-all-tests - "h" #'racket-doc - "i" #'racket-unicode-input-method-enable - "l" #'racket-logger - "o" #'racket-profile - "p" #'racket-cycle-paren-shapes - "r" #'racket-run - "R" #'racket-run-and-switch-to-repl - "t" #'racket-test - "u" #'racket-backward-up-list - "y" #'racket-insert-lambda - (:prefix ("m" . "macros") - "d" #'racket-expand-definition - "e" #'racket-expand-last-sexp - "r" #'racket-expand-region - "a" #'racket-expand-again) - (:prefix ("g" . "goto") - "b" #'racket-unvisit - "d" #'racket-visit-definition - "m" #'racket-visit-module - "r" #'racket-open-require-path) - (:prefix ("s" . "send") - "d" #'racket-send-definition - "e" #'racket-send-last-sexp - "r" #'racket-send-region) - :map racket-repl-mode-map - "l" #'racket-logger - "h" #'racket-repl-documentation - "y" #'racket-insert-lambda - "u" #'racket-backward-up-list - (:prefix ("m" . "macros") - "d" #'racket-expand-definition - "e" #'racket-expand-last-sexp - "f" #'racket-expand-file - "r" #'racket-expand-region) - (:prefix ("g" . "goto") - "b" #'racket-unvisit - "m" #'racket-visit-module - "d" #'racket-repl-visit-definition)))) + (unless (or (modulep! :editor parinfer) + (modulep! :editor lispy)) + (add-hook mode-hook #'racket-smart-open-bracket-mode)) + + (map! (:map racket-xp-mode-map + [remap racket-doc] #'racket-xp-documentation + [remap racket-visit-definition] #'racket-xp-visit-definition + [remap next-error] #'racket-xp-next-error + [remap previous-error] #'racket-xp-previous-error) + (:localleader + :map ,mode-map + "a" #'racket-align + "A" #'racket-unalign + "f" #'racket-fold-all-tests + "F" #'racket-unfold-all-tests + "h" #'racket-doc + "i" #'racket-unicode-input-method-enable + "l" #'racket-logger + "o" #'racket-profile + "p" #'racket-cycle-paren-shapes + "r" #'racket-run + "R" #'racket-run-and-switch-to-repl + "t" #'racket-test + "u" #'racket-backward-up-list + "y" #'racket-insert-lambda + (:prefix ("m" . "macros") + "d" #'racket-expand-definition + "e" #'racket-expand-last-sexp + "r" #'racket-expand-region + "a" #'racket-expand-again) + (:prefix ("g" . "goto") + "b" #'racket-unvisit + "d" #'racket-visit-definition + "m" #'racket-visit-module + "r" #'racket-open-require-path) + (:prefix ("s" . "send") + "d" #'racket-send-definition + "e" #'racket-send-last-sexp + "r" #'racket-send-region) + :map racket-repl-mode-map + "l" #'racket-logger + "h" #'racket-repl-documentation + "y" #'racket-insert-lambda + "u" #'racket-backward-up-list + (:prefix ("m" . "macros") + "d" #'racket-expand-definition + "e" #'racket-expand-last-sexp + "f" #'racket-expand-file + "r" #'racket-expand-region) + (:prefix ("g" . "goto") + "b" #'racket-unvisit + "m" #'racket-visit-module + "d" #'racket-repl-visit-definition)))))