Jak osiągnąć efekty składania kodu w Emacsie?

Jaki jest najlepszy sposób, aby osiągnąć coś takiego jak składanie kodu lub rodzaj jazdy na rowerze, którego używa tryb org. Jakie byłoby najlepsze rozwiązanie w elisp do tworzenia tego typu zachowań?

Edytuj: Przepraszam, że nie wyraziłem się jasno. Chcę zaprogramować coś w elisp, co robi rzeczy bardzo podobne do składania kodu, a właściwie najbardziej jak tryb org z hierarchią, która może być rozszerzona. Zastanawiam się, jak najlepiej osiągnąć ten efekt. Chyba słyszałem, że nakładki Emacsa są dobrym rozwiązaniem, ale nie wiem.

Jeśli chodzi o składanie to używam wbudowanego zestawu-selective-display

EDIT NUMBER 2:

Dzięki za odpowiedzi, ale myślę, że zadaję złe pytanie, Więc pozwól mi się bardziej wyjaśnić, co staram się zrobić. Chciałbym utworzyć następujące

Kiedy umieścisz swój punkt na funkcji i wywołasz tę funkcję, to umieścisz definicję funkcji z dowolnego miejsca (myślę o użyciu do tego celu find-tag) i rozwiń ją w bufor prądu. Chodzi o to, że jeśli musisz przejść do innego bufora, aby odczytać definicję funkcji, czuję, że jej kontekstowy przełącznik do innego pliku. Więc chciałbym, aby zachowywał się jak składanie kodu, tylko ściąga kod zewnętrzny z bufora. Stwarza to pewne problemy, ponieważ nie można acutalnie wkleić kodu do bufora lub jeśli ktoś go zapisze, zapisze pobrany kod. Więc zastanawiam się, czy istnieje sposób, aby utworzyć obszar wewnątrz bufora, który również nie jest częścią bufora. I to ma sens.

Author: Tshepang, 2009-07-06

12 answers

Składanie jest na ogół niepotrzebne w Emacsie, ponieważ posiada narzędzia, które bezpośrednio implementują czynności wykonywane ręcznie podczas składania kodu.

Większość ludzi ma dobry sukces dzięki prostym wyszukiwaniom przyrostowym. Widzisz gdzieś wspomniane "foo"? Typ C-sfoo, znajdź definicję, naciśnij enter, przeczytaj ją, a następnie naciśnij C-x C-x wrócić tam, gdzie byłeś. Proste i bardzo przydatne.

Większość trybów obsługuje imenu. M-ximenu pozwoli Ci przejdź do definicji funkcji (itd.) z nazwiska. Możesz również powiązać go kliknięciem myszy, aby uzyskać menu funkcji (lub dodać go do paska menu; zobacz stronę informacji, aby uzyskać więcej szczegółów). Dostarcza danych dla trybu which-function-mode, który pozwoli Ci zobaczyć, w której funkcji aktualnie znajdujesz się w modelu. (Dlaczego jednak twoje funkcje są tak długie?)

Istnieje również speedbar , który wyświetla informacje imenu (i inne rzeczy) graficznie.

Jeśli chcesz uzyskać przegląd pliku, spróbuj M-xoccur". Biorąc pod uwagę Wyrażenie regularne, utworzy on nowy bufor z każdym dopasowaniem w bieżącym buforze. Możesz wyszukać "(defun", aby uzyskać przegląd funkcji implementowanych przez bieżący plik. Kliknięcie na wynik przeniesie Cię do tej pozycji w pliku.

Zastanów się, co naprawdę chcesz osiągnąć, a Emacs prawdopodobnie to zaimplementuje. Nie walcz z niedoskonałymi narzędziami, które sprawiają, że ciągle składasz i rozkładasz rzeczy.
 140
Author: jrockway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-28 19:26:15

Hide-show mode (hs-minor-mode) with default keybinding C-c @ C-M-h to trigger the folding (hs-hide-all)

 81
Author: dmckee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-06 05:22:25

Inny sposób na skórę kota:

Tak się składa, że nie potrzebujesz żadnego pakietu ani dodatkowej konfiguracji dla to. Po prostu przejdź do dowolnego pliku źródłowego, wpisz

M-1 C-x $ and magic happens!

Jak zwykle, to biała magia: C-x $ przywróci Twój kod.

Możemy użyć systemu pomocy Emacsa, aby dowiedzieć się o co chodzi: C-h k C-x $ mówi nam, że powyższa kombinacja klawiszy wywołuje set-selective-display , funkcja, która przyjmuje jeden argument liczbowy (przedrostek M-1 przekazuje 1 jako wartość tego argumentu) i, nic dziwnego, ustawia zmienną selective-display na wartość ten argument.

From minor Emacs wizardry blog

Tylko dla kompletności: M-3 C-x $ pokaże głębszy kod zagnieżdżony i tak dalej.

FWIW zrobiłem dziś malutkiego pomocnika na bazie smth. znaleziono tutaj tak, że F5 przełącza składanie kodu na podstawie bieżącej pozycji kursora:

(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))))))
 23
Author: einSelbst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-26 19:29:59

Używam trybu outline minor do składania kodu Pythona. Zamiast konieczności umieszczania {{{i}}} jak w trybie zwijania, używa tam, gdzie blok jest zdefiniowany.

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

Jestem prawie pewien, że pochodzi z emacs. Następnie dodaję to do mojego .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)
)
 20
Author: Nikwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 05:29:02

Możesz również uzyskać składanie kodu za pomocą CEDET z następującym kodem w pliku init:

(global-semantic-folding-mode t)

Po ocenie tego kodu, mały trójkąt pojawi się w obszarze frędzli, dzięki czemu będziesz mógł złożyć i rozwinąć kod za jego pomocą. Metoda ta jest bardziej precyzyjna, ponieważ wykorzystuje informacje składniowe, wydobyte z kodu źródłowego

 12
Author: Alex Ott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 05:46:40

HS-moll-mode działa pięknie.

Działa jeszcze piękniej w połączeniu z fold-dwim (do what I mean). Następnie jest fold-dwim-org, który zapewnia tryb org, jak wiązania kluczy do składania kodu! Oba można zainstalować za pomocą marmolady(i myślę, że elpa).

 9
Author: Jones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-24 23:01:59

Najwyraźniej nie ma idealnego rozwiązania, ale myślę, że najlepsze jest to:

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

 7
Author: freitass,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 02:37:37

vimish-fold jest również miłym i łatwym rozwiązaniem.

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

Ze strony głównej:

Jest to pakiet do składania tekstu jak w Vimie. Posiada następujące cechy:

  • składanie aktywnych regionów;
  • dobra wizualna informacja zwrotna: to oczywiste, która część tekstu jest składana;
  • persistence domyślnie: po zamknięciu pliku Twoje fałdy nie znikają;
  • trwałość dobrze skaluje, możesz pracować na setkach plików z dużą ilością fałd bez negatywnych skutków;
  • nie łamie wcięcia czy coś;
  • [[15]}fałdy można łatwo przełączać od stanu złożonego do rozłożonego iz powrotem; [16]}
  • Szybka nawigacja pomiędzy istniejącymi fałdami;
  • możesz używać myszki do rozkładania fałd (dobre dla początkujących i nie tylko dla nich);
  • dla fanów pakietu avy: możesz użyć avy do składania tekstu przy minimalnej liczbie uderzeń klawiszy!

Korzystając z doskonałego use-package instaluję i aktywuję go używając tego fragmentu w moim config:

(use-package vimish-fold
  :ensure t
  :config (vimish-fold-global-mode t))
 4
Author: Horus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-18 09:25:30

Emacs jest wyposażony w hs-minor-mode, który ułatwia składanie kodu pomiędzy wyrażeniami zbalansowanymi http://www.emacswiki.org/emacs/HideShow

 2
Author: eunikorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-25 03:12:21

Uważam, że porównanie twojego "projektu" do składania nie jest całkiem dobre, ponieważ składanie polega na zmianie wyglądu przy zachowaniu nienaruszonej zawartości bufora (tekstu). Twój projekt wymagałby pokazania dodatkowego tekstu przy zachowaniu nienaruszonej zawartości bufora, AFAIU. Więc. nie można go zaimplementować jako skład tekstu-wstawianie i składanie (wtedy zmieniłaby się zawartość bufora).

Ale być może, jest to rzeczywiście możliwe z tym samym mechanizmem, jak składanie odbywa się z -- "nakładki"... Rozważ właściwości" before-string "i" after-string " overlay ; Być może mógłbyś umieścić definicje funkcji w tych łańcuchach należących do nakładki o zerowej długości w punkcie. Spójrz na funkcję outline-flag-region , aby zobaczyć, jak nakładki są używane w trybie konturu.

 2
Author: imz -- Ivan Zakharyaschev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-25 14:41:54

Jeśli używasz hs-minor-mode, dobrym pomysłem może być również ustawienie wygodniejszego skrótu, np.:

(eval-after-load 'hideshow
 '(progn
   (global-set-key (kbd "C-+") 'hs-toggle-hiding)))
 1
Author: quazgar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-30 12:49:17

Z inspiracji odpowiedź einselbsta :

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

Voila, C-x $ nagle stał się przydatny nawet bez żadnego C-u ani M-4 biznesu.

 0
Author: DomQ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-29 11:44:34