Как добиться эффекта сворачивания кода в 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).
Ответ 7
По-видимому, нет идеального решения, но я думаю, что лучший из них:
http://www.emacswiki.org/emacs/FoldingMode
Ответ 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
бизнеса.