#+Title: Свободный текстовый редактор общего назначения GNU/Emacs #+Author: Михаил Кириллов https://w96k.de #+EMAIL: w96k@runbox.com #+DATE: 1 Июня 2020 #+LANGUAGE: ru #+OPTIONS: H:2 date:nil 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: Berlin #+BEAMER_COLOR_THEME: default #+LATEX_HEADER: \usepackage[russian]{babel} #+LATEX_HEADER: \usepackage{beamerthemesplit} #+LATEX_CLASS_OPTIONS: [article,12pt,notitlepage,notitle,oneside,twocolumn] #+STARTUP: beamer #+LINK_HOME: https://w96k.dev * Вступление ** Текстовый редактор Текстовый редактор необходим тем, кто хочет набирать и сохранять текст в памяти компьютера. Это может понадобиться программистам и тем, кто хочет писать заметки и документы. ** Свобода - Пользователь хочет понимать работу одного из базовых инструментов - Для понимания необходимо изучить исходный код - Исходный код может быть открытым или закрытым - Только при открытости исходного кода становиться возможно полностью изучить работу программы. Также это способствует улучшению и расширению функционала. ** О чём доклад Мы рассмотрим использование редактора GNU Emacs для выполнения следующих задач: - программирование - редактирования документов и презентаций - ведение заметок * GNU ** GNU/Emacs #+ATTR_LATEX: :width 100 [[./emacs.png]] *GNU/Emacs* -- это свободный немодальный текстовый редактор общего назначения, созданный в 1985 году Ричардом Столлманом. Редактор обновляется по сей день и доступен на многих платформах в том числе Windows. ** Кто пользуется Имаксом в той или иной степени пользовались следующие люди: * Линус Торвальдс * Дональд Кнут * Юкихиро Матсумото * Гуидо Ван Россум * Рич Хикей * Джо Армстронг * Эрик Реймонд * Андрей Александреску Также Emacs весьма популярен среди непрограммистов, например писателей. ** Главный экран # Продемонстрировать главный экран Emacs Если открыть Имакс, то нас встретит следующая надпись:\\ *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=10 :END: *** Свобода 0 Свобода выполнять программу как вам угодно в любых целях. *** Свобода 1 Свобода изучать работу программы и модифицировать программу, чтобы она выполняла ваши вычисления, как вы пожелаете. Это предполагает доступ к исходному тексту. *** Свобода 2 Свобода передавать копии, чтобы помочь другим. *** Свобода 3 Свобода передавать копии своих измененных версий другим. Этим вы можете дать всему сообществу возможность получать выгоду от ваших изменений. Это предполагает доступ к исходному тексту. ** Больше о GNU Деятельность данного фонда подробно описана в книге "[[https://en.wikipedia.org/wiki/Free_as_in_Freedom][Free as in Freedom]]", которая доступна на русском языке. #+ATTR_LATEX: :width 100 [[./gnu-book.jpeg]] * Редакторы ** Другие редакторы Рассмотрим следующие текстовые редакторы, которые возможно используют ваши друзья и коллеги: * IDE от JetBrains (PHPStorm, InttelliIDEA и т.д.) * VS Code * Sublime Text * Vi/Vim/NeoVim За исключением вима данные редакторы не подходят для общего назначения, большинство из них направлены именно на написание кода. Тем не менее даже в более узкой специализации они имеют серьезные изъяны. ** Недостатки популярных редакторов *** IDE от JetBrains * Закрытый исходный код * Плохая производительность, долгий отклик * Узкая специализация (одно IDE на язык вместо одного окружения для всего) * Неконсинстентность интерфейса *** Sublime Text * Закрытый исходный код * Неконсинстентность интерфейса ** Недостатки популярных редакторов *** VS Code * Телеметрия * Низкая производительность (Electron) * Основан на веб-технологиях * Неконсистентность интерфейса *** Vi/Vim/NeoVim * Невозможно выйти (шутка) * Vim и Emacs ** Почему Emacs и Vim непопулярны #+ATTR_LATEX: :height 120 [[./learning-curve.jpg]] Ответ: Кривая обучения ** Миф: Emacs не настолько сложен Мы видим, что вход в вим высокий. С другой стороны у Emacs кривая обучения начинается с самого низа, но потом закручивается. Что это значит? ** Миф: Emacs не настолько сложен В отличии от Vim 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* | |-------------------------+---------+-------| | Интерфейс | Текст | Текст | | Туториал | Есть | Есть | | Фреймы | Есть | Есть | | Файловый менеджер | Есть | Есть | | Макросы | Есть | Есть | | Автокомплит | Есть | Есть | | Интеграция с терминалом | Есть | Есть | ** Отличия | | *Emacs* | *Vim* | |---------------------+------------------+-------------| | Ввод | Аккордовые бинды | Модальность | | Язык расширений | Emacs Lisp | VimScript | | Принципы | M-x butterfly | Unix Way | | Документация | Info | Man | | Клиент (в основном) | Графика | Терминал | Подробнее о сравнении Vim и Emacs: https://en.wikipedia.org/wiki/Editor_war ** Что даёт графический клиент - Правильно работающие бинды (например в консоли не сработает C-.) - Управление мышью - Отображение картинок, видео, граф. документов вроде pdf - Отображение шрифта с лигатурами - Всплывающие окна и дополнительные меню ** (equal :Emacs :Vim) ;; => t Субъективно Emacs Lisp предоставляет больше возможностей по расширению редактора, чем VimScript. Хотя Emacs Lisp и далёк от идеала, он больше похож на язык общего назначения. По этим и другим соображениям Emacs популярен в частности среди пользователей Vim. ** Evil #+ATTR_LATEX: :height 25 [[./evil.png]] *Evil-mode* -- это расширение для GNU/Emacs, которое эмулирует Vim. Так как оба редактора работают со всеми объектами как с текстом, то использование эмуляции Vim в Emacs более тривиальное, чем в каком-нибудь IDE. Огромное количество пакетов Emacs предоставляют биндинги для работы с Evil. * Возможности ** Что есть в GNU/Emacs * Рантайм Emacs Lisp * Аккордовые сочетания клавиш * Макросы * Встроенный пакетный менеджер * Встроенный файловый менеджер * Отображение номеров строк * Работа с терминалом (ansi-term, eshell) * Разделение на фреймы * Поддержка большого числа языков программирования * Поддержка спелл-чекера * Встроенная система помощи (туториал, apropos, функции, бинды) ** Что есть в GNU/Emacs * Интерактивные элементы (кнопки, формы и т.д.) * Интерфейс к info и man * Поиск * Встроенный текстовый браузер eww * Встроенные клиенты IRC и email * Линтер кода Flymake * Интерфейс к GDB * Система контроля версий (не только git) * Возможность удаленного редактирования кода (например через ssh) * Org-mode для ведения заметок (и много чего еще) * Можно читать pdf (с pdf-tools) ** Биндинги 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 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 И так с любым действием. ** Система помощи В 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 <название пакета>= -- установка пакета из репозитория Моя конфигурация доступна по адресу https://w96k.ru/emacs.html ** use-package *use-package* -- это декларативная обёртка от сообщества для package.el. Рекомендую использовать use-package, чтобы ваш конфиг не превратился со временем в нечитаемое месиво. - =:config= -- изолирует конфигурацию пакетов друг от друга - =:hook= -- короткая запись для навешивания хуков - =:ensure= -- загружает пакет из репозитория - =:diminish= -- скрывает мод из модлайна - и другие опции * Демо ** Создание базового конфига Наглядное создание базового конфига с нуля. ** Редактирование кода - Projectile - VCS - LSP - Repl и терминал ** Организация жизни при помощи org-mode ** Ведение документов * Дистрибутивы ** Vanilla ** Spacemacs ** Doom Emacs ** Prelude * Изучение ** Tutorial ** Info emacs ** Книги *** Mastering Emacs *** Learning Gnu Emacs