2016-08-04 6 views
2

В настоящее время я разрабатываю интерфейс CLI для linux и по разным причинам Я не могу использовать ncurses. Я использую исключительно C++ и Qt framework.Linux - перемещение курсора курсора visual

Поэтому для того, чтобы иметь удобный интерфейс, я должен запустить этот Геч цикл в отдельном потоке:

https://stackoverflow.com/a/912796/3605689

Который в основном означает, что я должен выполнять все основные функциональные возможности (например, backspace). Я уже реализовал завершение команд и историю команд (например, когда вы нажимаете вкладку или uparrow/downarrow в linux), но я не могу понять, как реализовать leftarrow/rightarrow (ака ищет через typeahead).

Как правило, я реализую его так: при каждом gech, который не равен -1, я проверяю, нажал ли пользователь специальный ключ (тот, который каким-то образом изменяет typeahead). Затем я очищаю stdout, используя следующую функцию:

void inputobject::clear_line(int nletters) 
{ 
    QTextStream(stdout) << "\033[2K"; 

    for(int i = 0; i < nletters;i++){ 
     QTextStream(stdout) << "\b"; 
    } 

    rewind(stdout); 
} 

И замените его чем-то другим, эффективно имитирующим typeahead. Например, в случае backspace я бы сохранил командный вызов clear_line и снова распечатал команду, только с одним меньшим количеством букв, ведя себя точно так же, как и обычное консольное приложение.

Моя реальная проблема с курсором, в случае левого/Rightarrow, мне нужно переместить курсор визуальный для того, чтобы иметь возможность указать, где в тексте пользователь ищет: enter image description here

Из-за характер того, как я переписываю данную строку stdout для имитации typeahead, на самом деле не имеет значения, где находится курсор ДЕЙСТВИТЕЛЬНО, до тех пор, пока он остается на одной строке - это просто визуальное значение. Как я могу добиться перемещения визуализации курсора в Linux?

+0

Рассматривали ли вы, глядя на 'ncurses', чтобы узнать, как это сделать? –

+1

http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html не тот, что вы ищете? – evilruff

+0

Да, спасибо! – user129186

ответ

3

ответ был предоставлен в комментариях по Evilruff:

Cursor Movement

ANSI escape-последовательности позволяют перемещать курсор по экрану по желанию. Это более полезно для полноэкранных пользовательских интерфейсов, созданных оболочечными сценариями, но также может использоваться в подсказках. Управляющие последовательности движения заключаются в следующем:

  • позиционировать курсор: \ 033 [; H Or \ 033 [L; Cf помещает курсор в строке L и столбце C.
  • Переместить курсор вверх N строк: \ 033 [NA
  • Перемещение курсора вниз N строк: \ 033 [NB
  • переместите курсор вперед N столбцов: \ 033 [NC
  • Move курсор назад N столбцов: \ 033 [ND

  • Очистить экран, перейти к (0,0): \ 033 [2J

  • Erase до конца строки: \ 033 [K

  • Сохранить позицию курсора: \ 033 [s

  • Восстановление позиции курсора: \ 033 [и
+1

Ответы только на связь обескуражены, поскольку связь может умереть. Если вы хотите рекламировать комментарий злобности как ответ, вы должны включить все необходимое из ссылки, чтобы сделать ее самодостаточной. – Quentin

0

Не использование ncurses и co является серьезным ограничением.

Это ад, чтобы сделать правильный ввод/вывод на оболочке для отображения чего-либо.

Единственные другие реальные решения (я не могу думать, как решение переопределять в ncurse подобную библиотеку) Я думаю, являются:

  • решений вызова диалога (для некоторого примера www.linuxjournal.com/статьи/2807 и для дока: http://linux.die.net/man/1/dialog)
  • с использованием фреймбуфера с Qt4 Механизмом, (here)
Смежные вопросы