1 | #+Title: Emacs: what user freedom is about
|
---|
2 | #+Author: CC-0: No Rights Reserved
|
---|
3 | #+EMAIL: w96k@runbox.com
|
---|
4 | #+DATE: \href{https://w96k.dev}{w96k.dev} <2023-11-25 Sat>
|
---|
5 | #+LANGUAGE: ru
|
---|
6 | #+OPTIONS: H:2 num:nil toc:nil \n:nil @:t ::t |:t ^:t -:t f:t *:t <:t
|
---|
7 | #+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
|
---|
8 | #+BEAMER_THEME: Goettingen
|
---|
9 | #+BEAMER_COLOR_THEME: default
|
---|
10 | #+LATEX_HEADER: \usepackage[russian]{babel}
|
---|
11 | #+LATEX_HEADER: \usepackage[protrusion=true,activate={true,nocompatibility},final,tracking=true,kerning=true,spacing=true,factor=1100]{microtype}\SetTracking{encoding={*}, shape=sc}{40}
|
---|
12 | #+LATEX_CLASS_OPTIONS: [article,11pt,notitlepage,notitle,oneside,twocolumn]
|
---|
13 | #+STARTUP: beamer
|
---|
14 | #+LINK_HOME: https://w96k.dev
|
---|
15 |
|
---|
16 | * Вступление
|
---|
17 |
|
---|
18 | # Всем привет, меня зовут Михаил, я переехал в Тбилиси в сентябре
|
---|
19 | # прошлого года, работаю бекенд разработчиком и использую Emacs для
|
---|
20 | # разработки и других целей уже более трёх лет. Я не самый искушенный
|
---|
21 | # пользователь этого редактора в том смысле, что я его знаю не
|
---|
22 | # настолько углубленно, тем не менее есть причины по которым GNU Emacs
|
---|
23 | # меня заинтересовал и я продолжаю его использовать. Об этих причинах
|
---|
24 | # пойдёт речь в докладе, надеюсь будет хоть сколько-нибудь интересно.
|
---|
25 |
|
---|
26 | # <Переключение слайда>
|
---|
27 |
|
---|
28 | # Я рассчитываю что из присутствующих есть те, кто имеет не самое
|
---|
29 | # подробное представление об этом редакторе. В противном случае боюсь
|
---|
30 | # будет неинтересно, так как большинство пользователей вероятно и так
|
---|
31 | # в курсе о преимуществах этого редактора.
|
---|
32 |
|
---|
33 | ** Для кого доклад
|
---|
34 | Доклад нацелен в первую очередь на тех, кто по тем или иным причинам
|
---|
35 | не знаком с редактором GNU Emacs и хотел бы узнать причины для начала
|
---|
36 | его использования. Одна из таких причин — свобода.
|
---|
37 |
|
---|
38 | * GNU
|
---|
39 | ** GNU/Emacs
|
---|
40 | #+ATTR_LATEX: :width 100
|
---|
41 | [[./emacs.png]] *GNU/Emacs* -- это свободный немодальный текстовый
|
---|
42 | редактор общего назначения, созданный в 1985 году Ричардом
|
---|
43 | Столлманом. Редактор обновляется по сей день и доступен на многих
|
---|
44 | платформах в том числе Windows.
|
---|
45 |
|
---|
46 | ** Кто использовал Emacs
|
---|
47 | Имаксом в той или иной степени пользовались следующие люди:
|
---|
48 | * [[https://en.wikipedia.org/wiki/Linus_Torvald][Linus Torvalds]]
|
---|
49 | * [[https://en.wikipedia.org/wiki/Donald_Knuth][Donald Knuth]]
|
---|
50 | * [[https://en.wikipedia.org/wiki/Yukihiro_Matsumoto][Yukihiro Matsumoto]]
|
---|
51 | * [[https://en.wikipedia.org/wiki/Guido_van_rossum][Guido van Rossum]]
|
---|
52 | * [[https://en.wikipedia.org/wiki/Rich_Hickey][Rich Hickey]]
|
---|
53 | * [[https://en.wikipedia.org/wiki/Joe_Armstrong_(programmer)][Joe Armstrong]]
|
---|
54 | * [[https://en.wikipedia.org/wiki/Eric_Raymond][Eric Raymond]]
|
---|
55 | * [[https://en.wikipedia.org/wiki/Andrei_Alexandrescu][Andrei Alexandrescu]]
|
---|
56 | * [[https://en.wikipedia.org/wiki/Edward_Snowden][Edward Snowden]]
|
---|
57 |
|
---|
58 | ** Главный экран
|
---|
59 | # Продемонстрировать главный экран Emacs
|
---|
60 |
|
---|
61 | #+ATTR_LATEX: :height 100
|
---|
62 | [[./emacs-splash.png]]
|
---|
63 |
|
---|
64 | Если открыть Имакс, то нас встретит следующая надпись:\\
|
---|
65 |
|
---|
66 |
|
---|
67 | *Welcome to GNU Emacs, one component of the GNU/Linux operating system.*
|
---|
68 |
|
---|
69 |
|
---|
70 | Что это значит?
|
---|
71 |
|
---|
72 | ** GNU is not Unix
|
---|
73 | #+ATTR_LATEX: :height 60
|
---|
74 | [[./gnu.png]]
|
---|
75 |
|
---|
76 | *GNU* -- это проект фонда свободного программного обеспечения, который
|
---|
77 | содержит ПО, следующее четырём свободам:
|
---|
78 |
|
---|
79 | ** Свободы GNU
|
---|
80 | :PROPERTIES:
|
---|
81 | :BEAMER_opt: shrink=5
|
---|
82 | :END:
|
---|
83 | *** Свобода 0
|
---|
84 | Свобода выполнять программу как вам угодно в любых целях.
|
---|
85 |
|
---|
86 | *** Свобода 1
|
---|
87 | Свобода изучать работу программы и модифицировать
|
---|
88 | программу, чтобы она выполняла ваши вычисления, как вы
|
---|
89 | пожелаете.
|
---|
90 |
|
---|
91 | *** Свобода 2
|
---|
92 | Свобода передавать копии
|
---|
93 |
|
---|
94 | *** Свобода 3
|
---|
95 | Свобода передавать копии своих измененных версий другим. Этим вы
|
---|
96 | можете дать всему сообществу возможность получать выгоду от ваших
|
---|
97 | изменений.
|
---|
98 |
|
---|
99 | ** Больше о GNU
|
---|
100 | Деятельность GNU, FSF и Ричарда Столлмана подробно описана в книге "[[https://en.wikipedia.org/wiki/Free_as_in_Freedom][Free as in
|
---|
101 | Freedom]]", которая доступна на русском языке.
|
---|
102 |
|
---|
103 | #+ATTR_LATEX: :width 100
|
---|
104 | [[./gnu-book.jpeg]]
|
---|
105 |
|
---|
106 | https://www.gnu.org/
|
---|
107 |
|
---|
108 | * Свобода
|
---|
109 | # Я только что перечислил какую свободу предоставляет проект GNU, но
|
---|
110 | # что же такое свобода. Это мгогранный термин, который
|
---|
111 | # интерпретируется в философии, политике и в целом разными людьми
|
---|
112 | # совершенно по разному.
|
---|
113 |
|
---|
114 | # Для этого доклада нам подойдёт самое просто определение свободы,
|
---|
115 | # взятое из Википедии.
|
---|
116 |
|
---|
117 | # К сожалению в использовании и написании софта мы редко бываем
|
---|
118 | # полностью свободны для реализации своей воли.
|
---|
119 | ** Определение свободы
|
---|
120 | Свобо́да — состояние субъекта, в котором он является определяющей
|
---|
121 | причиной своих действий.
|
---|
122 |
|
---|
123 | # Определение свободы максимально обобщенно, поэтому мы будем
|
---|
124 | # рассматривать концепт свободы в разных контекстах. Контекст первый:
|
---|
125 | # свобода в использовании программ. Если свобода это то насколько мы
|
---|
126 | # как субъекты можем реализовывать свою волю в использовании программ,
|
---|
127 | # то несвобода это то, как мы не можем эту волю реализовать и миримся
|
---|
128 | # с различного рода ограничениями при взаимодействии с программой.
|
---|
129 |
|
---|
130 | # Довольно банальные примеры реализации воли у пользователя:
|
---|
131 | # Мне не нравится текст или цвет, хочу изменить, как мне это сделать
|
---|
132 | ** Свобода в контексте использования программ
|
---|
133 | - Пользователь хочет изменить функционал программы
|
---|
134 | - Для этого необходимо получить и изучить исходный код
|
---|
135 | - У исходного кода должно быть разрешение на модификацию (открытая
|
---|
136 | или свободная лицензия)
|
---|
137 | - Только тогда мы свободны внести свои изменения в программу
|
---|
138 |
|
---|
139 | ** Нюансы и сложности при модификации
|
---|
140 | - Закрытость кода или использование закрытых компонентов
|
---|
141 | - Недоступность документации API для изменений
|
---|
142 | - Технические сложности: сложная процедура изменения даже малейшей части кода
|
---|
143 | - Программа написана так, чтобы её не модифицировали (final классы,
|
---|
144 | private методы вот это всё)
|
---|
145 | - Собственническая организация приёма патчей и принятия решений
|
---|
146 | ** Свобода в контексте GNU Emacs
|
---|
147 | GNU Emacs один из немногих редакторов, которые могут предоставить
|
---|
148 | свободу пользователю с наименьшими трудностями в реализации своих
|
---|
149 | идей.
|
---|
150 | ** Свобода Emacs: Свобода модификации
|
---|
151 | GNU Emacs можно модифицировать практически как угодно. Не нравится
|
---|
152 | автокомплит, меняем или дописываем свой, не нравятся элементы
|
---|
153 | интерфейса убираем их, не нравится как выглядит кнопочка, у вас есть
|
---|
154 | средства чтобы исправить это. В мейнстримных редакторах так нельзя, а
|
---|
155 | если и можно, то есть существенные ограничения. В Emacs'е мы можем
|
---|
156 | менять не только конфигурацию, но и сам код используемых пакетов и
|
---|
157 | самого редактора.
|
---|
158 | ** Свобода Emacs: Использование для любых целей
|
---|
159 | Вытекает из предыдущего. Так как у нас нет ограничений на модификацию,
|
---|
160 | то у нас появляется свобода использовать программу для любых
|
---|
161 | целей. Конечно Emacs в первую очередь заточен для работы с текстом, но
|
---|
162 | во-первых текст бывает разный, а во вторых Emacs покрывает некоторые
|
---|
163 | сферы применения без текста. Vim хоть кажется таким же свободным, этой
|
---|
164 | свободы не предоставляет, возможно это одно из фундаментальных
|
---|
165 | различий.
|
---|
166 | ** Для чего можно использовать Emacs
|
---|
167 | * Literate Programming
|
---|
168 | * Создание TeX / LaTeX и иных документов документов
|
---|
169 | * Email / IRC / XMPP / Telega / Fediverse и т.д.
|
---|
170 | * Создание схем, графиков, рисование (ascii, svg)
|
---|
171 | * Открытие и зачастую редактирование почти любого файла (бинарный
|
---|
172 | файл, изображение, видео, аудио, презентация, документ pdf)
|
---|
173 | * Для управления системой (меняем громкость звука, убиваем
|
---|
174 | процессы, ставим пакеты)
|
---|
175 | * Можно использовать в качество WM (window manager)
|
---|
176 | * Играть в тетрис, шахматы и другие игры :)
|
---|
177 |
|
---|
178 | Одним словом возможности реализации функционала ограничены в основном
|
---|
179 | только желанием человека создать что-то новое.
|
---|
180 |
|
---|
181 | ** Свобода Emacs: Любые способы взаимодействия
|
---|
182 | Немного вытекает из предыдущего, но с программой можно
|
---|
183 | взаимодействовать не тольк путем ввода текста с клавиатуры.
|
---|
184 | * Можно активно использовать мышь, а можно только клавиатуру
|
---|
185 | * Emacspeak позволяет использовать Emacs слепым людям
|
---|
186 | * Есть сенсорный ввод при помощи жестов
|
---|
187 | * Есть пакеты для голосового ввода
|
---|
188 | * Есть поддержка RTL (right to left) и огромного числа кодировок и
|
---|
189 | языков
|
---|
190 | * Можно с терминала, можно с графикой
|
---|
191 | ** Emacs как интерфейс к операционной системе
|
---|
192 | Есть мнение, что Emacs настольно функциональный, что сам является
|
---|
193 | операционной системой. В целом это не так далеко от правды, так как
|
---|
194 | возможностей этого редактора хватает, чтобы много вещи операционной
|
---|
195 | системы заточить "под себя". Например нам не нравится взаимодействие с
|
---|
196 | программой, мы пишем для него обвязку, заточенную конкретно под нас,
|
---|
197 | которую мы можем менять в отличие от скомпиленной программы, в которой
|
---|
198 | чтобы провести малейшее изменение надо вложить немало времени.
|
---|
199 | ** Обвязка ls: Dired
|
---|
200 | [[./dired.png]]
|
---|
201 |
|
---|
202 | Dired это файловый менеджер Emacs'а. Внутри он использует ls для
|
---|
203 | скорости, но его вывод мы можем редактировать под себя. Помимо того,
|
---|
204 | что мы можем можем удалять, создавать, редактировать файлы и
|
---|
205 | директории, Dired умеет открывать и создавать архивы.
|
---|
206 |
|
---|
207 | ** Обвязка git: Magit
|
---|
208 | [[./magit.png]]
|
---|
209 | ** Другие обвязки
|
---|
210 | Конечно всё обвязать таким образом невозможно, но для большинства
|
---|
211 | user-space программ мы можем использовать удобные для нас обвязки как
|
---|
212 | бы вместо редактирования самих этих программ.
|
---|
213 | * Обвязка всячески CLI утилит (git, gcc, gdb, make, ledger)
|
---|
214 | * Обвязка программ с графическим выхлопом (Latex)
|
---|
215 | ** Lisp
|
---|
216 | Большинство свобод достигается благодаря использованию в качестве
|
---|
217 | языка расширения Emacs Lisp. Лисп -- один из старейших динамических
|
---|
218 | языков программирования, основанный на нетипизированном
|
---|
219 | лямбда-исчислении. Одной из удобнейших фич языка является его
|
---|
220 | динамичность, которая позволяет изменять программу в рантайме, а также
|
---|
221 | расширять сам язык при помощи макросов. Можно даже сказать, что Emacs
|
---|
222 | Lisp это не язык расширения, это Emacs просто является интерпретатором
|
---|
223 | Elisp.
|
---|
224 | ** Почему Emacs Lisp даёт свободу
|
---|
225 | - Динамическая типизация
|
---|
226 | - Reflection
|
---|
227 | - Introspection
|
---|
228 | - Макросы
|
---|
229 | - Код есть данные / метациркулярный интерпретатор
|
---|
230 | - Мультипарадигма (ООП, ФП, Процедурщина)
|
---|
231 |
|
---|
232 | * Редакторы
|
---|
233 | ** Что умеет Emacs чего не умеют другие
|
---|
234 | * Можно модифицировать сам редактор внутри редактора без
|
---|
235 | перезапуска
|
---|
236 | * Менять способы ввода (аккордные бинды, модальные бинды,
|
---|
237 | управление жестами, синтезаторы речи)
|
---|
238 | * Использовать систему версий отличную от Git
|
---|
239 | * Открывать любые файлы вне текущего проекта
|
---|
240 | * Открывать файлы на удалённом компьютере
|
---|
241 | * Открывать файлы через sudo
|
---|
242 | * Редактировать любой элемент интерфейса
|
---|
243 | * Не быть ограниченным форматом конфигурации и доступными настройками
|
---|
244 | * Жить 40+ лет и обновляться
|
---|
245 |
|
---|
246 | ** Другие редакторы
|
---|
247 | Рассмотрим следующие текстовые редакторы, которые возможно
|
---|
248 | используют ваши друзья и коллеги:
|
---|
249 |
|
---|
250 | * IDE от JetBrains (PHPStorm, InttelliIDEA и т.д.)
|
---|
251 | * VS Code
|
---|
252 | * Sublime Text
|
---|
253 | * Vi/Vim/NeoVim
|
---|
254 |
|
---|
255 | За исключением вима данные редакторы не подходят для общего
|
---|
256 | назначения, большинство из них направлены именно на написание
|
---|
257 | кода. Тем не менее даже в более узкой специализации они имеют
|
---|
258 | серьезные изъяны.
|
---|
259 |
|
---|
260 | ** Недостатки популярных редакторов
|
---|
261 | *** IDE от JetBrains
|
---|
262 | * Закрытый исходный код
|
---|
263 | * Плохая производительность, долгий отклик
|
---|
264 | * Узкая специализация (одно IDE на язык вместо одного окружения для всего)
|
---|
265 | * Неконсинстентность интерфейса
|
---|
266 | *** Sublime Text
|
---|
267 | * Закрытый исходный код
|
---|
268 | * Неконсинстентность интерфейса
|
---|
269 | ** Недостатки популярных редакторов
|
---|
270 | *** VS Code
|
---|
271 | * Телеметрия
|
---|
272 | * Полузакрытость (Electron)
|
---|
273 | * Низкая производительность (Electron)
|
---|
274 | * Неконсистентность интерфейса
|
---|
275 | *** Vi/Vim/NeoVim
|
---|
276 | * Невозможно выйти
|
---|
277 | * Невозможно модифицировать и использовать для любых целей
|
---|
278 | (например выключить моды и сделать их как в имаксе)
|
---|
279 | ((если это возможно сделайте пожалуйста, в emacs есть evil))
|
---|
280 | * Vim и Emacs
|
---|
281 | ** Почему Emacs и Vim непопулярны
|
---|
282 |
|
---|
283 | #+ATTR_LATEX: :height 120
|
---|
284 | [[./learning-curve.jpg]]
|
---|
285 |
|
---|
286 | Ответ: Кривая обучения
|
---|
287 |
|
---|
288 | ** Миф: Emacs не настолько сложен
|
---|
289 | Мы видим, что вход в вим высокий. С другой стороны у Emacs кривая
|
---|
290 | обучения начинается с самого низа, но потом закручивается. Что это
|
---|
291 | значит?
|
---|
292 |
|
---|
293 | ** Миф: Emacs не настолько сложен
|
---|
294 | GNU/Emacs имеет рядовые инструменты для работы с текстом: поддержка
|
---|
295 | мыши (выделение, скролл), стрелки, подсказки горячих клавиш,
|
---|
296 | различные менюшки. Emacs в изначальной поставке -- это что-то между
|
---|
297 | обычным текстовым редактором вроде notepad.exe и IDE. Тем не менее
|
---|
298 | Emacs имеет возможности расширения, которые позволяют превратить
|
---|
299 | его в нечто похожее на IDE и покрывать даже больше задач.
|
---|
300 | ** M-x butterfly
|
---|
301 | #+ATTR_LATEX: :height 140
|
---|
302 | [[./real_programmers.png]]
|
---|
303 |
|
---|
304 | Шуточная функция поставляется в GNU/Emacs после появления комикса.
|
---|
305 | ** Схожести и отличия Emacs / Vim
|
---|
306 | #+ATTR_LATEX: :height 120
|
---|
307 | [[./emacs-vim.png]]
|
---|
308 | Не смотря на то, что редакторы достаточно разительно отличаются
|
---|
309 | друг друга концептуально, на самом деле у них больше общего чем
|
---|
310 | может показаться.
|
---|
311 | ** Схожести
|
---|
312 | | | *Emacs* | *Vim* |
|
---|
313 | |-------------------------+---------+-------|
|
---|
314 | | Интерфейс | Текст | Текст |
|
---|
315 | | Туториал | Есть | Есть |
|
---|
316 | | Расширяемый | Да | Да |
|
---|
317 | | Команды | M-x | : |
|
---|
318 | | Буферы | Есть | Есть |
|
---|
319 | | Файловый менеджер | Есть | Есть |
|
---|
320 | | Макросы | Есть | Есть |
|
---|
321 | | Автокомплит | Есть | Есть |
|
---|
322 | | Интеграция с терминалом | Есть | Есть |
|
---|
323 |
|
---|
324 | ** Отличия
|
---|
325 | | | *Emacs* | *Vim* |
|
---|
326 | |-----------------+---------------+-------------|
|
---|
327 | | Ввод | Любые системы | Модальность |
|
---|
328 | | Язык расширений | Emacs Lisp | VimScript |
|
---|
329 | | Принципы | M-x butterfly | Unix Way |
|
---|
330 | | Документация | Info | Man |
|
---|
331 | | Основной клиент | Графика | Терминал |
|
---|
332 |
|
---|
333 | Подробнее о сравнении Vim и Emacs:
|
---|
334 | https://en.wikipedia.org/wiki/Editor_war
|
---|
335 |
|
---|
336 | ** Что даёт графический клиент
|
---|
337 | - Правильно работающие бинды (например в консоли не сработает C-.)
|
---|
338 | - Управление мышью
|
---|
339 | - Отображение картинок, видео, граф. документов вроде pdf
|
---|
340 | - Отображение шрифта с лигатурами
|
---|
341 | - Всплывающие окна и дополнительные меню
|
---|
342 | ** Evil
|
---|
343 | #+ATTR_LATEX: :height 25
|
---|
344 | [[./evil.png]]
|
---|
345 |
|
---|
346 | *Evil-mode* -- это расширение для GNU/Emacs, которое эмулирует
|
---|
347 | Vim. Так как оба редактора работают со всеми объектами как с текстом,
|
---|
348 | то использование эмуляции Vim в Emacs более тривиальное, чем в
|
---|
349 | каком-нибудь IDE. Огромное количество пакетов Emacs предоставляют
|
---|
350 | биндинги для работы с Evil.
|
---|
351 | * Возможности GNU Emacs
|
---|
352 | ** Что есть в GNU Emacs
|
---|
353 | * Реализация Client-Server архитектуры
|
---|
354 | * Рантайм Emacs Lisp с JIT компиляцией
|
---|
355 | * Аккордовые сочетания клавиш
|
---|
356 | * Макросы
|
---|
357 | * Встроенный пакетный менеджер
|
---|
358 | * Встроенный файловый менеджер
|
---|
359 | * Отображение номеров строк
|
---|
360 | * Работа с терминалом (ansi-term, eshell)
|
---|
361 | * Разделение на фреймы
|
---|
362 | * LSP клиент
|
---|
363 | * Поддержка большого числа языков программирования
|
---|
364 | * Поддержка спелл-чекера
|
---|
365 | * Встроенная система помощи (туториал, apropos, функции, бинды)
|
---|
366 | ** Что есть в GNU/Emacs
|
---|
367 | * Интерактивные элементы (кнопки, формы и т.д.)
|
---|
368 | * Интерфейс к info и man
|
---|
369 | * Поиск
|
---|
370 | * Встроенный текстовый браузер eww
|
---|
371 | * Встроенные клиенты IRC и email
|
---|
372 | * Линтер кода Flymake
|
---|
373 | * Интерфейс к GDB
|
---|
374 | * Система контроля версий (не только git)
|
---|
375 | * Возможность удаленного редактирования кода (например через ssh)
|
---|
376 | * Org-mode для ведения заметок (и много чего еще)
|
---|
377 | * Можно читать документы pdf, docx и презентации
|
---|
378 | * Система учёта времени на работе timeclock (засекает 8 часов)
|
---|
379 | * M-x doctor (chatgpt до изобретения нейросетей)
|
---|
380 | ** Биндинги Emacs
|
---|
381 | Биндинги в Emacs мнемонические. Это значит, что их легко запомнить,
|
---|
382 | так как буква биндинга практически всегда что-то обозначает.
|
---|
383 | - =C-n= Следующая строка (next)
|
---|
384 | - =C-p= Предыдущая строка (previous)
|
---|
385 | - =C-f= Вперед на символ (forward)
|
---|
386 | - =C-b= Назад на символ (back)
|
---|
387 |
|
---|
388 | Не все биндинги появились именно в Emacs. Emacs изначально был
|
---|
389 | расширением редактора TECO.
|
---|
390 |
|
---|
391 | Подробнее об истории биндингов Emacs и Vim:
|
---|
392 | http://xahlee.info/kbd/keyboard_hardware_and_key_choices.html
|
---|
393 | ** Биндинги Emacs
|
---|
394 | Важным отличием биндингов в редакторе GNU/Emacs является то, что
|
---|
395 | они еще и аккордовыми. Это значит, что несколько комбинаций
|
---|
396 | следующих друг за другом могут что-то значить. Например:
|
---|
397 | - =C-x C-f= открыть файл
|
---|
398 | - =C-x s= сохранить файл
|
---|
399 | Набираемые аккордовые бинды отображаются в мод-лайне. Для сброса
|
---|
400 | существует биндинг *C-g*.
|
---|
401 |
|
---|
402 | ** Биндинги Emacs (продолжение)
|
---|
403 | Не смотря на наличие аккордовых биндов, Emacs не ограничивается
|
---|
404 | только ими и в редакторе поддерживают свои модальные режимы и режим
|
---|
405 | совместимости с VIM.
|
---|
406 | ** Emacs Lisp
|
---|
407 | Ядро редактора написано на языке C, остальное -- язык расширений
|
---|
408 | Emacs Lisp (25% C + 75% Elisp). Выглядит примерно так:
|
---|
409 |
|
---|
410 | #+BEGIN_SRC emacs-lisp
|
---|
411 | ;; Объявление и вызов функции
|
---|
412 | (defun имя-функции (аргументы) (тело функции))
|
---|
413 | (имя-функция аргумент1 аргумент2)
|
---|
414 |
|
---|
415 | (defun hello (name)
|
---|
416 | (concat "Hello, " name)) ;; => hello
|
---|
417 | (hello "Mikhail") ;; => "Hello, Mikhail"
|
---|
418 | #+END_SRC
|
---|
419 | ** Всё есть функция
|
---|
420 | Любое действие в редакторе представляет из себя функцию.
|
---|
421 | - Двинули курсор в начало строки -- функция beginning-of-line
|
---|
422 | - Сохранили файл -- функция save-buffer
|
---|
423 | - Вставили текст -- функция yank
|
---|
424 |
|
---|
425 | И так с любым действием. В VIM вероятно также.
|
---|
426 |
|
---|
427 | ** Система помощи
|
---|
428 | В GNU/Emacs встроен туториал и очень удобная система помощи.
|
---|
429 | - =C-h t= Туториал (на русском языке)
|
---|
430 | - =C-h r= Мануал Emacs
|
---|
431 | - =C-h a= Apropos (по описанию находит нужную функцию)
|
---|
432 | - =C-h k= Describe-key (описывает функцию, прикрепленную к бинду)
|
---|
433 | - =C-h f= Describe-function (описывает функцию)
|
---|
434 | - =C-h m= Describe-mode
|
---|
435 | - =C-h i= Info
|
---|
436 | ** Моды
|
---|
437 | *Мод* -- это модификация GNU/Emacs, которая включается при
|
---|
438 | определенном условии.
|
---|
439 | - Major мод может быть всего один, чаще всего вешается на открытие
|
---|
440 | файла определенного расширения. Например при открытие файла с
|
---|
441 | расширением .py запустится python-mode.
|
---|
442 | - Minor модов может быть неограниченное количество, они дополняют
|
---|
443 | функционал Major модов. Могут быть активированы всегда (имеют
|
---|
444 | префикс global-<название мода>) или при определенном условии.
|
---|
445 | ** Мод-лайн
|
---|
446 | *Мод-лайн* отображает информацию об используемых модах и состоянии
|
---|
447 | файла (название, сохранён или нет, позиция курсора, система
|
---|
448 | контроля версий). Пользователь может расширить мод-лайн для показа
|
---|
449 | своей информации, например времени. Под мод-лайном располагает
|
---|
450 | Echo зона, которая даёт уведомления о работе модов, а также может
|
---|
451 | запрашивать ввод.
|
---|
452 | ** Буфер
|
---|
453 | *Буфер* -- это обособленная память с текстом, которой манипулирует
|
---|
454 | имакс прежде чем писать на диск. Экран Emacs отображает буфера,
|
---|
455 | грубо говоря вы видите всегда как-минимум один буфер. При запуске
|
---|
456 | доступны следующие буферы:
|
---|
457 | - =*GNU EMACS*= -- начальный экран
|
---|
458 | - =*scratch*= -- площадка REPL для обкатывания Emacs Lisp
|
---|
459 | Бинды:
|
---|
460 | - =C-x b= -- сменить буфер
|
---|
461 | - =C-x C-b= -- список буферов
|
---|
462 | ** Программирование
|
---|
463 | Поддерживаются языки:
|
---|
464 | - C
|
---|
465 | - Lisp и Scheme
|
---|
466 | - C++
|
---|
467 | - Fortran
|
---|
468 | - Java
|
---|
469 | - Javascript
|
---|
470 | - Python
|
---|
471 | - Ruby
|
---|
472 | - Perl
|
---|
473 | - и множество других
|
---|
474 | Разумеется список можно расширить сторонними пакетами
|
---|
475 | ** Программирование
|
---|
476 | Также для задач программирования доступны:
|
---|
477 | - Форматирование кода
|
---|
478 | - Компилирование программ
|
---|
479 | - Линтер Flymake, который на фоне проверяет текст программы
|
---|
480 | - Дебаггеры GDB, PDB, JDB и другие
|
---|
481 | - Интерфейс к grep
|
---|
482 | - Выполнение кода Emacs Lisp прямо в редакторе
|
---|
483 | ** Система контроля версий
|
---|
484 | При программировании полезно использовать систему контроля
|
---|
485 | версий. Самая распространненая система -- git. Про другие системы
|
---|
486 | обычно забывают, но не в случае Emacs. Система контроля версий
|
---|
487 | Emacs поддерживает:
|
---|
488 | - Git
|
---|
489 | - Mercurial
|
---|
490 | - CVS
|
---|
491 | - Bazaar
|
---|
492 | - Subversion
|
---|
493 | - и другие
|
---|
494 |
|
---|
495 | ** Org-mode
|
---|
496 | *Org-mode* -- Markdown на колёсах, декларативный формат описания
|
---|
497 | всего и вся, основанный на списке из уровней (Outline). С помощью
|
---|
498 | org-mode можно:
|
---|
499 | - Организовывать свою жизнь
|
---|
500 | - Создавать документы и презентации (latex)
|
---|
501 | - Использовать технику грамотного программирования
|
---|
502 | - Заменять Markdown
|
---|
503 |
|
---|
504 | https://orgmode.org/worg/org-tutorials/
|
---|
505 | ** Tramp
|
---|
506 | #+BEGIN_QUOTE
|
---|
507 | Вимеры могут привести в аргумент то, что их редактор уже доступен
|
---|
508 | на многих системам и ничего не надо докачивать и что можно
|
---|
509 | редактировать прямо на сервере.
|
---|
510 | #+END_QUOTE
|
---|
511 | В Emacs вы можете редактировать удалённые файлы через ssh,
|
---|
512 | использую Tramp. Выглядеть это будет также как вы редактируете всё
|
---|
513 | на своей родной системе. В Vim редактирование на сервере работает
|
---|
514 | только при условии отсутствия конфигурации, в Emacs
|
---|
515 | ** Кастомизация
|
---|
516 | [[./customize.png]]
|
---|
517 | =M-x customize= открывает GUI, позволяющий редактировать поведение
|
---|
518 | и внешний вид Emacs.
|
---|
519 | ** .emacs / init.el
|
---|
520 | В качестве конфигурации Emacs использует один из следующих файлов в домашней директории:
|
---|
521 | - ~/.emacs
|
---|
522 | - ~/.emacs.d/init.el
|
---|
523 |
|
---|
524 | Файл конфигурации содержит листинг кода на Emacs Lisp, который
|
---|
525 | Emacs вычисляет при запуске программы. Чтобы создавать конфиг Emacs
|
---|
526 | вовсе необязательно в идеале владеть Emacs Lisp.
|
---|
527 | ** Пакетный менеджер package.el
|
---|
528 | Для расширения предусмотрен пакетный менеджер, который уже встроен
|
---|
529 | в редактор. По-умолчанию доступен только один официальный
|
---|
530 | репозиторий Elpa, но пользователь может подключать сторонние
|
---|
531 | (например Melpa).
|
---|
532 | - =M-x list-packages= -- список пакетов, доступных в репозиториях
|
---|
533 | - =M-x package-install <название пакета>= -- установка пакета из репозитория
|
---|
534 |
|
---|
535 | ** use-package
|
---|
536 | *use-package* -- это декларативная обёртка от сообщества для
|
---|
537 | package.el. Рекомендую использовать use-package, чтобы ваш конфиг
|
---|
538 | не превратился со временем в нечитаемое месиво.
|
---|
539 | - =:config= -- изолирует конфигурацию пакетов друг от друга
|
---|
540 | - =:hook= -- короткая запись для навешивания хуков
|
---|
541 | - =:ensure= -- загружает пакет из репозитория
|
---|
542 | - =:diminish= -- скрывает мод из модлайна
|
---|
543 | - и другие опции
|
---|
544 |
|
---|
545 | * Дистрибутивы
|
---|
546 | ** Vanilla
|
---|
547 | Emacs, который поставляется на большинстве систем без готовой
|
---|
548 | конфигурации.
|
---|
549 |
|
---|
550 | [[./emacs-vanilla.png]]
|
---|
551 |
|
---|
552 | https://www.gnu.org/software/emacs/
|
---|
553 | ** Doom Emacs
|
---|
554 | Emacs с поддержкой vim и emacs биндов и тонной пакетов на все случаи жизни
|
---|
555 |
|
---|
556 | [[./emacs-doom.png]]
|
---|
557 |
|
---|
558 | https://github.com/doomemacs/doomemacs
|
---|
559 | ** Spacemacs
|
---|
560 | По сути тоже самое, что Doom, но старее и медленнее.
|
---|
561 |
|
---|
562 | [[./emacs-spacemacs.png]]
|
---|
563 |
|
---|
564 | https://www.spacemacs.org/
|
---|
565 | ** Prelude
|
---|
566 | Расширяет дефолтный Emacs, но не настолько сильно как Doom и
|
---|
567 | Spacemacs. Пытается придерживаться "Sane Defaults".\\
|
---|
568 |
|
---|
569 | https://prelude.emacsredux.com/en/latest/
|
---|
570 | * Материалы по Emacs
|
---|
571 | ** Изучение Emacs внутри Emacs
|
---|
572 | * (*C-h t*) Help => Emacs Tutorial
|
---|
573 | * (*C-h r*) Info emacs manual
|
---|
574 | * Introduction to Emacs Lisp
|
---|
575 | ** Книги
|
---|
576 | :PROPERTIES:
|
---|
577 | :BEAMER_opt: shrink=10
|
---|
578 | :END:
|
---|
579 | *** Mastering Emacs
|
---|
580 | #+ATTR_LATEX: :height 80
|
---|
581 | [[./mastering-emacs.png]]
|
---|
582 |
|
---|
583 | https://masteringemacs.org
|
---|
584 | *** Learning Gnu Emacs
|
---|
585 | #+ATTR_LATEX: :height 80
|
---|
586 | [[./learning-emacs.jpg]]
|
---|
587 |
|
---|
588 | https://dl.acm.org/doi/book/10.5555/2167272
|
---|
589 | ** Заключение
|
---|
590 | GNU Emacs имеет широкие возможности модификации самого себя, что
|
---|
591 | предоставляет нам как пользователям реализовывать свои задумки с
|
---|
592 | гораздом меньшим количеством преград чем в других решениях.
|
---|
593 |
|
---|
594 | [[./prot.png]]
|
---|
595 | Есть похожий доклад, который рекомендую посмотреть.
|
---|
596 | ** Вопросы?
|
---|
597 |
|
---|
598 | - https://fosstodon.org/@w96k
|
---|
599 | - [[https://w96k.dev]]
|
---|
600 |
|
---|
601 | #+ATTR_LATEX: :height 50
|
---|
602 | [[./wk-logo.png]]
|
---|
603 |
|
---|
604 | Заходите в русскоязычный Emacs чат в Telegram, если вас там нет:
|
---|
605 | - https://t.me/emacs_ru
|
---|