Как лучше всего добиться чего-то вроде сворачивания кода или типа цикличности, который использует организационный режим? Какое решение в elisp было бы лучшим для создания такого поведения?
РЕДАКТИРОВАТЬ: Мне жаль, что я не понял. Я хочу запрограммировать на elisp что-то, что очень похоже на сворачивание кода, или на самом деле больше похоже на org-mode с иерархией, которую можно расширять. Мне интересно, как лучше всего добиться этого эффекта. Я думаю, что слышал, что оверлеи emacs - хорошее решение, но я не знаю.
Что касается складывания, я просто использую встроенный набор-выборочный дисплей.
ИЗМЕНИТЬ НОМЕР 2:
Спасибо за ответы, но я думаю, что задаю неправильный вопрос, поэтому позвольте мне попытаться пояснить, что я пытаюсь сделать. Я хотел бы создать следующие
Когда вы помещаете свою точку в функцию и вызываете эту функцию elisp, она помещает определение функции из любого места (я думаю о том, чтобы просто использовать для этого find-tag) и разворачивать его в текущем буфере. Идея в том, что если вам нужно перейти в другой буфер, чтобы прочитать определение функции, я чувствую, что это переключение контекста на другой файл. Поэтому я хотел бы, чтобы он вел себя как сворачивание кода, только он извлекает код извне из буфера. Это создает некоторые проблемы, поскольку он не может фактически вставить код в буфер или, если кто-то его сохранит, он сохранит втянутый код. Поэтому мне интересно, есть ли способ создать область внутри буфера, которая также не является частью буфера. Думаю, в этом есть смысл.
источник
EDIT NB 2
и задать для него новый вопрос.Ответы:
В emacs сворачивание обычно не требуется, поскольку в нем есть инструменты, которые явно реализуют действия, которые люди делают вручную при сворачивании кода.
Большинство людей добиваются успеха с помощью простых пошаговых поисков. Видите где-то "foo"? Введите C-s
foo
, найдите определение, нажмите ввод, прочтите его, а затем нажмите, C-x C-xчтобы вернуться туда, где вы были. Просто и очень полезно.Большинство режимов поддерживают имя . M-x
imenu
позволит вам перейти к определению функции (и т. д.) по имени. Вы также можете привязать его к щелчку мыши, чтобы получить меню функций (или добавить его в строку меню; см. Страницу «Информация» для более подробной информации). Он предоставляет данные для режима-функции, которые позволят вам увидеть, в какой функции вы сейчас находитесь в строке режима. (Но почему ваши функции такие длинные?)Также есть панель быстрого доступа , которая отображает информацию об имени (и других вещах) графически.
Если вы хотите получить обзор вашего файла, попробуйте M-x
occur
". Учитывая регулярное выражение, он создаст новый буфер с каждым совпадением в текущем буфере. Вы можете выполнить поиск" (defun ", чтобы получить обзор функций текущего файла Нажав на результат, вы переместитесь в эту позицию в файле.Так или иначе, подумайте о том, чего вы действительно хотите достичь, и Emacs, вероятно, это реализует. Не сражайтесь с несовершенными инструментами, которые заставляют вас постоянно складывать и раскладывать вещи.
источник
hide-show mode (
hs-minor-mode
) с привязкой клавишC-c @ C-M-h
по умолчанию для запуска функции сворачивания (hs-hide-all
)источник
zR
,zM
,zo
,zc
.Еще один способ снять шкуру с кошки:
M-1 Cx $ и волшебство происходит!
Как обычно, это белая магия: Cx $ вернет ваш код.
из второстепенного блога emacs wizardry
Для полноты: M-3 Cx $ покажет более глубокий вложенный код и так далее.
FWIW Сегодня я сделал крошечного помощника, основанного на чем-л. найдено здесь, так что F5 переключает сворачивание кода в зависимости от текущей позиции курсора:
источник
Я использую второстепенный режим структуры, чтобы свернуть свой код Python. Вместо того, чтобы размещать {{{и}}}, как в режиме сворачивания, он использует место, где определен блок.
http://www.gnu.org/software/emacs/manual/html_node/emacs/Outline-Mode.html http://www.emacswiki.org/emacs/OutlineMinorMode
Я почти уверен, что он идет с emacs. Затем я добавляю это в свой .emacs
источник
outline-mode
поддерживает python в emacs 24 из коробки - нет необходимости в пользовательскихoutline-level
функциях. Это все, что мне нужно было добавить к моемуuser.el
:(add-hook 'python-mode-hook 'outline-minor-mode)
outline-minor-mode-prefix
- комбинации клавиш по умолчанию ужасны - я использую(setq outline-minor-mode-prefix (kbd "C-;"))
Вы также можете получить сворачивание кода, используя CEDET со следующим кодом в файле инициализации:
После оценки этого кода маленький треугольник появится в области окантовки, поэтому вы сможете сворачивать и разворачивать код, используя его. Этот метод более точен, поскольку использует синтаксическую информацию, извлеченную из исходного кода.
источник
hs-minor-mode прекрасно работает.
Это работает еще лучше в сочетании с fold-dwim (делайте то, что я имею в виду). Затем есть fold-dwim-org, которая предоставляет org-mode, например привязки клавиш для сворачивания кода! Оба могут быть установлены через мармелад (и я думаю, что elpa).
источник
По-видимому, идеального решения не существует, но я думаю, что лучший из них:
http://www.emacswiki.org/emacs/FoldingMode
источник
vimish-fold
также хорошее и простое решение.https://github.com/mrkkrp/vimish-fold .
С домашней страницы:
Используя отличный,
use-package
я устанавливаю и активирую его, используя этот фрагмент в моей конфигурации:источник
Я удивлен, что никто не упомянул сужение-расширение. Это супер круто, он тоже идет в комплекте с emacs. Просто выберите код, на котором вы хотите сосредоточиться, и нажмите
C-x n n
, чтобы вернуться в полноэкранный режим, просто сделайте этоC-x n w
. Я всегда предпочитаю использовать встроенные функции emacs, чем загромождать свое пользовательское пространство другим пакетом. Если emacs может делать это со встроенными функциями, тогда я предпочитаю это каким-то сторонним пакетам, но это только я, не означает и не подразумевает чего-либо еще, кроме того, что мне нравятся простые вещи, а не сложные длинные конфигурации.источник
emacs поставляется с hs-minor-mode, который способствует сворачиванию кода между сбалансированными выражениями http://www.emacswiki.org/emacs/HideShow
источник
Я считаю, что ваше сравнение вашего «проекта» со сворачиванием не совсем удачно, потому что сворачивание - это изменение внешнего вида при сохранении неизменного содержимого буфера (текста). Ваш проект будет включать отображение дополнительного текста при сохранении неизменного содержимого буфера, AFAIU. Так. это нереализуемо как композиция вставки и сворачивания текста (тогда содержимое буфера будет изменено).
Но, возможно, это действительно возможно с тем же механизмом, что и сворачивание с помощью - «overlays» ... Рассмотрим свойства наложения «before-string» и «after-string» ; возможно, вы могли бы поместить определения ваших функций в эти строки, принадлежащие наложению нулевой длины в точке. Посмотрите на функцию outline-flag-region, чтобы увидеть, как наложения используются в режиме контура.
источник
Если вы используете
hs-minor-mode
, было бы неплохо также установить более удобный ярлык, например:источник
Вдохновленный ответом einSelbst :
Вуаля,
C-x $
вдруг стал полезным , даже без какого - либоC-u
ниM-4
бизнеса.источник
Если вы используете JavaScript и используете его
js2-mode.el
, вы можете:C-c C-f
: переключить скрыть / показать всеC-c C-e
: скрыть элементC-c C-s
: показать элементисточник