Emacs. Пакет outline-indent

Emacs. Пакет outline-indent

2026-02-11 · 3 мин. для прочтения
blog computer-science

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
Профессор кафедры теории вероятностей и кибербезопасности
Работаю профессором на кафедре теории вероятностей и кибербезопасности Российского университета дружбы народов им. Патриса Лумумбы. Научные интересы относятся к области теоретической физики и математического моделирования.