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.

Mark Aufflick
quelle
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.

user20119
quelle
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.

Stefan
quelle