Ik denk dat het probleem is dat RET
waarschijnlijk is toegewezen aan comint-send-input
, die geen enkele insprong heeft.
Wat ik doe is kaart Cj
naar newline-en-streepje
en laat RET
toegewezen aan comint-send-input
. Dus druk ik op C-j
om een nieuwe regel in te voeren en de nieuwe regel in te voegen, of RET
om het formulier daadwerkelijk voor evaluatie te verzenden. (Ik plaats eigenlijk C-j
in paredit-newline
, maar newline-and-indent
zou moeten werken als u Paredit niet gebruikt).
Natuurlijk kunt u deze omkeren en RET
gebruiken voor newline-and-indent
met Cj
voor comint-send-input
.
Als een voorbeeld van het toewijzen van een van deze sleutels, wordt C-j
toegewezen aan newline-and-indent
:
(with-eval-after-load 'cmuscheme
(define-key inferior-scheme-mode-map (kbd "C-j") #'newline-and-indent))
( cmuscheme
is om historische redenen de naam van het pakket dat inferieur-schema-modus
implementeert, d.w.z. het Schema REPL.)
Bewerken
Hier is iets dat lijkt te werken, hoewel ik het niet uitgebreid heb getest:
(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))
Het idee is om comint-send-input
aan te roepen en vervolgens te controleren of punt (de cursor) zich onmiddellijk voor de prompt bevindt. Als dit niet het geval is (omdat comint-send-input
zojuist een nieuwe regel heeft ingevoerd), roept u indent-for-tab-command
aan, waarmee de regel op de juiste manier wordt ingesprongen.
Nog een bewerking:
Bij nader inzien, denk ik dat deze definitie waarschijnlijk meer steek houdt:
(defun comint-send-input-indent ()
(interactive)
(let ((parens (or (car (syntax-ppss)) 0)))
(if (zerop parens)
(comint-send-input)
(newline-and-indent))))
Zie C-h f syntax-ppss RET
(en, beter, C-h f parse-partial-sexp RET
) voor meer informatie. De korte versie is dat ze ons kunnen vertellen hoe diep het nest van het paar zich op het punt bevindt, zodat we dit kunnen gebruiken om te beslissen of newline-and-indent
of comint-send-input
.