У меня есть вопрос о синтаксисе, и при этом не о скобках.
Что вы думаете об удобочитаемости записей, которые нужно смотреть справа налево? Например,
(to-customize (to-install Common-Lisp-IDE))
В объектно-ориентированных языках это можно было бы записать как
Common-Lisp-IDE.to-install.to-customize
Это не относится непосредственно к LISP, в том же Haskell или C запись тоже «перевернутая». Привыкаете ли вы или со временем это продолжает вызывать дискомфорт, так как традиционно письменность в другую сторону.
Спасибо за ответ. У меня нет linux'а чтобы проверить, но, похоже, SSH — единственная причина реализовать это как escape sequence, поэтому я убежден, что работает. Ведь можно было просто выполнять notify-send по PROMPT_COMMAND, но тогда бы команда выполнялась на компьютере, где запущен shell, а не terminal emulator. Конечно же, для этого надо на удаленном сервере настроить PROMPT_COMMAND. Так сказать, только по обоюдному согласию.
Я не уверен как таким образом можно определить завершение. Нужно ведь наоборот: если вывод прекращается. Только прекращение вывода не гарантирует, что команда завершилась.
О самом главном нововведении: выводе уведомления по завершению длительных команд. А как GNOME Terminal различает shell комманды и в частности момент завершения? Ведь эмулятор терминала ничего не должен знать об оболочке; он должен только выводить изображение интерпретируя при этом последовательности ANSI. Именно оболочка, BASH, например, знает когда закончилось выполнение. Он парсит PS1 или что?
Программирование текстового редактора на стэке веб техноголий — костыль на костыле и костылем поганяет. Нет, снаружи все получается очень красивенько, ведь HTML и CSS намного гибче, чем всякие Cocoa, GTK и QT. И умеет их использовать больше людей.
Но, например, textarea не подойдет в качестве поля ввода, потому, что у нее недостаточно функционала. Нам ведь нужно и синтаксис подсветить, и autocomplete box в нужном месте показать. А это значит, что мы зафигачим div'ов, костылями сделаем его focusable, навешаем своих событий — нужно ведь реагировать на нажатие кнопок, уметь стирать по backspace, перемещаться влево на слово по alt-left, выделять по double click и еще много всего. Хорошо хоть надо поддерживать только один браузер.
Или еще, позиционирование строк. Вы думали создадите обертку .editor со множеством вложенных div'ом и все будет показываться в правильных местах. Сейчас. Будь добр, рассчитай динамически координаты каждой строки и сделай абсолютное позиционирование. А еще при scroll'е давайте удалять невидимые строки, браузер, как и Москва, не резиновый.
Чем-то мне это напоминает дарвиновкую эволюцию — придумали язык разметки для простых страниц, а теперь извращаемся, чтобы написать на этом космический корабль. Получается так себе. Прямо как история с возвратным гортанным нервом.
Наверное, это утрясется и появятся хорошие framework'и для разработки интерфейсов, но прямо сейчас это Ад и Израиль. Очень гибкий Ад и Израиль, справедливости ради; никогда плагины к той же IntelliJ IDEA не смогут быть настолько же свободными. Хочешь — добавляй индикатор изменившихся линий к строкам (я знаю, что это можно, но ведь JetBrains должны были сначала поддержать)
хочешь, custom'ную панель снизу
хочешь, кнопочки с красивой анимацией
Полная свобода, никаких тебе интерфейсов, которые нужно имплементировать. А еще можно потом сделать как веб-сервис. Заходишь такой на github.com, кликаешь на файл, а он открывается в навороченном редакторе, почти как IDE.
В общем, я верю, что за этим будущее, но, к сожалению, не настоящее.
Лучшая часть Elementary OS для меня — это видео плеер Audience. Его killer feature — превью при наведении на полосу времени, как на YouTube, но намного быстрее, и это видео, а не статическая картинка.
На скриншоте старая версия плеера, новее не нашел.
Несмотря на то, что я сумбурно изъясняюсь, я таки понимаю, что иметь устройства ввода-вывода еще недостаточно, чтобы быть эмулятором терминала. Но они — публичный интерфейс эмулятора, если проводить параллели с OOP. Все, что внутри — неважно для внешнего наблюдателя. Ну да, умеет он как-то преобразовывать ANSI и показывать его.
С ls та же самая история. Обрезает ли он ANSI, или не добавляет его с самого начала, результат один: если output не pty, вывод отличается.
Я в свободное время пытаюсь написать эмулятор терминала, и уверен, что в реальном мире, единственный способ обеспечить пользователям предсказуемое поведение — прикидаться PTY.
То же и с последовательностями управления. Хотелось бы иметь возможность написать свой terminfo, и забыть о совместимости с ANSI, но программисты идут самым простым путем, и существует вагон и маленькая тележка утилит, у которых захардкоджены эти последовательности.
Если позволите, я хотел бы попросить совет. В современно мире, не имея наследия visual terminals и таких ограничений ресурсов, нужно ли передавать управляющие последовательности in-bound, или стоит их вынести в отдельный поток? Извините за off-topic.
Возможно, я неправильно понял man, но мое представление об эмуляторах терминала отсюда: linux.die.net/man/4/ptmx
Согласно описанию, нужно открыть /dev/ptmx, получить a file descriptor (первое устройство, в которое писать), потом сделать некие телодвижения и получить второе устройство, /dev/pts* — из которого читать.
Вы правы, теоретически можно обойтись без устройств. Но практически так никто делать не станет. Не говоря уже о ls, который обрезает control sequences, su и passwd не читают из pip'ов.
Мне кажется, у вас переплетаются функции эмулятора терминала и оболочки (shell). Терминал должен отвечать только за отображение информации: это односторонний канал коммуникации который получает поток символов и, иногда, последовательности управления. Переместить курсор, там, или подсветить красненьким. Важно, что состояние курсора хранится в оболочке, а эмулятору терминала оно нужно для того, чтобы знать с какого места продолжать выводить данные. Большинство PTY используют ANSI для control sequences, но я бы все же не полагался на это, и доверял terminfo. Ncurses, например, использует terminfo.
По сути, эмулятор терминала — это пара устройств, с которыми можно обращаться как с файлами. Вот, например, как писать в терминал без всяких библиотек, just for fun.:
$ tty # In one session: find out this terminal's output device.
$ printf "$(tput setaf 1)Follow the $(tput setaf 7)white$(tput setaf 1) rabbit." > ttys006 # In another session: write to the first one.
Кстати, tput выводит правильную для вашего терминала последовательность, а не hard-coded ANSI.
Что вы думаете об удобочитаемости записей, которые нужно смотреть справа налево? Например,
В объектно-ориентированных языках это можно было бы записать как
Это не относится непосредственно к LISP, в том же Haskell или C запись тоже «перевернутая». Привыкаете ли вы или со временем это продолжает вызывать дискомфорт, так как традиционно письменность в другую сторону.
.LISP'e на писать легко арабам Наверное
Но, например, textarea не подойдет в качестве поля ввода, потому, что у нее недостаточно функционала. Нам ведь нужно и синтаксис подсветить, и autocomplete box в нужном месте показать. А это значит, что мы зафигачим div'ов, костылями сделаем его focusable, навешаем своих событий — нужно ведь реагировать на нажатие кнопок, уметь стирать по backspace, перемещаться влево на слово по alt-left, выделять по double click и еще много всего. Хорошо хоть надо поддерживать только один браузер.
Или еще, позиционирование строк. Вы думали создадите обертку .editor со множеством вложенных div'ом и все будет показываться в правильных местах. Сейчас. Будь добр, рассчитай динамически координаты каждой строки и сделай абсолютное позиционирование. А еще при scroll'е давайте удалять невидимые строки, браузер, как и Москва, не резиновый.
Чем-то мне это напоминает дарвиновкую эволюцию — придумали язык разметки для простых страниц, а теперь извращаемся, чтобы написать на этом космический корабль. Получается так себе. Прямо как история с возвратным гортанным нервом.
Наверное, это утрясется и появятся хорошие framework'и для разработки интерфейсов, но прямо сейчас это Ад и Израиль. Очень гибкий Ад и Израиль, справедливости ради; никогда плагины к той же IntelliJ IDEA не смогут быть настолько же свободными. Хочешь — добавляй индикатор изменившихся линий к строкам (я знаю, что это можно, но ведь JetBrains должны были сначала поддержать)
хочешь, custom'ную панель снизу
хочешь, кнопочки с красивой анимацией
Полная свобода, никаких тебе интерфейсов, которые нужно имплементировать. А еще можно потом сделать как веб-сервис. Заходишь такой на github.com, кликаешь на файл, а он открывается в навороченном редакторе, почти как IDE.
В общем, я верю, что за этим будущее, но, к сожалению, не настоящее.
— Ну хоть что-то у нас в безопасности.
На скриншоте старая версия плеера, новее не нашел.
С ls та же самая история. Обрезает ли он ANSI, или не добавляет его с самого начала, результат один: если output не pty, вывод отличается.
Я в свободное время пытаюсь написать эмулятор терминала, и уверен, что в реальном мире, единственный способ обеспечить пользователям предсказуемое поведение — прикидаться PTY.
То же и с последовательностями управления. Хотелось бы иметь возможность написать свой terminfo, и забыть о совместимости с ANSI, но программисты идут самым простым путем, и существует вагон и маленькая тележка утилит, у которых захардкоджены эти последовательности.
Если позволите, я хотел бы попросить совет. В современно мире, не имея наследия visual terminals и таких ограничений ресурсов, нужно ли передавать управляющие последовательности in-bound, или стоит их вынести в отдельный поток? Извините за off-topic.
Возможно, я неправильно понял man, но мое представление об эмуляторах терминала отсюда: linux.die.net/man/4/ptmx
Согласно описанию, нужно открыть /dev/ptmx, получить a file descriptor (первое устройство, в которое писать), потом сделать некие телодвижения и получить второе устройство, /dev/pts* — из которого читать.
Вы правы, теоретически можно обойтись без устройств. Но практически так никто делать не станет. Не говоря уже о ls, который обрезает control sequences, su и passwd не читают из pip'ов.
По сути, эмулятор терминала — это пара устройств, с которыми можно обращаться как с файлами. Вот, например, как писать в терминал без всяких библиотек, just for fun.:
Кстати, tput выводит правильную для вашего терминала последовательность, а не hard-coded ANSI.