Emacs. Пакет outline-indent
Emacs. Пакет outline-indent
2026-02-11
·
3 мин. для прочтения
Emacs. Пакет outline-indent.
Содержание
1 Общая информация
- Репозиторий: https://github.com/jamescherti/outline-indent.el
- Сворачивание кода на основе отступов.
- Предоставляет минорный режим
outline-indent-minor-mode, который превращает каждый уровень отступа в полноценный заголовок (heading) для стандартногоoutline-minor-mode. - Основан на нативном коде Emacs.
- Автоматически определяет
indent-offsetиз текущего major mode.
2 Включение
Включается как минорный режим:
(outline-indent-minor-mode)Для конкретных режимов:
;; Python (add-hook 'python-mode-hook #'outline-indent-minor-mode) (add-hook 'python-ts-mode-hook #'outline-indent-minor-mode) ;; YAML (add-hook 'yaml-mode-hook #'outline-indent-minor-mode) (add-hook 'yaml-ts-mode-hook #'outline-indent-minor-mode) ;; Для всех режимов программирования (add-hook 'prog-mode-hook #'outline-indent-minor-mode)
3 Настройки
| Переменная | Назначение | Значение по умолчанию |
|---|---|---|
outline-indent-default-offset | Базовая ширина отступа для расчёта уровня вложенности. | 1 |
outline-indent-shift-width | Количество пробелов при повышении/понижении уровня (promote=/=demote). | nil (наследует default-offset) |
outline-indent-ellipsis | Строка, отображаемая вместо свёрнутого содержимого. | nil |
outline-indent-advise-outline-functions | Добавляет обёртки (advice) к стандартным функциям outline для совместимости. Рекомендуется t. | t |
outline-indent-insert-heading-add-blank-line | Вставлять ли пустую строку перед новым заголовком. | nil |
make-window-start-visible (ранее outline-indent-make-window-start-visible) | Гарантирует, что начало окна не останется скрытым. Устанавливается как setq-local. | t |
- При значении
outline-indent-default-offset = 1пакет работает с любым языком, так как минимальный отступ в 1 пробел уже считается новым уровнем. - Однако для корректной работы команд повышения/понижения уровня рекомендуется явно указывать смещение под конкретный язык.
3.1 Пример языко-зависимой настройки
;; Python: 4 пробела
(add-hook 'python-mode-hook
(lambda ()
(setq-local outline-indent-default-offset 4)
(setq-local outline-indent-shift-width 4)))
;; YAML: 2 пробела
(add-hook 'yaml-mode-hook
(lambda ()
(setq-local outline-indent-default-offset 2)
(setq-local outline-indent-shift-width 2)))
4 Основные функции
4.1 Управление сворачиванием
| Функция | Действие |
|---|---|
outline-indent-open-fold | Развернуть блок под курсором |
outline-indent-close-fold | Свернуть блок под курсором |
outline-indent-open-folds | Развернуть всё |
outline-indent-close-folds | Свернуть всё |
outline-indent-open-fold-rec | Развернуть рекурсивно (все вложенные) |
outline-indent-toggle-fold | Переключить состояние блока |
outline-indent-toggle-level-at-point | Переключить видимость всех блоков текущего уровня |
4.2 Навигация
| Функция | Действие |
|---|---|
outline-indent-forward-same-level | Перейти к следующему блоку такого же уровня отступа |
outline-indent-backward-same-level | Перейти к предыдущему блоку такого же уровня |
- Если
outline-indent-advise-outline-functions = t, работают и стандартныеoutline-forward-same-level,outline-backward-same-level.
4.3 Редактирование структуры
| Функция | Действие |
|---|---|
outline-indent-shift-right | Увеличить отступ всего блока (понизить уровень) |
outline-indent-shift-left | Уменьшить отступ всего блока (повысить уровень) |
outline-indent-move-subtree-up | Переместить блок выше |
outline-indent-move-subtree-down | Переместить блок ниже |
outline-indent-insert-heading | Вставить новую строку с таким же отступом (аналог outline-insert-heading) |
outline-indent-select | Выделить весь текущий блок (включая вложения) |
5 Пример конфигурации
;;; === outline-indent.el ===
(require 'outline-indent)
;; Внешний вид: треугольник вместо "..."
(setq outline-indent-ellipsis " ▼ ")
;; Языко-зависимые настройки отступов
(defun my/set-outline-indent-offset ()
"Установить offset и shift-width в зависимости от режима."
(cond
((derived-mode-p 'python-mode)
(setq-local outline-indent-default-offset 4)
(setq-local outline-indent-shift-width 4))
((derived-mode-p 'yaml-mode)
(setq-local outline-indent-default-offset 2)
(setq-local outline-indent-shift-width 2))
((derived-mode-p 'js-mode)
(setq-local outline-indent-default-offset 2)
(setq-local outline-indent-shift-width 2))))
;; Добавляем во все хуки, где включен outline-indent
(add-hook 'outline-indent-minor-mode-hook #'my/set-outline-indent-offset)
;; Включаем режим для всех режимов программирования
(add-hook 'prog-mode-hook #'outline-indent-minor-mode)
;; Чтобы первая строка всегда была видна
(add-hook 'outline-minor-mode-hook
(lambda () (setq-local make-window-start-visible t)))
;; Персональные клавиши (если не нравится префикс C-c @)
(define-key outline-indent-minor-mode-map (kbd "C-c f") #'outline-indent-close-fold)
(define-key outline-indent-minor-mode-map (kbd "C-c F") #'outline-indent-open-fold)
(define-key outline-indent-minor-mode-map (kbd "C-c a") #'outline-indent-open-folds)
(define-key outline-indent-minor-mode-map (kbd "C-c C-c") #'outline-indent-close-folds)
(define-key outline-indent-minor-mode-map (kbd "C-c n") #'outline-indent-forward-same-level)
(define-key outline-indent-minor-mode-map (kbd "C-c p") #'outline-indent-backward-same-level)

Authors
Профессор кафедры теории вероятностей и кибербезопасности
Работаю профессором на кафедре теории вероятностей и кибербезопасности Российского университета дружбы народов им. Патриса Лумумбы.
Научные интересы относятся к области теоретической физики и математического моделирования.