Як досягти ефектів складання коду в Emacs?


123

Що найкращий спосіб досягти чогось, наприклад, складання коду чи типу їзди на велосипеді, який використовує org-mode. Що було б найкращим рішенням у Elisp для створення такого типу поведінки?

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

Щодо складання, я просто використовую вбудований набір-вибір-дисплей

Редагувати номер 2:

Дякую за відповіді, але я думаю, що я задаю неправильне запитання, тож дозвольте мені постаратися бути більш зрозумілим щодо того, що я намагаюся зробити. Я хотів би створити наступне

Коли ви помістите свою точку на функцію та зателефонуєте до цієї функції elisp, вона поставить визначення функції звідки б не було (я думаю, що я просто використовую find-tag для цього) та розгорнуть її у поточному буфері. Ідея полягає в тому, що якщо вам доведеться перейти до іншого буфера, щоб прочитати визначення функції, я відчуваю, що це контекстний перехід на інший файл. Тому я хотів би, щоб він поводився як складання коду, тільки він витягує код, зовнішній від буфера. Це створює деякі проблеми, оскільки він не може акутно вставити код у буфер, або якщо хтось збереже його, він збереже витягнутий код. Тож мені цікаво, чи є спосіб створити область всередині буфера, яка також не є частиною буфера. Я думаю, що це має сенс.


Ви шукаєте щось, що, коли ви називаєте це з точкою у функції CALL, переходить до визначення функції? Начебто отримання допомоги щодо функції elisp дозволить вам перейти до коду elisp? Я не думаю, що ви можете це зробити без якоїсь концепції "Проекту". Наприклад, як би ви знали, до якої функції "swap" ви хочете перейти?
Брайан Постув

1
Дивіться також: stackoverflow.com/questions/382781/…, де селективне відображення трохи налаштоване на деякі складні ефекти.
Майкл Паулуконіс

Я рекомендую вам зняти своє питання EDIT NB 2і задати нове запитання щодо нього.
Стефан

Відповіді:


151

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

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

Більшість режимів підтримують ім'я . M-ximenuдозволить вам перейти до визначення функції (тощо) по імені. Ви також можете зв'язати його клацанням миші, щоб отримати меню функцій (або додати його до меню меню; детальніше див. Сторінку Інформація). Він надає дані для режиму, який функціонує, що дозволить вам побачити, яку функцію ви зараз перебуваєте в моделі. (Чому ж ваші функції такі довгі?)

Існує також SpeedBar , який відображає інформацію про imenu (і інші речі) графічно.

Якщо ви хочете отримати огляд вашого файлу, спробуйте M-xoccur". З урахуванням регулярного вираження він створить новий буфер з кожним збігом у поточному буфері. Ви можете шукати" (defun ", щоб отримати огляд функцій поточного файлу Натискання на результат перемістить вас до цього положення у файлі.

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


13
Vim також надає всі ці функції в тій чи іншій формі, але я все ще вважаю його засіб для складання коду безцінним.
інтуїтив

115
Я проголосував за перше речення ("Складка взагалі непотрібна за допомогою emacs, як ..."). Я використовую просту складку (на основі рівня відступу) постійно для сканування структури незнайомого коду.
Саймон Майкл

4
Ms o - це ярлик для Mx відбутися
Джошуа Олсон

3
Я проголосував за те, що багато корисних ярликів у відповіді, а також коментар @SimonMichael, який додав голос, тому що складка / розгортання може бути корисною іноді!
Адрієн Кокіо

56
Відповідь була продумана і дуже інформативна. Однак ОП запитав, як зробити складання коду. ОП не запитувала, який улюблений спосіб уникнути складання коду. Даун проголосував.
wkschwartz


39

Ще один спосіб шкіри шкіри кішки:

Як це буває, для цього вам не потрібен якийсь пакет або додаткова конфігурація. Просто перейдіть до будь-якого вихідного файлу, введіть

M-1 Cx $ і відбувається магія!

Як завжди, це біла магія: Cx $ поверне ваш код назад.

Ми можемо використовувати довідкову систему Emacs, щоб дізнатися, що відбувається: Ch k Cx $ повідомляє нам, що вищевказана комбінація клавіш викликає набір селективного відображення , функція, яка приймає один числовий аргумент (префікс M-1 передає 1 як значення цього аргументу) і, не дивно, встановлює змінну селективного відображення значенням цього аргументу.

з незначного блогу майстра emacs

Просто для повноти: M-3 Cx $ показав би більш глибокий вкладений код тощо.

FWIW Я сьогодні створив крихітного помічника на основі smth. знайдено тут, щоб 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))))))

22

Я використовую контурний мінорний режим, щоб скласти свій код 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)
)

8
виглядає так, як outline-modeпідтримує пітон нестандартний в emacs 24 - немає необхідності у користувацьких outline-levelфункціях. Це все, що мені потрібно було додати до мого user.el:(add-hook 'python-mode-hook 'outline-minor-mode)
scytale

1
о, і ви, безумовно, хочете змінити outline-minor-mode-prefix- клавіатурні (setq outline-minor-mode-prefix (kbd "C-;"))
вкладки

13

Ви також можете отримати складний код, скориставшись CEDET із наступним кодом у файлі init:

(global-semantic-folding-mode t)

Після оцінки цього коду невеликий трикутник з’явиться у зоні бахроми, тож ви зможете скласти та розгорнути код, використовуючи його. Цей метод є більш точним, оскільки він використовує синтаксичну інформацію, витягнуту з вихідного коду


1
якщо перед якою - то помилка, подивіться на це питання: stackoverflow.com/questions/15307113 / ...
AdrieanKhisbe

9

hs-мінорний режим працює прекрасно.

Він працює ще красивіше, коли він поєднується з fold-dwim (зроби, що я маю на увазі). Потім є fold-dwim-org, який забезпечує орга-режим, як прив'язка клавіш для складання коду! І те й інше можна встановити за допомогою мармеладу (і я думаю, що elpa).



5

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

3

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



2

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

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


2

Якщо ви використовуєте hs-minor-mode, може бути корисною також встановити більш зручний ярлик, наприклад:

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

0

Маючи натхнення у відповіді einSelbst :

(порада-додати 'набір-вибір-показ
            : filter-args (лямбда (args))
                           (якщо (або (автомобільні аргументи) вибіркове відображення)
                               арги
                             (список (1+ (поточний стовпець)))))
            '((назва. set-selective-display-from-cursor-column)))

Вуаля, C-x $раптом став корисним навіть без будь-якого C-uчи M-4ділового.


0

Якщо ви робите якийсь JavaScript і використовуєте js2-mode.el, ви можете:

C-c C-f: увімкнути приховати / показати всі

C-c C-e: приховати елемент

C-c C-s: показ елемента

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.