ONE DUDE`S BLOG

/media/H2x1_NSwitchDS_DOOM1993_image1600w.webp

Редактор кода Doom emacs.

31.07.2021
Редактор после которого не хочется использовать что-то еще.

Про 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 с первоначальными настройками.

Полезные ссылки

Комьюнити

Статьи

Профилирование

Патчи

Docs

плагины

Далеко не все плагины, которые я использую, вошли в этот список. Детальнее можно изучить в github.

  1. Magit - безусловно лучшщий гит клиент (как минимум 1 из лучших) . Org roam - 1 из реализация метода ведения заметок zettelkasten. Бустит продуктивность.
  2. Org mode. Работает из коробки, однако, решил его тоже добавить.
  3. LSP mode мод для поддержки автокомплита, рефакторинга и многих других фич для разных языков программирования.
  4. Company mode - фрейм для автокомплита.
  5. IVY + IVY posframe движок для поиска всего и вся, а также красивый float frame.
  6. Evil mode - полноценная реализация кейбиндингов и режимов vim.
  7. VTerm - полноценный терминал внутри emacs (выглядит куда лучше чем аналоги)
  8. Лигатуры. Тут, пожалуй, добавить нечего.
  9. Treemacs - привычное дерево файлов. Лично мне больше по душе встроенные dired.
  10. Автоформатирование кода.

Структура проекта

Визуальная радость

Git

WAIT Github code review

WAIT Github notifications

Чтение

TODO Fb reader

Makdown

Отладка

Инфраструктура

Автокомполит

Полезные фичи

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

Настройка 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

Как это выглядит сейчас?

emacs
workspace
editor
doom
4
7459