Обзор

В своей предыдущей статье я задокументировал очень краткий учебник по Emacs Lisp. В этой статье продолжим создавать конфигурацию Emacs для начинающих.

Введение

Emacs — это больше, чем просто редактор текста/кода (LSP, DAP). Это расширяемая вычислительная среда, которую можно использовать в качестве почтового клиента (mu4e), оконного менеджера (exwm), редактирования удаленных файлов (tramp) и многого другого. В орг-режиме вы можете использовать Emacs для ведения заметок, ведения списков дел, планирования проектов, создания документов, вычислительных записных книжек, грамотного программирования (Вавилон) и многого другого.

В отличие от VSCode, с которым легко начать работу, Emacs требует настройки с помощью elisp, чтобы быть полезным и эффективным в использовании. Существуют такие дистрибутивы, как Spacemacs или Doom Emacs, которые упрощают начало работы с Emacs. Тем не менее, я предлагаю вам начать с понимания некоторых основ Emacs Lisp и попытаться настроить свои собственные файлы точек Emacs. Без понимания основ вы столкнетесь с проблемами при дальнейшей настройке Emacs.



Изучив основы, вы сможете решить, хотите ли вы разрабатывать свои собственные dotfiles или использовать дистрибутивы Emacs, такие как Spacemacs или Doom Emacs.

Основы

Экран Emacs

Выше приведен скриншот Emacs из коробки.

  • Frame выделено КРАСНЫМ прямоугольником.
  • Menu bar выделен СИНИМ прямоугольником.
  • Tool bar выделено ЗЕЛЕНЫМ прямоугольником.
  • Window выделено ПУРПУРНЫМ прямоугольником.
  • Слева от окна, выделенного КОРИЧНЕВЫМ цветом, находится окно fringe.
  • Mode line выделено ЖЕЛТЫМ прямоугольником.
  • Echo area выделяется ЧЕРНЫМ прямоугольником (внизу экрана).

Файл инициализации Emacs

Когда Emacs запускается, он обычно пытается загрузить программу на Лиспе из файла инициализации или, для краткости, файла инициализации. Традиционно в качестве файла инициализации используется файл ~/.emacs, хотя Emacs также просматривает ~/.emacs.el, ~/.emacs.d/init.el, ~/.config/emacs/init.el и другие местоположения. Вы также можете указать XDC_CONFIG_HOME для своего местоположения. В моем случае я храню свою конфигурацию в ~/.config/emacs/init.el.

Структура точечных файлов

Подобно Emacs Bootstrap, я собираюсь разделить конфигурацию на разные файлы elisp в папке elisp и загрузить их из init.el.

(add-to-list 'load-path (concat user-emacs-directory "elisp"))
(require 'base)
(require 'theme)
....

Базовая конфигурация

Давайте начнем с конфигурации base, создав файл с именем base.el в папке elisp.

  • Для лучшего просмотра я установил размер шрифта по умолчанию равным 160.
  • Я определил переменную для настраиваемого файла и загружал пользовательский файл при запуске Emacs. Это необходимо, чтобы запретить Emacs записывать какие-либо настройки в myinit.el..
  • Добавьте и обновите MELPA (архив пакетов Emacs Lisp от Milkypostman), используя package.el, чтобы разрешить установку пакетов MELPA.
  • Установите use-package, если он не установлен. Я собираюсь использовать его, чтобы изолировать установку и настройку пакетов.
  • Я указываю, что make-backup-files равно false. файл резервной копии — это копия старого содержимого файла, который вы редактируете.
  • Для отображения номеров строк ​​я установил relative.
  • Я устанавливаю для use-package-always-ensure значение true, чтобы use-package автоматически устанавливал пакет, если он отсутствует.
  • global-auto-revert-mode имеет значение true, чтобы автоматически перезагружать файл, если он обновляется другой программой.
  • global-display-line-numbers-mode отображает номера строк для всех буферов.
  • show-paren-mode позволяет мне видеть совпадающие скобки. Отличная помощь для проверки синтаксиса Lisp.
  • Я загружаю пользовательский файл, если он был создан Emacs.
  • Добавьте хук для удаления завершающих пробелов перед сохранением файла.

Вы можете дополнительно настроить базовые конфигурации по своему усмотрению, например. вы можете пропустить экран запуска, удалить панель инструментов, строку меню, полосу прокрутки и т. д.

Тема

Тема Emacs по умолчанию скучна. Давайте добавим к нему тему.

  • Создайте файл с именем theme.el в папке elisp.
  • Используйте use-package для установки spacemacs-theme. Для отложенной загрузки установлено значение true (другой пакет вызывает его загрузку). Ключевое слово :init используется для выполнения кода перед загрузкой пакета.
(use-package spacemacs-theme
  :defer t
  :init
  (load-theme 'spacemacs-dark t))
(provide 'theme)

В init.el загружаю тему после базовой конфигурации.

;; elisp files
(add-to-list 'load-path (concat user-emacs-directory "elisp"))
;; Base configuration
(require 'base)
;; Theme
(require 'theme)

Запустите Emacs, и я увижу, что тема уже загружена.

Злой режим

Я предпочитаю модальное редактирование Vim, поэтому давайте установим evil-mode.

  • Создайте файл с именем vim.el в папке elisp.
(use-package evil
  :init
  (setq evil-vsplit-window-right t)
  (setq evil-split-window-below t)
  (setq evil-want-C-u-scroll t)
  (setq evil-want-C-i-jump nil)
  :config
  (evil-mode 1))
(provide 'vim)

Загрузите этот файл в init.el

;; elisp files
(add-to-list 'load-path (concat user-emacs-directory "elisp"))
;; Base configuration
(require 'base)
;; Theme
(require 'theme)
;; Evil mode
(require 'vim)

Вы можете переключаться между режимами Vim и Emacs, используя C-z.

Завершение

Давайте установим структуру завершения, используя плющ, адвокат и компания.

Создайте файл с именем completion.el в папке elisp

Айви, советник

Добавьте следующие строки в completion.el.

(use-package ivy
  :bind
  ("C-x s" . swiper)
  ("C-x C-r" . ivy-resume)
  :config
  (ivy-mode 1)
  (setq ivy-use-virtual-buffers nil)
  (define-key read-expression-map (kbd "C-r") 'counsel-expression-history))
(use-package counsel
  :bind
  ("M-x" . counsel-M-x)
  ("C-x C-m" . counsel-M-x)
  ("C-x C-f" . counsel-find-file)
  ("C-x c k" . counsel-yank-pop))

Нажмите M-x, и я вижу, что сейчас он использует совет.

Есть много других функций советника, которые вы можете использовать. Вы можете дополнительно определить сопоставления клавиш для использования функций советника.

Компания

Давайте добавим фреймворк автодополнения текста с помощью company.

Добавьте следующие строки в completion.el

(use-package company
  :config
  (add-hook 'after-init-hook 'global-company-mode))

Запустите Emacs, и я увижу меню завершения по мере ввода.

Какой ключ

В Emacs просто слишком много сопоставлений клавиш. Давайте установим what-key, чтобы помочь.

Добавьте следующие строки в completion.el

(use-package which-key
  :defer 0
  :diminish which-key-mode
  :config
  (which-key-mode)
  (setq which-key-idle-delay 1))

Теперь в Emacs всякий раз, когда вы нажимаете комбинацию клавиш, он будет показывать вам доступные сопоставления клавиш. Например. когда я нажимаю C-x

Взаимодействие проекта

Давайте установим снаряд, чтобы упростить управление проектами.

Создайте файл с именем workspace.el в папке elisp.

(use-package projectile
  :diminish projectile-mode
  :config
  (setq projectile-completion-system 'ivy)
  (projectile-global-mode)
  :bind-keymap
  ("C-c p" . projectile-command-map)
  :init
  (setq projectile-project-search-path '("~/workspace/development/"))
  (setq projectile-switch-project-action #'projectile-dired))
(use-package counsel-projectile
  :after projectile
  :bind
  ("C-SPC" . counsel-projectile-switch-project)
  :config
  (counsel-projectile-mode))
(provide 'workspace)

Я настроил папку на поиск проектов. Запустите Emacs, и теперь я могу легко переключаться между проектами.

Я настроил все команды снаряда так, чтобы они начинались с C-c p.

Для переключения проектов введите Control-Space (C-SPC).

Стартовый экран

Стартовый экран скучный. Изменим его с помощью dashboard.

Создайте файл с именем splash.el в папке elisp.

;; Dependencies
(use-package page-break-lines)
(use-package all-the-icons)
(use-package dashboard
  :config
  (setq show-week-agenda-p t)
  (setq dashboard-items '((recents . 15) (agenda . 5)))
  (setq dashboard-set-heading-icons t)
  (setq dashboard-set-file-icons t)
  (setq dashboard-startup-banner 3)
  (dashboard-setup-startup-hook)
  )
(provide 'splash)

Запустите Emacs, и должна появиться панель инструментов.

Магит

Установим контроль версий с помощью Magit.

Создайте файл с именем vcs.el в папке elisp.

(use-package magit
  :config
  (setq magit-completing-read-function 'ivy-completing-read)
  :bind
  ;; Magic
  ("C-x g s" . magit-status)
  ("C-x g x" . magit-checkout)
  ("C-x g c" . magit-commit)
  ("C-x g p" . magit-push)
  ("C-x g u" . magit-pull)
  ("C-x g e" . magit-ediff-resolve)
  ("C-x g r" . magit-rebase-interactive))
(use-package magit-popup)
(provide 'vcs)

Запустите Emacs и нажмите C-x g s, чтобы увидеть статус Git.

Резюме

Теперь у нас есть очень простая конфигурация Emacs, как показано ниже. В следующих статьях мы увидим, как добавить LSP, DAP, а также сделать его более удобным для пользователя, как Spacemacs или Doom Emacs.

Точечные файлы, которые я использовал, можно найти в этом репозитории.

Прочтите эту статью о том, как я настраиваю LSP и DAP для Emacs на основе этой конфигурации.





использованная литература

Если вы еще не являетесь участником Medium и хотите им стать, нажмите здесь. (Часть вашей абонентской платы будет использована для поддержки alpha2phi.)