[9742500] | 1 | #+Title: Свободный текстовый редактор общего назначения GNU/Emacs
|
---|
[e6924ee] | 2 | #+Author: Михаил Кириллов https://w96k.de
|
---|
| 3 | #+EMAIL: w96k.ru@gmail.com
|
---|
[9742500] | 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
|
---|
[e6924ee] | 14 | #+LINK_HOME: https://w96k.dev
|
---|
[9742500] | 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 | Имаксом в той или иной степени пользовались следующие люди:
|
---|
[8e04a0f] | 47 | * Линус Торвальдс
|
---|
[9742500] | 48 | * Дональд Кнут
|
---|
| 49 | * Юкихиро Матсумото
|
---|
| 50 | * Гуидо Ван Россум
|
---|
| 51 | * Рич Хикей
|
---|
| 52 | * Джо Армстронг
|
---|
| 53 | * Эрик Реймонд
|
---|
[8e04a0f] | 54 | * Андрей Александреску
|
---|
[9742500] | 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
|
---|