Обычно программы, предназначенные для интерактивного использования (когда они имеют собственный терминал), отключают интерактивные функции (такие как история для ВВЕРХ / ВНИЗ, завершение для TAB) при использовании в конвейере.
Emacs обычно использует каналы для внешних процессов. Поэтому интерактивные функции отключены.
Даже если вы отправляете TAB, ваша клиентская программа не интерпретирует его для вас так, как вы хотите.
Вы можете прочитать man / help для вашей программы и попробовать принудительный интерактивный режим, предоставив ключ командной строки (например, --login для GNU Bash).
Чтобы отправить TAB eval:
(defun my-comint-send-string (string)
"Send string to comint buffers. Useful for *compilation* read-only buffer."
(interactive
(list (read-input "Type string: " nil 'my-comint-send-hist-list))
)
(comint-send-string (get-buffer-process (current-buffer)) string)
)
(define-key XXX-mode-map [C-return] 'my-comint-send-string)
и используйте такую последовательность клавиш: C-RET C-q TAB RET .
Но это может не сработать, если для stdio вашей программы включена буферизация (для сброса ввода вы также должны отправить \n
) ...
В основном та же проблема, что обсуждалась в Автодополнение Bash в режиме оболочки Emacs
ПРИМЕЧАНИЕ M-x термин использует псевдотерминал, поэтому все интерактивные программы работают по желанию. Но в этом режиме вы теряете все возможности редактирования Emacs ...