summaryrefslogtreecommitdiff
path: root/content/presentations/emacs/emacs-what-user-freedom-is-about.org
blob: 993a8f7807331328f4a596802d400dd0a9bc4bd3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
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