1 | #+Title: Свободный текстовый редактор общего назначения GNU/Emacs
|
---|
2 | #+Author: Михаил Кириллов https://w96k.de
|
---|
3 | #+EMAIL: w96k@runbox.com
|
---|
4 | #+DATE: 1 Июня 2020
|
---|
5 | #+LANGUAGE: ru
|
---|
6 | #+OPTIONS: H:2 date:nil 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: Berlin
|
---|
9 | #+BEAMER_COLOR_THEME: default
|
---|
10 | #+LATEX_HEADER: \usepackage[russian]{babel}
|
---|
11 | #+LATEX_HEADER: \usepackage{beamerthemesplit}
|
---|
12 | #+LATEX_CLASS_OPTIONS: [article,12pt,notitlepage,notitle,oneside,twocolumn]
|
---|
13 | #+STARTUP: beamer
|
---|
14 | #+LINK_HOME: https://w96k.dev
|
---|
15 |
|
---|
16 | * Вступление
|
---|
17 | ** Текстовый редактор
|
---|
18 | Текстовый редактор необходим тем, кто хочет набирать и сохранять
|
---|
19 | текст в памяти компьютера. Это может понадобиться программистам и
|
---|
20 | тем, кто хочет писать заметки и документы.
|
---|
21 | ** Свобода
|
---|
22 | - Пользователь хочет понимать работу одного из базовых инструментов
|
---|
23 | - Для понимания необходимо изучить исходный код
|
---|
24 | - Исходный код может быть открытым или закрытым
|
---|
25 | - Только при открытости исходного кода становиться возможно
|
---|
26 | полностью изучить работу программы. Также это способствует
|
---|
27 | улучшению и расширению функционала.
|
---|
28 |
|
---|
29 | ** О чём доклад
|
---|
30 |
|
---|
31 | Мы рассмотрим использование редактора GNU Emacs для выполнения
|
---|
32 | следующих задач:
|
---|
33 | - программирование
|
---|
34 | - редактирования документов и презентаций
|
---|
35 | - ведение заметок
|
---|
36 |
|
---|
37 | * GNU
|
---|
38 | ** GNU/Emacs
|
---|
39 | #+ATTR_LATEX: :width 100
|
---|
40 | [[./emacs.png]] *GNU/Emacs* -- это свободный немодальный текстовый
|
---|
41 | редактор общего назначения, созданный в 1985 году Ричардом
|
---|
42 | Столлманом. Редактор обновляется по сей день и доступен на многих
|
---|
43 | платформах в том числе Windows.
|
---|
44 |
|
---|
45 | ** Кто пользуется
|
---|
46 | Имаксом в той или иной степени пользовались следующие люди:
|
---|
47 | * Линус Торвальдс
|
---|
48 | * Дональд Кнут
|
---|
49 | * Юкихиро Матсумото
|
---|
50 | * Гуидо Ван Россум
|
---|
51 | * Рич Хикей
|
---|
52 | * Джо Армстронг
|
---|
53 | * Эрик Реймонд
|
---|
54 | * Андрей Александреску
|
---|
55 |
|
---|
56 | Также Emacs весьма популярен среди непрограммистов, например писателей.
|
---|
57 |
|
---|
58 | ** Главный экран
|
---|
59 | # Продемонстрировать главный экран Emacs
|
---|
60 | Если открыть Имакс, то нас встретит следующая надпись:\\
|
---|
61 |
|
---|
62 |
|
---|
63 | *Welcome to GNU Emacs, one component of the GNU/Linux operating system.*
|
---|
64 |
|
---|
65 |
|
---|
66 | Что это значит?
|
---|
67 |
|
---|
68 | ** GNU is not Unix
|
---|
69 | #+ATTR_LATEX: :height 60
|
---|
70 | [[./gnu.png]]
|
---|
71 |
|
---|
72 | *GNU* -- это фонд свободного программного обеспечения, который
|
---|
73 | содержит ПО, следующее четырём свободам:
|
---|
74 |
|
---|
75 | ** Свободы GNU
|
---|
76 | :PROPERTIES:
|
---|
77 | :BEAMER_opt: shrink=10
|
---|
78 | :END:
|
---|
79 | *** Свобода 0
|
---|
80 | Свобода выполнять программу как вам угодно в любых целях.
|
---|
81 |
|
---|
82 | *** Свобода 1
|
---|
83 | Свобода изучать работу программы и модифицировать
|
---|
84 | программу, чтобы она выполняла ваши вычисления, как вы
|
---|
85 | пожелаете. Это предполагает доступ к исходному тексту.
|
---|
86 |
|
---|
87 | *** Свобода 2
|
---|
88 | Свобода передавать копии, чтобы помочь другим.
|
---|
89 |
|
---|
90 | *** Свобода 3
|
---|
91 | Свобода передавать копии своих измененных версий другим. Этим вы
|
---|
92 | можете дать всему сообществу возможность получать выгоду от ваших
|
---|
93 | изменений. Это предполагает доступ к исходному тексту.
|
---|
94 |
|
---|
95 | ** Больше о GNU
|
---|
96 | Деятельность данного фонда подробно описана в книге "[[https://en.wikipedia.org/wiki/Free_as_in_Freedom][Free as in
|
---|
97 | Freedom]]", которая доступна на русском языке.
|
---|
98 |
|
---|
99 | #+ATTR_LATEX: :width 100
|
---|
100 | [[./gnu-book.jpeg]]
|
---|
101 | * Редакторы
|
---|
102 | ** Другие редакторы
|
---|
103 | Рассмотрим следующие текстовые редакторы, которые возможно
|
---|
104 | используют ваши друзья и коллеги:
|
---|
105 |
|
---|
106 | * IDE от JetBrains (PHPStorm, InttelliIDEA и т.д.)
|
---|
107 | * VS Code
|
---|
108 | * Sublime Text
|
---|
109 | * Vi/Vim/NeoVim
|
---|
110 |
|
---|
111 | За исключением вима данные редакторы не подходят для общего
|
---|
112 | назначения, большинство из них направлены именно на написание
|
---|
113 | кода. Тем не менее даже в более узкой специализации они имеют
|
---|
114 | серьезные изъяны.
|
---|
115 |
|
---|
116 | ** Недостатки популярных редакторов
|
---|
117 | *** IDE от JetBrains
|
---|
118 | * Закрытый исходный код
|
---|
119 | * Плохая производительность, долгий отклик
|
---|
120 | * Узкая специализация (одно IDE на язык вместо одного окружения для всего)
|
---|
121 | * Неконсинстентность интерфейса
|
---|
122 | *** Sublime Text
|
---|
123 | * Закрытый исходный код
|
---|
124 | * Неконсинстентность интерфейса
|
---|
125 | ** Недостатки популярных редакторов
|
---|
126 | *** VS Code
|
---|
127 | * Телеметрия
|
---|
128 | * Низкая производительность (Electron)
|
---|
129 | * Основан на веб-технологиях
|
---|
130 | * Неконсистентность интерфейса
|
---|
131 | *** Vi/Vim/NeoVim
|
---|
132 | * Невозможно выйти (шутка)
|
---|
133 |
|
---|
134 | * Vim и Emacs
|
---|
135 | ** Почему Emacs и Vim непопулярны
|
---|
136 |
|
---|
137 | #+ATTR_LATEX: :height 120
|
---|
138 | [[./learning-curve.jpg]]
|
---|
139 |
|
---|
140 | Ответ: Кривая обучения
|
---|
141 |
|
---|
142 | ** Миф: Emacs не настолько сложен
|
---|
143 | Мы видим, что вход в вим высокий. С другой стороны у Emacs кривая
|
---|
144 | обучения начинается с самого низа, но потом закручивается. Что это
|
---|
145 | значит?
|
---|
146 |
|
---|
147 | ** Миф: Emacs не настолько сложен
|
---|
148 | В отличии от Vim GNU/Emacs имеет рядовые инструменты для работы с
|
---|
149 | текстом: поддержка мыши (выделение, скролл), стрелки, улучшенная
|
---|
150 | система горячих клавиш, меню. Emacs в изначальной поставке -- это
|
---|
151 | что-то между обычным текстовым редактором вроде notepad.exe и
|
---|
152 | IDE. Тем не менее Emacs имеет возможности расширения, которые
|
---|
153 | позволяют превратить его в многофункциональное IDE-подобное нечто.
|
---|
154 | ** M-x butterfly
|
---|
155 | #+ATTR_LATEX: :height 140
|
---|
156 | [[./real_programmers.png]]
|
---|
157 |
|
---|
158 | Шуточная функция поставляется в GNU/Emacs после появления комикса.
|
---|
159 | ** Схожести и отличия Emacs / Vim
|
---|
160 | #+ATTR_LATEX: :height 120
|
---|
161 | [[./emacs-vim.png]]
|
---|
162 | Не смотря на то, что редакторы достаточно разительно отличаются
|
---|
163 | друг друга концептуально, на самом деле у них больше общего чем
|
---|
164 | может показаться.
|
---|
165 | ** Схожести
|
---|
166 | | | *Emacs* | *Vim* |
|
---|
167 | |-------------------------+---------+-------|
|
---|
168 | | Интерфейс | Текст | Текст |
|
---|
169 | | Туториал | Есть | Есть |
|
---|
170 | | Фреймы | Есть | Есть |
|
---|
171 | | Файловый менеджер | Есть | Есть |
|
---|
172 | | Макросы | Есть | Есть |
|
---|
173 | | Автокомплит | Есть | Есть |
|
---|
174 | | Интеграция с терминалом | Есть | Есть |
|
---|
175 |
|
---|
176 | ** Отличия
|
---|
177 | | | *Emacs* | *Vim* |
|
---|
178 | |---------------------+------------------+-------------|
|
---|
179 | | Ввод | Аккордовые бинды | Модальность |
|
---|
180 | | Язык расширений | Emacs Lisp | VimScript |
|
---|
181 | | Принципы | M-x butterfly | Unix Way |
|
---|
182 | | Документация | Info | Man |
|
---|
183 | | Клиент (в основном) | Графика | Терминал |
|
---|
184 |
|
---|
185 | Подробнее о сравнении Vim и Emacs:
|
---|
186 | https://en.wikipedia.org/wiki/Editor_war
|
---|
187 |
|
---|
188 | ** Что даёт графический клиент
|
---|
189 | - Правильно работающие бинды (например в консоли не сработает C-.)
|
---|
190 | - Управление мышью
|
---|
191 | - Отображение картинок, видео, граф. документов вроде pdf
|
---|
192 | - Отображение шрифта с лигатурами
|
---|
193 | - Всплывающие окна и дополнительные меню
|
---|
194 | ** (equal :Emacs :Vim) ;; => t
|
---|
195 | Субъективно Emacs Lisp предоставляет больше возможностей по
|
---|
196 | расширению редактора, чем VimScript. Хотя Emacs Lisp и далёк от
|
---|
197 | идеала, он больше похож на язык общего назначения. По этим и другим
|
---|
198 | соображениям Emacs популярен в частности среди пользователей Vim.
|
---|
199 | ** Evil
|
---|
200 | #+ATTR_LATEX: :height 25
|
---|
201 | [[./evil.png]] *Evil-mode* -- это расширение для GNU/Emacs, которое
|
---|
202 | эмулирует Vim. Так как оба редактора работают со всеми объектами как
|
---|
203 | с текстом, то использование эмуляции Vim в Emacs более тривиальное,
|
---|
204 | чем в каком-нибудь IDE. Огромное количество пакетов Emacs
|
---|
205 | предоставляют биндинги для работы с Evil.
|
---|
206 | * Возможности
|
---|
207 | ** Что есть в GNU/Emacs
|
---|
208 | * Рантайм Emacs Lisp
|
---|
209 | * Аккордовые сочетания клавиш
|
---|
210 | * Макросы
|
---|
211 | * Встроенный пакетный менеджер
|
---|
212 | * Встроенный файловый менеджер
|
---|
213 | * Отображение номеров строк
|
---|
214 | * Работа с терминалом (ansi-term, eshell)
|
---|
215 | * Разделение на фреймы
|
---|
216 | * Поддержка большого числа языков программирования
|
---|
217 | * Поддержка спелл-чекера
|
---|
218 | * Встроенная система помощи (туториал, apropos, функции, бинды)
|
---|
219 | ** Что есть в GNU/Emacs
|
---|
220 | * Интерактивные элементы (кнопки, формы и т.д.)
|
---|
221 | * Интерфейс к info и man
|
---|
222 | * Поиск
|
---|
223 | * Встроенный текстовый браузер eww
|
---|
224 | * Встроенные клиенты IRC и email
|
---|
225 | * Линтер кода Flymake
|
---|
226 | * Интерфейс к GDB
|
---|
227 | * Система контроля версий (не только git)
|
---|
228 | * Возможность удаленного редактирования кода (например через ssh)
|
---|
229 | * Org-mode для ведения заметок (и много чего еще)
|
---|
230 | * Можно читать pdf (с pdf-tools)
|
---|
231 | ** Биндинги Emacs
|
---|
232 | Биндинги в Emacs мнемонические. Это значит, что их легко запомнить,
|
---|
233 | так как буква биндинга практически всегда что-то обозначает.
|
---|
234 | - =C-n= Следующая строка (next)
|
---|
235 | - =C-p= Предыдущая строка (previous)
|
---|
236 | - =C-f= Вперед на символ (forward)
|
---|
237 | - =C-b= Назад на символ (back)
|
---|
238 |
|
---|
239 | Не все биндинги появились именно в Emacs. Emacs изначально был
|
---|
240 | расширением редактора TECO.
|
---|
241 |
|
---|
242 | Подробнее об истории биндингов Emacs и Vim:
|
---|
243 | http://xahlee.info/kbd/keyboard_hardware_and_key_choices.html
|
---|
244 | ** Биндинги Emacs
|
---|
245 | Важным отличием биндингов в редакторе GNU/Emacs является то, что
|
---|
246 | они еще и аккордовыми. Это значит, что несколько комбинаций
|
---|
247 | следующих друг за другом могут что-то значить. Например:
|
---|
248 | - =C-x C-f= открыть файл
|
---|
249 | - =C-x s= сохранить файл
|
---|
250 | Набираемые аккордовые бинды отображаются в мод-лайне. Для сброса
|
---|
251 | существует биндинг *C-g*.
|
---|
252 | ** Emacs Lisp
|
---|
253 | Ядро редактора написано на языке C, остальное -- язык расширений
|
---|
254 | Emacs Lisp (25% C + 75% Elisp). Лисп -- один из старейших
|
---|
255 | динамических языков программирования, основанный на
|
---|
256 | нетипизированном лямбда-исчислении. Выглядит примерно так:
|
---|
257 |
|
---|
258 | #+BEGIN_SRC emacs-lisp
|
---|
259 | ;; Объявление и вызов функции
|
---|
260 | (defun имя-функции (аргументы) (тело функции))
|
---|
261 | (имя-функция аргумент1 аргумент2)
|
---|
262 |
|
---|
263 | (defun hello (name)
|
---|
264 | (concat "Hello, " name)) ;; => hello
|
---|
265 | (hello "Mikhail") ;; => "Hello, Mikhail"
|
---|
266 | #+END_SRC
|
---|
267 | ** Всё есть функция
|
---|
268 | Любое действие в редакторе представляет из себя функцию.
|
---|
269 | - Двинули курсор в начало строки -- функция beginning-of-line
|
---|
270 | - Сохранили файл -- функция save-buffer
|
---|
271 | - Вставили текст -- функция yank
|
---|
272 |
|
---|
273 | И так с любым действием.
|
---|
274 |
|
---|
275 | ** Система помощи
|
---|
276 | В GNU/Emacs встроен туториал и очень удобная система помощи.
|
---|
277 | - =C-h t= Туториал (на русском языке)
|
---|
278 | - =C-h r= Мануал Emacs
|
---|
279 | - =C-h a= Apropos (по описанию находит нужную функцию)
|
---|
280 | - =C-h k= Describe-key (описывает функцию, прикрепленную к бинду)
|
---|
281 | - =C-h f= Describe-function (описывает функцию)
|
---|
282 | - =C-h m= Describe-mode
|
---|
283 | - =C-h i= Info
|
---|
284 | ** Моды
|
---|
285 | *Мод* -- это модификация GNU/Emacs, которая включается при
|
---|
286 | определенном условии.
|
---|
287 | - Major мод может быть всего один, чаще всего вешается на открытие
|
---|
288 | файла определенного расширения. Например при открытие файла с
|
---|
289 | расширением .py запустится python-mode.
|
---|
290 | - Minor модов может быть неограниченное количество, они дополняют
|
---|
291 | функционал Major модов. Могут быть активированы всегда (имеют
|
---|
292 | префикс global-<название мода>) или при определенном условии.
|
---|
293 | ** Мод-лайн
|
---|
294 | *Мод-лайн* отображает информацию об используемых модах и состоянии
|
---|
295 | файла (название, сохранён или нет, позиция курсора, система
|
---|
296 | контроля версий). Пользователь может расширить мод-лайн для показа
|
---|
297 | своей информации, например времени. Под мод-лайном располагает
|
---|
298 | Echo зона, которая даёт уведомления о работе модов, а также может
|
---|
299 | запрашивать ввод.
|
---|
300 | ** Буфер
|
---|
301 | *Буфер* -- это обособленная память с текстом, которой манипулирует
|
---|
302 | имакс прежде чем писать на диск. Экран Emacs отображает буфера,
|
---|
303 | грубо говоря вы видите всегда как-минимум один буфер. При запуске
|
---|
304 | доступны следующие буферы:
|
---|
305 | - =*GNU EMACS*= -- начальный экран
|
---|
306 | - =*scratch*= -- площадка REPL для обкатывания Emacs Lisp
|
---|
307 | Бинды:
|
---|
308 | - =C-x b= -- сменить буфер
|
---|
309 | - =C-x C-b= -- список буферов
|
---|
310 | ** Программирование
|
---|
311 | Поддерживаются языки:
|
---|
312 | - C
|
---|
313 | - Lisp и Scheme
|
---|
314 | - C++
|
---|
315 | - Fortran
|
---|
316 | - Java
|
---|
317 | - Javascript
|
---|
318 | - Python
|
---|
319 | - Ruby
|
---|
320 | - Perl
|
---|
321 | - и множество других
|
---|
322 | Разумеется список можно расширить сторонними пакетами
|
---|
323 | ** Программирование
|
---|
324 | Также для задач программирования доступны:
|
---|
325 | - Форматирование кода
|
---|
326 | - Компилирование программ
|
---|
327 | - Линтер Flymake, который на фоне проверяет текст программы
|
---|
328 | - Дебаггеры GDB, PDB, JDB и другие
|
---|
329 | - Интерфейс к grep
|
---|
330 | - Выполнение кода Emacs Lisp прямо в редакторе
|
---|
331 | ** Система контроля версий
|
---|
332 | При программировании полезно использовать систему контроля
|
---|
333 | версий. Самая распространненая система -- git. Про другие системы
|
---|
334 | обычно забывают, но не в случае Emacs. Система контроля версий
|
---|
335 | Emacs поддерживает:
|
---|
336 | - Git
|
---|
337 | - Mercurial
|
---|
338 | - CVS
|
---|
339 | - Bazaar
|
---|
340 | - Subversion
|
---|
341 | - и другие
|
---|
342 |
|
---|
343 | ** Org-mode
|
---|
344 | *Org-mode* -- Markdown на колёсах, декларативный формат описания
|
---|
345 | всего и вся, основанный на списке из уровней (Outline). С помощью
|
---|
346 | org-mode можно:
|
---|
347 | - Организовывать свою жизнь
|
---|
348 | - Создавать документы и презентации (latex)
|
---|
349 | - Использовать технику грамотного программирования
|
---|
350 | - Заменять Markdown
|
---|
351 |
|
---|
352 | https://orgmode.org/worg/org-tutorials/
|
---|
353 | ** Tramp
|
---|
354 | #+BEGIN_QUOTE
|
---|
355 | Вимеры могут привести в аргумент то, что их редактор уже доступен
|
---|
356 | на многих системам и ничего не надо докачивать и что можно
|
---|
357 | редактировать прямо на сервере.
|
---|
358 | #+END_QUOTE
|
---|
359 | В Emacs вы можете редактировать удалённые файлы через ssh,
|
---|
360 | использую Tramp. Выглядеть это будет также как вы редактируете всё
|
---|
361 | на своей родной системе. В Vim редактирование на сервере работает
|
---|
362 | только при условии отсутствия конфигурации, в Emacs
|
---|
363 | ** Кастомизация
|
---|
364 | [[./customize.png]]
|
---|
365 | =M-x customize= открывает GUI, позволяющий редактировать поведение
|
---|
366 | и внешний вид Emacs.
|
---|
367 | * Конфиг
|
---|
368 | ** .emacs / init.el
|
---|
369 | В качестве конфигурации Emacs использует один из следующих файлов в домашней директории:
|
---|
370 | - ~/.emacs
|
---|
371 | - ~/.emacs.d/init.el
|
---|
372 |
|
---|
373 | Файл конфигурации содержит листинг кода на Emacs Lisp, который
|
---|
374 | Emacs вычисляет при запуске программы. Чтобы создавать конфиг Emacs
|
---|
375 | вовсе необязательно в идеале владеть Emacs Lisp.
|
---|
376 | ** Пакетный менеджер package.el
|
---|
377 | Для расширения предусмотрен пакетный менеджер, который уже встроен
|
---|
378 | в редактор. По-умолчанию доступен только один официальный
|
---|
379 | репозиторий Elpa, но пользователь может подключать сторонние
|
---|
380 | (например Melpa).
|
---|
381 | - =M-x list-packages= -- список пакетов, доступных в репозиториях
|
---|
382 | - =M-x package-install <название пакета>= -- установка пакета из репозитория
|
---|
383 | Моя конфигурация доступна по адресу https://w96k.ru/emacs.html
|
---|
384 | ** use-package
|
---|
385 | *use-package* -- это декларативная обёртка от сообщества для
|
---|
386 | package.el. Рекомендую использовать use-package, чтобы ваш конфиг
|
---|
387 | не превратился со временем в нечитаемое месиво.
|
---|
388 | - =:config= -- изолирует конфигурацию пакетов друг от друга
|
---|
389 | - =:hook= -- короткая запись для навешивания хуков
|
---|
390 | - =:ensure= -- загружает пакет из репозитория
|
---|
391 | - =:diminish= -- скрывает мод из модлайна
|
---|
392 | - и другие опции
|
---|
393 |
|
---|
394 | * Демо
|
---|
395 | ** Создание базового конфига
|
---|
396 | Наглядное создание базового конфига с нуля.
|
---|
397 | ** Редактирование кода
|
---|
398 | - Projectile
|
---|
399 | - VCS
|
---|
400 | - LSP
|
---|
401 | - Repl и терминал
|
---|
402 | ** Организация жизни при помощи org-mode
|
---|
403 | ** Ведение документов
|
---|
404 | * Дистрибутивы
|
---|
405 | ** Vanilla
|
---|
406 | ** Spacemacs
|
---|
407 | ** Doom Emacs
|
---|
408 | ** Prelude
|
---|
409 | * Изучение
|
---|
410 | ** Tutorial
|
---|
411 | ** Info emacs
|
---|
412 | ** Книги
|
---|
413 | *** Mastering Emacs
|
---|
414 | *** Learning Gnu Emacs
|
---|