Кажется, что в нижней по умолчанию схеме нет отступов. По крайней мере, когда я делаю M-x run-scheme
, результирующий реплик вообще не отделяет мой код.
Как я могу это изменить? Предпочтительно, без каких-либо изменений, например, для гейзеров или других оберток.
Я думаю, проблема в том, что RET
, вероятно, отображается на comint-send-input
, который не имеет никакого отступа.
Что я делаю, это map Cj
to newline-and-indent
и оставить RET
сопоставлен с comint-send-input
, Поэтому я нажимаю C-j
для ввода новой строки и отступаю новую строку, или RET
, чтобы отправить форму для оценки. (На самом деле я сопоставляю C-j
с paredit-newline
, но newline-and-indent
должен работать, если вы не используете Paredit).
Конечно, вы можете отменить их и использовать RET
для newline-and-indent
с помощью Cj
для comint-send-input
код>.
В качестве примера сопоставления одного из этих ключей это будет отображать C-j
в newline-and-indent
:
(with-eval-after-load 'cmuscheme
(define-key inferior-scheme-mode-map (kbd "C-j") #'newline-and-indent))
( cmuscheme
по историческим причинам является именем пакета, который реализует inferior-scheme-mode
, то есть схему REPL.)
<Сильный> Edit:
Вот что-то, что, кажется, работает, хотя я не тестировал его широко:
(defun comint-send-input-indent ()
(interactive)
(comint-send-input)
(unless (save-excursion (forward-char -1)
(eq (field-at-pos (point)) 'output))
(indent-for-tab-command)))
(with-eval-after-load 'cmuscheme
(define-key inferior-scheme-mode-map (kbd "RET") #'comint-send-input-indent))
Идея состоит в том, чтобы вызвать comint-send-input
, а затем проверить, находится ли точка (курсор) непосредственно перед приглашением. Если это не так (потому что comint-send-input
только что ввел новую строку), вызовите indent-for-tab-command
, что соответственно отложит строку.
Другое редактирование:
С другой стороны, я думаю, что это определение, вероятно, имеет больше смысла:
(defun comint-send-input-indent ()
(interactive)
(let ((parens (or (car (syntax-ppss)) 0)))
(if (zerop parens)
(comint-send-input)
(newline-and-indent))))
Для получения дополнительной информации см. <Код> C-h f синтаксис-ppss RET (и, лучше, C-h f parse-partial-sexp RET
). Краткая версия заключается в том, что они могут рассказать нам, насколько глубока вложенность парных в точке, поэтому мы можем использовать это, чтобы решить, следует ли newline-and-indent
или comint-send-input
код>.