diff options
Diffstat (limited to 'content/presentations/emacs')
14 files changed, 1365 insertions, 0 deletions
diff --git a/content/presentations/emacs/dired.png b/content/presentations/emacs/dired.png Binary files differnew file mode 100644 index 0000000..0569ccf --- /dev/null +++ b/content/presentations/emacs/dired.png diff --git a/content/presentations/emacs/emacs-doom.png b/content/presentations/emacs/emacs-doom.png Binary files differnew file mode 100644 index 0000000..477c142 --- /dev/null +++ b/content/presentations/emacs/emacs-doom.png diff --git a/content/presentations/emacs/emacs-spacemacs.png b/content/presentations/emacs/emacs-spacemacs.png Binary files differnew file mode 100644 index 0000000..2ba61ed --- /dev/null +++ b/content/presentations/emacs/emacs-spacemacs.png diff --git a/content/presentations/emacs/emacs-splash.png b/content/presentations/emacs/emacs-splash.png Binary files differnew file mode 100644 index 0000000..a2b8d7f --- /dev/null +++ b/content/presentations/emacs/emacs-splash.png diff --git a/content/presentations/emacs/emacs-vanilla.png b/content/presentations/emacs/emacs-vanilla.png Binary files differnew file mode 100644 index 0000000..4f630e3 --- /dev/null +++ b/content/presentations/emacs/emacs-vanilla.png 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 diff --git a/content/presentations/emacs/emacs-what-user-freedom-is-about.pdf b/content/presentations/emacs/emacs-what-user-freedom-is-about.pdf Binary files differnew file mode 100644 index 0000000..76bb3a4 --- /dev/null +++ b/content/presentations/emacs/emacs-what-user-freedom-is-about.pdf diff --git a/content/presentations/emacs/emacs-what-user-freedom-is-about.tex b/content/presentations/emacs/emacs-what-user-freedom-is-about.tex new file mode 100644 index 0000000..3df2f14 --- /dev/null +++ b/content/presentations/emacs/emacs-what-user-freedom-is-about.tex @@ -0,0 +1,759 @@ +% Created 2023-11-26 Sun 14:10 +% Intended LaTeX compiler: pdflatex +\documentclass[article,11pt,notitlepage,notitle,oneside,twocolumn]{beamer} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{graphicx} +\usepackage{longtable} +\usepackage{wrapfig} +\usepackage{rotating} +\usepackage[normalem]{ulem} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{capt-of} +\usepackage{hyperref} +\usepackage[russian]{babel} +\usepackage[protrusion=true,activate={true,nocompatibility},final,tracking=true,kerning=true,spacing=true,factor=1100]{microtype}\SetTracking{encoding={*}, shape=sc}{40} +\usetheme{Goettingen} +\usecolortheme{default} +\author{CC-0: No Rights Reserved} +\date{\href{https://w96k.dev}{w96k.dev} \textit{<2023-11-25 Sat>}} +\title{Emacs: what user freedom is about} +\hypersetup{ + pdfauthor={CC-0: No Rights Reserved}, + pdftitle={Emacs: what user freedom is about}, + pdfkeywords={}, + pdfsubject={}, + pdfcreator={Emacs 29.1 (Org mode 9.6.6)}, + pdflang={Russian}} +\begin{document} + +\maketitle + +\section*{Вступление} +\label{sec:org15a6e21} + +\begin{frame}[label={sec:org735be7b}]{Для кого доклад} +Доклад нацелен в первую очередь на тех, кто по тем или иным причинам +не знаком с редактором GNU Emacs и хотел бы узнать причины для начала +его использования. Одна из таких причин — свобода. +\end{frame} + +\section*{GNU} +\label{sec:orgbfac1ca} +\begin{frame}[label={sec:org2e4822d}]{GNU/Emacs} +\begin{center} +\includegraphics[width=100]{./emacs.png} +\end{center} \alert{GNU/Emacs} -- это свободный немодальный текстовый +редактор общего назначения, созданный в 1985 году Ричардом +Столлманом. Редактор обновляется по сей день и доступен на многих +платформах в том числе Windows. +\end{frame} + +\begin{frame}[label={sec:org0d80ccd}]{Кто использовал Emacs} +Имаксом в той или иной степени пользовались следующие люди: +\begin{itemize} +\item \href{https://en.wikipedia.org/wiki/Linus\_Torvald}{Linus Torvalds} +\item \href{https://en.wikipedia.org/wiki/Donald\_Knuth}{Donald Knuth} +\item \href{https://en.wikipedia.org/wiki/Yukihiro\_Matsumoto}{Yukihiro Matsumoto} +\item \href{https://en.wikipedia.org/wiki/Guido\_van\_rossum}{Guido van Rossum} +\item \href{https://en.wikipedia.org/wiki/Rich\_Hickey}{Rich Hickey} +\item \href{https://en.wikipedia.org/wiki/Joe\_Armstrong\_(programmer)}{Joe Armstrong} +\item \href{https://en.wikipedia.org/wiki/Eric\_Raymond}{Eric Raymond} +\item \href{https://en.wikipedia.org/wiki/Andrei\_Alexandrescu}{Andrei Alexandrescu} +\item \href{https://en.wikipedia.org/wiki/Edward\_Snowden}{Edward Snowden} +\end{itemize} +\end{frame} + +\begin{frame}[label={sec:orgfe786b2}]{Главный экран} +\begin{center} +\includegraphics[height=100]{./emacs-splash.png} +\end{center} + +Если открыть Имакс, то нас встретит следующая надпись:\\[0pt] + + +\alert{Welcome to GNU Emacs, one component of the GNU/Linux operating system.} + + +Что это значит? +\end{frame} + +\begin{frame}[label={sec:org55b1b54}]{GNU is not Unix} +\begin{center} +\includegraphics[height=60]{./gnu.png} +\end{center} + +\alert{GNU} -- это проект фонда свободного программного обеспечения, который +содержит ПО, следующее четырём свободам: +\end{frame} + +\begin{frame}[label={sec:org26b0f79},shrink=5]{Свободы GNU} +\begin{block}{Свобода 0} +Свобода выполнять программу как вам угодно в любых целях. +\end{block} + +\begin{block}{Свобода 1} +Свобода изучать работу программы и модифицировать +программу, чтобы она выполняла ваши вычисления, как вы +пожелаете. +\end{block} + +\begin{block}{Свобода 2} +Свобода передавать копии +\end{block} + +\begin{block}{Свобода 3} +Свобода передавать копии своих измененных версий другим. Этим вы +можете дать всему сообществу возможность получать выгоду от ваших +изменений. +\end{block} +\end{frame} + +\begin{frame}[label={sec:org201acd4}]{Больше о GNU} +Деятельность GNU, FSF и Ричарда Столлмана подробно описана в книге "\href{https://en.wikipedia.org/wiki/Free\_as\_in\_Freedom}{Free as in +Freedom}", которая доступна на русском языке. + +\begin{center} +\includegraphics[width=100]{./gnu-book.jpeg} +\end{center} + +\url{https://www.gnu.org/} +\end{frame} + +\section*{Свобода} +\label{sec:org9bbd9ff} +\begin{frame}[label={sec:orga804a62}]{Определение свободы} +Свобо́да — состояние субъекта, в котором он является определяющей +причиной своих действий. +\end{frame} +\begin{frame}[label={sec:org78bf4ef}]{Свобода в контексте использования программ} +\begin{itemize} +\item Пользователь хочет изменить функционал программы +\item Для этого необходимо получить и изучить исходный код +\item У исходного кода должно быть разрешение на модификацию (открытая +или свободная лицензия) +\item Только тогда мы свободны внести свои изменения в программу +\end{itemize} +\end{frame} + +\begin{frame}[label={sec:org190483a}]{Нюансы и сложности при модификации} +\begin{itemize} +\item Закрытость кода или использование закрытых компонентов +\item Недоступность документации API для изменений +\item Технические сложности: сложная процедура изменения даже малейшей части кода +\item Программа написана так, чтобы её не модифицировали (final классы, +private методы вот это всё) +\item Собственническая организация приёма патчей и принятия решений +\end{itemize} +\end{frame} +\begin{frame}[label={sec:org6a6bc8f}]{Свобода в контексте GNU Emacs} +GNU Emacs один из немногих редакторов, которые могут предоставить +свободу пользователю с наименьшими трудностями в реализации своих +идей. +\end{frame} +\begin{frame}[label={sec:org70e5356}]{Свобода Emacs: Свобода модификации} +GNU Emacs можно модифицировать практически как угодно. Не нравится +автокомплит, меняем или дописываем свой, не нравятся элементы +интерфейса убираем их, не нравится как выглядит кнопочка, у вас есть +средства чтобы исправить это. В мейнстримных редакторах так нельзя, а +если и можно, то есть существенные ограничения. В Emacs'е мы можем +менять не только конфигурацию, но и сам код используемых пакетов и +самого редактора. +\end{frame} +\begin{frame}[label={sec:org7d1f29e}]{Свобода Emacs: Использование для любых целей} +Вытекает из предыдущего. Так как у нас нет ограничений на модификацию, +то у нас появляется свобода использовать программу для любых +целей. Конечно Emacs в первую очередь заточен для работы с текстом, но +во-первых текст бывает разный, а во вторых Emacs покрывает некоторые +сферы применения без текста. Vim хоть кажется таким же свободным, этой +свободы не предоставляет, возможно это одно из фундаментальных +различий. +\end{frame} +\begin{frame}[label={sec:orgce6d726}]{Для чего можно использовать Emacs} +\begin{itemize} +\item Literate Programming +\item Создание \TeX{} / \LaTeX{} и иных документов документов +\item Email / IRC / XMPP / Telega / Fediverse и т.д. +\item Создание схем, графиков, рисование (ascii, svg) +\item Открытие и зачастую редактирование почти любого файла (бинарный +файл, изображение, видео, аудио, презентация, документ pdf) +\item Для управления системой (меняем громкость звука, убиваем +процессы, ставим пакеты) +\item Можно использовать в качество WM (window manager) +\item Играть в тетрис, шахматы и другие игры :) +\end{itemize} + +Одним словом возможности реализации функционала ограничены в основном +только желанием человека создать что-то новое. +\end{frame} + +\begin{frame}[label={sec:org828d558}]{Свобода Emacs: Любые способы взаимодействия} +Немного вытекает из предыдущего, но с программой можно +взаимодействовать не тольк путем ввода текста с клавиатуры. +\begin{itemize} +\item Можно активно использовать мышь, а можно только клавиатуру +\item Emacspeak позволяет использовать Emacs слепым людям +\item Есть сенсорный ввод при помощи жестов +\item Есть пакеты для голосового ввода +\item Есть поддержка RTL (right to left) и огромного числа кодировок и +языков +\item Можно с терминала, можно с графикой +\end{itemize} +\end{frame} +\begin{frame}[label={sec:orgd3e6222}]{Emacs как интерфейс к операционной системе} +Есть мнение, что Emacs настольно функциональный, что сам является +операционной системой. В целом это не так далеко от правды, так как +возможностей этого редактора хватает, чтобы много вещи операционной +системы заточить "под себя". Например нам не нравится взаимодействие с +программой, мы пишем для него обвязку, заточенную конкретно под нас, +которую мы можем менять в отличие от скомпиленной программы, в которой +чтобы провести малейшее изменение надо вложить немало времени. +\end{frame} +\begin{frame}[label={sec:org51b4ff9}]{Обвязка ls: Dired} +\begin{center} +\includegraphics[width=.9\linewidth]{./dired.png} +\end{center} + +Dired это файловый менеджер Emacs'а. Внутри он использует ls для +скорости, но его вывод мы можем редактировать под себя. Помимо того, +что мы можем можем удалять, создавать, редактировать файлы и +директории, Dired умеет открывать и создавать архивы. +\end{frame} + +\begin{frame}[label={sec:orgb835e36}]{Обвязка git: Magit} +\begin{center} +\includegraphics[width=.9\linewidth]{./magit.png} +\end{center} +\end{frame} +\begin{frame}[label={sec:org470d783}]{Другие обвязки} +Конечно всё обвязать таким образом невозможно, но для большинства +user-space программ мы можем использовать удобные для нас обвязки как +бы вместо редактирования самих этих программ. +\begin{itemize} +\item Обвязка всячески CLI утилит (git, gcc, gdb, make, ledger) +\item Обвязка программ с графическим выхлопом (Latex) +\end{itemize} +\end{frame} +\begin{frame}[label={sec:org83d0ded}]{Lisp} +Большинство свобод достигается благодаря использованию в качестве +языка расширения Emacs Lisp. Лисп -- один из старейших динамических +языков программирования, основанный на нетипизированном +лямбда-исчислении. Одной из удобнейших фич языка является его +динамичность, которая позволяет изменять программу в рантайме, а также +расширять сам язык при помощи макросов. Можно даже сказать, что Emacs +Lisp это не язык расширения, это Emacs просто является интерпретатором +Elisp. +\end{frame} +\begin{frame}[label={sec:org914c22b}]{Почему Emacs Lisp даёт свободу} +\begin{itemize} +\item Динамическая типизация +\item Reflection +\item Introspection +\item Макросы +\item Код есть данные / метациркулярный интерпретатор +\item Мультипарадигма (ООП, ФП, Процедурщина) +\end{itemize} +\end{frame} + +\section*{Редакторы} +\label{sec:org0c79e81} +\begin{frame}[label={sec:orga4c5425}]{Что умеет Emacs чего не умеют другие} +\begin{itemize} +\item Можно модифицировать сам редактор внутри редактора без +перезапуска +\item Менять способы ввода (аккордные бинды, модальные бинды, +управление жестами, синтезаторы речи) +\item Использовать систему версий отличную от Git +\item Открывать любые файлы вне текущего проекта +\begin{itemize} +\item Открывать файлы на удалённом компьютере +\item Открывать файлы через sudo +\end{itemize} +\item Редактировать любой элемент интерфейса +\item Не быть ограниченным форматом конфигурации и доступными настройками +\item Жить 40+ лет и обновляться +\end{itemize} +\end{frame} + +\begin{frame}[label={sec:org51257c8}]{Другие редакторы} +Рассмотрим следующие текстовые редакторы, которые возможно +используют ваши друзья и коллеги: + +\begin{itemize} +\item IDE от JetBrains (PHPStorm, InttelliIDEA и т.д.) +\item VS Code +\item Sublime Text +\item Vi/Vim/NeoVim +\end{itemize} + +За исключением вима данные редакторы не подходят для общего +назначения, большинство из них направлены именно на написание +кода. Тем не менее даже в более узкой специализации они имеют +серьезные изъяны. +\end{frame} + +\begin{frame}[label={sec:orgc15dfc1}]{Недостатки популярных редакторов} +\begin{block}{IDE от JetBrains} +\begin{itemize} +\item Закрытый исходный код +\item Плохая производительность, долгий отклик +\item Узкая специализация (одно IDE на язык вместо одного окружения для всего) +\item Неконсинстентность интерфейса +\end{itemize} +\end{block} +\begin{block}{Sublime Text} +\begin{itemize} +\item Закрытый исходный код +\item Неконсинстентность интерфейса +\end{itemize} +\end{block} +\end{frame} +\begin{frame}[label={sec:org1932c60}]{Недостатки популярных редакторов} +\begin{block}{VS Code} +\begin{itemize} +\item Телеметрия +\item Полузакрытость (Electron) +\item Низкая производительность (Electron) +\item Неконсистентность интерфейса +\end{itemize} +\end{block} +\begin{block}{Vi/Vim/NeoVim} +\begin{itemize} +\item Невозможно выйти +\item Невозможно модифицировать и использовать для любых целей +(например выключить моды и сделать их как в имаксе) +((если это возможно сделайте пожалуйста, в emacs есть evil)) +\end{itemize} +\end{block} +\end{frame} +\section*{Vim и Emacs} +\label{sec:org22ebbce} +\begin{frame}[label={sec:org25fb9b9}]{Почему Emacs и Vim непопулярны} +\begin{center} +\includegraphics[height=120]{./learning-curve.jpg} +\end{center} + +Ответ: Кривая обучения +\end{frame} + +\begin{frame}[label={sec:org9f60009}]{Миф: Emacs не настолько сложен} +Мы видим, что вход в вим высокий. С другой стороны у Emacs кривая +обучения начинается с самого низа, но потом закручивается. Что это +значит? +\end{frame} + +\begin{frame}[label={sec:org215fabc}]{Миф: Emacs не настолько сложен} +GNU/Emacs имеет рядовые инструменты для работы с текстом: поддержка +мыши (выделение, скролл), стрелки, подсказки горячих клавиш, +различные менюшки. Emacs в изначальной поставке -- это что-то между +обычным текстовым редактором вроде notepad.exe и IDE. Тем не менее +Emacs имеет возможности расширения, которые позволяют превратить +его в нечто похожее на IDE и покрывать даже больше задач. +\end{frame} +\begin{frame}[label={sec:orgae103b6}]{M-x butterfly} +\begin{center} +\includegraphics[height=140]{./real_programmers.png} +\end{center} + +Шуточная функция поставляется в GNU/Emacs после появления комикса. +\end{frame} +\begin{frame}[label={sec:orga0378c3}]{Схожести и отличия Emacs / Vim} +\begin{center} +\includegraphics[height=120]{./emacs-vim.png} +\end{center} +Не смотря на то, что редакторы достаточно разительно отличаются +друг друга концептуально, на самом деле у них больше общего чем +может показаться. +\end{frame} +\begin{frame}[label={sec:orgc718feb}]{Схожести} +\begin{center} +\begin{tabular}{lll} + & \alert{Emacs} & \alert{Vim}\\[0pt] +\hline +Интерфейс & Текст & Текст\\[0pt] +Туториал & Есть & Есть\\[0pt] +Расширяемый & Да & Да\\[0pt] +Команды & M-x & :\\[0pt] +Буферы & Есть & Есть\\[0pt] +Файловый менеджер & Есть & Есть\\[0pt] +Макросы & Есть & Есть\\[0pt] +Автокомплит & Есть & Есть\\[0pt] +Интеграция с терминалом & Есть & Есть\\[0pt] +\end{tabular} +\end{center} +\end{frame} + +\begin{frame}[label={sec:orgca9027f}]{Отличия} +\begin{center} +\begin{tabular}{lll} + & \alert{Emacs} & \alert{Vim}\\[0pt] +\hline +Ввод & Любые системы & Модальность\\[0pt] +Язык расширений & Emacs Lisp & VimScript\\[0pt] +Принципы & M-x butterfly & Unix Way\\[0pt] +Документация & Info & Man\\[0pt] +Основной клиент & Графика & Терминал\\[0pt] +\end{tabular} +\end{center} + +Подробнее о сравнении Vim и Emacs: +\url{https://en.wikipedia.org/wiki/Editor\_war} +\end{frame} + +\begin{frame}[label={sec:org8fe85d2}]{Что даёт графический клиент} +\begin{itemize} +\item Правильно работающие бинды (например в консоли не сработает C-.) +\item Управление мышью +\item Отображение картинок, видео, граф. документов вроде pdf +\item Отображение шрифта с лигатурами +\item Всплывающие окна и дополнительные меню +\end{itemize} +\end{frame} +\begin{frame}[label={sec:org21b2fbe}]{Evil} +\begin{center} +\includegraphics[height=25]{./evil.png} +\end{center} + +\alert{Evil-mode} -- это расширение для GNU/Emacs, которое эмулирует +Vim. Так как оба редактора работают со всеми объектами как с текстом, +то использование эмуляции Vim в Emacs более тривиальное, чем в +каком-нибудь IDE. Огромное количество пакетов Emacs предоставляют +биндинги для работы с Evil. +\end{frame} +\section*{Возможности GNU Emacs} +\label{sec:org45c2af9} +\begin{frame}[label={sec:org1b1c3f4}]{Что есть в GNU Emacs} +\begin{itemize} +\item Реализация Client-Server архитектуры +\item Рантайм Emacs Lisp с JIT компиляцией +\item Аккордовые сочетания клавиш +\item Макросы +\item Встроенный пакетный менеджер +\item Встроенный файловый менеджер +\item Отображение номеров строк +\item Работа с терминалом (ansi-term, eshell) +\item Разделение на фреймы +\item LSP клиент +\item Поддержка большого числа языков программирования +\item Поддержка спелл-чекера +\item Встроенная система помощи (туториал, apropos, функции, бинды) +\end{itemize} +\end{frame} +\begin{frame}[label={sec:org94c269c}]{Что есть в GNU/Emacs} +\begin{itemize} +\item Интерактивные элементы (кнопки, формы и т.д.) +\item Интерфейс к info и man +\item Поиск +\item Встроенный текстовый браузер eww +\item Встроенные клиенты IRC и email +\item Линтер кода Flymake +\item Интерфейс к GDB +\item Система контроля версий (не только git) +\item Возможность удаленного редактирования кода (например через ssh) +\item Org-mode для ведения заметок (и много чего еще) +\item Можно читать документы pdf, docx и презентации +\item Система учёта времени на работе timeclock (засекает 8 часов) +\item M-x doctor (chatgpt до изобретения нейросетей) +\end{itemize} +\end{frame} +\begin{frame}[label={sec:org8cb7acd},fragile]{Биндинги Emacs} + Биндинги в Emacs мнемонические. Это значит, что их легко запомнить, +так как буква биндинга практически всегда что-то обозначает. +\begin{itemize} +\item \texttt{C-n} Следующая строка (next) +\item \texttt{C-p} Предыдущая строка (previous) +\item \texttt{C-f} Вперед на символ (forward) +\item \texttt{C-b} Назад на символ (back) +\end{itemize} + +Не все биндинги появились именно в Emacs. Emacs изначально был +расширением редактора TECO. + +Подробнее об истории биндингов Emacs и Vim: +\url{http://xahlee.info/kbd/keyboard\_hardware\_and\_key\_choices.html} +\end{frame} +\begin{frame}[label={sec:orgfbee6eb},fragile]{Биндинги Emacs} + Важным отличием биндингов в редакторе GNU/Emacs является то, что +они еще и аккордовыми. Это значит, что несколько комбинаций +следующих друг за другом могут что-то значить. Например: +\begin{itemize} +\item \texttt{C-x C-f} открыть файл +\item \texttt{C-x s} сохранить файл +\end{itemize} +Набираемые аккордовые бинды отображаются в мод-лайне. Для сброса +существует биндинг \alert{C-g}. +\end{frame} + +\begin{frame}[label={sec:orgace28bc}]{Биндинги Emacs (продолжение)} +Не смотря на наличие аккордовых биндов, Emacs не ограничивается +только ими и в редакторе поддерживают свои модальные режимы и режим +совместимости с VIM. +\end{frame} +\begin{frame}[label={sec:org1e34048},fragile]{Emacs Lisp} + Ядро редактора написано на языке C, остальное -- язык расширений +Emacs Lisp (25\% C + 75\% Elisp). Выглядит примерно так: + +\begin{verbatim} +;; Объявление и вызов функции +(defun имя-функции (аргументы) (тело функции)) +(имя-функция аргумент1 аргумент2) + +(defun hello (name) + (concat "Hello, " name)) ;; => hello +(hello "Mikhail") ;; => "Hello, Mikhail" +\end{verbatim} +\end{frame} +\begin{frame}[label={sec:orge354670}]{Всё есть функция} +Любое действие в редакторе представляет из себя функцию. +\begin{itemize} +\item Двинули курсор в начало строки -- функция beginning-of-line +\item Сохранили файл -- функция save-buffer +\item Вставили текст -- функция yank +\end{itemize} + +И так с любым действием. В VIM вероятно также. +\end{frame} + +\begin{frame}[label={sec:org8d7bac0},fragile]{Система помощи} + В GNU/Emacs встроен туториал и очень удобная система помощи. +\begin{itemize} +\item \texttt{C-h t} Туториал (на русском языке) +\item \texttt{C-h r} Мануал Emacs +\item \texttt{C-h a} Apropos (по описанию находит нужную функцию) +\item \texttt{C-h k} Describe-key (описывает функцию, прикрепленную к бинду) +\item \texttt{C-h f} Describe-function (описывает функцию) +\item \texttt{C-h m} Describe-mode +\item \texttt{C-h i} Info +\end{itemize} +\end{frame} +\begin{frame}[label={sec:org9d7948e}]{Моды} +\alert{Мод} -- это модификация GNU/Emacs, которая включается при + определенном условии. +\begin{itemize} +\item Major мод может быть всего один, чаще всего вешается на открытие +файла определенного расширения. Например при открытие файла с +расширением .py запустится python-mode. +\item Minor модов может быть неограниченное количество, они дополняют +функционал Major модов. Могут быть активированы всегда (имеют +префикс global-<название мода>) или при определенном условии. +\end{itemize} +\end{frame} +\begin{frame}[label={sec:orgfb5b098}]{Мод-лайн} +\alert{Мод-лайн} отображает информацию об используемых модах и состоянии + файла (название, сохранён или нет, позиция курсора, система + контроля версий). Пользователь может расширить мод-лайн для показа + своей информации, например времени. Под мод-лайном располагает + Echo зона, которая даёт уведомления о работе модов, а также может + запрашивать ввод. +\end{frame} +\begin{frame}[label={sec:org7b8cc76},fragile]{Буфер} + \alert{Буфер} -- это обособленная память с текстом, которой манипулирует +имакс прежде чем писать на диск. Экран Emacs отображает буфера, +грубо говоря вы видите всегда как-минимум один буфер. При запуске +доступны следующие буферы: +\begin{itemize} +\item \texttt{*GNU EMACS*} -- начальный экран +\item \texttt{*scratch*} -- площадка REPL для обкатывания Emacs Lisp +\end{itemize} +Бинды: +\begin{itemize} +\item \texttt{C-x b} -- сменить буфер +\item \texttt{C-x C-b} -- список буферов +\end{itemize} +\end{frame} +\begin{frame}[label={sec:orga540e72}]{Программирование} +Поддерживаются языки: +\begin{itemize} +\item C +\item Lisp и Scheme +\item C++ +\item Fortran +\item Java +\item Javascript +\item Python +\item Ruby +\item Perl +\item и множество других +\end{itemize} +Разумеется список можно расширить сторонними пакетами +\end{frame} +\begin{frame}[label={sec:org68194c7}]{Программирование} +Также для задач программирования доступны: +\begin{itemize} +\item Форматирование кода +\item Компилирование программ +\item Линтер Flymake, который на фоне проверяет текст программы +\item Дебаггеры GDB, PDB, JDB и другие +\item Интерфейс к grep +\item Выполнение кода Emacs Lisp прямо в редакторе +\end{itemize} +\end{frame} +\begin{frame}[label={sec:org157df92}]{Система контроля версий} +При программировании полезно использовать систему контроля +версий. Самая распространненая система -- git. Про другие системы +обычно забывают, но не в случае Emacs. Система контроля версий +Emacs поддерживает: +\begin{itemize} +\item Git +\item Mercurial +\item CVS +\item Bazaar +\item Subversion +\item и другие +\end{itemize} +\end{frame} + +\begin{frame}[label={sec:org4bf4ab3}]{Org-mode} +\alert{Org-mode} -- Markdown на колёсах, декларативный формат описания + всего и вся, основанный на списке из уровней (Outline). С помощью + org-mode можно: +\begin{itemize} +\item Организовывать свою жизнь +\item Создавать документы и презентации (latex) +\item Использовать технику грамотного программирования +\item Заменять Markdown +\end{itemize} + +\url{https://orgmode.org/worg/org-tutorials/} +\end{frame} +\begin{frame}[label={sec:org7031564}]{Tramp} +\begin{quote} +Вимеры могут привести в аргумент то, что их редактор уже доступен +на многих системам и ничего не надо докачивать и что можно +редактировать прямо на сервере. +\end{quote} +В Emacs вы можете редактировать удалённые файлы через ssh, +использую Tramp. Выглядеть это будет также как вы редактируете всё +на своей родной системе. В Vim редактирование на сервере работает +только при условии отсутствия конфигурации, в Emacs +\end{frame} +\begin{frame}[label={sec:org759bf16},fragile]{Кастомизация} + \begin{center} +\includegraphics[width=.9\linewidth]{./customize.png} +\end{center} +\texttt{M-x customize} открывает GUI, позволяющий редактировать поведение +и внешний вид Emacs. +\end{frame} +\begin{frame}[label={sec:org5267aa1}]{.emacs / init.el} +В качестве конфигурации Emacs использует один из следующих файлов в домашней директории: +\begin{itemize} +\item \textasciitilde{}/.emacs +\item \textasciitilde{}/.emacs.d/init.el +\end{itemize} + +Файл конфигурации содержит листинг кода на Emacs Lisp, который +Emacs вычисляет при запуске программы. Чтобы создавать конфиг Emacs +вовсе необязательно в идеале владеть Emacs Lisp. +\end{frame} +\begin{frame}[label={sec:org3f75b3c},fragile]{Пакетный менеджер package.el} + Для расширения предусмотрен пакетный менеджер, который уже встроен +в редактор. По-умолчанию доступен только один официальный +репозиторий Elpa, но пользователь может подключать сторонние +(например Melpa). +\begin{itemize} +\item \texttt{M-x list-packages} -- список пакетов, доступных в репозиториях +\item \texttt{M-x package-install <название пакета>} -- установка пакета из репозитория +\end{itemize} +\end{frame} + +\begin{frame}[label={sec:org0c37de3},fragile]{use-package} + \alert{use-package} -- это декларативная обёртка от сообщества для + package.el. Рекомендую использовать use-package, чтобы ваш конфиг + не превратился со временем в нечитаемое месиво. +\begin{itemize} +\item \texttt{:config} -- изолирует конфигурацию пакетов друг от друга +\item \texttt{:hook} -- короткая запись для навешивания хуков +\item \texttt{:ensure} -- загружает пакет из репозитория +\item \texttt{:diminish} -- скрывает мод из модлайна +\item и другие опции +\end{itemize} +\end{frame} + +\section*{Дистрибутивы} +\label{sec:orga045702} +\begin{frame}[label={sec:orgf602764}]{Vanilla} +Emacs, который поставляется на большинстве систем без готовой +конфигурации. + +\begin{center} +\includegraphics[width=.9\linewidth]{./emacs-vanilla.png} +\end{center} + +\url{https://www.gnu.org/software/emacs/} +\end{frame} +\begin{frame}[label={sec:orgafffedd}]{Doom Emacs} +Emacs с поддержкой vim и emacs биндов и тонной пакетов на все случаи жизни + +\begin{center} +\includegraphics[width=.9\linewidth]{./emacs-doom.png} +\end{center} + +\url{https://github.com/doomemacs/doomemacs} +\end{frame} +\begin{frame}[label={sec:orgacb615f}]{Spacemacs} +По сути тоже самое, что Doom, но старее и медленнее. + +\begin{center} +\includegraphics[width=.9\linewidth]{./emacs-spacemacs.png} +\end{center} + +\url{https://www.spacemacs.org/} +\end{frame} +\begin{frame}[label={sec:org6a4511a}]{Prelude} +Расширяет дефолтный Emacs, но не настолько сильно как Doom и +Spacemacs. Пытается придерживаться "Sane Defaults".\\[0pt] + +\url{https://prelude.emacsredux.com/en/latest/} +\end{frame} +\section*{Материалы по Emacs} +\label{sec:org5e52afa} +\begin{frame}[label={sec:org5eac8c3}]{Изучение Emacs внутри Emacs} +\begin{itemize} +\item (\alert{C-h t}) Help => Emacs Tutorial +\item (\alert{C-h r}) Info emacs manual +\item Introduction to Emacs Lisp +\end{itemize} +\end{frame} +\begin{frame}[label={sec:org9645604},shrink=10]{Книги} +\begin{block}{Mastering Emacs} +\begin{center} +\includegraphics[height=80]{./mastering-emacs.png} +\end{center} + +\url{https://masteringemacs.org} +\end{block} +\begin{block}{Learning Gnu Emacs} +\begin{center} +\includegraphics[height=80]{./learning-emacs.jpg} +\end{center} + +\url{https://dl.acm.org/doi/book/10.5555/2167272} +\end{block} +\end{frame} +\begin{frame}[label={sec:org9a25e5a}]{Заключение} +GNU Emacs имеет широкие возможности модификации самого себя, что +предоставляет нам как пользователям реализовывать свои задумки с +гораздом меньшим количеством преград чем в других решениях. + +\begin{center} +\includegraphics[width=.9\linewidth]{./prot.png} +\end{center} +Есть похожий доклад, который рекомендую посмотреть. +\end{frame} +\begin{frame}[label={sec:orga5d34a2}]{Вопросы?} +\begin{itemize} +\item \url{https://fosstodon.org/@w96k} +\item \url{https://w96k.dev} +\end{itemize} + +\begin{center} +\includegraphics[height=50]{./wk-logo.png} +\end{center} + +Заходите в русскоязычный Emacs чат в Telegram, если вас там нет: +\begin{itemize} +\item \url{https://t.me/emacs\_ru} +\end{itemize} +\end{frame} +\end{document}
\ No newline at end of file diff --git a/content/presentations/emacs/learning-emacs.jpg b/content/presentations/emacs/learning-emacs.jpg Binary files differnew file mode 100644 index 0000000..779e674 --- /dev/null +++ b/content/presentations/emacs/learning-emacs.jpg diff --git a/content/presentations/emacs/magit.png b/content/presentations/emacs/magit.png Binary files differnew file mode 100644 index 0000000..29a3675 --- /dev/null +++ b/content/presentations/emacs/magit.png diff --git a/content/presentations/emacs/mastering-emacs.png b/content/presentations/emacs/mastering-emacs.png Binary files differnew file mode 100644 index 0000000..d247c8b --- /dev/null +++ b/content/presentations/emacs/mastering-emacs.png diff --git a/content/presentations/emacs/missfont.log b/content/presentations/emacs/missfont.log index 3309da2..7f1e181 100644 --- a/content/presentations/emacs/missfont.log +++ b/content/presentations/emacs/missfont.log @@ -1 +1,2 @@ mktextfm latt1095 +mktextfm latt1095 diff --git a/content/presentations/emacs/prot.png b/content/presentations/emacs/prot.png Binary files differnew file mode 100644 index 0000000..4f501d5 --- /dev/null +++ b/content/presentations/emacs/prot.png diff --git a/content/presentations/emacs/wk-logo.png b/content/presentations/emacs/wk-logo.png Binary files differnew file mode 100644 index 0000000..5bce13f --- /dev/null +++ b/content/presentations/emacs/wk-logo.png |