# Каждый программист должен написать свой редактор
hugeping(ping,1) — All
2023-09-10 11:32:09


Решил написать небольшую заметку про свой новый проект. Интересно, что как и остальные, он стал эволюцией моих прошлых экспериментов. Занимаясь INSTEAD я полюбил Lua. Играя с Plan9 я сделал парсерный re:instead (в том числе и для того, чтобы можно было писать парсерные игры прямо в Plan9). Развил re:instead в rein, который стал уже скорее "платформой" приложений.

Не смотря на то, что rein создавался с мыслью о "духе ретро", я не стал выбрасывать из него функции, которые бы позволяли писать "полноценные" приложения. Например, поддержку шрифтов ttf и возможности менять размеры окна на лету. Я знал, что рано или поздно я попробую сделать это -- написать свой собственный текстовый редактор. :)

Я пользовался разными редакторами. Среди них, конечно, особое место занимают vim и emacs. Но когда я познакомился с acme я понял, что по большому счёту совсем не важно в чём ты пишешь код. Простой инструмент может быть гибким, эффективным и вдохновляющим.

У кого-то может возникнуть вопрос. А почему я не использую vscode? Потому что моя профессия приносит мне удовольствие и я разборчив в своих предпочтениях. Что касается vscode:

- это приложение на основе браузера;
- vscode пришёл из недр корпорации.

Как я обхожусь без "фишек" современных редакторов? Наверное, мне они не так уж и нужны. Даже наоборот, вылезающие подсказки во время набора раздражают. А после acme я осознал, что и "раскраска" текста -- какая-то ненужная нелепость. Играет роль и то, что в моей области деятельности не нужно запоминать бесчисленное число методов и классов. Я могу писать код просто "из головы".

Я начал проводить всё больше времени в acme, написал для него e-mail клиент, но всё-таки нельзя сказать, что он стал моим единственным редактором. Он является естественным в своей родной среде обитания - Plan9, но для работы в Linux/Bsd* необходимо собрать plan9ports. Я не чувствовал, что инструмент "принадлежит" мне в полной мере.

Так что мысль о собственном _простом_ редакторе стала приходить мне всё чаще. Наверное ещё во время работы над re:instead (который был написал под вдохновением от редактора Lite) я увидел, что это возможно.

Потом, в rein я написал простой "традиционный" редактор edit и пользовался им при разработке под rein. Ощущение инструмента в котором ты знаешь каждый "болтик" было непередаваемым!

В edit (редактор rein) в начале было много багов. Файл в edit был представлен в виде массива строк. Это удобно для навигации и отображния, но совсем неудобно для редактирования. Пока я его дописывал и фиксил баги я подумал, а что если файл представлять не массивом строк, а просто -- одной строкой? И тут же снова вспомнил acme, где изменения высоты скроллера явно намекает на то, что в качестве позиции используется смещение, а не номер строки. Стало интересно попробовать. И в этот раз я не смог погасить свой порыв. Так я и начал писать свой мини-acme.

Многие фишки acme раскрываются в полной мере в Plan9. Например, файловая система, через которую можно управлять редактором. Да, в Linux тоже можно монтировать её через fuse, но есть нюансы, которые делают этот метод не рабочим. Поэтому я был настроен делать именно "мини"-acme редактор, в котором мог бы делать свою повседневную работу. В качестве механизма расширения - конечно Lua!

Сейчас редактор доведён до полу-готового состояния и смержен в master ветку проекта rein. Редактор делается под мои предпочтения, поэтому он не будет демонстрироваться "широкой" публике, но я всё-таки решил написать этот текст на случай, если им заинтересуется кто-нибудь ещё.

Итак, особенности редактора red.

# RED -- Rein Editor

## Клавиши

В отличие от acme в red работают многие привычные комбинации клавиш:

- ctrl-c/x/v - копирование, удаление, вставка;
- ctrl-z - undo;
- ctrl-k - удаление до конца строки;
- стрелки курсора - перемещение по тексту во всех направления;
- page down/up - перемещение по тексту по странично;
- home/end - начало и конец строки;
- ctrl-w - умное выделение;
- ctrl-s - сохранение буфера (окна).
- shift-движение - выделение клавиатурой.

Как в acme (или почти как в acme) работают:

- escape - выделение последнего блока, удаление;
- ctrl-f - автодополнение путей (правда, если варинтов несколько - выдаётся первый);
- ctrl-a - начало/конец строки.

## Мышка

- аккорды acme - должны работать похоже;
- правая кнопка мыши - простой поиск как в acme;
- alt+правая кнопка мыши - простой поиск назад;
- shift + правая кнопка мыши - эмуляция средней кнопки мыши.

В отличие от acme курсор _мыши_ не прыгает на выделенный текст поиска (так как управление курсором из приложение возможно не во всех средах). Чтобы продолжить поиск нужно повторно кликнуть в пустую область где нет текста (например, справа от строки). Или кликнуть на слово для поиска этого слова.

- правая кнопка мыши на :число - прыжок на строчку.
- средняя кнопка мыши - выполнение действия: меню, вызов программ, открытие каталогов и файлов.

В acme открытие файлов и передача в plumber делается по пкм, однако это меня всегда немного раздражало. Потому что иногда клик приводит к поиску, а иногда - к действию. Захотел поискать https://... в коде, а открылся браузер. Поэтому в red все активные действия висят на средней кнопки мыши. А открытие каталогов, файлов - это тоже активные действия. Возможно, я сделал ошибку, но пока решение кажется удобным.

- умное выделение

Не такое как в acme, но всё-таки удобное. Двойной клик справа от строки - выделить всю строку с переводом строки. Двойной справа от последнего символа строки - строка но без перевода строки. Клики около скобок - выделение до пары. Клики на словах - выделение слов. Кроме мышки можно пользоваться умным выделением нажимая ctrl-w.

## Окна

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

Когда вы открываете файл, то ищется уже открытый файл по всем столбцам и если он есть -- показывается. Если вам нужно открыть несколько одинаковых файлов, вам придется поменять имя открытому файлу в меню (напрмер, добавить "+" в начале) и открыть этот же файл ещё раз.

Если имя файла начинается с "+", то такой файл не сохраняется на диск. Поэтому информационные окна называются: +Errors, +Output, +Help и т.д. Вы можете любое окно сделать информационным просто добавив + в начало имени активного файла (первый файл в списке файлов в меню).

Скроллеры в отличие от acme работают традиционно - левая кнопка мыши "таскает" скроллер.

## Вызов программ

Поддержки win (запуск шелла) на данный момент нет. Это связано с тем, что полноценную поддержку процессов нужно делать через fork. Это привяжет red к Unix. К тому же, red - это lite-acme. :) Расширения red можно делать на Lua, но для запуска полноценного shell этого недостаточно.

### Возможности по запуску программ

- >cmd - запуск cmd с передачей в качестве параметра временного файла с данными;
- <cmd - запуск cmd с чтением stdout;
- !cmd - запуск cmd

Кроме того для Linux всё-таки доступна:

- |cmd - работает примерно как в acme. На вход через пайп передаётся текст или выделение и ждём выхода.

Всё это реализовано за счёт io.popen временных файлов и coroutine (переключение после чтения пачки строк). Поэтому - ненадёжно. Если вы запустите программу которая висит и ничего не выдаёт, red зависнет. Поэтому реализацию нельзя считать полноценной замену acme. Тем не менее, я пользуюсь этим механизмом для проверки орфографии.

Если запускается программа с параметрами, выделите всю строчку и нажмите среднюю кнопку мыши.

### Встроенные команды

Основной механизм расширений редактора всё-таки не через запуск внешних команд, а за счёт написания процедур на Lua. Процедуры находятся в файле data/lib/red/proc.lua и на данный момент включают следующие команды:

- sub - поиск или поиск/замена построчно;
- gsub - поиск или поиск/замена глобально;
- select - синоним gsub без замены;
- find - синоним sub без замены;

Внимание! Все регулярки - регулярки на Lua!

Примеры:

select ^.*$ - выбрать всё
sub /^/ / - построчно добавлять в начало строки 4 пробела.

Во втором примере на каждые 2 клика вы получите одну итерацию: поиск-замена. Но если хотите произвести манипуляции не интерактивно - выделите текст, с которым работаете. Например:

gsub ^.*$ - выделили всё (тот же select)
sub /^/ / - отработали по выделению.

Доступна форма записи поиска с / - если нужно работать с пробелами:

select / / - выбрать 2 пробела.

Другие встроенные команды:

- Getline - добавляет справа от себя текущий номер строки. Удобно для составления "закладок" в файле;
- fmt [ширина] - аналог утилиты fmt;
- grep выражение - рекурсивный поиск по содержимому файлов каталога. Каталог - dirname открытого в данный момент файла;
- Run [программа] - запуск программы rein (интеграция для разработки под rein) или текущего файла.

## Dump

При нажатии средней кнопки мыши на Dump - в текущем каталоге создаётся конфигурация сессии (файл red.dump). В сессии сохраняются все данные открытых файлов. Даже если вы сотрёте сами файлы, при восстановлении сессии они будут показаны в окнах. Если red находит в текущем каталоге red.dump он всегда его загружает. Возможно, в будущем появится опция для загрузки Dump.

## Параметры командной строки

Запуск red:

$ rein red [-fs <размер шрифта>] [файлы]

Чтобы немного ускорить запуск можно воспользоваться опциями:

$ rein -platform-nosound -platform-nojoystick ...

Для удобства я делаю себе скрипт вида:

-- red
#!/bin/sh
/home/peter/Devel/rein/rein -platform-nosound -platform-nojoystick red -fs 19 "$@"

И запускаю редактор из любого места.

## Открытие файлов по средней кнопке мыши

В файле data/lib/red/uri.lua вы можете прописать вызов внешних программ. Например, запускать просмотрщик pdf если вы нажали на строчку, которая заканчивается на .pdf.

## Настройки для типов файлов

В файле data/lib/red/presets.lua вы можете настроить поведение редактора в зависимости от типа файла (расширения). Пока доступны только размер табуляции и режим табуляции (пробелы или \t). Скорее всего появятся и другие настройки.

## Цвета

В начале red.lua в таблице conf.

# Что дальше?

Редактор ещё сыроват, но я начал его использовать и постоянно вношу доработки. Приоритет разработки - личное использование. Ведь вряд-ли вы захотите променять vscode на _это_! Не правда ли? :) Но меня это не беспокоит. Ведь теперь я точно знаю -- каждый программист должен написать собственный редактор!

У Линуса есть https://github.com/torvalds/uemacs у Роба Пайка -- acme, у Столмана emacs. А у меня теперь есть red и мне больше не нужно выбирать!

P.S. Один мой друг удивился тому, что у меня есть желание программировать после работы и тратить время на такие вот хобби проекты. Не знаю в чём дело, но с годами желание программировать у меня никогда не исчезало. И я считал что это нормальное состояние для программиста. Программирование -- это в первую очередь форма творчества, а творчество всегда лечит. Ведь творчество это свобода. Эксперимент, игра -- но никак не рутина. В хобби проекте ты можешь почувствовать это в полной мере, ведь тут ты не ограничен целесообразностью. А на работе... На работе теперь можно будет редактировать код в red :)

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — hugeping
2023-09-10 12:46:14


Удалено. Случайно зацепил не ту клавишу.

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — hugeping
2023-09-10 12:47:01


hugeping> Всё это реализовано за счёт io.popen временных файлов и coroutine (переключение после чтения пачки строк). Поэтому - ненадёжно. Если вы запустите программу которая висит и ничего не выдаёт, red зависнет. Поэтому реализацию нельзя считать полноценной замену acme. Тем не менее, я пользуюсь этим механизмом для проверки орфографии.

https://luvit.io ? Дисклеймер: найдено в интернете, я не специалист по Lua и т.п.

P.S. Я долгое время относился к Lua пренебрежительно за его "игрушечность". Однако в какой-то момент мне зачем-то понадобилось ознакомиться с ним глубже и на меня произвели впечатление элегантность и минимализм языка, напомнило Лисп. И всё же большие и сложные проекты я бы на нём делать поостерёгся.

P.S. Для меня редактор - это ещё и интерфейс со средой исполнения, например CAS или ITP. Но для многих достаточно и меньшего. Emacs - это крайний пример, к тому же его может оказаться и недостаточно если интерфейс нетекстовый по природе.

# Re: Каждый программист должен написать свой редактор
hugeping(ping,1) — vvs
2023-09-10 15:34:36


vvs> https://luvit.io ? Дисклеймер: найдено в интернете, я не специалист по Lua и т.п.

Если сделать специализированный код, то - можно, конечно. Я просто старался остаться в рамках API rein. Ну и вообще, хотел сохранить простоту.

vvs> И всё же большие и сложные проекты я бы на нём делать поостерёгся.

red меньше 2000 строк в общей сложности. Lua конечно хорош как встраиваемый язык.

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — hugeping
2023-09-10 16:40:20


hugeping> Если сделать специализированный код, то - можно, конечно. Я просто старался остаться в рамках API rein. Ну и вообще, хотел сохранить простоту.

Ты, когда говоришь о простоте, всегда, на самом деле, подразумеваешь только самое необходимое :) Берём вызовы ядра Линукса и План 9: разница лишь в том, что считать самым необходимым. Один человек ещё как-то сказал, что его самой большой ошибкой было то, что для реализации интерфейса пользователя он написал текстовый редактор на Яве - такой проект может занять всю жизнь :) Интересно, Столлман, когда писал Emacs, подозревал, что в нём появится ещё и Сокобан и калькулятор в придачу? Понятие необходимости со временем тоже эволюционирует, однако :)

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — vvs
2023-09-10 17:41:14


vvs> Ты, когда говоришь о простоте, всегда, на самом деле, подразумеваешь только самое необходимое

Кстати, я тоже замечал, что если у меня под рукой есть привычный инструмент, то я всё пытаюсь делать им. Ну, действительно, зачем плодить лишние сущности и изучать всё новые способы делать одно и то же, если у меня уже и так всё для этого было? А в расходы запишем необходимость в постоянном усложнении "простого" инструмента. Вот так и появились на свет Vim и Emacs (и luvit с emilua, Smalltalk и кто его знает что ещё :)

# Победа будет Za нами!
kct-ac12(ping,50) — hugeping
2023-09-11 11:30:21


Слава России!

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — hugeping
2023-09-11 12:32:49


hugeping> У кого-то может возникнуть вопрос. А почему я не использую vscode? Потому что моя профессия приносит мне удовольствие и я разборчив в своих предпочтениях. Что касается vscode:

hugeping> - это приложение на основе браузера;
hugeping> - vscode пришёл из недр корпорации.

VSCode надо рассматривать именно как интерфейс, а не редактор. Тогда наличие браузера становится преимуществом.

hugeping> Как я обхожусь без "фишек" современных редакторов? Наверное, мне они не так уж и нужны. Даже наоборот, вылезающие подсказки во время набора раздражают. А после acme я осознал, что и "раскраска" текста -- какая-то ненужная нелепость. Играет роль и то, что в моей области деятельности не нужно запоминать бесчисленное число методов и классов. Я могу писать код просто "из головы".

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

Мои претензии к VSCode - текстовый редактор, который даже не работает в текстовом режиме, а текстовый процессор программисту не нужен, к тому же здесь он всем уступает.

hugeping> Я не чувствовал, что инструмент "принадлежит" мне в полной мере.

Тогда жду, что следующим проектом станет свой язык программирования :) Нет, ну серьёзно, у Пайка были свои ОС (Plan 9 и Inferno), свой редактор Acme и свои языки - Limbo и Go. Правда он это делал не один, да и, к тому же, не бесплатно.

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

# Re: Каждый программист должен написать свой редактор
Andrew Lobanov(tavern,1) — vvs
2023-09-11 12:47:45


hugeping>> У кого-то может возникнуть вопрос. А почему я не использую vscode? Потому что моя профессия приносит мне удовольствие и я разборчив в своих предпочтениях. Что касается vscode:
hugeping>> - это приложение на основе браузера;
hugeping>> - vscode пришёл из недр корпорации.
vvs> VSCode надо рассматривать именно как интерфейс, а не редактор. Тогда наличие браузера становится преимуществом.

Я могу понять acme как интерфейс. И даже emacs как интерфейс, хотя тут уже всё менее чётко. Но интерфейсом к чему является VSCode. На работе использую его каждый день и от твоего сообщения появилось стойкое ощущение, что я что-то фундаментального о нём не знаю :)

+++ Лично я вижу в этом перст судьбы – шли по лесу и встретили программиста.

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — Andrew Lobanov
2023-09-11 13:19:44


VSCode может служить интерфейсом к самым разным веб приложениям. Например, он является клиентом GutHub Codespaces и Copilot. Я знаю и другие проекты, где он используется для интерактивных документов, где вместе присутствуют код, данные и документация, как в Jupyter. Если кто видел Wolfram Mathematica, то там такой же подход, только на основе интерактивного блокнота: https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%B1%D0%BB%D0%BE%D0%BA%D0%BD%D0%BE%D1%82

Использование чисто текстовой среды, как в Emacs, затрудняет создание таких интерфейсов, особенно при использовании сети и интернет протоколов. Хотя и в Emacs можно пытаться такое реализовать, но он тут явно уступает по своим возможностям. Большинство людей не станет использовать Lynx вместо Firefox, да и не везде он будет работать правильно (в банке).

P.S. Edited: 2023-09-11 13:20:01

# Re: Каждый программист должен написать свой редактор
hugeping(ping,1) — vvs
2023-09-11 18:47:36


vvs> Тогда жду, что следующим проектом станет свой язык программирования :) Нет, ну серьёзно, у Пайка были свои ОС (Plan 9 и Inferno), свой редактор Acme и свои языки - Limbo и Go. Правда он это делал не один, да и, к тому же, не бесплатно.

Я не потянул бы такое. Хотя мне уже тут советовали посмотреть Оберон. :)
Но пока я решил чисто утилитарную проблему - испытал сегодня на работе - пока всё отлично!

# Re: Победа будет Za нами!
hugeping(ping,1) — kct-ac12
2023-09-11 18:47:56


kct-ac12> Слава России!

Да, бро! Только вперёд!

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — hugeping
2023-09-12 14:12:38


vvs>> Тогда жду, что следующим проектом станет свой язык программирования :) Нет, ну серьёзно, у Пайка были свои ОС (Plan 9 и Inferno), свой редактор Acme и свои языки - Limbo и Go. Правда он это делал не один, да и, к тому же, не бесплатно.

hugeping> Я не потянул бы такое. Хотя мне уже тут советовали посмотреть Оберон. :)

Смотря что иметь в виду. Изобрести оригинальный универсальный язык - это искусство. Придумать же практичный прикладной язык для личного пользования - не сложнее, чем написать свой текстовый редактор. Ну пользуются же люди URQ :) Вот и подтверждение практичности такого подхода: https://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

Разработать же транслятор - вообще дело техники и желания почитать соответствующую литературу. Короче, главное - не дрейфить :)

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — vvs
2023-09-12 17:59:38


Кстати, напомнило. Когда Hewlett-Packard запустили линейку первых программируемых калькуляторов со встроенной CAS, то для них был специально придуман язык RPL (Reverse Polish Lisp). Собственно почти все дальнейшие их калькуляторы, совместимые с этими и являлись реализацией RPL с кучей ПО.

# Re: Каждый программист должен написать свой редактор
hugeping(ping,1) — hugeping
2023-09-23 10:00:41


Довольно сильно продвинулся с red!

Основные отличия будут видны, если он используется не в Windows среде:

- Теперь есть win почти как в acme, в котором можно выполнять команды и есть даже ввод-вывод через fifo;
- Запуск процессов теперь осуществляется через потоки red, что должно исключить "зависания".

Ядро rein в плане потоков было немного переработано (для поддержки ThreadDetach), но в целом - движок не пришлось менять. Пока очень доволен. Вижу как red медленно (но верно) превращается в мой личный инструмент.

P.S. Ещё бы логотип какой-то придумать... Сейчас это просто красный квадрат с рамкой, который генерируется прямо внутри кода red. Хотя, может и не плохо.

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — hugeping
2023-09-25 20:06:07


Почему-то до меня только сейчас это дошло, как до жирафа: не знаю, в курсе ты или нет, но уже есть один редактор с поддержкой Lua первого класса - Neovim. Может тебе это будет интересно для сравнения.

# Re: Каждый программист должен написать свой редактор
Andrew Lobanov(tavern,1) — vvs
2023-09-26 05:22:39


vvs> Почему-то до меня только сейчас это дошло, как до жирафа: не знаю, в курсе ты или нет, но уже есть один редактор с поддержкой Lua первого класса - Neovim. Может тебе это будет интересно для сравнения.

Есть ещё lite, например.

+++ Йа мобилко.

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — Andrew Lobanov
2023-09-26 14:39:53


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

По опыту здесь чаще всего доминируют VSCode, Emacs и, в меньшей степени, Vim/Neovim. Я тут говорю именно о "редакторах", а не IDE типа Eclipse или IntelliJ IDEA, хотя граница там достаточно размыта. Использовать же какой-то специализированный редактор отдельно, только для редактирования текста, в таком случае уже избыточно, КМК. Кстати, ведь и Acme задумывался именно для такого применения.

Но это вопрос личных потребностей и вкусов, которые, впрочем, имеют тенденцию меняться со временем.

# Re: Каждый программист должен написать свой редактор
Andrew Lobanov(tavern,1) — vvs
2023-09-26 18:17:28


vvs> Я уже привык оценивать текстовый редактор по тому, как он интегрируется с интересующими меня приложениями, т.е. в качестве стандартного интерфейса пользователя. Вообще, для меня лучше всего, когда редактор уже является частью стандартного интерфейса, а не самостоятельным приложением, поскольку собственно редактированием текстов я не занимаюсь (ну не писатель). Это сравнимо с разницей между графическим интерфейсом и терминалом (и я пользуюсь эмулятором терминала, встроенным в GUI, а не устройством).

Я уже давно рассматриваю редактор не столько как редактор. Emacs ибо. Хотя напрямую как интерфейс к ОС его рассматривать не совсем правильно, но вот как вычислительную среду с интерфейсом доступа к ОС уже корректнее.

vvs> По опыту здесь чаще всего доминируют VSCode, Emacs и, в меньшей степени, Vim/Neovim. Я тут говорю именно о "редакторах", а не IDE типа Eclipse или IntelliJ IDEA, хотя граница там достаточно размыта. Использовать же какой-то специализированный редактор отдельно, только для редактирования текста, в таком случае уже избыточно, КМК. Кстати, ведь и Acme задумывался именно для такого применения.

Как раз acme офигенный пользовательский интерфейс. По крайней мере в родной для него ОС. Но и в GNU/Linux весьма себе вкусная вещь. А вот vi/vim/neovim мной только как редакторы воспринимаются. Хорошие, но редакторы. Не прижилось у меня более широкое их использование.

vvs> Но это вопрос личных потребностей и вкусов, которые, впрочем, имеют тенденцию меняться со временем.

Да я даже не знаю. Мне почти всё нравится, что пробовал. Даже vscode на работе успешно использую. Правда рядом всегда открыто несколько клиентов Emacs, а в терминальных сессиях до серверов использую vim.

+++ Йа мобилко.

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — Andrew Lobanov
2023-09-26 19:15:33


AL> Я уже давно рассматриваю редактор не столько как редактор. Emacs ибо. Хотя напрямую как интерфейс к ОС его рассматривать не совсем правильно, но вот как вычислительную среду с интерфейсом доступа к ОС уже корректнее.

Смотря какая ОС. В GNU Scheme в качестве интерфейса по умолчанию есть Edwin - тот же Emacs. Сассман - который (со)автор Scheme - использует его как интерфейс в своих курсах/книгах, таких как "Структура и интерпретация компьютерных программ" и в своей CAS Scmutils (Scheme Mechanics). У него, кстати, есть книги и по математике и по физике с той же CAS. Она сама вот тут лежит: https://groups.csail.mit.edu/mac/users/gjs/6946/installation.html

AL> Как раз acme офигенный пользовательский интерфейс. По крайней мере в родной для него ОС. Но и в GNU/Linux весьма себе вкусная вещь. А вот vi/vim/neovim мной только как редакторы воспринимаются. Хорошие, но редакторы. Не прижилось у меня более широкое их использование.

У меня все редакторы используются так, как задумано авторами приложений. Я только пользователь.

# Re: Каждый программист должен написать свой редактор
hugeping(ping,1) — vvs
2023-09-27 21:41:48


vvs> есть один редактор с поддержкой Lua первого класса - Neovim. Может тебе это будет интересно для сравнения.

Да, я в курсе. vim (который не neo) я использовал одно время (пару лет), но потом перешёл на emacs. К режимам я привык, но не полностью. Хороший редактор, и neovim хвалят очень, думаю я его ещё посмотрю.

# Re: Каждый программист должен написать свой редактор
Andrew Lobanov(tavern,1) — vvs
2023-10-02 10:31:43


AL>> Как раз acme офигенный пользовательский интерфейс. По крайней мере в родной для него ОС. Но и в GNU/Linux весьма себе вкусная вещь. А вот vi/vim/neovim мной только как редакторы воспринимаются. Хорошие, но редакторы. Не прижилось у меня более широкое их использование.
vvs> У меня все редакторы используются так, как задумано авторами приложений. Я только пользователь.

Ну мне сложнее: я не телепат и люблю ковыряться во всякой фигне. Но зачем мне из вима делать интерфейс к ОС, если у меня уже есть более другие интерфейсы к ОС я не понимаю. Тем более на серверах, где просто нет смысла что-то сильно настраивать.

+++ Лично я вижу в этом перст судьбы – шли по лесу и встретили программиста.

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — Andrew Lobanov
2023-10-02 14:24:34


AL> Ну мне сложнее: я не телепат и люблю ковыряться во всякой фигне. Но зачем мне из вима делать интерфейс к ОС, если у меня уже есть более другие интерфейсы к ОС я не понимаю. Тем более на серверах, где просто нет смысла что-то сильно настраивать.

Если ОС это и есть реализация какого-то языка, то и выбора особого нет. Например HP 48, в которых RPL - это и есть вся ОС. На z/OS - это часто ISPF, поскольку там обычно есть только блочные терминалы. Или какой-нибудь Smalltalk, MIT Scheme, Wolfram Mathematica или другая интерактивная среда, которые от ОС мало зависят. В Lisp или OCaml использовать голый REPL - тоже не самый удобный вариант. Поэтому и Emacs. Да и в Plan 9 я Gnome что-то не заметил.

Но для Linux, Windows, какой-нибудь Sony PlayStation, где среда разработки для большинства пользователей совершенно не нужна, есть специализированные GUI. Так сложилось исторически.

А зачем, например, Пётр делает Red? Ну тоже есть у него на то свои причины :)

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — Andrew Lobanov
2023-10-02 19:59:18


AL> Но зачем мне из вима делать интерфейс к ОС

Может я неправильно понял вопрос? Если имеется в виду, что Emacs - это интерфейс, а Vim - нет, то это вовсе не так. Vim и Emacs отличаются очень поверхностно, т.е. это дело привычки. Я пользуюсь обоими и разница для меня только в языке реализации: elisp в Emacs и vimscript в vim. Модальный режим не в счёт. Neovim ещё добавляет нормальную поддержку Lua.

Посмотрим и с обратной стороны: если пользователь всё своё время и так проводит в редакторе, то зачем ему вообще отдельный интерфейс к ОС? И какая ему разница на каком языке он написан? Для него интерфейс к ОС - это и есть его редактор.

Ну вот многие ли в DOS пользовались командной строкой? Большинство перешли на Norton Commander и были довольны. Тем более, кто сейчас пользуется терминалом в Windows? Потому что их устраивает данный разработчиками GUI и о большем они не мечтают. Это инерция мышления и привычка. Я ещё раньше называл это данью моде, но это уже вызвало споры. Тогда использование редактора в качестве интерфейса тоже определяется привычками и целесообразностью перемен. Зачем что-то менять если всё и так устраивает?

GUI тоже ведь зародился не на пустом месте, а сначала продвигался, как интерфейс к системам типа Xerox Alto, а потом Smalltalk или Oberon. Потом к нему просто привыкли и первоначальные мотивы уже утратили значение. Эти системы, в свою очередь, тоже продвигались просто, как более интуитивный интерфейс для неспециалистов. Тогда даже появился модный термин "рабочая станция", а в качестве ОС там обычно фигурировал какой-то язык программирования. Сейчас эталоном GUI можно считать смартфон, где это его визитная карточка. И действительно, пользоваться текстовым интерфейсом там было бы совсем затруднительно. На серверах же традиционно прижился интерфейс командной строки, но это просто традиция, как показывает тот же Plan 9. Кстати, Inferno - это попытка сделать Plan 9 переносимым на разные платформы и он мало чем, по сути, отличается от того же Smalltalk.

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — hugeping
2023-10-23 20:04:40


hugeping> У кого-то может возникнуть вопрос. А почему я не использую vscode? Потому что моя профессия приносит мне удовольствие и я разборчив в своих предпочтениях. Что касается vscode:

hugeping> - это приложение на основе браузера;
hugeping> - vscode пришёл из недр корпорации.

Я могу тебя понять :)

Сегодня обновил расширение и обнаружил, что оно попало в кэш хромиума, в кэш расширений да ещё и сам установленный экземпляр. И у меня автоматические обновления отключены. Ещё и вся память воркспейсов, включая те, которых уже давно нет, хранится там вечно. И нет никакого интерфейса для чистки мусора, кроме резервных копий самих редактируемых файлов. Баг репорты ою этом лежат по всему интернету минимум последние шесть лет и никто даже не чешется :( На emacs и vim это совсем не похоже.

Кстати, VS Code - это единственный из уже упоминавшихся редакторов, который сохраняет изменения непосредственно в сам редактируемый файл (дата создания файла не меняется). Остальные же меняют только его копию. Зато ему не нужны и дополнительные права на создание, удаление и переименование файлов на сервере :)

# Re: Каждый программист должен написать свой редактор
hugeping(ping,1) — vvs
2023-10-23 22:35:41


vvs> Я могу тебя понять :)

vvs> Сегодня обновил расширение и обнаружил, что оно попало в кэш хромиума, в кэш расширений да ещё и сам установленный экземпляр.

А дописал всё-таки к red механизм подсветки синтаксиса (сейчас есть поддержка: Си, Lua, markdown и diff) и вовсю использую его на работе. Правда, всё время что-то дописываю, а это немного отвлекает собственно от самой работы. :) Да, уже вижу что написан он грязновато, но это вечная проблема.

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — hugeping
2023-10-24 13:29:54


hugeping> Правда, всё время что-то дописываю, а это немного отвлекает собственно от самой работы. :)

Я ещё много лет назад хотел себе интерактивную визуальную систему для работы. Нашёл тогда только Smalltalk и Oberon. Потом, правда, ещё познакомился с Plan 9 и Inferno. Так там _всегда_ надо что-то дописывать, в этом и суть интерактивного программирования :) Сейчас, кстати, читаю "Squeak by example 6.0": интерактивная среда там никем не превзойдена до сих пор! А ты видел Skein в Inform 7? Вообще, у этих систем много общего: интерактивная динамическая среда, текст программы похож на обычный английский язык, мощные средства отладки, исследовательское программирование.

hugeping> Да, уже вижу что написан он грязновато, но это вечная проблема.

Фрэнку Герберту, автору "Дюны", понадобилось ещё целых семь лет после написания первого романа серии, пока он смог уволиться и заняться, наконец, только литературной деятельностью. Кстати, и писал он первую книгу шесть лет. А настоящая исследовательская работа имеет много общего с написанием романа :)

# Re: Каждый программист должен написать свой редактор
hugeping(ping,1) — vvs
2023-10-24 16:13:46


hugeping>> Правда, всё время что-то дописываю, а это немного отвлекает собственно от самой работы. :)

vvs> А ты видел Skein в Inform 7? Вообще, у этих систем много общего:

Skein не видел. Про сам Inform 7 знаю и смотрел на "код программ".. В итоге, правда, настроен довольно скептически. Может быть кому-то проще писать на таком как бы человеческом языке, но мне показалось что это принесёт больше проблем. Хотя сам неоднократно думал над DSL который бы компилировал в код INSTEAD игры, но там я думал о специализированном синтаксисе.

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — hugeping
2023-10-24 17:10:21


hugeping> Skein не видел. Про сам Inform 7 знаю и смотрел на "код программ".. В итоге, правда, настроен довольно скептически. Может быть кому-то проще писать на таком как бы человеческом языке, но мне показалось что это принесёт больше проблем. Хотя сам неоднократно думал над DSL который бы компилировал в код INSTEAD игры, но там я думал о специализированном синтаксисе.

А как тогда тебе этот код (фрагмент большой)?
import Game.Metadata
import Game.MyNat.Multiplication


World "Tutorial"
Level 1
Title "The rfl tactic"

Introduction
"
# Read this first

Each level in this game involves proving a mathematical theorem (the \"Goal\").
The goal will be a statement about *numbers*. Some numbers in this game have known values.
Those numbers have names like $37$. Other numbers will be secret. They're called things
like $x$ and $q$. We know $x$ is a number, we just don't know which one.

In this first level we're going to prove the theorem that $37x + q = 37x + q$.
You can see `x q : ℕ` in the *Objects* below, which means that `x` and `q`
are numbers.

We solve goals in Lean using *Tactics*, and the first tactic we're
going to learn is called `rfl`, which proves all theorems of the form $X = X$.

Prove that $37x+q=37x+q$ by casting the `rfl` tactic.
"

/-- If $x$ and $q$ are arbitrary natural numbers, then $37x+q=37x+q.$ -/
Statement (x q : ℕ) : 37 * x + q = 37 * x + q := by
  Hint "In order to use the tactic `rfl` you can enter it in the text box
  under the goal and hit \"Execute\"."
  rfl

TacticDoc rfl
"
## Summary

`rfl` proves goals of the form `X = X`.

In other words, the `rfl` tactic will close any goal of the
form `A = B` if `A` and `B` are *identical*.

`rfl` is short for \"reflexivity (of equality)\".

## Example:

If the goal looks like this:

```
x + 37 = x + 37
```

then `rfl` will close it. But if it looks like `0 + x = x` then `rfl` won't work, because even
though $0+x$ and $x$ are always equal as *numbers*, they are not equal as *terms*.
The only term which is identical to `0 + x` is `0 + x`.

## Details

`rfl` is short for \"reflexivity of equality\".

## Game Implementation

*Note that our `rfl` is weaker than the version used in core Lean and `mathlib`,
for pedagogical purposes; mathematicians do not distinguish between propositional
and definitional equality because they think about definitions in a different way
to type theorists (`zero_add` and `add_zero` are both \"facts\" as far
as mathematicians are concerned, and who cares what the definition of addition is).*
"

NewTactic rfl

Conclusion
"
Congratulations! You completed your first verified proof!

Remember that `rfl` is a *tactic*. If you ever want information about the `rfl` tactic,
you can click on `rfl` in the list of tactics on the right.

Now click on \"Next\" to learn about the `rw` tactic.
"

Это уже DSL для реального языка программирования. Эту игру уже реально используют в некоторых университетах для введения в формальную математику :)

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — hugeping
2023-10-24 18:51:04


hugeping> Skein не видел. Про сам Inform 7 знаю и смотрел на "код программ".. В итоге, правда, настроен довольно скептически. Может быть кому-то проще писать на таком как бы человеческом языке, но мне показалось что это принесёт больше проблем. Хотя сам неоднократно думал над DSL который бы компилировал в код INSTEAD игры, но там я думал о специализированном синтаксисе.

Кстати, совсем забыл - есть же ещё Dialog:
Dialog is a domain-specific language for creating interactive fiction. It is heavily inspired by Inform 7 (Graham Nelson et al. 2006) and Prolog (Alain Colmerauer et al. 1972), and substantially different from both.
https://linusakesson.net/dialog/

# Re: Каждый программист должен написать свой редактор
hugeping(ping,1) — vvs
2023-10-26 19:23:23


Про диалог тоже слышал. А вот твой пример не понял прям совсем. :) Даже специально паузу взял, думал изучу на досуге. Загадочно и непонятно. Как ФП :)

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — hugeping
2023-10-26 20:19:12


hugeping> Про диалог тоже слышал. А вот твой пример не понял прям совсем. :) Даже специально паузу взял, думал изучу на досуге. Загадочно и непонятно. Как ФП :)

Хм... Ведь я его и привёл специально с целью продемонстрировать, как код на DSL может быть похож на английский язык. Вроде, если его читать, как английский, то должно быть всё довольно понятно, даже не зная сам DSL. Ну, по крайней мере, я так думал, когда его выкладывал :)

Там сам код включает сам текст из игры, как маркдаун и несколько специальных выражений, которые тоже похожи на текст. Это имеет большое сходство с Inform 7, только синтаксис более специальный, как ты и хотел :) Конечно, в самом тексте говорится о некоторых элементарных математических понятиях, но это должно быть несущественно. Какая разница, говорится там об эльфах и гоблинах или о чем-то там ещё? Это ведь уже часть сюжета игры, а не самого программного кода :)

Ты ведь сказал, что уже думал о DSL для INSTEAD, но со своим специальным синтаксисом, а это ведь такой DSL и есть, только для другого языка. Но ты почти угадал - это действительно ФП :)

Сама игра в браузере тут, можешь попробовать поиграть и увидеть результат такого подхода на деле:
https://adam.math.hhu.de/#/g/hhu-adam/NNG4
Там и хостинг для других подобных игр, типа itch.io

# Re: Каждый программист должен написать свой редактор
vvs(ping,12) — hugeping
2023-10-26 20:43:52


Да, ещё код сервера для реализации этого DSL - 3k строк. На функциональном языке :) Клиент, отвечающий за UI - на JS (точнее TypeScript).

https://github.com/leanprover-community/lean4game

Там ещё одна девочка недавно спрашивала: а нельзя ли поменять в игре менюшный интерфейс на парсерный :)