При воспроизведении и расширении stdiodemo.py a придумал добавить историю командной строки. Возможно ли это? Любые подсказки?stdiodemo и история команд
Благодаря Антонис К.
При воспроизведении и расширении stdiodemo.py a придумал добавить историю командной строки. Возможно ли это? Любые подсказки?stdiodemo и история команд
Благодаря Антонис К.
Это, конечно, возможно. История может быть рассмотрена несколько независимо от ввода, поэтому в идеале у вас может быть объект, представляющий вашу историю, с методами, такими как addLine
и previousLine
и так далее. Затем вы приклеиваете это к пользовательскому интерфейсу по вашему выбору, будь то поле ввода в приложении Gtk или что-то на stdio.
В рамках (незавершенный) клиента IRC, я написал что-то вроде этого: https://github.com/exarkun/invective/blob/master/invective/history.py
И на самом деле, в том же проекте, вы найдете LineInputWidget, который перехватывает это до STDIO, а также орудие такие вещи, как emacs-style kill and yank, forward-and back-word и т. д.
stdiodemo.py не может обрабатывать такие вещи, как стрелка вверх и стрелка вниз, хотя вы, вероятно, захотите получить разумную навигацию по истории. Вместо этого вам нужно обработать stdio в необработанном режиме с помощью некоторого кода, который знает, как интерпретировать последовательности управления терминалом. Если вы когда-либо запускали «cat» и стрелку вверх или любую другую функциональную клавишу, вы знаете, что для каждой из них существует специальная последовательность байтов. Что-то в вашей программе должно интерпретировать эти последовательности и превращать их в нечто разумное. Это то, что делает twisted.conch.insults.insults.ServerProtocol
. Он превращает байтовый транспорт, подключенный к терминалу, в другой, более богатый вид транспорта: транспорт, который может сказать вам, когда байты прибыли, но также при нажатии различных специальных клавиш. Вы можете увидеть пример запуска линии на основе протокола с историей ввода команды:
python -m twisted.conch.stdio
Это запускает Python REPL, используя ServerProtocol
и один из уроков истории ввода в самой Twisted (специальная вещь об этом РЕПЛО является что у него есть реактор, работающий одновременно с обработкой вашего входа, что-то, что сложно сделать в обычном PIPON REPL).
Вы можете найти источник этого в twisted/conch/stdio.py. Важный код подключения stdio находится в классе runWithProtocol
. Посмотрите, как он создает ServerProtocol
и соединяет его с stdio с StandardIO
(так что он просто строится поверх того, что делает stdiodemo.py). Однако ServerProtocol
интерпретирует только байты с терминала. В нем нет вашей прикладной логики. Поэтому вам нужно дать ему класс, который реализует вашу логику приложения. И это exactly what invective does.
Вы спрашиваете о 'readline'? http://docs.python.org/library/readline.html –
Нет, твист «скрученный» подразумевает, что он спрашивает об авизованной стандартной версии io-азимута Twisted. http://twistedmatrix.com/trac/browser/trunk/doc/core/examples/stdiodemo.py – Glyph
Спасибо, Глиф за разъяснение! – Antonis