Как написать эмулятор терминала с нуля (или не с нуля)?

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

Очевидно, что это не должно быть что-то большое. Я бы хотел, чтобы у него было окно с цветом фона (и непрозрачностью позже), отображающее командную строку. Пользователь может ввести команду, и она выдаст результат. Основные вещи. Вот только я даже не знаю, с чего начать.

Я предполагаю, что визуальная часть должна обрабатываться чем-то вроде gtk (с которым я никогда не работал), но как насчет всего остального? Может кто-нибудь описать возможную архитектуру и на что мне смотреть?

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

Я также понимаю, что могут существовать и другие вопросы, подобные этому, но я не смог найти качественных ответов. Если вы знаете такие ответы, пожалуйста, дайте ссылку на них.


person snitko    schedule 28.07.2016    source источник
comment
почему бы не перевести ваш любимый терминал с открытым исходным кодом с его текущего языка на D. Затем вы можете решить, достаточно ли вы узнали, и вы можете найти более подходящие термины (терминология для особых случаев) для дальнейшего исследования. Удачи.   -  person shellter    schedule 28.07.2016
comment
Я не думаю, что этот вопрос подходит для переполнения стека, потому что он не очень конкретен. Я думаю, лучшее, что вы можете сделать, это посмотреть на другие эмуляторы терминала (которые также могут быть написаны не на D) и портировать какой-нибудь код или посмотреть на них. Но я не думаю, что есть общий ответ на то, что вам следует делать, потому что это ваш проект, и вам решать, что вы будете добавлять, а что нет. Но если вы хотите взглянуть на эмулятор терминала, написанный на D, он есть на github: github.com/gnunn1/ терминикс   -  person WebFreak001    schedule 28.07.2016
comment
Я подозреваю, что вы можете путать эмуляторы терминала с оболочками. Эмулятор терминала просто эмулирует устройство ввода-вывода, он не запускает команды и ничего не знает о подсказках. В Linux эмулятор терминала выделяет псевдотерминал, открывая устройство-мультиплексор /dev/ptmx (возможно, используя posix_openpt()), в результате чего ведомое устройство появляется на /dev/pts. Затем эмулятор терминала обычно порождает оболочку с std{in,out,err}, подключенную к ведомому устройству.   -  person ninjalj    schedule 29.07.2016
comment
Информация об эмуляторах терминала: unix.stackexchange.com/questions/93531/ unix.stackexchange.com/questions/79334/ unix.stackexchange.com/questions/4126/ st.suckless.org ECMA-48, invisible-island.net/vttest/vttest.html   -  person ninjalj    schedule 29.07.2016
comment
Фантастическая проверка эмулятора терминала — насколько хорошо он справляется с программой редактора vim. Конечно, изучение vim требует некоторого обучения, если вы этого не знаете, но со всеми обновлениями, цветами экрана для подсветки синтаксиса и прочим, vi имеет долгую историю взлома эмуляторов.   -  person Gilbert    schedule 29.07.2016
comment
Руководство по GTK+ Напишите собственный эмулятор терминала   -  person jcubic    schedule 20.12.2019


Ответы (1)


У вас уже есть превосходный эмулятор терминала, реализованный на D под общественной лицензией Mozilla. Код находится здесь: https://github.com/gnunn1/terminix/tree/master/source/gx/terminix/terminal

Однако хорошим началом будет Адам Рупп (автор "D Cookbook") https://github.com/adamdruppe/terminal-emulator .

person DejanLekic    schedule 29.07.2016
comment
Да, мой эмулятор терминала — это именно то, о чем просит OP: он на 100% с нуля (ну, я использую xlib и ядро, но это не считается :)) и обрабатывает множество распространенных программ, включая vim. На самом деле это немного сложнее, чем вы думаете... эмуляция терминала - это заноза в заднице. Кстати: я на самом деле использую свой терминал в качестве своего повседневного терминала как в Windows (ssh-соединение с моим Linux-боксом, например, шпатлевка), так и в Linux. Он слегка глючный и местами неэффективный, но никаких нарушителей условий сделки и, кроме того, он мой :P - person Adam D. Ruppe; 29.07.2016