Редактор кода Doom emacs.
Про Emacs.
Думаю если ты попал на эту статью, у тебя уже есть определенные представления про Emacs, можешь смело мотать ниже к конфигам и скринам :).
Но если ты вдруг не слышал про emacs
Emacs - это редактор, ну или так может показаться на первый взгляд. На самом деле emacs это религия, вселенная и целый полигон для любых твоих идей и эксперементов. Серьезно, ты можешь реализовать любую идею внутри емакса. Иногда это доходит до какого-то безумия, т.к. внутри него ты вполне себе можешь использовать twitter, почтовый клиент, и даже телеграм. Лично мне зашли не все идеи, однако это вкусовщина.
За настройку плагинов, отвечает Elisp, для любителей функционального программирования это может оказаться плюсом, лично мне данный язык неочень понравился, достаточно аляписто выглядит и тяжело читается (возможно это дело привычки).
Почему doom emacs?
Долгое время я использовал vim, а затем мигрировал на neovim. В целом меня все устраивало, из недостатков (прошу заметить, весьма субъективных), я могу отметить следующее:
Зачастую не самый удобный дебаг (существуют плагины, позволяющие отлаживать код..но не всегда все происходит бесшвно и гладко)
Не самая удобная интеграция с гитом (существует проект neogit, но он только развивается)
На этом на самом деле все :). По факту, у vim не так много недостатков, мигрировал я в общем-то не из-за них, скорее из-за преимуществ емакса.
Собственно сами преимущества:
Лучший гит клиент ever. Magit.
Сперва я его невзлюбил, теперь я не представляю без него жизни. Аналогичная имплементация для vim - neogit.
- org mode - невероятно удобный формат для ведения журнала, заметок, календаря.
Он настолько удобен, что прямо сейчас, я пишу эту статью в нем. А также, я написал расширение, которое позволяет снхронизировать файлы орг с блогом.
- ivy - просто лучшая имплементация поиска по проекту, заметкам, орг файлам
- bookmarks - невероятный плагин, позволяющий делать заметки в коде и быстро передвигаться между ними, для вим существует аналог, однако, в нем не настолько удобный поиск (снова ivy)
- Поддержка разного размера шрифта. В vim, увы, это просто невозможно т.к. ограничено tty.
Также в doom emacs из коробки идет поддержка vim key binding, c помощью плагина evil.
К недостаткам можно отнести более медленный запуск (зависит от прямоты рук, в моем случае запуск емакс составляет около 6-7 секунд на osx и около 2-3 секунд на arch linux). 2 Моментом является порог входа, на emacs я потратил куда больше времени и сил чем на настройку vim.
Установка doom emacs.
Для начала посетим страницу с описанием пошаговой установки emacs + doom для твоей ос. Я рассмотрю процедуру установки для osx с оптимальным клиентом.
- Установим brew:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Добавим репозиторий с emacs-plus и установим его. Путем проб и ошибок могу сказать что он наиболее оптимизирован для osx и меньше лагает, к тому же поддерживает клиент без title bar
brew tap d12frosted/emacs-plus brew install emacs-plus@27 --with-xwidgets --with-modern-papirus-icon --with-no-titlebar ln -s /usr/local/opt/emacs-plus/Emacs.app /Applications/Emacs.app
Установим фреймворк doom
git clone --depth 1 https://github.com/hlissner/doom-emacs ~/.emacs.d ~/.emacs.d/bin/doom install
В целом, на этом этапе, у нас уже есть рабочий клиент doom emacs с первоначальными настройками.
Полезные ссылки
- Мои конфиги
- Репозиторий doom
- Темы для doom
- Тут проблема с with-no-title-bar и posframe
- Проблема с 1 из патчей swiper (ivy)
- Пример кастомзиации org-capture
- Генератор цветов для темплейтов
- Еще 1 генератор тем
- Работа с регистрами clipboard
Комьюнити
- Рускоязычный телеграм канал по емаксу
- Англоязычный канал по емаксу
- Сабреддит (пожалуй самое большое комьюнити, eng)
Статьи
Профилирование
Патчи
Docs
плагины
Далеко не все плагины, которые я использую, вошли в этот список. Детальнее можно изучить в github.
- Magit - безусловно лучшщий гит клиент (как минимум 1 из лучших) . Org roam - 1 из реализация метода ведения заметок zettelkasten. Бустит продуктивность.
- Org mode. Работает из коробки, однако, решил его тоже добавить.
- LSP mode мод для поддержки автокомплита, рефакторинга и многих других фич для разных языков программирования.
- Company mode - фрейм для автокомплита.
- IVY + IVY posframe движок для поиска всего и вся, а также красивый float frame.
- Evil mode - полноценная реализация кейбиндингов и режимов vim.
- VTerm - полноценный терминал внутри emacs (выглядит куда лучше чем аналоги)
- Лигатуры. Тут, пожалуй, добавить нечего.
- Treemacs - привычное дерево файлов. Лично мне больше по душе встроенные dired.
- Автоформатирование кода.
Структура проекта
Визуальная радость
Git
WAIT Github code review
WAIT Github notifications
Чтение
TODO Fb reader
Makdown
Отладка
Инфраструктура
Автокомполит
- Corfu адаптеры
- Сам corfu, альтернатива company
Полезные фичи
Fflycheck ui не переносит текст ошибки на новую строку Необходимо увеличить макесимально доступное количество строк.
(setq lsp-ui-sideline-diagnostic-max-lines 4)
Оптимизация загрузки Хорошая статья для понимания use-package
Db connection example dbi
Если вдруг ^M вместо \n M-< M-% C-q C-m RET C-q C-j RET
dbi:postgresql://netmap:netmap@127.0.0.1:5432/sequencedata
dbi:SQLite:dbname=/Users/arturarosenko/projects/atom-security/sequencedata-update-server/update.sqlite
Org mode
Языки программирования
Golang
Настройка DAP для отладки
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch from JSON config",
"type": "go",
"request": "launch",
"mode": "debug",
"remotePath": "",
"port": 2345,
"host": "127.0.0.1",
"program": "${workspaceFolder}/app/main.go",
"env": {},
"args": [],
"showLog": true,
"trace": true,
"logging": {
"engineLogging": true
}
}
]
}
Фиксы
Doom emacs не видит недавно добавленный пакет в (m)elpa
# Update MELPA
cd ~/.emacs.d/.local/straight/repos/melpa
git pull
# Clear straight's cache
rm -f ~/.emacs.d/.local/straight/build-cache.el
doom sync
Elfeed не обновляется
Можно попробовать очистить базу rm -rf ~/.emacs.d/.local/elfeed/db/
Настройки
Настройка проверки орфографии с помощью aspell
тут описание. Вместо brew install aspell –with-lang-ru используем brew install aspell
Magit Forge
Для корректной работы необходимо создать файл ~/.authinfo
machine git.private-repo-soft.com/api/v4 login My_Name^forge password some-goken
machine gitlab.com/api/v4 login My_Another_Name^forge password some-token
Машины добавляются для каждого репозитория отдельно Настройки:
(use-package forge
:after magit
:config
(setq auth-sources '("~/.authinfo"))
(push '("git.private-repo.com" "git.private-repo.com/api/v4"
"any-id-what-u-want" forge-gitlab-repository)
forge-alist)
(add-to-list 'ghub-insecure-hosts "git.private-repo.com/api/v4")
)
Баг. flycheck не включается для lsp-ui-mode
https://github.com/emacs-lsp/lsp-mode/issues/2594
Keybinding
На самом деле большинство из них прописаны в подсказках. Однако ты можешь не знать о существовании подобных возможностей:). Выделил только те которые были неочевидны для меня.
Узнать что только что нажал
C-h k <S-SPC>
;; или другое сочетание клавиш
html
- Переход к концу html тега C-c C-f
- Переход к началу html тега C-c C-b
Org mode
- Создание timestamp (+ agenda) C-c .
Magit
- Сташ Z-i
- Ансташ Z-a
- Измененение последнего имени коммита C A C-c C-c
- Checkout на определенный комит l l <выбор коммита> b b
- - свернуть/развернуть узлы в истории изменений
- Cherry pick
- Copy file from another branch