diff --git a/init.example.el b/init.example.el index 01b7e30e1..be9846e62 100644 --- a/init.example.el +++ b/init.example.el @@ -139,6 +139,7 @@ ;;ruby ; 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 sh ; she sells {ba,z,fi}sh shells on the C xor ;;solidity ; do you need a blockchain? No. ;;swift ; who asked for emoji variables? diff --git a/modules/lang/scheme/README.org b/modules/lang/scheme/README.org new file mode 100644 index 000000000..beaa15897 --- /dev/null +++ b/modules/lang/scheme/README.org @@ -0,0 +1,38 @@ +#+TITLE: lang/scheme +#+DATE: July 23, 2019 +#+SINCE: v2.0.9 +#+STARTUP: inlineimages + +* Table of Contents :TOC_3:noexport: +- [[#description][Description]] + - [[#module-flags][Module Flags]] +- [[#prerequisites][Prerequisites]] +- [[#features][Features]] + - [[#commands][Commands]] + - [[#geiser][Geiser]] + +* Description +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. + + +* Prerequisites +This module requires you to have at least one of the supported schemes, namely: +- [[https://www.gnu.org/software/guile][Guile]] 2.2.0 or better +- [[https://call-cc.org][Chicken]] 4.8.0 or better +- [[https://www.gnu.org/software/mit-scheme][MIT/GNU Scheme]] 9.1.1 or better +- [[https://synthcode.com/scheme/chibi][Chibi Scheme]] 0.7.3 or better +- [[https://www.scheme.com][Chez Scheme]] 9.4 or better + +Their executables must be present in your path for geiser to work properly. + +* Features +** Commands +*** Geiser +| command | key / ex command | description | +|---------------------+------------------+----------------------| +| ~+scheme/open-repl~ | =:repl= | Open the Scheme Repl | +| | | | diff --git a/modules/lang/scheme/autoload.el b/modules/lang/scheme/autoload.el new file mode 100644 index 000000000..2573ef5fb --- /dev/null +++ b/modules/lang/scheme/autoload.el @@ -0,0 +1,8 @@ +;;; lang/scheme/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +scheme/repl (&optional arg) + "Open the Scheme REPL." + (interactive "P") + (switch-to-geiser arg) + (current-buffer)) diff --git a/modules/lang/scheme/config.el b/modules/lang/scheme/config.el new file mode 100644 index 000000000..db9d7c96a --- /dev/null +++ b/modules/lang/scheme/config.el @@ -0,0 +1,39 @@ +;;; lang/scheme/config.el -*- lexical-binding: t; -*- + +(add-hook 'scheme-mode-hook #'rainbow-delimiters-mode) + +(def-package! geiser + :mode ("\\.scm\\'" . scheme-mode) + :mode ("\\.ss\\'" . scheme-mode) + :commands (geiser) + :init + (setq geiser-active-implementations '(guile chicken mit chibi chez)) + (set-repl-handler! 'scheme-mode '+scheme/repl) + (set-eval-handler! 'scheme-mode #'geiser-eval-region) + (set-lookup-handlers! 'scheme-mode + :definition #'geiser-edit-symbol-at-point + :documentation #'geiser-doc-symbol-at-point) + :config + (map! (:localleader + (:map scheme-mode-map + "'" #'geiser-mode-switch-to-repl + "s" #'geiser-set-scheme + + (:prefix ("e" . "eval") + "b" #'geiser-eval-buffer + "B" #'geiser-eval-buffer-and-go + "e" #'geiser-eval-definition + "E" #'geiser-eval-definition-and-go + "r" #'geiser-eval-region + "R" #'geiser-eval-region-and-go) + + (:prefix ("h" . "help") + "d" 'geiser-autodoc) + ;; TODO add more help keybindings + + (:prefix ("r" . "repl") + "b" #'geiser-switch-to-repl + "q" #'geiser-repl-exit + "r" #'geiser-restart-repl + "R" #'geiser-reload + "c" #'geiser-repl-clear-buffer))))) diff --git a/modules/lang/scheme/packages.el b/modules/lang/scheme/packages.el new file mode 100644 index 000000000..20a43e613 --- /dev/null +++ b/modules/lang/scheme/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/scheme/packages.el + +(package! geiser)