Получить завершение вкладки в пользовательском режиме Comint

Я обычно пытаюсь запустить CLI (возможно, не определяю его должным образом) с помощью таких команд:

(make-comint-in-buffer "PUTTY" nil "./plink.exe" nil "dbserver")
(make-comint-in-buffer "Python" nil "c:/Python26/python.exe" nil "-i")
(make-comint-in-buffer "Python" nil "c:/Python27/python.exe" nil "-i")
(make-comint-in-buffer "git" nil "C:/Program Files (x86)/Git/bin/sh.exe" nil "--login" "-i")

Запуск вышеупомянутого, особенно первого и последнего в командной строке, обеспечивает возможность завершения вкладки. Но в comint-mode Я, кажется, не понимаю эту функцию.

Ввод табуляции добавляет простой символ табуляции под точкой вместо передачи его процессу и возврата кандидатов на завершение. comint-dynamic-complete и вкладкаCq не дает желаемого результата.

Как я могу использовать в вышеупомянутой функции в comint-mode запущены разные процессы?

1 ответ

Решение

Короткий ответ

Вам нужно написать свои собственные функции завершения внутри Emacs. Они могут извлекать информацию из внешней программы, но вы не можете иметь прямой доступ к завершению табуляции, предоставляемому python или git и т. Д.

Длинный ответ:

Когда ты бежишь make-comint-in-bufferвы настраиваете самые основные настройки для интерактивной отправки и получения данных из внешнего процесса. Всякий раз, когда вы нажимаете enter, Emacs отправляет текущую строку в базовый процесс, а затем печатает выходные данные процесса. Внешний процесс не будет знать, что вы делаете, пока Emacs не отправит ему полную строку - ни один символ не передается напрямую.

Это отличается от запуска внешней программы непосредственно в терминале. Когда вы запускаете python в терминале, он интерпретирует каждый символ по мере его ввода (или, по крайней мере, может). Поэтому, когда вы нажимаете кнопку Tab, он знает, что пытается что-то завершить. Когда вы запускаете python внутри Emacs, Emacs обрабатывает весь ваш ввод, пока вы не нажмете Enter. Это означает, что когда вы нажимаете клавишу Tab, Emacs просто вставляет символ табуляции, а python не знает, что пытаться что-то завершить.

Emacs может обеспечить завершение табуляции для режимов коминтов, но вам нужно построить цели завершения на стороне Emacs, вы не можете полагаться на собственное завершение внешней программы. Чтобы получить представление о том, как это работает, взгляните на функции завершения в shell.el, которые вы можете открыть с помощью M-x find-library shell,

Это не то, что вы можете сделать с линией или двумя elisp. Это важная часть основных режимов, написанных для взаимодействия с внешними процессами, такими как ESS for R http://ess.r-project.org/

Тем не менее, если вы покопаетесь в кишечнике shell.el, вы можете найти достаточно кода, который можете изменить, чтобы начать работу.

Другие вопросы по тегам