Gibt es eine Möglichkeit, die Emacs-Shell die TAB an einen darin ausgeführten Readline-Befehl übergeben zu lassen?


8

Z.B. Wenn Sie nette Dinge wie Perl- oder Ruby-REPLs ausführen, wird die Code- / Befehlsvervollständigung über GNU Readline angezeigt. Ich möchte beim Eingeben / Beenden eines solchen Programms eine elisp / env-Variable festlegen, um anzuzeigen, dass ich shell-modedie TAB-Taste an diese Programme übergeben möchte .

Beachten Sie, dass dies C-q TABauch nicht funktioniert, daher denke ich, dass Readline es auch ignoriert, weil TERM=dumb, aber es auf z. vt100 macht auch nicht den Trick, also könnte es sogar schauen EMACS=t.


3
Comint funktioniert so nicht. Es wartet auf das Senden einer Leitung RETund empfängt dann die Ausgabe, bis eine Eingabeaufforderung erkannt wird. Die Fertigstellung muss daher auf seiner Seite gelöst werden.
— Wasamasa

Werfen Sie einen Blick auf ESS oder Grass-Modus, um zu sehen, wie die Fertigstellung direkt in elisp auf der Emacs-Seite gehandhabt wird, anstatt sich auf readline zu verlassen.
— Tyler

Dies ist auch im Prolog-Modus nützlich, in dem durch Drücken der Tabulatortaste der Interpreter aufgefordert werden soll, die nächste Lösung zu generieren.
— wvxvw

@ Tyler die Sache ist, wo das Wissen anderswo existiert (zB in einem laufenden Dolmetscher). Ich denke, ich könnte eine Art Readline-Proxy erstellen, an den die Fertigstellung von
— lisp

@MarkAufflick ESS macht so etwas, denke ich, wobei die meisten Abschlüsse über elisp bereitgestellt werden, aber einige Sonderfälle / Situationen an den R-Prozess übergeben wurden. Die Sonderfälle können zu schmerzhaft langsamen Abschlüssen führen.
— Tyler

Antworten:


2

M-x shellarbeitet zeilenweise. Beim Drücken der RetTaste wird eine Eingabezeile an den externen Shell-Prozess übergeben .

M-x termÜbergibt jeden Tastendruck an den externen Shell-Prozess, mit Ausnahme von C-cund ich denke Esc. Wenn Sie drücken Tab, wird es vom externen Shell-Prozess angezeigt und interpretiert.


2

Wie @ user20119 hervorhob, M-x termkönnte dies eine gute Option sein: Es unterstützt auch das dynamische Umschalten in den "Leitungsmodus", der dem ähnelt, mit dem Sie arbeiten M-x shell.

M-x eshell versucht auch, Ihnen eine Mischung aus den beiden Verhaltensweisen zu geben.

Ich werde auch darauf hinweisen, dass C-q TABdies nicht funktioniert hat, da lediglich ein TAB-Zeichen in den Puffer eingefügt werden muss (anstatt ein TAB an den Unterprozess zu senden). Darüber hinaus würde es nicht ausreichen, nur ein TAB-Zeichen an den zugrunde liegenden Prozess zu senden, da der Text in der aktuellen Zeile noch nicht an den Prozess gesendet wurde. Daher benötigen Sie möglicherweise Folgendes:

(defun my-comint-tab ()
  (interactive)
  (let* ((proc (get-buffer-process (current-buffer)))
         (str (buffer-substring (process-mark proc) (point))))
    (process-send-string proc (concat str "\t"))))

und in der Tat müssen Sie wahrscheinlich auch überzeugen M-x shell, eine andere Einstellung für zu verwenden $TERM.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.