2019-07-20 23:59:29 -05:00
|
|
|
;;; lang/scheme/autoload.el -*- lexical-binding: t; -*-
|
|
|
|
|
2021-04-15 00:38:39 -04:00
|
|
|
;; HACK geiser-* plugins will try to add to these two variables, so it must be
|
|
|
|
;; defined before their autoloads are evaluated. Fortunately, Doom modules'
|
|
|
|
;; autoloads run earlier than package autoloads.
|
|
|
|
;;;###autoload (defvar geiser-active-implementations ())
|
|
|
|
;;;###autoload (defvar geiser-implementations-alist ())
|
2021-04-13 22:41:31 -04:00
|
|
|
|
|
|
|
;; 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.
|
2021-04-15 18:23:26 -04:00
|
|
|
;;;###autoload (defun geiser-impl--add-to-alist (kind what impl &optional append) (add-to-list 'geiser-implementations-alist (list (list kind what) impl) append))
|
2021-04-13 22:41:31 -04:00
|
|
|
|
|
|
|
|
2020-04-24 00:34:28 -04:00
|
|
|
(defvar calculate-lisp-indent-last-sexp)
|
|
|
|
|
|
|
|
;; Adapted from https://github.com/alezost/emacs-config/blob/master/utils/al-scheme.el#L76-L123
|
|
|
|
;;;###autoload
|
|
|
|
(defun +scheme-scheme-indent-function-a (indent-point state)
|
|
|
|
"Advice to replace `scheme-indent-function'.
|
|
|
|
|
|
|
|
This function is the same as `scheme-indent-function' except it indents property
|
|
|
|
lists properly and names starting with 'default'."
|
|
|
|
(let ((normal-indent (current-column)))
|
|
|
|
(goto-char (1+ (elt state 1)))
|
|
|
|
(parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)
|
|
|
|
(if (and (elt state 2)
|
|
|
|
;; NOTE looking-at -> looking-at-p
|
|
|
|
(not (looking-at-p "\\sw\\|\\s_")))
|
2020-05-01 01:22:14 -04:00
|
|
|
(progn
|
|
|
|
;; NOTE (if (not ...) (progn ...)) -> (unless ... ...)
|
|
|
|
(unless (> (save-excursion (forward-line 1) (point))
|
|
|
|
calculate-lisp-indent-last-sexp)
|
|
|
|
(goto-char calculate-lisp-indent-last-sexp)
|
|
|
|
(beginning-of-line)
|
|
|
|
(parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t))
|
|
|
|
(backward-prefix-chars)
|
|
|
|
(current-column))
|
2020-04-24 00:34:28 -04:00
|
|
|
(let* ((function (buffer-substring
|
|
|
|
(point) (progn (forward-sexp 1) (point))))
|
2020-05-01 01:22:14 -04:00
|
|
|
;; NOTE let -> let* & moved `method' def into let bindings
|
2020-04-24 00:34:28 -04:00
|
|
|
(method (or (get (intern-soft function) 'scheme-indent-function)
|
|
|
|
(get (intern-soft function) 'scheme-indent-hook))))
|
|
|
|
(cond ((or (eq method 'defun)
|
|
|
|
(and (null method)
|
|
|
|
(> (length function) 3)
|
|
|
|
;; NOTE string-match -> string-match-p
|
|
|
|
;; NOTE The original regexp is "\\`def" but it will mess
|
|
|
|
;; indentation with such names as 'default-...'.
|
2020-05-01 01:22:14 -04:00
|
|
|
(string-match-p "\\`def" function)))
|
2020-04-24 00:34:28 -04:00
|
|
|
(lisp-indent-defform state indent-point))
|
|
|
|
;; NOTE Added this clause to handle alignment of keyword symbols
|
|
|
|
((and (null method)
|
|
|
|
(> (length function) 1)
|
2020-05-01 01:22:14 -04:00
|
|
|
;; NOTE string-match -> string-match-p
|
2020-04-24 00:34:28 -04:00
|
|
|
(string-match-p "\\`:" function))
|
|
|
|
(let ((lisp-body-indent 1))
|
|
|
|
(lisp-indent-defform state indent-point)))
|
|
|
|
((integerp method)
|
|
|
|
(lisp-indent-specform method state indent-point normal-indent))
|
|
|
|
(method
|
|
|
|
(funcall method state indent-point normal-indent)))))))
|
|
|
|
|
2019-07-20 23:59:29 -05:00
|
|
|
;;;###autoload
|
2020-06-10 00:17:03 +10:00
|
|
|
(defun +scheme/open-repl ()
|
2019-07-20 23:59:29 -05:00
|
|
|
"Open the Scheme REPL."
|
2020-06-10 00:17:03 +10:00
|
|
|
(interactive)
|
|
|
|
(call-interactively #'switch-to-geiser)
|
2019-07-20 23:59:29 -05:00
|
|
|
(current-buffer))
|