Emacs
Emacs — один из наиболее мощных и широко распространённых редакторов, используемых в мире Unix. По популярности он соперничает с редактором vi и его клонами.
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-документом
- Создайте новый файл
.tex
или откройте существующий
- Начните вводить
\documentclass
- сработает автодополнение
- Используйте
C-c C-e
для добавления окружений
- Для вставки ссылок:
- Создайте метку:
C-c )
- Вставьте ссылку:
C-c (
- Для компиляции:
C-c C-c
(выберите команду, обычно latexmk
)
- Для просмотра 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+клик
Полезные советы
- Для многофайловых проектов используйте
\include
и \input
- Настройте шаблоны для часто используемых документов
- Используйте
yasnippet
для быстрой вставки структурных элементов
- Для математических формул используйте
C-c C-m
и выберите нужный символ
Решение проблем
1. Компиляция не работает
Проверьте:
- Установлен ли
latexmk
: latexmk --version
- Правильно ли указан путь к TeX-дистрибутиву
2. Нет автодополнения
Убедитесь, что:
- Пакет
company-auctex
установлен и загружен
- Включен режим
company-mode
3. PDF не синхронизируется с исходником
Проверьте настройки:
(setq TeX-source-correlate-mode t)
Альтернативные пакеты
- AUCTeX - основной пакет для работы с LaTeX
- cdlatex - быстрый ввод математических выражений
- prettify-symbols-mode - отображение символов (например, \alpha как α)
- 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
Использование снипетов
Все очень просто.
- Набираем ключ сниппета и нажимаем
<TAB>
и сниппет загружается
- Снипету можно назначить свою клавишу вызова на функцию
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-у
- Выделяю текст для сниппета
{{ alert warning }}
{{ /alert }}
- и нажимаю
C-c & C-n
, это серьезно так сложно и не забыть &
.
Откроется окно:
# -*- mode: snippet -*-
# name: alert warning
# condition: (and (texmathp) 'auto)
# key: alert
# --
{{ alert warning }}
$0
{{ /alert }}
-
пишу значение name
, condition
и key
. Где должен оказаться курсор ставлю $0
-
Нажимаю 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, $2, ...
и заканчиваем $0
переход между ними идет [TAB]
Чтобы сделать подсказку с заменой пишем
${1:подсказка}
— когда начнем ввод, подсказка удалится
Зеркалить значения
Очень полезная функция для программирования Latex и Org-mode
\begin{${1:enumerate}}
$0
\end{$1}
Вводим значение в begin, оно автоматически дублируется в end.
Собрать в группу в меню
- В преамбуле каждого сниппета указать
# group: имя группы
у всех одинаковое.
- Создать директорию с названием группы
- Поместить в директорию пустой файл с именем
.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:
M-x pyvenv-activate
- Выберите путь к virtualenv
2. Настройка интерпретатора
(setq python-shell-interpreter "python3"
python-shell-interpreter-args "-i")
Рабочий процесс с Python-проектом
1. Создание нового проекта
M-x elpy-config
- проверьте, что все зависимости установлены
C-x f
- откройте или создайте новый .py файл
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. Отладка
- Установите
pip install epc
- Добавьте в конфигурацию:
(use-package realgud
:ensure t)
Основные команды:
M-x realgud:pdb
- запуск отладчика
C-c C-b
- установить точку останова
n
- следующая строка
s
- шаг внутрь функции
c
- продолжить выполнение
Интеграция с другими инструментами
1. Jupyter Notebook
(use-package ein
:ensure t)
Использование:
M-x ein:notebooklist-open
- Выберите или создайте notebook
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 не загружается
Проверьте:
M-x elpy-config
- все ли зависимости установлены
M-x elpy-rpc-restart
- перезапустите RPC сервер
2. Нет автодополнения
- Убедитесь, что установлен jedi:
pip install -U jedi
- Проверьте
M-x elpy-company-backend
3. Медленная работа
(setq elpy-rpc-timeout 10
elpy-rpc-large-buffer-size 102400)
Заключение
Elpy предоставляет полноценную среду разработки для Python в Emacs. После настройки вы получаете:
- Интеллектуальное автодополнение
- Интегрированную отладку
- Поддержку тестирования
- Инструменты рефакторинга
- Интерактивную разработку
Для максимальной эффективности рекомендуется использовать в сочетании с:
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
- Установите через package.el:
(use-package magit
:ensure t)
- Или через 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
- Откройте log (
l l
)
- Выберите коммит, с которого начать rebase
- Нажмите
r i
для интерактивного rebase
- Используйте команды:
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. Разрешение конфликтов
При возникновении конфликтов:
- Откройте файл с конфликтами
- Используйте
M-x magit-ediff-resolve
для интерактивного разрешения
- После разрешения всех конфликтов сделайте
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
Советы и рекомендации
- Используйте
M-x magit-file-delete
для удаления файлов через Magit
- Для частичного stage используйте
s
внутри diff
M-x magit-blame-mode
для просмотра аннотаций к строкам
M-x magit-submodule
для работы с подмодулями
- Для сложных операций используйте команды через
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
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