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

StackOverflow https://stackoverflow.com/questions/1085170

  •  23-08-2019
  •  | 
  •  

Вопрос

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

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

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

ПРАВКА НОМЕР 2:

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

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

Это было полезно?

Решение

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

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

Поддержка большинства режимов именуюсь. М-хimenu позволит вам перейти к определению функции (и т.д.) по имени.Вы также можете привязать его к щелчку мыши, чтобы получить меню функций (или добавить его на панель меню;смотрите Информационную страницу для получения более подробной информации).Он предоставляет данные для which-function-mode, которые позволят вам увидеть, внутри какой функции вы в данный момент находитесь в линии модели.(Но почему ваши функции такие длинные?)

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

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

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

Другие советы

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

Еще один способ освежевать кошку:

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

M-1 C-x $ и происходит волшебство!

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

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

От блог о волшебстве minor emacs

Просто для полноты картины: 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))))))

Я использую режим outline minor для сворачивания моего кода на 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 \C-c@ 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)
)

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

(global-semantic-folding-mode t)

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

режим hs-minor работает великолепно.

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

Очевидно, что идеального решения не существует, но я думаю, что лучшим из них является это:

http://www.emacswiki.org/emacs/FoldingMode

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))

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

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

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

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

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

С вдохновением от Ответ Эйнзельбста:

(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 бизнес.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top