2010-07-14 2 views
1

При воспроизведении и расширении stdiodemo.py a придумал добавить историю командной строки. Возможно ли это? Любые подсказки?stdiodemo и история команд

Благодаря Антонис К.

+0

Вы спрашиваете о 'readline'? http://docs.python.org/library/readline.html –

+0

Нет, твист «скрученный» подразумевает, что он спрашивает об авизованной стандартной версии io-азимута Twisted. http://twistedmatrix.com/trac/browser/trunk/doc/core/examples/stdiodemo.py – Glyph

+0

Спасибо, Глиф за разъяснение! – Antonis

ответ

1

Это, конечно, возможно. История может быть рассмотрена несколько независимо от ввода, поэтому в идеале у вас может быть объект, представляющий вашу историю, с методами, такими как 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.

+0

Спасибо вам большое! Antonis K. – Antonis

+0

Ну, похоже, я не могу приклеить объект History с помощью методов stdiodemo.py, чтобы у меня была история команд, которые я набрал. Любые подсказки, пожалуйста? – Antonis

+0

Я немного расширил ответ, надеюсь, что это поможет. :) –

Смежные вопросы