Различия между версиями 12 и 13
Версия 12 от 2020-09-29 11:22:44
Размер: 8238
Редактор: FrBrGeorge
Комментарий:
Версия 13 от 2020-09-29 11:52:12
Размер: 8675
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 24: Строка 24:
Неожиданный бонус: если вы используете `xterm`, просто скачайте [[attachment:map.tek.xterm|этот файл]] и скажите ему `cat`: Неожиданный бонус [[WP:Tektronix_4010]]:
 *
если вы используете `xterm`, просто скачайте [[attachment:map.tek.xterm|этот файл]] и скажите ему `cat`:
Строка 29: Строка 30:
 * Для пользователей `xterm` в [[https://getalt.org/ru/|дистрибутивах линейки ALT]] (возможно, и для других тоже) — [[attachment:tek_examples|сценарий на shell]], который показывает все `.tek`-файлы в заданном каталоге (по умолчанию — в документации по `xterm`).
  

Работа с терминалом; пример простого проекта

Ещё немного про secure shell

  • Ключ (повторение)
    • Запароленный ключ; в чём разница с паролями на хостах?
      • Агент, хранящий распароленный ключ
        • Порт агента, хранящего распароленный ключ
          • Проброс порта агента, хранящего распароленный ключ
            • Дальнейший проброс порта агента, хранящего распароленный ключ
              • вы издеваетесь?

  • Бонус: проброс других портов

Терминал

  • В/В байтов
  • Управление со стороны ОС (сигналы с клавиатуры),
    • stty

  • Управление выводом со стороны приложения, ESC-последовательности
    • Немного истории
    • terminfo(/termcap); tput

    • изменение атрибутов текста
    • позиционирование курсора
  • Проблемы с неправильным $TERM

Неожиданный бонус Tektronix_4010:

  • если вы используете xterm, просто скачайте этот файл и скажите ему cat:

    •   $ cat map.tek.xterm
      • Хуже не будет :)

  • Для пользователей xterm в дистрибутивах линейки ALT (возможно, и для других тоже) — сценарий на shell, который показывает все .tek-файлы в заданном каталоге (по умолчанию — в документации по xterm).

Curses

NCurses — свободная (на сегодняшний день, главная) реализация Curses

  • Curses: библиотека работы с произвольным терминалом
    • Независимость от типа терминала
    • Экран = матрица символов (а не телетайп)
    • Важно — функции вывода заполняют эту воображаемую матрицу (а не настоящий экран), экран обновляется отдельной командой.

  • Простой пример:
       1 #include <curses.h>
       2 
       3 main ()
       4 {
       5         initscr ();
       6         move (LINES/2 - 1, COLS/2 - 4);
       7         addstr ("Hello, World!");
       8         getch ();
       9         endwin ();
      10 }
    
    • Сборка: cc Hello.c -lcurses -o Hello

    • initscr() / endwin() — инициализация и останов движка curses

    • move() — перемещение курсора, LINES/COLS — размер экрана

    • addstr() — аналог puts()

    • (никогда больше не используем -lcurses)

  • Если надо по-русски, программа должна установить локаль:
       1 #include <curses.h>
       2 #include <locale.h>
       3 
       4 main ()
       5 {
       6         setlocale(LC_ALL, "");
       7         initscr ();
       8         move (LINES/2 - 1, COLS/2 - 4);
       9         addstr ("Привет, мир!");
      10         getch ();
      11         endwin ();
      12 }
    
    • Сборка — с libncursesw: cc Hello.c -lncursesw -o Hello

  • Пример с окном
       1 #include <ncurses.h>
       2 
       3 #define DX 3
       4 
       5 void main() {
       6         WINDOW *win;
       7         int c = 0;
       8 
       9         initscr();
      10         noecho();
      11         cbreak();
      12         printw("Window:");
      13         refresh();
      14 
      15         win = newwin(LINES-2*DX, COLS-2*DX, DX, DX);
      16         keypad(win, TRUE);
      17         scrollok (win, TRUE);
      18         do {
      19                 wprintw(win, "  Key: %d, Name: %s\n", c, keyname(c));
      20                 box(win, 0, 0);
      21                 wrefresh(win);
      22         } while((c = wgetch(win)) != 27);
      23 
      24         endwin();
      25 
      26 }
    
    • Поэкспериментируйте (попробуйте не включать) noecho(), keypad(), scrollok(). Что делают эти функции?

Примитивный Makefile:

  • Make (очень коротко): цели и рецепты
  • Синтаксис: обязательный символ табуляции в рецептах

  • Задача — запуск команд пересборки, когда это надо
  • Цели могут быть, а могут не быть файлами
  • Пример:
       1 Window: Window.c
       2         cc Window.c -o Window -lncursesw
       3 
       4 clean:
       5         rm -f *~ *.o Window a.out
    
  • Использование:
       1 $ make
       2 cc Window.c -o Window -lncursesw
       3 $ ls
       4 a.out    Hello.c~  Makefile~  win.c   Window.c   WindowEx.c
       5 Hello.c  Makefile  simple.c   Window  Window.c~
       6 $ make
       7 make: «Window» не требует обновления.
       8 $ make clean
       9 rm -f *~ *.o Window a.out
      10 $ ls
      11 Hello.c  Makefile  simple.c  win.c  Window.c  WindowEx.c
      12 $ make
      13 cc Window.c -o Window -lncursesw
      14 $ ls
      15 Hello.c  Makefile  simple.c  win.c  Window  Window.c  WindowEx.c
      16 
    

Д/З

  1. (для сдающих спецкурс, кто ещё не сделал этого) Зарегистрировать свой репозиторий в качестве комментария здесь

  2. Сделать в репозитории подкаталог, совпадающий с именем данной страницы (03_TerminalProject, и поместить в него решение следующей задачи.

    • С помощью интернета и здравого смысла написать на ncurses программу Show.c, которая постранично просматривает файл (слишком длинные строки усекаются или переносятся — как вам удобнее).

      • Имя файла передавать параметром командной строки.
      • Файл должен показываться в окне, а в первой строке экрана должно содержаться его имя.
      • Весь файл допустимо хранить в памяти, например, одним куском или в виде списка строк.

      • При нажатии пробела файл прокручивается дальше (если есть такая возможность), при нажатии ESC программа завершается.

        • Имеет смысл очищать окно при помощи werase(), а потом всё заново на нём выводить.

      • Многобайтовую кодировку можно не поддерживать
    • Сделать Makefile и добиться работоспособности make (обратите внимание на использование табуляций; понадобится на следующей лекции)

    • Не забыть опубликовать решение в репозитории!
    • (!) Дополнительно, для тех, кому стало интересно:

      1. При нажатии стрелки вправо выводить строки файла, начиная со следующей колонки (так можно посмотреть урезанные длинные строки; начала строк при этом не видны). Стрелку влево обработать так же.
      2. Реализовать обработку PgUp, PgDown и стрелок вверх/вниз — прокрутка на один экран вперёд/назад, на одну строку вперёд-назад, остальные клавиши игнорировать

Так как-то :)

  • o.gif

LecturesCMC/LinuxApplicationDevelopment2020/03_TerminalProject (последним исправлял пользователь FrBrGeorge 2020-09-29 11:52:12)