Cider: (schlürfen * in *) kann nicht unterbrochen werden

Erstellt am 9. Juni 2018  ·  18Kommentare  ·  Quelle: clojure-emacs/cider

Hiermit wird lediglich ein Ticket für https://stackoverflow.com/questions/50493580/cider-for-emacs-stdin erstellt

Es scheint, dass das Schlürfen aus dem Standard momentan nicht unterbrochen werden kann, was sicherlich möglich sein sollte.

bug good first issue

Hilfreichster Kommentar

@ TimoFreiberg Ich habe ein paar Artikel darüber verfasst, wie man mit dem Debuggen beginnt und Beiträge leistet: http://hackingcider.com/ (insbesondere CIDER für die Entwicklung einrichten )

Fühlen Sie sich auch frei, in #cider auf der Clojure Slack zu chatten

Alle 18 Kommentare

Ich möchte einen kleinen Beitrag zu CIDER leisten, habe aber keine Ahnung, wo ich mit diesem Problem anfangen soll. Könnten Sie / jemand mir einige Hinweise geben?

@ TimoFreiberg Ich habe ein paar Artikel darüber verfasst, wie man mit dem Debuggen beginnt und Beiträge leistet: http://hackingcider.com/ (insbesondere CIDER für die Entwicklung einrichten )

Fühlen Sie sich auch frei, in #cider auf der Clojure Slack zu chatten

danke @dpsutton! M-x nrepl-toggle-message-loggin war das fehlende Glied für mich :)

Das Problem scheint zu sein:

  • Beim Versuch, den gesamten Inhalt von in zu lesen, antwortet nrepl immer auf eine neue stdin -Nachricht mit :status "need-input"
  • Daher öffnet CIDER den Minibuffer immer wieder, um daraus zu lesen ( cider-need-input immer aufgerufen, siehe https://github.com/clojure-emacs/cider/blob/master/cider-client.el#L596).
  • nrepl interpretiert ein leeres stdin als EOF: https://github.com/clojure/tools.nrepl/blob/master/src/test/clojure/clojure/tools/nrepl_test.clj#L403
  • cider-need-input hängt immer eine neue Zeile an die Eingabe an (was korrekt erscheint), daher gibt es keine Möglichkeit, ein leeres stdin zu senden

Mögliche Lösungen scheinen zu sein:

  • Fangen Sie die signal 'quit von C-g und senden Sie nil / eine leere Liste an nrepl
  • Hinzufügen einer Cc-Bindung zum Minibuffer, die auch null / eine leere Liste sendet

Ich werde diesen Ansatz versuchen, Feedback geschätzt :)

Hervorragende Forschung!

Ja, ich denke wir sollten beides machen.

cider-need-input hängt immer eine neue Zeile an die Eingabe an (was korrekt erscheint), daher gibt es keine Möglichkeit, ein leeres stdin zu senden

Übrigens bin ich mir da nicht ganz sicher. Warum ist es richtig, immer eine letzte neue Zeile hinzuzufügen?

Übrigens bin ich mir da nicht ganz sicher. Warum ist es richtig, immer eine letzte neue Zeile hinzuzufügen?

Andernfalls wäre es unmöglich, eine leere Zeile in stdin einzugeben

Sie können einfach \n . :-) Aber ja - das ist ein guter Punkt. Andernfalls benötigen wir eine andere Tastenkombination (z. B. haben viele Chats Shift+Enter dafür). Der von Ihnen vorgeschlagene Ansatz klingt mit Sicherheit besser.

Freut mich das zu hören :)
Ich werde versuchen, es zum Laufen zu bringen, es könnte eine Weile dauern, da ich neu im Emacs-Hacking bin;)

Hier erfahren Sie, wie Sie das Minibuffer-Setup für stdin https://github.com/clojure-emacs/cider/blob/master/cider-common.el#L87 optimieren

Übrigens, wenn Sie Lust auf mehr Detektiv- / Fehlerbehebung haben, kann ich Ihnen zwei weitere kleine Probleme vorschlagen, die etwas miteinander zu tun haben:

Ich werde einen Blick darauf werfen: +1:

Aktueller Status:
Ich habe C-c C-c an abort-recursive-edit gebunden.
C-c C-c und C-g stoppen erfolgreich die stdin-Schleife:

https://gist.github.com/TimoFreiberg/34d7efa24f2966daff44601ce6c4753e#file -nrepl-exception

Es gibt jedoch ein Problem: Wenn Sie (slurp *in*) erneut aufrufen, wird der folgende Fehler ausgegeben:
https://gist.github.com/TimoFreiberg/34d7efa24f2966daff44601ce6c4753e#file -nrepl-messages-cider-issue-2317
wahrscheinlich, weil der stdin reader nach dem lesen einer leeren nachricht geschlossen wird.

Wahrscheinlich hast du recht. Ich bin mir nicht sicher, wo ich am besten damit umgehen soll.

Übrigens bin ich neugierig, ob wir irgendwie eine Möglichkeit hinzufügen können, die vom Minibuffer gelesene Eingabe mit EOF abzuschließen (z. B. mit einer Tastenkombination), um zu verhindern, dass eine zweite "Beendigungs" -Nachricht gesendet werden muss.

Oh, eigentlich ist es ziemlich offensichtlich. slurp schließt *in* und nrepl öffnet es einfach nicht wieder.

Ja, darüber habe ich auch nachgedacht.
slurp liest, bis es auf EOF trifft, das nrepl sendet, wenn stdin leer ist: https://github.com/clojure/tools.nrepl/blob/master/src/main/clojure/clojure/tools/nrepl/ Middleware / session.clj # L233
nrepl macht das nur, wenn eine leere Nachricht gesendet wird. Ich denke, eine leere Beendigungsnachricht ist der einzige Weg, es sei denn, nrepl ändert sich

Nun, Verbesserungen in nREPL sind jetzt sicherlich machbar. Https://github.com/nrepl/nrepl/

CIDER wird bald auf den neuen nREPL-Server umsteigen.

Wie auch immer, für den Moment sollten wir wahrscheinlich mit einer Kündigungsnachricht gehen, bis der Übergang zur "neuen" nREPL abgeschlossen ist.

Ich habe es jetzt.

Wir akzeptieren also, dass Benutzer das nREPL-Standard schließen und dies möglicherweise im neuen nREPL-Projekt beheben / verbessern können?

Wir akzeptieren daher, dass Benutzer den nREPL-Standard schließen können

Nur für jetzt.

Vielleicht das im neuen nREPL-Projekt beheben / verbessern?

Wir sollten dies dort auf jeden Fall beheben. Mein Punkt war hauptsächlich, dass einige Leute das Legacy-Projekt noch eine Weile nutzen werden, daher müssen wir im Idealfall auch damit kompatibel sein.

CIDER wird die Unterstützung des Legacy-nREPL einstellen, sobald ich etwas Zeit finde, mich darauf zu konzentrieren. :-)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

mwfogleman picture mwfogleman  ·  3Kommentare

phillord picture phillord  ·  3Kommentare

Reefersleep picture Reefersleep  ·  8Kommentare

achikin picture achikin  ·  7Kommentare

harold picture harold  ·  7Kommentare