Как добиться эффекта сворачивания кода в Emacs?

Каков наилучший способ добиться чего-то вроде сгибания кода или типа циклирования, который используется в режиме org-mode. Что было бы лучшим решением в elisp для создания такого поведения?

EDIT: Мне жаль, что я не был чист. Я хочу запрограммировать что-то в elisp, что делает вещи очень похожими на сворачивание кода или на самом деле больше всего похож на org-mode с иерархией, которая может быть расширена. Мне интересно, как наилучшим образом достичь этого эффекта. Я думаю, что я слышал, что наложения emacs являются хорошим решением, но я не знаю.

Что касается складывания, я просто использую встроенный set-selective-display

ИЗМЕНИТЬ НОМЕР 2:

Спасибо за ответы, но я думаю, что задаю неправильный вопрос, поэтому позвольте мне попытаться более четко понять, что я пытаюсь сделать. Я хотел бы создать следующие

Когда вы помещаете свою точку в функцию и вызываете эту функцию elisp, она поместит определение функции из любого места (я думаю, просто использую find-tag для этого) и разворачиваю ее в текущем буфере. Идея заключается в том, что вам нужно перейти к другому буферу, чтобы прочитать определение функции, которое я чувствую, как его переключение контекста в другой файл. Поэтому я бы хотел, чтобы он вел себя как сворачивание кода, только он вытягивает код, внешний из буфера. Это создает некоторые проблемы, поскольку он не может принудительно вставить код в буфер, или если кто-то его сохранит, он сохранит вытащенный код. Поэтому мне интересно, есть ли способ создать область внутри буфера, которая также не является частью буфера. Я думаю, что это имеет смысл.

Ответ 1

Складка обычно не нужна с помощью emacs, так как в ней есть инструменты, которые явно реализуют действия, которые люди делают вручную при сгибании кода.

Большинство людей имеют хорошие успехи в простых инкрементальных поисках. См. "Foo", где-то упоминается? Введите C-s foo, найдите определение, нажмите enter, прочитайте его, а затем нажмите C-x C-x, чтобы вернуться туда, где вы были. Простой и очень полезный.

Большинство режимов поддерживают imenu. M-x imenu позволит вам перейти к определению функции (и т.д.) по имени. Вы также можете привязать его к щелчку мыши, чтобы получить меню функций (или добавить его в строку меню, более подробно см. Страницу "Информация" ). Он предоставляет данные, для которых-функция-режим, который позволит вам увидеть, какую функцию вы сейчас используете в моделировании. (Почему ваши функции так долго?)

Существует также панель скорости, которая графически отображает информацию imenu (и другие вещи).

Если вы хотите получить обзор своего файла, попробуйте M-x occur ". С учетом регулярного выражения он создаст новый буфер с каждым совпадением в текущем буфере. Вы можете искать" (defun "to получить обзор функций, которые реализует текущий файл. Нажав на результат, вы переместите вас в эту позицию в файле.

Так или иначе, подумайте о том, чего вы действительно хотите достичь, и Emacs, вероятно, это реализует. Не сражайтесь с несовершенными инструментами, которые заставляют вас складывать и разворачивать вещи постоянно.

Ответ 2

режим скрытого просмотра (hs-minor-mode) с привязкой по умолчанию C-c @ C-M-h для запуска складывания (hs-hide-all)

Ответ 3

Другой способ обрезать кошку:

Как это бывает, вам не нужен какой-либо пакет или дополнительная настройка для что. Просто перейдите в любой исходный файл, введите

M-1 C-x $, и волшебство случается!

Как обычно, его белая магия: C-x $ вернет ваш код.

Мы можем использовать справочную систему Emacs, чтобы узнать, что происходит: C-h k C-x $говорит, что вышеупомянутая комбинация клавиш вызывает set-selective-display, функция, которая принимает один численный аргумент (префикс M-1 передает значение 1 в качестве значения этого аргумента) и, неудивительно, устанавливает переменную selective-display на значение этот аргумент.

из младший блог emacs wizardry

Просто для полноты: M-3 C-x $ отобразит более глубокий вложенный код и т.д.

FWIW Сегодня я сделал крошечный помощник на основе чего-л. нашел здесь, так что F5 переключает сгибание кода на основе текущей позиции курсора:

(global-set-key (kbd "<f5>") 'set-selective-display-dlw)

(defun set-selective-display-dlw (&optional level)
"Fold text indented same of more than the cursor.
If level is set, set the indent level to LEVEL.
If 'selective-display' is already set to LEVEL, clicking
F5 again will unset 'selective-display' by setting it to 0."
  (interactive "P")
  (if (eq selective-display (1+ (current-column)))
      (set-selective-display 0)
    (set-selective-display (or level (1+ (current-column))))))

Ответ 4

Я использую второстепенный режим выделения, чтобы сбрасывать код на Python. Вместо того, чтобы размещать {{{и}}}, как в режиме сгибания, он использует, где определяется блок.

http://www.gnu.org/software/emacs/manual/html_node/emacs/Outline-Mode.html http://www.emacswiki.org/emacs/OutlineMinorMode

Я уверен, что он поставляется с emacs. Затем я добавляю это в мой .emacs

;;======= Code folding =======
(add-hook 'python-mode-hook 'my-python-outline-hook)
; this gets called by outline to deteremine the level. Just use the length of the whitespace
(defun py-outline-level ()
  (let (buffer-invisibility-spec)
    (save-excursion
      (skip-chars-forward "    ")
      (current-column))))
; this get called after python mode is enabled
(defun my-python-outline-hook ()
  ; outline uses this regexp to find headers. I match lines with no indent and indented "class"
  ; and "def" lines.
  (setq outline-regexp "[^ \t]\\|[ \t]*\\(def\\|class\\) ")
  ; enable our level computation
  (setq outline-level 'py-outline-level)
  ; do not use their \[email protected] prefix, too hard to type. Note this overides some bindings.
  (setq outline-minor-mode-prefix "\C-t")
  ; turn on outline mode
  (outline-minor-mode t)
  ; initially hide all but the headers
  ;(hide-body)
  ; make paren matches visible
  (show-paren-mode 1)
)

Ответ 5

Вы также можете получить сворачивание кода, используя CEDET со следующим кодом в файле инициализации:

(global-semantic-folding-mode t)

После оценки этого кода маленький треугольник появится в области fringle, поэтому вы сможете сбрасывать и разворачивать код, используя его. Этот метод более точен, поскольку он использует синтаксическую информацию, извлеченную из исходного кода

Ответ 6

hs-minor-mode прекрасно работает.

Он работает еще красивее, когда в паре с флеш-dwim (что я имею в виду). Затем есть fold-dwim-org, который обеспечивает org-mode, как привязки клавиш для сгибания кода! Оба могут быть установлены через мармелад (и я думаю, elpa).

Ответ 8

vimish-fold также является хорошим и простым решением.

https://github.com/mrkkrp/vimish-fold.

С домашней страницы:

Это пакет для выполнения свертывания текста, как в Vim. Он имеет следующие функции:

  • складывание активных областей;
  • хорошая визуальная обратная связь: очевидно, какая часть текста свернута;
  • постоянство по умолчанию: при закрытии файла ваши складки не исчезают;
  • постоянство хорошо масштабируется, вы можете работать с сотнями файлов с большим количеством сгибов без негативных последствий;
  • это не нарушает отступ или что-то еще;
  • складки можно легко переключать из сложенного состояния в разложенное и обратно;
  • быстрая навигация между существующими складками;
  • Вы можете использовать мышь, чтобы развернуть складки (хорошо для начинающих, а не только для них);
  • для любителей пакета avy: вы можете использовать avy для свертывания текста с минимальным количеством нажатий клавиш!

Используя отличный use-package, я устанавливаю и активирую его, используя этот фрагмент в моей конфигурации:

(use-package vimish-fold
  :ensure t
  :config (vimish-fold-global-mode t))

Ответ 9

emacs поставляется с hs-minor-mode, который уравновешивает сворачивание кода между сбалансированными выражениями http://www.emacswiki.org/emacs/HideShow

Ответ 10

Я считаю, что сравнение вашего "проекта" с складыванием не очень хорошо, потому что сворачивание - это изменение внешнего вида, сохраняя содержимое буфера неповрежденным (текст). Ваш проект будет включать дополнительный текст при сохранении содержимого буфера, AFAIU. Так. он не может быть реализован в виде композиции вставки и складывания текста (тогда содержимое буфера будет изменено).

Но, возможно, это действительно возможно с тем же механизмом, что и сгибание - с помощью "оверлей"... Рассмотрим "перед-строкой" и "после строки" свойства наложения; возможно, вы могли бы поместить свои определения функций в эти строки, принадлежащие оверлею нулевой длины в точке. Посмотрите на контур-флаг-область, чтобы увидеть, как оверлеи используются в режиме контура.

Ответ 11

Если вы используете hs-minor-mode, может быть хорошей идеей также установить более удобный ярлык, например:

(eval-after-load 'hideshow
 '(progn
   (global-set-key (kbd "C-+") 'hs-toggle-hiding)))

Ответ 12

Я удивлен, что никто не упомянул сужение-расширение. Это супер круто, он поставляется в комплекте с Emacs. Просто выберите код, на котором вы хотите сфокусироваться, и нажмите C-x n n, чтобы вернуться в режим полного просмотра, просто сделайте C-x n w. Я всегда предпочитаю использовать встроенные функции emacs, чем загромождать мое пространство пользователя другим пакетом. Если emacs может сделать это со встроенной функциональностью, то я предпочту это, а не какой-нибудь сторонний пакет, но это только я, не означает и не подразумевает ничего другого, кроме того, что я люблю простые вещи, а не сложные длинные конфигурации.

Ответ 13

С вдохновением от ответа einSelbst:

(advice-add 'set-selective-display
            :filter-args (lambda (args)
                           (if (or (car args) selective-display)
                               args
                             (list (1+ (current-column)))))
            '((name . set-selective-display-from-cursor-column)))

Вуаля, C-x $ неожиданно стала полезной даже без всякого C-u и M-4 бизнеса.