Множественные курсоры в curses

#c #ncurses

#c #ncurses ( проклятия )

Вопрос:

Я использую ncurses в C / C . Я пытаюсь получить несколько мигающих курсоров, но пока мне это не удавалось. Возможно ли это в ncurses? Предложения по аналогичной библиотеке (C / C или Python), которая поддерживает это, также приветствуются.

Обновление: под «курсором» я подразумеваю мигающий символ блока / строки, а не объект, который получает ввод с клавиатуры.

Комментарии:

1. Зачем вам нужно несколько мигающих курсоров?

2. Как насчет размещения мигающих символов подчеркивания на экране. (Имеется только один текстовый курсор.)

3. С помощью какого курсора вы ожидаете ввода? Вы имеете в виду мигающий символьный атрибут?

4. @EdHeal Например, некоторые текстовые редакторы (например, SublimeText) имеют функцию «несколько курсоров», которая позволяет пользователям вводить текст и выделять его в нескольких местах одновременно. Я мог бы представить, что кто-то пытается реализовать эту функцию в текстовом редакторе на основе терминала.

Ответ №1:

Как упоминалось в принятом ответе, вы не можете на самом деле иметь несколько курсоров в своем терминале, но вы можете имитировать это.

Используя ncurses, вы могли бы скрыть фактический курсор и использовать chgat(3) семейство функций для изменения атрибутов символов, которые вы хотите отобразить в качестве курсоров. Делая это в нескольких позициях, ваша программа, похоже, использует несколько курсоров.

Эта программа выделяет «H» в «Hello» и «w» в world обратным выделением, что создает впечатление наведения курсора на каждый символ. Затем он переходит в спящий режим на 5 секунд и завершается.

 #include <ncurses.h>
#include <unistd.h>

int main() {
    initscr();
    noecho();
    curs_set(FALSE);

    mvprintw(0, 0, "Hello, world!");
    mvchgat(0, 0, 1, A_REVERSE, 0, NULL);
    mvchgat(0, 7, 1, A_REVERSE, 0, NULL);
    refresh();

    sleep(5);

    endwin();
}
  

Ответ №2:

коротко: нет, вы не можете этого сделать

long: curses могут только запрашивать терминалы что-то делать (а терминалы этого не делают).

Каждое окно в окне curses может иметь свою собственную позицию курсора, но терминал будет отображать только один курсор одновременно. Если вы запросите ввод, например, с помощью getch , curses поместит курсор терминала в последнюю позицию в окне, куда вы его переместили.