diff options
Diffstat (limited to 'content/presentations/emacs/emacs-what-user-freedom-is-about.org')
-rw-r--r-- | content/presentations/emacs/emacs-what-user-freedom-is-about.org | 605 |
1 files changed, 605 insertions, 0 deletions
diff --git a/content/presentations/emacs/emacs-what-user-freedom-is-about.org b/content/presentations/emacs/emacs-what-user-freedom-is-about.org new file mode 100644 index 0000000..993a8f7 --- /dev/null +++ b/content/presentations/emacs/emacs-what-user-freedom-is-about.org @@ -0,0 +1,605 @@ +#+Title: Emacs: what user freedom is about +#+Author: CC-0: No Rights Reserved +#+EMAIL: w96k@runbox.com +#+DATE: \href{https://w96k.dev}{w96k.dev} <2023-11-25 Sat> +#+LANGUAGE: ru +#+OPTIONS: H:2 num:nil toc:nil \n:nil @:t ::t |:t ^:t -:t f:t *:t <:t +#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc +#+BEAMER_THEME: Goettingen +#+BEAMER_COLOR_THEME: default +#+LATEX_HEADER: \usepackage[russian]{babel} +#+LATEX_HEADER: \usepackage[protrusion=true,activate={true,nocompatibility},final,tracking=true,kerning=true,spacing=true,factor=1100]{microtype}\SetTracking{encoding={*}, shape=sc}{40} +#+LATEX_CLASS_OPTIONS: [article,11pt,notitlepage,notitle,oneside,twocolumn] +#+STARTUP: beamer +#+LINK_HOME: https://w96k.dev + +* Вступление + +# Всем привет, меня зовут Михаил, я переехал в Тбилиси в сентябре +# прошлого года, работаю бекенд разработчиком и использую Emacs для +# разработки и других целей уже более трёх лет. Я не самый искушенный +# пользователь этого редактора в том смысле, что я его знаю не +# настолько углубленно, тем не менее есть причины по которым GNU Emacs +# меня заинтересовал и я продолжаю его использовать. Об этих причинах +# пойдёт речь в докладе, надеюсь будет хоть сколько-нибудь интересно. + +# <Переключение слайда> + +# Я рассчитываю что из присутствующих есть те, кто имеет не самое +# подробное представление об этом редакторе. В противном случае боюсь +# будет неинтересно, так как большинство пользователей вероятно и так +# в курсе о преимуществах этого редактора. + +** Для кого доклад +Доклад нацелен в первую очередь на тех, кто по тем или иным причинам +не знаком с редактором GNU Emacs и хотел бы узнать причины для начала +его использования. Одна из таких причин — свобода. + +* GNU +** GNU/Emacs + #+ATTR_LATEX: :width 100 + [[./emacs.png]] *GNU/Emacs* -- это свободный немодальный текстовый + редактор общего назначения, созданный в 1985 году Ричардом + Столлманом. Редактор обновляется по сей день и доступен на многих + платформах в том числе Windows. + +** Кто использовал Emacs + Имаксом в той или иной степени пользовались следующие люди: + * [[https://en.wikipedia.org/wiki/Linus_Torvald][Linus Torvalds]] + * [[https://en.wikipedia.org/wiki/Donald_Knuth][Donald Knuth]] + * [[https://en.wikipedia.org/wiki/Yukihiro_Matsumoto][Yukihiro Matsumoto]] + * [[https://en.wikipedia.org/wiki/Guido_van_rossum][Guido van Rossum]] + * [[https://en.wikipedia.org/wiki/Rich_Hickey][Rich Hickey]] + * [[https://en.wikipedia.org/wiki/Joe_Armstrong_(programmer)][Joe Armstrong]] + * [[https://en.wikipedia.org/wiki/Eric_Raymond][Eric Raymond]] + * [[https://en.wikipedia.org/wiki/Andrei_Alexandrescu][Andrei Alexandrescu]] + * [[https://en.wikipedia.org/wiki/Edward_Snowden][Edward Snowden]] + +** Главный экран + # Продемонстрировать главный экран Emacs + + #+ATTR_LATEX: :height 100 + [[./emacs-splash.png]] + + Если открыть Имакс, то нас встретит следующая надпись:\\ + + + *Welcome to GNU Emacs, one component of the GNU/Linux operating system.* + + + Что это значит? + +** GNU is not Unix + #+ATTR_LATEX: :height 60 + [[./gnu.png]] + + *GNU* -- это проект фонда свободного программного обеспечения, который + содержит ПО, следующее четырём свободам: + +** Свободы GNU + :PROPERTIES: + :BEAMER_opt: shrink=5 + :END: +*** Свобода 0 + Свобода выполнять программу как вам угодно в любых целях. + +*** Свобода 1 + Свобода изучать работу программы и модифицировать + программу, чтобы она выполняла ваши вычисления, как вы + пожелаете. + +*** Свобода 2 + Свобода передавать копии + +*** Свобода 3 + Свобода передавать копии своих измененных версий другим. Этим вы + можете дать всему сообществу возможность получать выгоду от ваших + изменений. + +** Больше о GNU + Деятельность GNU, FSF и Ричарда Столлмана подробно описана в книге "[[https://en.wikipedia.org/wiki/Free_as_in_Freedom][Free as in + Freedom]]", которая доступна на русском языке. + + #+ATTR_LATEX: :width 100 + [[./gnu-book.jpeg]] + + https://www.gnu.org/ + +* Свобода +# Я только что перечислил какую свободу предоставляет проект GNU, но +# что же такое свобода. Это мгогранный термин, который +# интерпретируется в философии, политике и в целом разными людьми +# совершенно по разному. + +# Для этого доклада нам подойдёт самое просто определение свободы, +# взятое из Википедии. + +# К сожалению в использовании и написании софта мы редко бываем +# полностью свободны для реализации своей воли. +** Определение свободы +Свобо́да — состояние субъекта, в котором он является определяющей +причиной своих действий. + +# Определение свободы максимально обобщенно, поэтому мы будем +# рассматривать концепт свободы в разных контекстах. Контекст первый: +# свобода в использовании программ. Если свобода это то насколько мы +# как субъекты можем реализовывать свою волю в использовании программ, +# то несвобода это то, как мы не можем эту волю реализовать и миримся +# с различного рода ограничениями при взаимодействии с программой. + +# Довольно банальные примеры реализации воли у пользователя: +# Мне не нравится текст или цвет, хочу изменить, как мне это сделать +** Свобода в контексте использования программ + - Пользователь хочет изменить функционал программы + - Для этого необходимо получить и изучить исходный код + - У исходного кода должно быть разрешение на модификацию (открытая + или свободная лицензия) + - Только тогда мы свободны внести свои изменения в программу + +** Нюансы и сложности при модификации + - Закрытость кода или использование закрытых компонентов + - Недоступность документации API для изменений + - Технические сложности: сложная процедура изменения даже малейшей части кода + - Программа написана так, чтобы её не модифицировали (final классы, + private методы вот это всё) + - Собственническая организация приёма патчей и принятия решений +** Свобода в контексте GNU Emacs +GNU Emacs один из немногих редакторов, которые могут предоставить +свободу пользователю с наименьшими трудностями в реализации своих +идей. +** Свобода Emacs: Свобода модификации +GNU Emacs можно модифицировать практически как угодно. Не нравится +автокомплит, меняем или дописываем свой, не нравятся элементы +интерфейса убираем их, не нравится как выглядит кнопочка, у вас есть +средства чтобы исправить это. В мейнстримных редакторах так нельзя, а +если и можно, то есть существенные ограничения. В Emacs'е мы можем +менять не только конфигурацию, но и сам код используемых пакетов и +самого редактора. +** Свобода Emacs: Использование для любых целей +Вытекает из предыдущего. Так как у нас нет ограничений на модификацию, +то у нас появляется свобода использовать программу для любых +целей. Конечно Emacs в первую очередь заточен для работы с текстом, но +во-первых текст бывает разный, а во вторых Emacs покрывает некоторые +сферы применения без текста. Vim хоть кажется таким же свободным, этой +свободы не предоставляет, возможно это одно из фундаментальных +различий. +** Для чего можно использовать Emacs + * Literate Programming + * Создание TeX / LaTeX и иных документов документов + * Email / IRC / XMPP / Telega / Fediverse и т.д. + * Создание схем, графиков, рисование (ascii, svg) + * Открытие и зачастую редактирование почти любого файла (бинарный + файл, изображение, видео, аудио, презентация, документ pdf) + * Для управления системой (меняем громкость звука, убиваем + процессы, ставим пакеты) + * Можно использовать в качество WM (window manager) + * Играть в тетрис, шахматы и другие игры :) + +Одним словом возможности реализации функционала ограничены в основном +только желанием человека создать что-то новое. + +** Свобода Emacs: Любые способы взаимодействия +Немного вытекает из предыдущего, но с программой можно +взаимодействовать не тольк путем ввода текста с клавиатуры. + * Можно активно использовать мышь, а можно только клавиатуру + * Emacspeak позволяет использовать Emacs слепым людям + * Есть сенсорный ввод при помощи жестов + * Есть пакеты для голосового ввода + * Есть поддержка RTL (right to left) и огромного числа кодировок и + языков + * Можно с терминала, можно с графикой +** Emacs как интерфейс к операционной системе +Есть мнение, что Emacs настольно функциональный, что сам является +операционной системой. В целом это не так далеко от правды, так как +возможностей этого редактора хватает, чтобы много вещи операционной +системы заточить "под себя". Например нам не нравится взаимодействие с +программой, мы пишем для него обвязку, заточенную конкретно под нас, +которую мы можем менять в отличие от скомпиленной программы, в которой +чтобы провести малейшее изменение надо вложить немало времени. +** Обвязка ls: Dired +[[./dired.png]] + +Dired это файловый менеджер Emacs'а. Внутри он использует ls для +скорости, но его вывод мы можем редактировать под себя. Помимо того, +что мы можем можем удалять, создавать, редактировать файлы и +директории, Dired умеет открывать и создавать архивы. + +** Обвязка git: Magit +[[./magit.png]] +** Другие обвязки +Конечно всё обвязать таким образом невозможно, но для большинства +user-space программ мы можем использовать удобные для нас обвязки как +бы вместо редактирования самих этих программ. + * Обвязка всячески CLI утилит (git, gcc, gdb, make, ledger) + * Обвязка программ с графическим выхлопом (Latex) +** Lisp +Большинство свобод достигается благодаря использованию в качестве +языка расширения Emacs Lisp. Лисп -- один из старейших динамических +языков программирования, основанный на нетипизированном +лямбда-исчислении. Одной из удобнейших фич языка является его +динамичность, которая позволяет изменять программу в рантайме, а также +расширять сам язык при помощи макросов. Можно даже сказать, что Emacs +Lisp это не язык расширения, это Emacs просто является интерпретатором +Elisp. +** Почему Emacs Lisp даёт свободу +- Динамическая типизация +- Reflection +- Introspection +- Макросы +- Код есть данные / метациркулярный интерпретатор +- Мультипарадигма (ООП, ФП, Процедурщина) + +* Редакторы +** Что умеет Emacs чего не умеют другие + * Можно модифицировать сам редактор внутри редактора без + перезапуска + * Менять способы ввода (аккордные бинды, модальные бинды, + управление жестами, синтезаторы речи) + * Использовать систему версий отличную от Git + * Открывать любые файлы вне текущего проекта + * Открывать файлы на удалённом компьютере + * Открывать файлы через sudo + * Редактировать любой элемент интерфейса + * Не быть ограниченным форматом конфигурации и доступными настройками + * Жить 40+ лет и обновляться + +** Другие редакторы + Рассмотрим следующие текстовые редакторы, которые возможно + используют ваши друзья и коллеги: + + * IDE от JetBrains (PHPStorm, InttelliIDEA и т.д.) + * VS Code + * Sublime Text + * Vi/Vim/NeoVim + + За исключением вима данные редакторы не подходят для общего + назначения, большинство из них направлены именно на написание + кода. Тем не менее даже в более узкой специализации они имеют + серьезные изъяны. + +** Недостатки популярных редакторов +*** IDE от JetBrains + * Закрытый исходный код + * Плохая производительность, долгий отклик + * Узкая специализация (одно IDE на язык вместо одного окружения для всего) + * Неконсинстентность интерфейса +*** Sublime Text + * Закрытый исходный код + * Неконсинстентность интерфейса +** Недостатки популярных редакторов +*** VS Code + * Телеметрия + * Полузакрытость (Electron) + * Низкая производительность (Electron) + * Неконсистентность интерфейса +*** Vi/Vim/NeoVim + * Невозможно выйти + * Невозможно модифицировать и использовать для любых целей + (например выключить моды и сделать их как в имаксе) + ((если это возможно сделайте пожалуйста, в emacs есть evil)) +* Vim и Emacs +** Почему Emacs и Vim непопулярны + + #+ATTR_LATEX: :height 120 + [[./learning-curve.jpg]] + + Ответ: Кривая обучения + +** Миф: Emacs не настолько сложен + Мы видим, что вход в вим высокий. С другой стороны у Emacs кривая + обучения начинается с самого низа, но потом закручивается. Что это + значит? + +** Миф: Emacs не настолько сложен + GNU/Emacs имеет рядовые инструменты для работы с текстом: поддержка + мыши (выделение, скролл), стрелки, подсказки горячих клавиш, + различные менюшки. Emacs в изначальной поставке -- это что-то между + обычным текстовым редактором вроде notepad.exe и IDE. Тем не менее + Emacs имеет возможности расширения, которые позволяют превратить + его в нечто похожее на IDE и покрывать даже больше задач. +** M-x butterfly + #+ATTR_LATEX: :height 140 + [[./real_programmers.png]] + + Шуточная функция поставляется в GNU/Emacs после появления комикса. +** Схожести и отличия Emacs / Vim + #+ATTR_LATEX: :height 120 + [[./emacs-vim.png]] + Не смотря на то, что редакторы достаточно разительно отличаются + друг друга концептуально, на самом деле у них больше общего чем + может показаться. +** Схожести + | | *Emacs* | *Vim* | + |-------------------------+---------+-------| + | Интерфейс | Текст | Текст | + | Туториал | Есть | Есть | + | Расширяемый | Да | Да | + | Команды | M-x | : | + | Буферы | Есть | Есть | + | Файловый менеджер | Есть | Есть | + | Макросы | Есть | Есть | + | Автокомплит | Есть | Есть | + | Интеграция с терминалом | Есть | Есть | + +** Отличия + | | *Emacs* | *Vim* | + |-----------------+---------------+-------------| + | Ввод | Любые системы | Модальность | + | Язык расширений | Emacs Lisp | VimScript | + | Принципы | M-x butterfly | Unix Way | + | Документация | Info | Man | + | Основной клиент | Графика | Терминал | + + Подробнее о сравнении Vim и Emacs: + https://en.wikipedia.org/wiki/Editor_war + +** Что даёт графический клиент + - Правильно работающие бинды (например в консоли не сработает C-.) + - Управление мышью + - Отображение картинок, видео, граф. документов вроде pdf + - Отображение шрифта с лигатурами + - Всплывающие окна и дополнительные меню +** Evil + #+ATTR_LATEX: :height 25 + [[./evil.png]] + + *Evil-mode* -- это расширение для GNU/Emacs, которое эмулирует + Vim. Так как оба редактора работают со всеми объектами как с текстом, + то использование эмуляции Vim в Emacs более тривиальное, чем в + каком-нибудь IDE. Огромное количество пакетов Emacs предоставляют + биндинги для работы с Evil. +* Возможности GNU Emacs +** Что есть в GNU Emacs + * Реализация Client-Server архитектуры + * Рантайм Emacs Lisp с JIT компиляцией + * Аккордовые сочетания клавиш + * Макросы + * Встроенный пакетный менеджер + * Встроенный файловый менеджер + * Отображение номеров строк + * Работа с терминалом (ansi-term, eshell) + * Разделение на фреймы + * LSP клиент + * Поддержка большого числа языков программирования + * Поддержка спелл-чекера + * Встроенная система помощи (туториал, apropos, функции, бинды) +** Что есть в GNU/Emacs + * Интерактивные элементы (кнопки, формы и т.д.) + * Интерфейс к info и man + * Поиск + * Встроенный текстовый браузер eww + * Встроенные клиенты IRC и email + * Линтер кода Flymake + * Интерфейс к GDB + * Система контроля версий (не только git) + * Возможность удаленного редактирования кода (например через ssh) + * Org-mode для ведения заметок (и много чего еще) + * Можно читать документы pdf, docx и презентации + * Система учёта времени на работе timeclock (засекает 8 часов) + * M-x doctor (chatgpt до изобретения нейросетей) +** Биндинги Emacs + Биндинги в Emacs мнемонические. Это значит, что их легко запомнить, + так как буква биндинга практически всегда что-то обозначает. + - =C-n= Следующая строка (next) + - =C-p= Предыдущая строка (previous) + - =C-f= Вперед на символ (forward) + - =C-b= Назад на символ (back) + + Не все биндинги появились именно в Emacs. Emacs изначально был + расширением редактора TECO. + + Подробнее об истории биндингов Emacs и Vim: + http://xahlee.info/kbd/keyboard_hardware_and_key_choices.html +** Биндинги Emacs + Важным отличием биндингов в редакторе GNU/Emacs является то, что + они еще и аккордовыми. Это значит, что несколько комбинаций + следующих друг за другом могут что-то значить. Например: + - =C-x C-f= открыть файл + - =C-x s= сохранить файл + Набираемые аккордовые бинды отображаются в мод-лайне. Для сброса + существует биндинг *C-g*. + +** Биндинги Emacs (продолжение) + Не смотря на наличие аккордовых биндов, Emacs не ограничивается + только ими и в редакторе поддерживают свои модальные режимы и режим + совместимости с VIM. +** Emacs Lisp + Ядро редактора написано на языке C, остальное -- язык расширений + Emacs Lisp (25% C + 75% Elisp). Выглядит примерно так: + + #+BEGIN_SRC emacs-lisp + ;; Объявление и вызов функции + (defun имя-функции (аргументы) (тело функции)) + (имя-функция аргумент1 аргумент2) + + (defun hello (name) + (concat "Hello, " name)) ;; => hello + (hello "Mikhail") ;; => "Hello, Mikhail" + #+END_SRC +** Всё есть функция + Любое действие в редакторе представляет из себя функцию. + - Двинули курсор в начало строки -- функция beginning-of-line + - Сохранили файл -- функция save-buffer + - Вставили текст -- функция yank + + И так с любым действием. В VIM вероятно также. + +** Система помощи + В GNU/Emacs встроен туториал и очень удобная система помощи. + - =C-h t= Туториал (на русском языке) + - =C-h r= Мануал Emacs + - =C-h a= Apropos (по описанию находит нужную функцию) + - =C-h k= Describe-key (описывает функцию, прикрепленную к бинду) + - =C-h f= Describe-function (описывает функцию) + - =C-h m= Describe-mode + - =C-h i= Info +** Моды + *Мод* -- это модификация GNU/Emacs, которая включается при + определенном условии. + - Major мод может быть всего один, чаще всего вешается на открытие + файла определенного расширения. Например при открытие файла с + расширением .py запустится python-mode. + - Minor модов может быть неограниченное количество, они дополняют + функционал Major модов. Могут быть активированы всегда (имеют + префикс global-<название мода>) или при определенном условии. +** Мод-лайн + *Мод-лайн* отображает информацию об используемых модах и состоянии + файла (название, сохранён или нет, позиция курсора, система + контроля версий). Пользователь может расширить мод-лайн для показа + своей информации, например времени. Под мод-лайном располагает + Echo зона, которая даёт уведомления о работе модов, а также может + запрашивать ввод. +** Буфер + *Буфер* -- это обособленная память с текстом, которой манипулирует + имакс прежде чем писать на диск. Экран Emacs отображает буфера, + грубо говоря вы видите всегда как-минимум один буфер. При запуске + доступны следующие буферы: + - =*GNU EMACS*= -- начальный экран + - =*scratch*= -- площадка REPL для обкатывания Emacs Lisp + Бинды: + - =C-x b= -- сменить буфер + - =C-x C-b= -- список буферов +** Программирование + Поддерживаются языки: + - C + - Lisp и Scheme + - C++ + - Fortran + - Java + - Javascript + - Python + - Ruby + - Perl + - и множество других + Разумеется список можно расширить сторонними пакетами +** Программирование + Также для задач программирования доступны: + - Форматирование кода + - Компилирование программ + - Линтер Flymake, который на фоне проверяет текст программы + - Дебаггеры GDB, PDB, JDB и другие + - Интерфейс к grep + - Выполнение кода Emacs Lisp прямо в редакторе +** Система контроля версий + При программировании полезно использовать систему контроля + версий. Самая распространненая система -- git. Про другие системы + обычно забывают, но не в случае Emacs. Система контроля версий + Emacs поддерживает: + - Git + - Mercurial + - CVS + - Bazaar + - Subversion + - и другие + +** Org-mode + *Org-mode* -- Markdown на колёсах, декларативный формат описания + всего и вся, основанный на списке из уровней (Outline). С помощью + org-mode можно: + - Организовывать свою жизнь + - Создавать документы и презентации (latex) + - Использовать технику грамотного программирования + - Заменять Markdown + + https://orgmode.org/worg/org-tutorials/ +** Tramp + #+BEGIN_QUOTE + Вимеры могут привести в аргумент то, что их редактор уже доступен + на многих системам и ничего не надо докачивать и что можно + редактировать прямо на сервере. + #+END_QUOTE + В Emacs вы можете редактировать удалённые файлы через ssh, + использую Tramp. Выглядеть это будет также как вы редактируете всё + на своей родной системе. В Vim редактирование на сервере работает + только при условии отсутствия конфигурации, в Emacs +** Кастомизация + [[./customize.png]] + =M-x customize= открывает GUI, позволяющий редактировать поведение + и внешний вид Emacs. +** .emacs / init.el + В качестве конфигурации Emacs использует один из следующих файлов в домашней директории: + - ~/.emacs + - ~/.emacs.d/init.el + + Файл конфигурации содержит листинг кода на Emacs Lisp, который + Emacs вычисляет при запуске программы. Чтобы создавать конфиг Emacs + вовсе необязательно в идеале владеть Emacs Lisp. +** Пакетный менеджер package.el + Для расширения предусмотрен пакетный менеджер, который уже встроен + в редактор. По-умолчанию доступен только один официальный + репозиторий Elpa, но пользователь может подключать сторонние + (например Melpa). + - =M-x list-packages= -- список пакетов, доступных в репозиториях + - =M-x package-install <название пакета>= -- установка пакета из репозитория + +** use-package + *use-package* -- это декларативная обёртка от сообщества для + package.el. Рекомендую использовать use-package, чтобы ваш конфиг + не превратился со временем в нечитаемое месиво. + - =:config= -- изолирует конфигурацию пакетов друг от друга + - =:hook= -- короткая запись для навешивания хуков + - =:ensure= -- загружает пакет из репозитория + - =:diminish= -- скрывает мод из модлайна + - и другие опции + +* Дистрибутивы +** Vanilla +Emacs, который поставляется на большинстве систем без готовой +конфигурации. + +[[./emacs-vanilla.png]] + +https://www.gnu.org/software/emacs/ +** Doom Emacs +Emacs с поддержкой vim и emacs биндов и тонной пакетов на все случаи жизни + +[[./emacs-doom.png]] + +https://github.com/doomemacs/doomemacs +** Spacemacs +По сути тоже самое, что Doom, но старее и медленнее. + +[[./emacs-spacemacs.png]] + +https://www.spacemacs.org/ +** Prelude +Расширяет дефолтный Emacs, но не настолько сильно как Doom и +Spacemacs. Пытается придерживаться "Sane Defaults".\\ + +https://prelude.emacsredux.com/en/latest/ +* Материалы по Emacs +** Изучение Emacs внутри Emacs + * (*C-h t*) Help => Emacs Tutorial + * (*C-h r*) Info emacs manual + * Introduction to Emacs Lisp +** Книги + :PROPERTIES: + :BEAMER_opt: shrink=10 + :END: +*** Mastering Emacs + #+ATTR_LATEX: :height 80 + [[./mastering-emacs.png]] + + https://masteringemacs.org +*** Learning Gnu Emacs + #+ATTR_LATEX: :height 80 + [[./learning-emacs.jpg]] + + https://dl.acm.org/doi/book/10.5555/2167272 +** Заключение +GNU Emacs имеет широкие возможности модификации самого себя, что +предоставляет нам как пользователям реализовывать свои задумки с +гораздом меньшим количеством преград чем в других решениях. + +[[./prot.png]] +Есть похожий доклад, который рекомендую посмотреть. +** Вопросы? + +- https://fosstodon.org/@w96k +- [[https://w96k.dev]] + +#+ATTR_LATEX: :height 50 +[[./wk-logo.png]] + +Заходите в русскоязычный Emacs чат в Telegram, если вас там нет: +- https://t.me/emacs_ru |