Это многостраничный печатный вид этого раздела. Нажмите что бы печатать.

Вернуться к обычному просмотру страницы.

Emacs

Emacs — один из наиболее мощных и широко распространённых редакторов, используемых в мире Unix. По популярности он соперничает с редактором vi и его клонами.

В зависимости от ситуации, Emacs может быть:

  • текстовым редактором;
  • программой для чтения почты и новостей Usenet;
  • интегрированной средой разработки (IDE);
  • операционной системой;
  • всем, чем угодно.

1 - LaTeX в Emacs

Полное руководство по настройке LaTeX в Emacs

Установка и базовая настройка

1. Установка необходимых пакетов

Добавьте в ваш .emacs или init.el:

(use-package tex
  :ensure auctex
  :mode ("\\.tex\\'" . latex-mode)
  :config
  (setq TeX-auto-save t
        TeX-parse-self t
        TeX-save-query nil
        TeX-PDF-mode t))
        
(use-package company-auctex
  :ensure t
  :after (company tex))
  
(use-package reftex
  :ensure t
  :config
  (add-hook 'LaTeX-mode-hook 'turn-on-reftex))

2. Системные зависимости

Убедитесь, что установлены:

  • TeX-дистрибутив (TeX Live или MiKTeX)
  • latexmk (для автоматической сборки)
  • chktex (для проверки стиля)

Основные горячие клавиши

Общие команды

Комбинация Описание
C-c C-c Компиляция документа
C-c C-v Просмотр PDF
C-c C-e Добавить окружение
C-c C-s Добавить section-like команду
C-c C-m Добавить макрос
C-c C-k Удалить макрос/окружение
C-c C-w Проверить орфографию

Навигация

Комбинация Описание
C-c = Показать структуру документа
C-c [ Перейти к следующей метке
C-c ] Перейти к предыдущей метке
C-c & Перейти к месту ссылки

RefTeX (ссылки и библиография)

Комбинация Описание
C-c ( Вставить ссылку
C-c ) Создать метку
C-c [ Вставить ссылку на библиографию
C-c ] Вставить citation
C-c / Поиск по меткам

Настройка рабочего процесса

1. Конфигурация компилятора

(setq TeX-engine 'xetex)  ;; Использовать XeLaTeX
(setq TeX-view-program-selection '((output-pdf "PDF Viewer")))
(setq TeX-view-program-list '(("PDF Viewer" "evince %o")))

2. Автоматическая сборка

(setq TeX-command-default "latexmk")
(setq TeX-command-extra-options "-pdf -shell-escape -synctex=1")

3. Проверка стиля

(add-hook 'LaTeX-mode-hook
          (lambda ()
            (flycheck-mode)
            (setq flycheck-latex-checker 'chktex)))

Продвинутые настройки

1. Интеллектуальное завершение кода

(use-package company-auctex
  :ensure t
  :config
  (company-auctex-init))

2. Подсветка синтаксиса

(use-package latex-preview-pane
  :ensure t
  :config
  (latex-preview-pane-enable))

3. Шаблоны документов

(use-package yasnippet
  :ensure t
  :config
  (yas-global-mode 1))
  
(use-package yasnippet-snippets
  :ensure t)

Рабочий процесс с LaTeX-документом

  1. Создайте новый файл .tex или откройте существующий
  2. Начните вводить \documentclass - сработает автодополнение
  3. Используйте C-c C-e для добавления окружений
  4. Для вставки ссылок:
    • Создайте метку: C-c )
    • Вставьте ссылку: C-c (
  5. Для компиляции: C-c C-c (выберите команду, обычно latexmk)
  6. Для просмотра PDF: C-c C-v

Интеграция с другими инструментами

1. Работа с библиографией (BibTeX)

(setq reftex-plug-into-AUCTeX t)

Команды:

  • C-c [ - вставить ссылку на библиографию
  • C-c C-m bib RET - вставить новый элемент библиографии

2. Просмотр ошибок

Используйте M-x flycheck-list-errors для просмотра списка ошибок.

3. Синхронизация с PDF

(setq TeX-source-correlate-mode t
      TeX-source-correlate-start-server t)

Для перехода из Emacs в PDF и обратно:

  • В Emacs: C-c C-g
  • В PDF-просмотрщике: Ctrl+клик

Полезные советы

  1. Для многофайловых проектов используйте \include и \input
  2. Настройте шаблоны для часто используемых документов
  3. Используйте yasnippet для быстрой вставки структурных элементов
  4. Для математических формул используйте C-c C-m и выберите нужный символ

Решение проблем

1. Компиляция не работает

Проверьте:

  • Установлен ли latexmk: latexmk --version
  • Правильно ли указан путь к TeX-дистрибутиву

2. Нет автодополнения

Убедитесь, что:

  • Пакет company-auctex установлен и загружен
  • Включен режим company-mode

3. PDF не синхронизируется с исходником

Проверьте настройки:

(setq TeX-source-correlate-mode t)

Альтернативные пакеты

  1. AUCTeX - основной пакет для работы с LaTeX
  2. cdlatex - быстрый ввод математических выражений
  3. prettify-symbols-mode - отображение символов (например, \alpha как α)
  4. lsp-latex - Language Server Protocol для LaTeX (требуется texlab)

2 - Yasnippet

Документация и настройки Yasnippet

Yasnippet

Установка Yasnippet

Загрузил через M-x list-packages [RET] yasnippet

Поместил в init.el

(setq yas-snippet-dirs
      '("~/.emacs.d/snippets"                 ;; personal snippets
        "/path/to/some/collection/"           ;; foo-mode and bar-mode snippet collection
        "/path/to/yasnippet/yasmate/snippets" ;; the yasmate collection
        ))

(yas-global-mode 1) ;; or M-x yas-reload-all if you've started YASnippet already.

Команда M-x yas-reload-all перегружает все сниппеты и появляется меню в Emacs

Загрузил стандартную коллекцию сниппетов

M-x list-packages [RET] yasnippet-snippets

Использование снипетов

Все очень просто.

  1. Набираем ключ сниппета и нажимаем <TAB> и сниппет загружается
  2. Снипету можно назначить свою клавишу вызова на функцию yas-expand
;; Bind `SPC' to `yas-expand' when snippet expansion available (it
;; will still call `self-insert-command' otherwise).
(define-key yas-minor-mode-map (kbd "SPC") yas-maybe-expand)
;; Bind `C-c y' to `yas-expand' ONLY.
(define-key yas-minor-mode-map (kbd "C-c y") #'yas-expand)

Автоматическое развертывание сниппетов

;; Function that tries to autoexpand YaSnippets
;; The double quoting is NOT a typo!
(defun my/yas-try-expanding-auto-snippets ()
  (when (bound-and-true-p 'yas-minor-mode)
      (let ((yas-buffer-local-condition ''(require-snippet-condition . auto)))
        (yas-expand))))

;; Try after every insertion
(add-hook 'post-self-insert-hook #'my/yas-try-expanding-auto-snippets)

Добавим в описание сниппета переменную # condition: (and (texmathp) 'auto) чтобы он стал авторасширяющимся.

Создание своих сниппетов

На примере сниппетов для markdown

в коллекции хранится как markdown-mode, это нужно знать, чтобы потом объяснить куда складывать yasnippet-у

  1. Выделяю текст для сниппета
{{ alert warning }}

{{ /alert }}
  1. и нажимаю C-c & C-n, это серьезно так сложно и не забыть &.

Откроется окно:

# -*- mode: snippet -*-
# name: alert warning
# condition: (and (texmathp) 'auto)
# key: alert
# --
{{ alert warning }}
$0
{{ /alert }}
  1. пишу значение name, condition и key. Где должен оказаться курсор ставлю $0

  2. Нажимаю C-c C-c для сохранения сниппета. При сохранении на запрос:

    • Choose or enter a table (yas guesses markdown-mode): указать markdown-mode [RET]
    • [yas] Loaded for markdown-mode. Also save snippet buffer? (y or n) указать y
    • File to save snippet in: ~/.emacs.d/snippets/markdown-mode/alert.5 имя файла нужно обязательно исправить, чтобы при использовании сниппета была возможность выбора значений. У меня это уже 5-й alert с разными значениями, поэтому имя дал alert.5 если сниппет будет один, то имя может быть как ключ.

Фишки сниппетов

Обход полей при вводе снипета задаются переменными

Чтобы сделать подсказку с заменой пишем

${1:подсказка} — когда начнем ввод, подсказка удалится

Зеркалить значения

Очень полезная функция для программирования Latex и Org-mode

\begin{${1:enumerate}}
    $0
\end{$1}

Вводим значение в begin, оно автоматически дублируется в end.

Собрать в группу в меню

  1. В преамбуле каждого сниппета указать # group: имя группы у всех одинаковое.
  2. Создать директорию с названием группы
  3. Поместить в директорию пустой файл с именем .yas-make-groups

Добавить в сниппет дату

Просто вставляем функцию, как и любую функцию LISP

`(format-time-string "%Y-%m-%d")`

3 - Как настроить и работать с Go в Emacs?

Полное руководство по настройке Go и работе с проектами в Emacs

Настройка Emacs для работы с Go включает установку необходимых пакетов и настройку среды разработки. Вот пошаговая инструкция:

1. Установите go-mode (основной режим для Go)

Добавьте в ваш ~/.emacs или ~/.emacs.d/init.el:

(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)

;; Установка go-mode (если не установлен)
(unless (package-installed-p 'go-mode)
  (package-refresh-contents)
  (package-install 'go-mode))

2. Установите lsp-mode (Language Server Protocol)

Для автодополнения, навигации и рефакторинга:

(unless (package-installed-p 'lsp-mode)
  (package-install 'lsp-mode))

(require 'lsp-mode)
(add-hook 'go-mode-hook #'lsp-deferred)  ;; Автоматический запуск LSP для Go

3. Установите lsp-ui (дополнения для LSP)

(unless (package-installed-p 'lsp-ui)
  (package-install 'lsp-ui))

(require 'lsp-ui)
(setq lsp-ui-doc-enable t)       ;; Включить документацию при наведении
(setq lsp-ui-sideline-enable t)   ;; Показывать информацию на полях

4. Установите company (автодополнение)

(unless (package-installed-p 'company)
  (package-install 'company))

(require 'company)
(add-hook 'go-mode-hook 'company-mode)
(setq company-minimum-prefix-length 1)
(setq company-idle-delay 0.1)

5. Установите flycheck (проверка синтаксиса)

(unless (package-installed-p 'flycheck)
  (package-install 'flycheck))

(require 'flycheck)
(add-hook 'go-mode-hook 'flycheck-mode)

6. Настройка gofmt (форматирование кода)

Добавьте в go-mode-hook:

(add-hook 'go-mode-hook
          (lambda ()
            (add-hook 'before-save-hook 'gofmt-before-save nil t)))

7. Установите goimports (автоматическое добавление импортов)

Убедитесь, что goimports установлен:

go install golang.org/x/tools/cmd/goimports@latest

Затем настройте в Emacs:

(setq gofmt-command "goimports")

8. Дополнительные улучшения (опционально)

  • dap-mode (отладка):
    (unless (package-installed-p 'dap-mode)
      (package-install 'dap-mode))
    (require 'dap-go)  ;; Поддержка Go
    
  • yasnippet (шаблоны кода):
    (unless (package-installed-p 'yasnippet)
      (package-install 'yasnippet))
    (yas-global-mode 1)
    

9. Проверьте настройки

Перезапустите Emacs и откройте .go файл. Должны работать:

  • Автодополнение (company)
  • Проверка ошибок (flycheck)
  • Форматирование при сохранении (gofmt/goimports)
  • Навигация по коду (lsp-mode)

Если LSP не работает, убедитесь, что у вас установлен Go Language Server (gopls):

go install golang.org/x/tools/gopls@latest

Готово! Теперь Emacs настроен для комфортной работы с Go. 🚀

4 - Как настроить и работать с Python в Emacs?

Полное руководство по настройке Elpy и работе с Python-проектами в Emacs

Установка и базовая настройка

1. Установка необходимых пакетов

Добавьте в ваш .emacs или init.el:

;; Активация Elpy
(use-package elpy
  :ensure t
  :init
  (elpy-enable))

;; Дополнительные зависимости
(use-package flycheck
  :ensure t)

(use-package py-autopep8
  :ensure t)

2. Установка системных зависимостей

Выполните в терминале:

pip install jedi flake8 autopep8 black

Основные горячие клавиши

Комбинация Описание
C-c C-c Выполнить текущий буфер
C-c C-z Открыть Python shell
C-c C-r Выполнить выделенный регион
C-c C-f Форматировать код (autopep8)
C-c C-d Показать документацию
M-. Перейти к определению
M-, Вернуться назад
C-c C-t Запустить тест
C-c C-e Открыть список ошибок (flycheck)

Настройка окружения

1. Работа с виртуальными окружениями

;; Настройка работы с virtualenv
(setq elpy-rpc-virtualenv-path 'current)  ;; Использовать текущее virtualenv

Для активации virtualenv в Emacs:

  1. M-x pyvenv-activate
  2. Выберите путь к virtualenv

2. Настройка интерпретатора

(setq python-shell-interpreter "python3"
      python-shell-interpreter-args "-i")

Рабочий процесс с Python-проектом

1. Создание нового проекта

  1. M-x elpy-config - проверьте, что все зависимости установлены
  2. C-x f - откройте или создайте новый .py файл
  3. M-x elpy-project-root - установите корень проекта

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

Elpy автоматически создает:

  • .projectile - файл для projectile
  • setup.py - если создаете пакет

Рекомендуемая структура:

project_root/
├── .git/
├── src/
│   ├── __init__.py
│   ├── module1.py
│   └── module2.py
├── tests/
├── requirements.txt
└── setup.py

3. Написание кода

  • Автодополнение работает автоматически после import
  • Для принудительного обновления: M-x elpy-rpc-restart
  • Используйте M-x elpy-company-backend для управления бекендами автодополнения

4. Рефакторинг

;; Настройка рефакторинга
(use-package srefactor
  :ensure t
  :config
  (define-key python-mode-map (kbd "M-RET") 'srefactor-refactor-at-point))

Доступные операции:

  • Переименование переменной
  • Извлечение метода
  • Изменение сигнатуры функции

5. Отладка

  1. Установите pip install epc
  2. Добавьте в конфигурацию:
(use-package realgud
  :ensure t)

Основные команды:

  • M-x realgud:pdb - запуск отладчика
  • C-c C-b - установить точку останова
  • n - следующая строка
  • s - шаг внутрь функции
  • c - продолжить выполнение

Интеграция с другими инструментами

1. Jupyter Notebook

(use-package ein
  :ensure t)

Использование:

  1. M-x ein:notebooklist-open
  2. Выберите или создайте notebook
  3. C-c C-c - выполнить ячейку

2. Тестирование

;; Настройка pytest
(setq elpy-test-runner 'elpy-test-pytest-runner)

Команды:

  • C-c C-t t - запустить тест
  • C-c C-t m - запустить тесты модуля
  • C-c C-t p - запустить все тесты проекта

3. Форматирование кода

;; Настройка black
(setq elpy-formatter 'black)

Используйте C-c C-f для форматирования текущего буфера.

Продвинутые настройки

1. Настройка flycheck

(setq flycheck-python-flake8-executable "flake8"
      flycheck-python-pylint-executable "pylint"
      flycheck-checker-error-threshold 1000
      flycheck-python-mypy-executable "mypy")

2. Интерактивная разработка

;; Настройка интерактивного Python
(setq python-shell-interpreter "ipython"
      python-shell-interpreter-args "-i --simple-prompt")

3. Работа с документацией

(use-package eldoc
  :config
  (setq eldoc-idle-delay 0.4))

Решение проблем

1. Elpy не загружается

Проверьте:

  1. M-x elpy-config - все ли зависимости установлены
  2. M-x elpy-rpc-restart - перезапустите RPC сервер

2. Нет автодополнения

  1. Убедитесь, что установлен jedi: pip install -U jedi
  2. Проверьте M-x elpy-company-backend

3. Медленная работа

(setq elpy-rpc-timeout 10
      elpy-rpc-large-buffer-size 102400)

Заключение

Elpy предоставляет полноценную среду разработки для Python в Emacs. После настройки вы получаете:

  1. Интеллектуальное автодополнение
  2. Интегрированную отладку
  3. Поддержку тестирования
  4. Инструменты рефакторинга
  5. Интерактивную разработку

Для максимальной эффективности рекомендуется использовать в сочетании с:

  • magit для контроля версий
  • projectile для навигации по проекту
  • lsp-mode для дополнительных возможностей анализа кода

5 - Как настроить и работать с Magit?

Полное руководство по работе с Magit в Emacs

Сводная таблица горячих клавиш Magit

Основные команды

Комбинация Действие
C-x g Открыть Magit status
s Stage изменения
u Unstage изменения
c Commit
C Extended commit
P Push
F Pull
b Branch
m Merge
l Log
t Tag
z Stash
k Discard изменения

Навигация

Комбинация Действие
TAB Развернуть/свернуть секцию
n Следующий элемент
p Предыдущий элемент
M-n Следующая секция
M-p Предыдущая секция

Статус репозитория

Комбинация Действие
g Обновить статус
= Diff
E Ediff

Установка Magit

  1. Установите через package.el:
(use-package magit
  :ensure t)
  1. Или через MELPA: M-x package-install RET magit RET

Основной рабочий процесс

1. Открытие Magit status

Основная точка входа - окно статуса:

C-x g

2. Просмотр изменений

В окне статуса:

  • Неотслеживаемые файлы (Untracked)
  • Измененные файлы (Unstaged changes)
  • Подготовленные к коммиту изменения (Staged changes)

Используйте TAB для разворачивания секций.

3. Подготовка изменений (Stage)

  • Наведите курсор на файл и нажмите s для stage
  • Для stage конкретных изменений внутри файла:
    • Откройте diff (= на файле)
    • Перейдите к нужному блоку изменений
    • Нажмите s

4. Создание коммита

После stage изменений:

  • Нажмите c для начала коммита
  • Затем:
    • c - обычный коммит
    • C - extended commit (с дополнительными опциями)

Введите сообщение коммита и завершите C-c C-c.

5. Работа с ветками

  • b b - переключение между ветками
  • b c - создание новой ветки
  • b n - переименование ветки
  • b d - удаление ветки

6. Синхронизация с удаленным репозиторием

  • P p - push текущей ветки
  • F u - pull с rebase
  • F p - обычный pull

Продвинутые возможности

1. Интерактивный rebase

  1. Откройте log (l l)
  2. Выберите коммит, с которого начать rebase
  3. Нажмите r i для интерактивного rebase
  4. Используйте команды:
    • p - pick (оставить коммит)
    • r - reword (изменить сообщение)
    • e - edit (изменить коммит)
    • s - squash (объединить с предыдущим)
    • f - fixup (как squash, но отбросить сообщение)

2. Работа с stash

  • z s - создать stash
  • z a - применить stash
  • z p - pop stash (применить и удалить)
  • z d - удалить stash

3. Разрешение конфликтов

При возникновении конфликтов:

  1. Откройте файл с конфликтами
  2. Используйте M-x magit-ediff-resolve для интерактивного разрешения
  3. После разрешения всех конфликтов сделайте git add (s в Magit)

Кастомизация Magit

Настройка в .emacs

(setq magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1)

;; Автозавершение при вводе сообщений коммита
(add-hook 'git-commit-mode-hook 'git-commit-turn-on-flyspell)

Полезные расширения

  • magit-todos - просмотр TODO в коде
  • magit-gitflow - поддержка git-flow
  • forge - интеграция с GitHub/GitLab

Советы и рекомендации

  1. Используйте M-x magit-file-delete для удаления файлов через Magit
  2. Для частичного stage используйте s внутри diff
  3. M-x magit-blame-mode для просмотра аннотаций к строкам
  4. M-x magit-submodule для работы с подмодулями
  5. Для сложных операций используйте команды через M-x magit-*

Решение проблем

Magit работает медленно

Добавьте в конфигурацию:

(setq magit-refresh-status-buffer nil)

Проблемы с аутентификацией

Настройте:

(setq magit-git-executable "/path/to/git")
(setq magit-credential-cache-daemon-socket "~/.git-credential-cache/socket")

Magit предоставляет мощный интерфейс для работы с Git, сочетающий удобство использования с полнотой функционала. Освоение его горячих клавиш значительно ускорит ваш рабочий процесс.

Команды Magit

C-x g для отображения информации о текущем репозитории Git
Left s / u добавить файл в индекс или убрать из индекса.
C-SPC — поставить метку на файле C-n C-p отметить список файлов из отменить,потом s или u для включения или исключения.
c откроет меню для COMMIT и другие варианты, нажимаю еще раз c, ввожу комментарий commit и нажимаю C-c для выполнения commit.

Список команд
Key             Binding

TAB		magit-section-toggle
RET		magit-visit-thing
C-w		magit-copy-section-value
SPC		magit-diff-show-or-scroll-up
!		magit-run
$		magit-process-buffer
%		magit-worktree
+		magit-diff-more-context
-		magit-diff-less-context
0		magit-diff-default-context
1		magit-section-show-level-1
2		magit-section-show-level-2
3		magit-section-show-level-3
4		magit-section-show-level-4
5 .. 9		digit-argument
:		magit-git-command
<		beginning-of-buffer
>		magit-sparse-checkout
?		magit-dispatch
A		magit-cherry-pick
B		magit-bisect
C		magit-clone
D		magit-diff-refresh
E		magit-ediff
F		magit-pull
G		magit-refresh-all
H		magit-describe-section
I		magit-init
J		magit-display-repository-buffer
K		magit-file-untrack
L		magit-log-refresh
M		magit-remote
O		magit-subtree
P		magit-push
Q		magit-git-command
R		magit-file-rename
S		magit-stage-modified
T		magit-notes
U		magit-unstage-all
V		magit-revert
W		magit-patch
X		magit-reset
Y		magit-cherry
Z		magit-worktree
^		magit-section-up
a		magit-cherry-apply
b		magit-branch
c		magit-commit
d		magit-diff
e		magit-ediff-dwim
f		magit-fetch
g		magit-refresh
h		magit-dispatch
i		magit-gitignore
j		magit-status-jump
k		magit-delete-thing
l		magit-log
m		magit-merge
n		magit-section-forward
o		magit-submodule
p		magit-section-backward
q		magit-mode-bury-buffer
r		magit-rebase
s		magit-stage-file
t		magit-tag
u		magit-unstage-file
v		magit-revert-no-commit
w		magit-am
x		magit-reset-quickly
y		magit-show-refs
z		magit-stash
DEL		magit-diff-show-or-scroll-down
S-SPC		magit-diff-show-or-scroll-down
C-<return>	magit-visit-thing
C-<tab>		magit-section-cycle
M-<tab>		magit-section-cycle-diffs
<backtab>	magit-section-cycle-global

<remap> <dired-jump>	magit-dired-jump

<remap> <back-to-indentation>	magit-back-to-indentation
<remap> <evil-next-line>	evil-next-visual-line
<remap> <evil-previous-line>	evil-previous-visual-line
<remap> <next-line>		magit-next-line
<remap> <previous-line>		magit-previous-line

C-c C-c		magit-dispatch
C-c C-e		magit-edit-thing
C-c C-o		magit-browse-thing
C-c C-w		magit-copy-thing

C-M-i		magit-dired-jump
M-w		magit-copy-buffer-revision

C-c TAB		magit-section-cycle

M-1		magit-section-show-level-1-all
M-2		magit-section-show-level-2-all
M-3		magit-section-show-level-3-all
M-4		magit-section-show-level-4-all
M-n		magit-section-forward-sibling
M-p		magit-section-backward-sibling

<left-fringe> <mouse-1>	magit-mouse-toggle-section
<left-fringe> <mouse-2>	magit-mouse-toggle-section