¿Alguna forma de hacer que emacs shell pase la TAB a un comando readline que se ejecuta dentro de él?

8

P.ej. cuando está ejecutando cosas buenas como Perl o Ruby REPLs, tiene la finalización de código / comando expuesta a través de GNU Readline. Lo que quiero hacer es establecer alguna variable elisp / env al ingresar / salir de dicho programa para indicar que quiero shell-modepasar la tecla TAB a esos programas.

Tenga en cuenta que C-q TABtampoco funciona, así que creo que Readline también lo ignora porque TERM=dumb, pero lo configura a, por ejemplo. vt100 tampoco funciona, por lo que incluso podría estar mirando EMACS=t.

Mark Aufflick
fuente
3
Comint no funciona de esa manera. Espera a que se envíe una línea RET, luego recibe la salida hasta que reconoce una solicitud. Por lo tanto, la terminación debe resolverse de lado.
wasamasa 01 de
Eche un vistazo a ESS , o modo hierba para ver cómo se maneja la finalización directamente en elisp en el lado de Emacs, en lugar de depender de readline.
Tyler
Esto también sería útil para el modo Prolog, donde al presionar la tecla se le pide al intérprete que genere la próxima solución.
wvxvw
@Tyler la cosa es donde el conocimiento existe en otra parte (por ejemplo, en un intérprete en ejecución). Supongo que podría hacer algún tipo de proxy de línea de lectura que podría haber delegado su finalización desde lisp - parece mucho trabajo :)
Mark Aufflick
@MarkAufflick ESS hace algo así, creo, con la mayoría de las terminaciones proporcionadas a través de elisp, pero algunos casos / situaciones especiales pasaron al proceso R. Los casos especiales pueden resultar en terminaciones dolorosamente lentas.
Tyler

Respuestas:

2

M-x shelltrabaja línea por línea. Pasa una línea de entrada al proceso de shell externo cuando presiona la Rettecla.

M-x termpasa cada pulsación de tecla al proceso de shell externo, con la excepción de C-cy creo Esc. Cuando presiona Tab, será visto e interpretado por el proceso de shell externo.

usuario20119
fuente
2

Como señaló @ user20119, M-x termpodría ser una buena opción: también admite cambiar dinámicamente al "modo de línea", que es algo similar a lo que obtienes M-x shell.

M-x eshell También trata de darle una mezcla de los dos comportamientos.

También señalaré que C-q TABno funcionó porque todo lo que hace es insertar un carácter TAB en el búfer (en lugar de enviar una TAB al subproceso). Además, simplemente enviar un TAB char al proceso subyacente no sería suficiente, porque el texto en la línea actual aún no se ha enviado al proceso, por lo que puede necesitar algo como:

(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"))))

y, de hecho, probablemente también necesite convencer M-x shellpara usar una configuración diferente para $TERM.

Stefan
fuente