diff --git a/docs/modules.org b/docs/modules.org index f4ed06901..1ca5b2da0 100644 --- a/docs/modules.org +++ b/docs/modules.org @@ -144,7 +144,7 @@ Modules that bring support for a language or group of languages to Emacs. + [[file:../modules/lang/ruby/README.org][ruby]] =+lsp +rvm +rbenv +rails +chruby= + [[file:../modules/lang/rust/README.org][rust]] =+lsp= - TODO + scala =+lsp= - TODO -+ [[file:../modules/lang/scheme/README.org][scheme]] - TODO ++ [[file:../modules/lang/scheme/README.org][scheme]] =+chez +chibi +chicken +gambit +gauche +guile +kawa +mit +racket= - TODO + [[file:../modules/lang/sh/README.org][sh]] =+fish +lsp +powershell= - TODO + [[file:../modules/lang/sml/README.org][sml]] - TODO + [[file:../modules/lang/solidity/README.org][solidity]] - TODO diff --git a/init.example.el b/init.example.el index fe0b64988..d592b0911 100644 --- a/init.example.el +++ b/init.example.el @@ -160,7 +160,7 @@ ;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} ;;rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() ;;scala ; java, but good - ;;scheme ; a fully conniving family of lisps + ;;(scheme +guile) ; a fully conniving family of lisps sh ; she sells {ba,z,fi}sh shells on the C xor ;;sml ;;solidity ; do you need a blockchain? No. diff --git a/modules/lang/scheme/README.org b/modules/lang/scheme/README.org index b6bd17ca0..6f750c02d 100644 --- a/modules/lang/scheme/README.org +++ b/modules/lang/scheme/README.org @@ -17,10 +17,29 @@ This module provides an environment for hacking and having fun in scheme. It is powered by [[https://www.nongnu.org/geiser/geiser_1.html#introduction][geiser]]. ** Module Flags -This module provides no flags. ++ =+chez= ++ =+chibi= ++ =+chicken= ++ =+gambit= ++ =+gauche= ++ =+guile= ++ =+kawa= ++ =+mit= ++ =+racket= ** Plugins + [[https://gitlab.com/jaor/geiser][geiser]] ++ [[https://github.com/nbfalcon/macrostep-geiser][macrostep-geiser]] ++ [[https://gitlab.com/emacs-geiser/chez][geiser-chez]] (if =+chez=) ++ [[https://gitlab.com/emacs-geiser/chez][geiser-chibi]] (if =+chibi=) ++ [[https://gitlab.com/emacs-geiser/chicken][geiser-chicken]] (if =+chicken=) ++ [[https://gitlab.com/emacs-geiser/gambit][geiser-gambit]] (if =+gambit=) ++ [[https://gitlab.com/emacs-geiser/gauche][geiser-gauche]] (if =+gauche=) ++ [[https://gitlab.com/emacs-geiser/guile][geiser-guile]] (if =+guile=) ++ [[https://github.com/flatwhatson/flycheck-guile][flycheck-guile]] (if =+guile= and =:checkers syntax=) ++ [[https://gitlab.com/emacs-geiser/kawa][geiser-kawa]] (if =+kawa=) ++ [[https://gitlab.com/emacs-geiser/mit][geiser-mit]] (if =+mit=) ++ [[https://gitlab.com/emacs-geiser/racket][geiser-racket]] (if =+racket=) * Prerequisites This module requires you to have at least one of the supported schemes, namely: diff --git a/modules/lang/scheme/autoload.el b/modules/lang/scheme/autoload.el index 960700ebb..722c2e7e0 100644 --- a/modules/lang/scheme/autoload.el +++ b/modules/lang/scheme/autoload.el @@ -1,5 +1,20 @@ ;;; lang/scheme/autoload.el -*- lexical-binding: t; -*- +;; HACK geiser-* plugins will try to add to `geiser-active-implementations', so +;; it must be defined before their autoloads are evaluated. Fortunately, +;; Doom modules' autoloads run earlier than package autoloads. +;;;###autoload +(defvar geiser-active-implementations ()) + +;; HACK `geiser-impl--add-to-alist' isn't autoloaded or inlined, so you get +;; void-function errors when it is called in the autoloads files of other +;; geiser-* packages. +;;;###autoload +(defun geiser-impl--add-to-alist (kind what impl &optional append) + (add-to-list 'geiser-implementations-alist + (list (list kind what) impl) append)) + + (defvar calculate-lisp-indent-last-sexp) ;; Adapted from https://github.com/alezost/emacs-config/blob/master/utils/al-scheme.el#L76-L123 diff --git a/modules/lang/scheme/config.el b/modules/lang/scheme/config.el index 0ab63ceb1..46c348ada 100644 --- a/modules/lang/scheme/config.el +++ b/modules/lang/scheme/config.el @@ -8,14 +8,10 @@ (use-package! geiser :defer t :init - (setq geiser-active-implementations '(guile chicken mit chibi chez) - geiser-autodoc-identifier-format "%s → %s" - geiser-repl-current-project-function 'doom-project-root) - (if (featurep! :lang racket) - (setq auto-mode-alist - (remove '("\\.rkt\\'" . scheme-mode) auto-mode-alist)) - (push 'racket geiser-active-implementations)) - (after! scheme ; built-in + (setq geiser-autodoc-identifier-format "%s → %s" + geiser-repl-current-project-function #'doom-project-root) + + (after! scheme ; built-in (set-repl-handler! 'scheme-mode #'+scheme/open-repl) (set-eval-handler! 'scheme-mode #'geiser-eval-region) (set-lookup-handlers! '(scheme-mode geiser-repl-mode) @@ -23,11 +19,10 @@ :documentation #'geiser-doc-symbol-at-point)) :config (set-popup-rules! - '(("^\\*geiser messages\\*$" :slot 1 :vslot -1) - ("^\\*Geiser dbg\\*$" :slot 1 :vslot -1) - ("^\\*Geiser xref\\*$" :slot 1 :vslot -1) + '(("^\\*[gG]eiser \\(dbg\\|xref\\|messages\\)\\*$" :slot 1 :vslot -1) ("^\\*Geiser documentation\\*$" :slot 2 :vslot 2 :select t :size 0.35) ("^\\* [A-Za-z0-9_-]+ REPL \\*" :size 0.3 :quit nil :ttl nil))) + (map! :localleader :map scheme-mode-map "'" #'geiser-mode-switch-to-repl @@ -48,10 +43,6 @@ "<" #'geiser-xref-callers ">" #'geiser-xref-callees "i" #'geiser-doc-look-up-manual) - (:prefix ("m" . "macro") - "r" #'geiser-expand-region - "d" #'geiser-expand-definition - "e" #'geiser-expand-last-sexp) (:prefix ("r" . "repl") "b" #'geiser-switch-to-repl "q" #'geiser-repl-exit @@ -60,6 +51,19 @@ "R" #'geiser-reload "c" #'geiser-repl-clear-buffer))) + +(use-package! macrostep-geiser + :hook (geiser-mode . macrostep-geiser-setup) + :hook (geiser-repl-mode . macrostep-geiser-setup) + :init + (map! :after geiser + :localleader + :map scheme-mode-map + :desc "Expand macro" "m" #'macrostep-geiser + :desc "Expand all macros recursively" "M" #'macrostep-geiser-all)) + + (use-package! flycheck-guile + :when (featurep! +guile) :when (featurep! :checkers syntax) :after geiser) diff --git a/modules/lang/scheme/packages.el b/modules/lang/scheme/packages.el index 3d219f80b..11f162659 100644 --- a/modules/lang/scheme/packages.el +++ b/modules/lang/scheme/packages.el @@ -1,11 +1,27 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/scheme/packages.el -(package! geiser - :recipe (:host gitlab :repo "emacs-geiser/geiser") - :pin "aa26163aa81b5af3bc5bbf23bec8b5776de3a8bc") - -(when (featurep! :checkers syntax) - (package! flycheck-guile - :recipe (:host github :repo "flatwhatson/flycheck-guile") - :pin "e46d6e5453dd7471309fae6549445c48e6d8f340")) +(when (package! geiser :pin "aa26163aa81b5af3bc5bbf23bec8b5776de3a8bc") + (package! macrostep-geiser :pin "8600fca05fd12a2e0ffe63238ddbfcb37c285dac") + (when (featurep! +chez) + (package! geiser-chez :pin "4cb7f2667ea1c53da53f0144910fbbd67bccbf4d")) + (when (featurep! +chibi) + (package! geiser-chibi :pin "54e7f384618c73d8fb675b5289d443a8ee3e4dc8")) + (when (featurep! +chicken) + (package! geiser-chicken :pin "47be5b43b35d3bf35b0f668b4c08715ea41fb97d")) + (when (featurep! +gambit) + (package! geiser-gambit :pin "0ee4156640988497779345452c3aa0417356e606")) + (when (featurep! +gauche) + (package! geiser-gauche :pin "66e51430bded0f0e2037f474818a7bbaafb2906c")) + (when (featurep! +guile) + (package! geiser-guile :pin "93ef7101fdfcc7eac6f465b4b9788c384a323c14") + (when (featurep! :checkers syntax) + (package! flycheck-guile + :recipe (:host github :repo "flatwhatson/flycheck-guile") + :pin "e46d6e5453dd7471309fae6549445c48e6d8f340"))) + (when (featurep! +kawa) + (package! geiser-kawa :pin "b96c008e9c3b8dc210d8b536ee7b76b8690c8af6")) + (when (featurep! +mit) + (package! geiser-mit :pin "d17394f577aaa2854a74a1a0039cb8f73378b400")) + (when (featurep! +racket) + (package! geiser-racket :pin "a87fd449cc6c7b0b17a0b08268e78d3f038f3351")))