2015-08-15 1 views
0

Я пишу простой текстовый редактор в C, на cygwin, используя проклятия, теперь у меня есть экран, полный строки текста, некоторые строки являются частичными линиями, теперь, когда я перемещаю курсор вверх или вниз по одной строке Я хочу, чтобы он переместился в непустую позицию, если предыдущая/следующая строка является частичной линией, как это сделать? любая помощь будет принята с благодарностью. Благодарю.проклятия, перемещающие курсор в непустую позицию

+1

Что вы пытаетесь ? Есть много * возможных путей. Прямая идея заключалась бы в том, чтобы хранить длины строк вместе с вашим текстовым буфером. –

+0

Относительная сторона примечания: для приложений консоли Windows вы можете заглянуть в [PDCurses] (http://pdcurses.sourceforge.net/) и скомпилировать их с помощью 'mingw'. Таким образом, вы получите исполняемый файл, независимый от всей среды выполнения «cygwin». –

+0

На самом деле я думал об этом несколько дней и не нашел решения. обыскали в Интернете и не нашли ответа на него. –

ответ

0

curses (и ncurses и PDCurses) поддерживают функцию winch, которая позволяет приложению читать символ, хранящийся в текущей позиции курсора. Аналогично, все версии проклятий могут и do представляют несколько символов как несколько ячеек. Поэтому сохранение длины строк и попытка использовать их в качестве номеров столбцов на экране могут привести к неудовлетворительным результатам.

В качестве примера, вы могли бы сделать что-то вроде этого (для простоты, все в линии и только для стандартного экрана stdscr — реальных программ на самом деле не так):

int y, x, xc; 
bool partial = TRUE; 
getyx(stdscr, y, x); 
if (y > 0) { 
    y--; 
    for (xc = x; xc < COLS; ++xc) { 
     move(y, xc); 
     if ((inch() & A_CHARTEXT) != ' ') { 
      partial = FALSE; 
      break; /* found a nonblank cell at or beyond current x */ 
     } 
    } 
    if (partial) { 
     for (xc = x; xc >= 0; --xc) { 
      move(y, xc); 
      if ((inch() & A_CHARTEXT) != ' ') { 
       break; /* found the last nonblank cell on the line */ 
      } 
     } 
    } 
} 
+0

Отлично, но что, если последний символ/символы в частичной строке - это пробел/пробелы? –

+0

Пример кода сначала проверяется (начиная с текущей позиции), если есть незаблокированные, что оставляет X-ординату неизменной. Если не было никаких непустых символов, то он сканирует влево, и на каждом тесте он перемещает текущую позицию в тестируемую ячейку. Если он не находит неблокированные, это оставляет курсор в левой части экрана. –

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