diff --git a/modules/lang/racket/autoload.el b/modules/lang/racket/autoload.el new file mode 100644 index 000000000..c1d071aa3 --- /dev/null +++ b/modules/lang/racket/autoload.el @@ -0,0 +1,12 @@ +;;; lang/racket/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +racket/repl () + "Open the Racket REPL." + (interactive) + (pop-to-buffer + (or (get-buffer "*Racket REPL*") + (progn (racket-run-and-switch-to-repl) + (let ((buf (get-buffer "*Racket REPL*"))) + (bury-buffer buf) + buf))))) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el new file mode 100644 index 000000000..f62a69597 --- /dev/null +++ b/modules/lang/racket/config.el @@ -0,0 +1,103 @@ +;;; lang/racket/config.el -*- lexical-binding: t; -*- + +(def-package! racket-mode + :mode "\\.rkt$" + :interpreter "racket" + :init + (add-hook 'racket-repl-mode-hook 'racket-unicode-input-method-enable) + :config + (set-popup-rule! "*Racket REPL*" + :size 10 + :select t + :modeline nil + :quit t + :transient 3) + (set-repl-handler! 'racket-mode #'+racket/repl) + (set-eval-handler! 'racket-mode "racket") + (set-company-backend! 'racket-mode '(company-abbrev + company-dabbrev-code + company-dabbrev + company-files)) + (set-lookup-handlers! 'racket-mode + :definition #'racket-describe + :documentation #'racket-doc) + (set-docset! 'racket-mode "Racket") + (set-pretty-symbols! 'racket-mode + :lambda "lambda" + :map "map" + :dot ".") + (set-rotate-patterns! 'racket-mode + :symbols '(("#true" "#false"))) + + (add-hook! racket-mode + #'(;; Internals + racket-unicode-input-method-enable + ;; 3rd-party functionality + doom|enable-delete-trailing-whitespace + ;; fontification + rainbow-delimiters-mode + highlight-quoted-mode + highlight-numbers-mode + ;; initialization + flycheck-mode)) + + (setq-hook! racket-mode + racket-smart-open-bracket-enable t + company-frontends '(company-pseudo-tooltip-unless-just-one-frontend + company-preview-if-just-one-frontend + company-preview-common-frontend)) + + (map! :map racket-mode-map + :localleader + :n "c" #'racket-run + :n "z" #'racket-repl + :n "C" #'racket-run-and-switch-to-repl + :n "x" #'racket-racket + :n "t" #'racket-test + :n "l" #'racket-logger + :n "o" #'racket-profile + (:desc "eval" :prefix "s" + :n "d" #'racket-send-definition + :n "l" #'racket-send-last-sexp + :n "r" #'racket-send-region) + (:desc "macro expand" :prefix "e" + :n "d" #'racket-expand-definition + :n "l" #'racket-expand-last-sexp + :n "r" #'racket-expand-region + :n "a" #'racket-expand-again) + :n "r" #'racket-open-require-path + :n "TAB" #'indent-for-tab-command + :n "u" #'racket-backward-up-list + :n "[" #'racket-smart-open-bracket + :n ")" #'racket-insert-closing + :n "]" #'racket-insert-closing + :n "}" #'racket-insert-closing + :n "p" #'racket-cycle-paren-shapes + :n "y" #'racket-insert-lambda + :n "d" #'racket-doc + :n "." #'racket-describe + :n "M-." #'racket-visit-definition + :n "C-." #'racket-visit-module + :n "," #'racket-unvisit + :n "f" #'racket-fold-all-tests + :n "F" #'racket-unfold-all-tests + :n "a" #'racket-align + :n "A" #'racket-unalign + :nv ";" #'comment-dwim + :nv "\\" #'indent-region)) + + +;; +;; Plugins +;; + +(def-package! highlight-quoted + :commands highlight-quoted-mode) + +(after! org + (org-babel-do-load-languages + 'org-babel-load-languages + (append org-babel-load-languages + '((racket . t) + ;; (scribble . t) + )))) diff --git a/modules/lang/racket/doctor.el b/modules/lang/racket/doctor.el new file mode 100644 index 000000000..cabeb0d55 --- /dev/null +++ b/modules/lang/racket/doctor.el @@ -0,0 +1,11 @@ +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/racket/doctor.el + +(unless (executable-find "drracket") + (warn! "Could not find drracket executable; code-completion and syntax checking will not work.")) + +(unless (executable-find "racket") + (warn! "Could not find racket executable; REPL will not work.")) + +(unless (executable-find "raco") + (warn! "Could not find raco executable; commands for install packages and build libraries will not work.")) diff --git a/modules/lang/racket/packages.el b/modules/lang/racket/packages.el new file mode 100644 index 000000000..e29892a04 --- /dev/null +++ b/modules/lang/racket/packages.el @@ -0,0 +1,8 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/racket/packages.el + +(package! racket-mode) +(package! ob-racket + :recipe (:fetcher github + :repo "DEADB17/ob-racket" + :files ("*")))