LINUX.ORG.RU

Текстовый редактор на C с curses, menu, form

 


0

4

Всем здравствуйте! Задание было написать текстовый редактор с использованием библиотек curses. Сделал в таком виде:

#include <curses.h>
       #include <stdlib.h>
       #define CTRL(c) ((c) & 037)
 
       main (argc, argv)
       int argc;
       char **argv;
       {
         extern void perror(), exit();
         int i, n, l;
         int c;
         int line = 0;
         FILE *fd;
 
         if (argc != 2) {
           fprintf (stderr, "usage: %s file\n", argv [0]);
           exit (1);
         }
 
         fd = fopen (argv [1], "r");
         if (fd == NULL) {
           perror (argv [1]);
           exit (2);
         }
 
         initscr ();
         cbreak ();
         nonl ();
         noecho ();
         idlok (stdscr, TRUE);
         keypad (stdscr, TRUE);
 
         /* Читаем файл */
         while ((c = getc(fd)) != EOF) {
           if (c == '\n') line++;
           if (line > LINES - 2) break;
           addch(c);
         }
         fclose (fd);
 
         move (0, 0);
         refresh ();
         edit ();
 
         /* Записываем файл */
         fd = fopen (argv [1], "w");
         for (l = 0; l < LINES - 1; l++) {
           n = len(l);
           for (i = 0; i < n; i++)
             putc (mvinch (l, i) & A_CHARTEXT, fd);
           putc('\n', fd);
         }
         fclose(fd);
 
         endwin ();
         exit (0);
       }
 
       len (lineno)
       int lineno;
       {
         int linelen = COLS - 1;
 
         while (linelen >= 0 && mvinch (lineno, linelen) == ' ')
           linelen--;
         return linelen + 1;
       }
 
       /* Глобальное значение текущего положения курсора */
       int row, col;
 
       edit ()
       {
         int c;
 
         for (;;) {
           move (row, col);
           refresh ();
           c = getch ();
 
           /* Команды редактора */
           switch (c) {
 
             /* hjkl и стрелки: перемещают курсор
                в указанном направлении */
             case 'h':
             case KEY_LEFT:
               if (col > 0) col--;
               else flash ();
               break;
 
             case 'j':
             case KEY_DOWN:
               if (row < LINES - 1) row++;
               else flash ();
               break;
 
             case 'k':
             case KEY_UP:
               if (row > 0) row--;
               else flash ();
               break;
 
             case 'l':
             case KEY_RIGHT:
               if (col < COLS - 1) col++;
               else flash ();
               break;
 
             /* i: переход в режим ввода */
             case KEY_IC:
             case 'i':
               input ();
               break;
 
             /* x: удалить текущий символ */
             case KEY_DC:
             case 'x':
               delch ();
               break;
 
             /* o: вставить строку и перейти в режим ввода */
             case KEY_IL:
             case 'o':
               move (++row, col = 0);
               insertln ();
               input ();
               break;
 
             /* d: удалить текущую строку */
             case KEY_DL:
             case 'd':
               deleteln ();
               break;
 
             /* CTRL+L: перерисовать экран */
             case KEY_CLEAR:
             case CTRL('L'):
               wrefresh (curscr);
               break;
 
             /* w: записать и закончить работу */
             case 'w':
               return;
 
             /* q: закончить работу без записи файла */
             case 'q':
               endwin ();
               exit (2);
 
             default:
               flash ();
               break;
           }
         }
       }
 
       /* Режим ввода: принимает и вставляет символы
          Выход: CTRL+D или EIC */
       input ()
       {
         int c;
 
         standout ();
         mvaddstr (LINES - 1, COLS - 20, "Режим ввода");
         standend ();
         move (row, col);
         refresh ();
           for (;;) {
             c = getch ();
             if (c == CTRL('D') || c == KEY_EIC) break;
             insch (c);
             move (row, ++col);
             refresh ();
           }
           move (LINES - 1, COLS - 20);
           clrtoeol ();
           move (row, col);
           refresh ();
       }

Теперь нужно добавить кнопки «Открыть», «Сохранить», «Выйти». Дословно задание звучит так: «Редактор должен иметь окно для отображения содержимого файла и окно с функциональными кнопками: Отрыть файл, Сохранить файл, Выйти». Погуглил про menu.h, panel.h, form.h, не могу пока разобраться как их сюда прикрутить.. С программированием под Linux только начинаю знакомиться, очень надеюсь на вашу помощь. P.S. Почему код не убирается под спойлер? тег cut не работает..



Последнее исправление: taarakan_nvkz (всего исправлений: 2)
Ответ на: комментарий от taarakan_nvkz

подразумевал acme( подобно https://ru.wikipedia.org/wiki/Canon_Cat - там нет чётко кнопок но есть возможность исполнять каманды как строки текста ) - у sam - отдельное окно команд с возможностью быстро их повторять ну и добавлять в контекстное меню различные действия

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

а реализовать через menu.h, panel.h, form.h можно? я просто думаю что задание подразумевает чтобы интерфейс наглядный был, в виде кнопок..

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

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

qulinxao ★★☆
()

Почему код не убирается под спойлер? тег cut не работает..

Это только в ленте (и новостях) работает.

Сейчас твой пост здесь

www.linux.org.ru/forum/lenta/?offset=100

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

я просто не совсем понимаю.. есть стандартные функции библиотеки curses, вот только хз как ими пользоваться.

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