Редактор ACME

[plan.9] Wed Jan 20 12:17:21 UTC 2021 @hugeping -> All

Я не буду писать руководство по этому редактору. Но мне хотелось в этой небольшой заметке обозначить главную идею редактора. Дело в том, что когда я начинал осваивать acme мне не хватало именно этого -- понимания центральной идеи, архитектуры. Что это вообще такое? Нечто, непохожее ни на один существующий редактор. Да как можно в нём работать? А идея у acme оказалась простой и при этом мощной. Я в течении 2-х месяцев разрабатывал в нём игру с текстовым вводом, и это было удобно. Привык настолько, что забыл даже часть клавиатурных комбинаций emacs. :) Итак, в чём идея acme? Идея acme состоит в том, чтобы дать прослойку между ОС и человеком в виде TUI. И это всё. 1) Acme - это просто столбцы, в которых могут создаваться "окна", отображающие текст. Просто текст, поток текста. Без цвета, стилей, номеров строк... Лишь текст. 2) Над окнами есть области, в которых тоже может быть текст, которые играют роль меню. 3) Меню и окнами можно управлять с помощью записи в специальные файлы. С помощью чтения, можно получать события и информацию о текущем содержимом окон и меню. 4) Вы можете "выполнять" команды системы прямо из текста и/или меню. Например, вызывать спеллчекер, форматирование кода, увеличение отступа -- всё это должно быть Unix командами, которые будут выполняться для всего текста или выделенной его части. Текст приходит через stdin и выходит через stdout. Текст может быть внедрён в редактируемый текст или отображаться в отдельном окне (например, ошибки компилятора). Скрипт может понимать, что он запущен из среды acme и управлять редактором через файловую систему! 5) Можно открывать и просматривать файлы/каталоги, переходить на нужные строки, делать поиск в тексте. Всё это делается "выполнением" текста. Есть базовая возможность делать обработку текста на языке, который похож на sed. (Встроенная команда Edit). При такой простой идее получается, что acme это не просто редактор, а интерфейс к ОС! Настоящий Unix подход, у которого есть неоспоримое преимущество -- простота и низкий порог вхождения! Никаких сочетаний клавиш, всё интуитивно понятно и естественно. Как только привыкаешь к этому, чувствуешь как твоя голова отдыхает! Не смотря на простоту, acme оказывается мощным. В том числе благодаря возможности работать с ним, как с файловой системой. Так как мы можем ловить события редактора и управлять им, то, к примеру, для acme есть почтовый клиент Mail, который выглядит так же, как и всё остальное -- просто текст с активными элементами. Можно запустить win -- "терминал" и выполнять в нём команды. acme умеет дампить и восстанавливать своё состояние. Сразу оговорюсь, до мощи Emacs acme далеко. Хотя бы потому, что в acme окнах возможно отображать только текст. Но учитывая его простоту, мощности на строку кода у acme больше! Когда я использовал acme для написания игры, то выглядело это примерно так: 1) Левый столбец содержал окна с кодом и окно, в котором я запускал консольный метапарсер, через который прогонял автоскрипт (все команды игры, для полного прохождения). 2) Правый столбец содержал окна: вывод спеллчекера, файл с автокомандами. Интересно то, что со временем строка меню обросла теми командами, которые я использовал больше всего именно при работе над игрой. Там были фрагменты строк для поиска, какие-то выбранные места кода, запуск форматирования кода и прочее. Таким образом, acme подстраивался под конкретную задачу. Это было удобно и сам факт показался мне интересным. В общем, acme -- отличный пример удачного применения KISS подхода. Теперь, кроме emacs в Linux я также использую и acme и этот опыт мне нравится. Переходя с emacs на acme, отчётливо чувствуешь разницу подходов и то, как освобождаются ресурсы в твоей голове, когда можно забыть, хотя бы на время, все эти клавиатурные комбинации. :)

Запуск нового экземпляра acme в plan9port

[plan.9] Thu Feb 4 21:48:59 UTC 2021 @hugeping -> hugeping

Если запустить acme из plan9port, а затем попробовать запустить его снова, то получим ошибку, вроде такой: > 9pserve: announce unix!/tmp/ns.peter.:0/acme: Address already in use acme: can't post service: 9pserve failed Поэтому, у меня есть простой скрипт, который запускает acme если он ещё не был запущен. А в последующие разы открывает файл через plumber в уже существующем экземпляре acme. Выглядит скрипт так: ==== #!/bin/sh 9 PAGER=nobs MANPAGER=nobs # Default font for Plan 9 programs. font=/mnt/font/GoMono/14a/font # Equivalent variables for rc(1). home=$HOME prompt="$ " # if you want to use rc instead of your shell within acme, uncomment the following line shell=rc user=$USER export \ font\ home\ shell\ prompt\ user\ PAGER\ MANPAGER if ! pidof plumber >/dev/null; then plumber fi if pidof acme >/dev/null; then plumb -d edit "$@" else acme -f /mnt/font/Iosevka/14a/font "$@" & fi ==== Но иногда хочется все-таки запустить ещё один (или не один) acme! Оказывается, это возможно! ==== #!/bin/sh export NAMESPACE=`mktemp -d /tmp/acmeXXXX` 9 PAGER=nobs MANPAGER=nobs # Default font for Plan 9 programs. font=/mnt/font/GoMono/14a/font # Equivalent variables for rc(1). home=$HOME prompt="$ " # if you want to use rc instead of your shell within acme, uncomment the following line shell=rc user=$USER export \ font\ home\ shell\ prompt\ user\ PAGER\ MANPAGER plumber "$NAMESPACE" acme -f /mnt/font/Iosevka/14a/font "$@" for p in `pidof plumber`; do if cat /proc/$p/cmdline | grep -q "$NAMESPACE"; then kill $p break fi done rmdir $NAMESPACE ==== Скрипт запустит столько acme, сколько понадобится.

Скрипты и заметки по ACME

[plan.9] Thu Feb 18 07:33:59 UTC 2021 @hugeping -> hugeping

Несколько раз уже натыкался на этот репозиторий. https://github.com/evbogdanov/acme

Re: Скрипты и заметки по ACME

[plan.9] Wed Mar 10 04:19:49 UTC 2021 @hugeping -> hugeping

Ещё скрипты и заметки: https://github.com/jinyangustc/acme-editor

ACME в Linux: пишем почтовый клиент

[plan.9] Wed Oct 13 16:48:36 UTC 2021 @hugeping -> hugeping

Написал статью о том, как писал фронтенд к почте для acme: ii://S4sJA2iZYo83k8ZnpjEX

copyleft 2021 difrex at lessmore dot pw; source code