Про окно редактирования написано в этом посте ниже.
Но надо еще понять, что в этом окне делать.
А пока пойдем по порядку. Какие операции c файлом надо делать?
Теперь. Что в окне редактирования делаем?
в каком-нибудь конфиге.
нашел пример. Именно работа с окном, в котором строк больше, чем видно на экране.
Правда, на Си, а не на Плюсах, ну уж простите, по-другому не умею.
Добавлена GNU GPL, поскольку для создания этого поделия
потрачены некоторые усилия, и я хочу довести дело до конца.
Тем более, что дело-то верное!
/*
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Copyright 2013 inkblack.
*/
#include <ncurses.h>
/*
Первая модель текстового редактора.
1. Подразумеваем, что терминал имеет размер 24x80.
ЕСЛИ ЗАПУСТИТЬ В МЕНЬШЕМ ТЕРМИНАЛЕ, БУДЕТ РАБОТАТЬ НЕКОРРЕКТНО!
2. Пока вместо файла в окно редактирования закидываются строки вида:
1 __________ 1 __________ 1 __________ 1 __________
2 __________ 2 __________ 2 __________ 2 __________
...
21 __________ 21 __________ 21 __________ 21 __________
22 __________ 22 __________ 22 __________ 22 __________
...
3. Ниже задается количество строк в "файле" и максимальное количество
символов в строке.
*/
#define MAX_ROWS 1024
#define MAX_COLS 256
/// Размер окна, в котором будем показывать наш файл.
#define V_ROWS 23
#define V_COLS 80
/// Левый верхний угол этого окна. (0,0) - это левый верхний угол всего экрана.
#define UL_ROW 1
#define UL_COL 0
/// Самая верхняя строка экрана оставлена для вывода подскзок и т. п.
/// (т. н. строка статуса).
int main(void) {
int c_row, c_col, /// Координаты курсора на экране.
f_line, f_symb, /// Координаты курсора в файле (строка, столбец).
o_vert, o_horz; /// Смещение файла в окне редактирования.
/* Если в окне редактирования видна первая строка файла, то o_vert == 0,
а если там видна третья строка и следущие (на 2 больше), а вторая строка
оказалась выше края окна, то o_vert == 2.
Аналогично, o_horz == 0, если видна первая колонка в строке. */
int ch; /// Сюда читаем кнопки, нажатые на клавиатуре.
int i; /// Переменная цикла.
WINDOW* ed_buf; /// Здесь храним изображение всего "файла"
/// Это виртуальное окно, его часть будет показана
/// на физическом экране.
char lin_buf[MAX_COLS+1]; /// Здесь создаем строки "1 ______ 1..." и т. д.
char stat_lin[V_COLS+1]; /// Строка статуса
char* sp = " __________ ";
////////////////////////////////////////////////////////////////////////////////
/// Начинаем. Стартуем curses, задаем режимы.
initscr(); raw(); keypad(stdscr, TRUE); noecho();
c_row = UL_ROW; /// Курсор на экране - в лев. верх. углу
c_col = UL_COL; /// окна редактирования.
f_line = 1; /// курсор в файле - в первой строке,
f_symb = 1; /// первой колонке.
o_vert = o_horz = 0; /// файл не смещен.
/* Создаем буфер. В этом буфере будет находиться изображение нашего
"файла". В цикле заполняем буфер всякой всячиной, числа соответствуют
номерам строк, чтобы было видно, как файл скроллится.
После всего надо сделать refresh()! */
ed_buf = newpad(MAX_ROWS, MAX_COLS);
for (i=1; i<=MAX_ROWS; i++) {
sprintf(lin_buf, "%4i%s%4i%s%4i%s%4i%s", i,sp, i,sp, i,sp, i,sp);
mvwaddstr(ed_buf, i-1, 0, lin_buf);
}
refresh();
/* Заполняем строку статуса (подсказка как выйти, номер текущей строки и
колонки) выводим её на экран, ДАЛЕЕ: выводим на нужную часть экрана
нужную часть буфера, где лежит изображение нашего файла.
И в конце обновляем положение курсора. */
sprintf(stat_lin, "%-70sL%-4i C%-3i", "F10 to exit", f_line, f_symb);
mvwaddstr(stdscr, 0, 0, stat_lin);
prefresh(ed_buf,o_vert,o_horz,UL_ROW,UL_COL,UL_ROW+V_ROWS-1,UL_COL+V_COLS-1);
move(c_row, c_col);
/* Основной цикл: получаем кнопку, которую нажал юзер, если F10, то
заканчиваем цикл и переходим к завершающей части программы.
Дальше:
Пока обрабатываются только стрелки вверх и вниз. */
while (1) {
ch = wgetch(stdscr);
if (ch == KEY_F(10)) break;
/* Обрабатываем кнопки. В кейсах (case) устанавливаем все переменные, а после
switch выводим результат на экран. */
switch (ch) {
/* Вниз.
1. Если курсор в последней строке файла, то куда дальше вниз? Некуда.
Значит, ничего не надо делать:
break;
2. Если курсор НЕ в самой нижней строке окна редактирования, то его просто
надо подвинуть вниз:
c_row++;
3. А если в самой нижней строке окна, то он должен физически остаться
на том же месте, а файл надо подвинуть на строчку вверх:
o_vert++;
4. В случаях 2 и 3 курсор перемещается в файле на одну строку вниз:
f_line++;
Это первоначальный примитивный вариант обработки "стрелки вниз", сюда надо
добавить еще кое-какие проверки и действия. */
case KEY_DOWN:
if (f_line == MAX_ROWS) break;
if (c_row < UL_ROW+V_ROWS-1) c_row++;
else o_vert++;
f_line++;
break;
/* Вверх - всё аналогично. */
case KEY_UP:
if (f_line == 1) break;
if (c_row > UL_ROW) c_row--;
else o_vert--;
f_line--;
break;
}
/* Наконец, после обработок:
обновляем информацию о видимой части изображения файла, оно могло
подвинуться вверх или вниз,
создаем строку статуса, там мог измениться номер строки,
определяем эту строку на законное место,
задаем координаты курсора на экране,
выводим всё на экран:
refresh(); */
prefresh(ed_buf,o_vert,o_horz,UL_ROW,UL_COL,UL_ROW+V_ROWS-1,UL_COL+V_COLS-1);
sprintf(stat_lin, "%-70sL%-4i C%-3i", "F10 to exit", f_line, f_symb);
mvwaddstr(stdscr, 0, 0, stat_lin);
move(c_row, c_col);
refresh();
/* Цикл while заканчивается, и всё по новой... */
}
/* Завершающая часть программы.
Здесь задаются режимы работы терминала, потом работа curses завершается. */
echo(); keypad(stdscr, FALSE); cbreak(); endwin();
return 0;
}