LINUX.ORG.RU

[Qt][R] Автодополнение в процессе, работающем через QProcess

 ,


0

1

Решил тут в общеукрепительных целях сделать кастомную «консоль» для R, чтобы каждый кусочек вывода можно было удалять/редактировать по отдельности. Для этого запустил R через QProcess, кормлю ему команды, получаю вывод через stdout/stderr. Но затык получился с вопросом автодополнения. Я думал, проще будет. Но по факту, если после жмакания tab-а R выдает список вариантов (то есть, я посылаю текст с \t+ на конце), то событие «readyRead» не генерируется. Если просто так читать out/err, то там ничего нет (если я не напортачил). Доступным этот вывод становится, если в процесс уйдет «\n», но это не то, что мне нужно. По моим представлениям, варианты для автодополнения должны были бы читаться, как и любой другой вывод R, но этого не происходит.

Чего я не понимаю?

★★★★★

1) А разве такие вещи, как обработка табов делаются без termios?

2) Введённый текст доходит до R побайтно?

unnamed
()
Ответ на: комментарий от unC0Rr

У QProcess нет метода flush(). Пробовал делать start c параметром QProcess::Unbuffered, но не преуспел.

Smacker ★★★★★
() автор топика
Ответ на: комментарий от unnamed

Судя по тому, что происходит после отправки «\n», до R всё доходит в лучшем виде. Только я прочитать не могу.

А разве такие вещи, как обработка табов делаются без termios?


Я понятия не имею, первый раз сталкиваюсь. Наивно думал, что всё будет просто. termios кросс-платформенность решения поломает?

Smacker ★★★★★
() автор топика
Ответ на: комментарий от Smacker

Я понятия не имею, первый раз сталкиваюсь. Наивно думал, что всё будет просто. termios кросс-платформенность решения поломает?

Поломает, конечно.

Могу ошибаться, но, по-моему, такие вещи делаются низкоуровневой работой с терминалом (tty). stdin тут и не нужен. Посмотри исходники readline.

А так, пока ты \n не нажмёшь, ничего никуда и не отправится.

unnamed
()
Ответ на: комментарий от unnamed

Дело не в том, что не отправится. А в том, что по нажатию таба (передачи \t в процесс) выводится текст подсказки. И ввода/\n для этого не нужно. Но вывод этого текста почему-то не попадает в каналы out или err процесса до первого «ввода». А тогда уже поздно пить боржоми.

Smacker ★★★★★
() автор топика
Ответ на: комментарий от Smacker

> Дело не в том, что не отправится

Но вывод этого текста почему-то не попадает в каналы out или err процесса до первого «ввода»

и в чем же по-твоему дело? написали же, что пока Enter не нажмешь, ничего никуда не отправится, и именно в этом и дело

ппц

dt1 ★★
()
Ответ на: комментарий от Smacker

Это понятно. stdout тут не поможет. Нужно работать с _терминалом_ на низком уровне.

unnamed
()
Ответ на: комментарий от dt1

Ок, я криво высказался.
Я не понимаю, куда попадают символы, которые выводятся при нажатии таба в качестве вариантов автодополнения (я имею в виду, когда их несколько, то бишь - выводятся над набираемой строкой). По идее, в терминале, они выводятся так же, как и всё остальное. То есть, как мне раньше казалось, должны были попадать в stdout. Но это не так. Куда же они выводятся, в какой поток? Или ни в какой поток - но как тогда?

И спасибо за ссылку на виджет. Мне нужно ещё внимательно изучить код, чтобы понять, как всё это работает, но думаю, что смогу что-то почерпнуть. Ведь, насколько я понимаю, автодополнение в R и в, скажем, bash работает одинаково.

Smacker ★★★★★
() автор топика
Ответ на: комментарий от Smacker

Эти символы отправляются на устройство, представляющее терминал, QProcess его эмулировать не может.

В QTermWidget основное, что тебе нужно - это K3Process, но он уже сильно устарел, просто он на Qt целиком.

Если хочется чего-то более современного, то лучше в сторону KPtyProcess смотреть, только придется отвязываться от KDE.

dt1 ★★
()
Ответ на: комментарий от dt1

Посмотрел я на всё это дело... и решил отправлять в R после табов строку из \b с \n на конце. «Я ничтожество, жалкий грешник, урод...»

Smacker ★★★★★
() автор топика
Ответ на: комментарий от Smacker

> Я не понимаю, куда попадают символы, которые выводятся при нажатии таба в качестве вариантов автодополнения

Вероятно они попадают в буфер stdio и до потока не доходят.

abacaba
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.