Hoe schakel ik inspringen in in een inferieur schema?

Er lijkt geen sprake te zijn van een inspringing in het standaard inferieure schema. Tenminste, wanneer ik M-x run-scheme heb, geeft de resulterende repl helemaal geen code.

Hoe kan ik dit veranderen? Bij voorkeur zonder iets als Geiser of andere wrappers.

1

1 antwoord

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 .

2
toegevoegd
@Darklightus, mijn slechte, ik heb het antwoord bewerkt om een ​​voorbeeld toe te voegen. Als u in plaats daarvan RET opnieuw wilt toewijzen, vervangt u "C-j" door "RET"
toegevoegd de auteur Jorriss, de bron
@wasamasa, dat lijkt inderdaad mogelijk te zijn. In de Emecs 25-test die ik gebruik (ik heb geen andere versies geprobeerd), voert comint-send-input al een nieuwe regel in (in plaats van de invoer te verzenden), maar wordt niet ingesprongen de nieuwe regel, als het formulier onvolledig is. Na een korte voorlezing van de bron is het mij echter niet duidelijk hoe dat werkt. Hm, ik zal er later naar moeten kijken.
toegevoegd de auteur Jorriss, de bron
In Emacs Lisp (en Common Lisp) is progn gelijk aan Schema's begin . Het definiëren van een functie met (progn (newline-en-streepje) (comint-send-input)) werkt echter niet; je wilt de ene of de andere doen, niet de ene dan de andere. Het moeilijkste is uitzoeken wanneer. (Ook functielichamen zijn een impliciete progn , net als in Schema, dus waarschijnlijk zou je in dit specifieke geval progn waarschijnlijk niet gebruiken, omdat de formulieren in een functie)
toegevoegd de auteur Jorriss, de bron
Ik heb nu hiernaar gevraagd op de Emacs help mailinglijst en zal mijn antwoord updaten met relevante informatie.
toegevoegd de auteur Jorriss, de bron
Hier is hoe u het zou doen. Tenzij ik iets mis, geloof ik echter nog steeds niet dat het je de functionaliteit zal geven die je wilt.
toegevoegd de auteur Jorriss, de bron
@Darklightus, ik heb het antwoord bewerkt met een nieuwe bezwering die lijkt te werken. Ik ga verder bewerken met alles wat ik leer van de lijst. Bedankt!
toegevoegd de auteur Jorriss, de bron
Ik kan me een manier voorstellen om een ​​enkel commando Doing The Right Thing te schrijven. Kortom, het verschil tussen een formulier dat naar het subproces kan worden gestuurd en een formulier dat inspringing van de rest vereist, is dat het eerste volledig is (lees: uitgebalanceerd), terwijl het laatste dat niet is.
toegevoegd de auteur ICodeForCoffee, de bron
Sorry maar ik ben echt nieuw voor emacs. Hoe kan ik deze sleutels in kaart brengen?
toegevoegd de auteur Snakist_へびーん, de bron
Als RET standaard comint-send-input doet, maar daarnaast inspringing wil, kan ik dan niet allebei newline-en-indent en comint-send-input ? In plaats van twee sleutels te gebruiken, kon ik er maar één gebruiken. Hoe zou ik dat doen? Ik zou begin gebruiken in andere lisp's maar dat lijkt niets te doen (behalve het breken van emacs). Daarnaast werkt de oplossing overigens prima.
toegevoegd de auteur Snakist_へびーん, de bron
Ik zie niet echt waarom niet de ene doen en dan de andere. We doen al comint-send-input en nu willen we daarvoor newline-and-indent gebruiken.
toegevoegd de auteur Snakist_へびーん, de bron
Ik heb geprobeerd het te definiëren als (progn (newline-en-streepje) (comint-send-input) maar dat breekt M-x run-scheme om een ​​vreemde reden.
toegevoegd de auteur Snakist_へびーん, de bron
@jbm ja je hebt gelijk, de newline die daar is geplaatst door comint-send-input ruïneert het effect. Nu krijg ik een mooi ingesprongen volgende regel, gevolgd door een niet-inspringende nieuwe regel. Ik denk dat ik gewoon zal wachten op een antwoord van de mailinglijst. Bedankt voor je hulp tot nu toe!
toegevoegd de auteur Snakist_へびーん, de bron
Ik heb het nu een beetje aangepast door de nieuwe regels tussen comint-send-input en newline-and-indent te verwijderen. Het is nu bijna perfect: het enige probleem is wanneer het daadwerkelijk een resultaat terugkrijgt en het afdrukt na de invoer zonder een nieuwe regel, zoals (+ 2 3) 5 in plaats van een nieuwe regel vóór 5. Ik kan niet kijk hoe ik dit kan oplossen, dus laten we hopen dat iemand een leuk antwoord stuurt op de mailinglijst. Voordat ik dit vergeet (voor het geval er niets gebeurt), zal ik je antwoord accepteren, maar houd me alsjeblieft op de hoogte als er iets gebeurt.
toegevoegd de auteur Snakist_へびーん, de bron
@jbm de laatste lijkt precies te werken zoals ik wilde. Ik heb het nog niet intensief gebruikt, maar het lijkt tot nu toe perfect te werken. Dank u zeer!
toegevoegd de auteur Snakist_へびーん, de bron