Was ist der beste Weg, um so etwas wie Code-Faltung oder die Art des Radfahrens zu erreichen, die der Org-Modus verwendet? Was wäre die beste Lösung in elisp, um diese Art von Verhalten zu erzeugen?
EDIT: Es tut mir leid, dass ich nicht klar war. Ich möchte etwas in elisp programmieren, das der Code-Faltung sehr ähnlich ist oder dem Org-Modus mit der Hierarchie, die erweitert werden kann, am ähnlichsten ist. Ich frage mich, wie ich diesen Effekt am besten erreichen kann. Ich denke, ich habe gehört, dass Emacs-Overlays eine gute Lösung sind, aber ich weiß es nicht.
Was das Falten angeht, verwende ich nur das eingebaute Set-Selective-Display
EDIT NUMBER 2:
Vielen Dank für die Antworten, aber ich glaube, ich stelle die falsche Frage. Lassen Sie mich versuchen, klarer zu machen, was ich versuche. Ich möchte Folgendes erstellen
Wenn Sie Ihren Punkt auf eine Funktion setzen und diese elisp-Funktion aufrufen, wird die Funktionsdefinition von jedem Ort aus platziert (ich denke nur daran, find-tag dafür zu verwenden) und im aktuellen Puffer entfaltet. Die Idee ist, wenn Sie zu einem anderen Puffer springen müssen, um die Funktionsdefinition zu lesen. Ich denke, es ist ein Kontextwechsel zu einer anderen Datei. Ich möchte also, dass es sich wie das Falten von Code verhält, nur dass Code außerhalb des Puffers eingezogen wird. Dies stellt einige Probleme dar, da der Code nicht akut in den Puffer eingefügt werden kann. Wenn jemand ihn speichert, wird der eingezogene Code gespeichert. Ich frage mich also, ob es eine Möglichkeit gibt, einen Bereich innerhalb eines Puffers zu erstellen, der ebenfalls nicht Teil des Puffers ist. Ich denke das macht Sinn.
quelle
EDIT NB 2
und eine neue Frage zu stellen.Antworten:
Das Falten ist bei Emacs im Allgemeinen nicht erforderlich, da es Tools enthält, die die Aktionen, die beim Falten von Code manuell ausgeführt werden, explizit implementieren.
Die meisten Menschen haben guten Erfolg mit einfachen inkrementellen Suchen. Siehe "foo" irgendwo erwähnt? Geben Sie ein C-s
foo
, suchen Sie die Definition, drücken Sie die Eingabetaste, lesen Sie sie und drücken Sie dann, um C-x C-xzu Ihrem ursprünglichen Standort zurückzukehren. Einfach und sehr nützlich.Die meisten Modi unterstützen imenu . M-x
imenu
Hiermit können Sie nach Namen zu einer Funktionsdefinition (usw.) springen. Sie können es auch an einen Mausklick binden, um ein Funktionsmenü aufzurufen (oder es der Menüleiste hinzufügen; weitere Informationen finden Sie auf der Info-Seite). Es liefert Daten für welchen Funktionsmodus, mit denen Sie sehen können, in welcher Funktion Sie sich derzeit in der Modellreihe befinden. (Warum sind deine Funktionen so lang?)Es gibt auch eine Geschwindigkeitsleiste , die die IMENU-Informationen (und andere Dinge) grafisch anzeigt.
Wenn Sie sich einen Überblick über Ihre Datei M-x
occur
verschaffen möchten, versuchen Sie es mit ". Bei einem regulären Ausdruck wird mit jeder Übereinstimmung im aktuellen Puffer ein neuer Puffer erstellt. Sie können nach" (defun "suchen, um einen Überblick über die Funktionen der aktuellen Datei zu erhalten Wenn Sie auf das Ergebnis klicken, gelangen Sie an diese Position in der Datei.Überlegen Sie sich also, was Sie wirklich erreichen möchten, und Emacs setzt dies wahrscheinlich um. Kämpfe nicht mit unvollkommenen Werkzeugen, mit denen du Dinge ständig falten und entfalten kannst.
quelle
Hide-Show-Modus (
hs-minor-mode
) mit Standard-TastenkombinationC-c @ C-M-h
zum Auslösen des Faltens (hs-hide-all
)quelle
zR
,zM
,zo
,zc
.Ein anderer Weg, um die Katze zu häuten:
M-1 Cx $ und Magie passiert!
Wie immer ist es weiße Magie: Cx $ bringt Ihren Code zurück.
von kleinen Emacs Zauberer Blog
Nur der Vollständigkeit halber : M-3 Cx $ würde tiefer verschachtelten Code anzeigen und so weiter.
FWIW Ich habe heute einen winzigen Helfer gemacht, der auf etw basiert. hier gefunden , so dass F5 die Code-Faltung basierend auf der aktuellen Cursorposition umschaltet:
quelle
Ich verwende den Gliederungsminderheitsmodus, um meinen Python-Code zu falten. Anstatt {{{und}}} wie im Faltmodus platzieren zu müssen, wird dort verwendet, wo der Block definiert ist.
http://www.gnu.org/software/emacs/manual/html_node/emacs/Outline-Mode.html http://www.emacswiki.org/emacs/OutlineMinorMode
Ich bin mir ziemlich sicher, dass es mit Emacs kommt. Ich füge dies dann meinen .emacs hinzu
quelle
outline-mode
Python in Emacs 24 sofort einsatzbereit ist - keine benutzerdefiniertenoutline-level
Funktionen erforderlich . Dies ist alles, was ich zu meinem hinzufügen mussteuser.el
:(add-hook 'python-mode-hook 'outline-minor-mode)
outline-minor-mode-prefix
- die Standard-Tastenkombinationen sind schrecklich - ich benutze(setq outline-minor-mode-prefix (kbd "C-;"))
Sie können Code auch falten, indem Sie CEDET mit folgendem Code in der Init-Datei verwenden:
Nach der Auswertung dieses Codes wird das kleine Dreieck im Randbereich angezeigt, sodass Sie den Code damit falten und entfalten können. Diese Methode ist präziser, da sie syntaktische Informationen verwendet, die aus dem Quellcode extrahiert wurden
quelle
Der hs-Moll-Modus funktioniert wunderbar.
Es funktioniert noch schöner, wenn es mit Fold-Dwim kombiniert wird (mach was ich meine). Dann gibt es Fold-Dwim-Org, das org-Modus-ähnliche Tastenkombinationen für das Falten von Code bietet! Beide können über Marmelade installiert werden (und ich denke elpa).
quelle
Anscheinend gibt es keine perfekte Lösung, aber ich denke, die beste ist folgende:
http://www.emacswiki.org/emacs/FoldingMode
quelle
vimish-fold
ist auch eine schöne und einfache Lösung.https://github.com/mrkkrp/vimish-fold .
Von der Homepage:
Mit dem exzellenten
use-package
installiere und aktiviere ich es mit diesem Snippet in meiner Konfiguration:quelle
Ich bin überrascht, dass niemand von einer Verengung und Erweiterung sprach. Es ist super toll, es kommt auch mit Emacs gebündelt. Wählen Sie einfach den Code aus, auf den Sie sich konzentrieren möchten, und drücken Sie
C-x n n
, um zum Vollbildmodus zurückzukehrenC-x n w
. Ich bevorzuge es immer, integrierte Emacs-Funktionen zu verwenden, als meinen Benutzerbereich mit einem anderen Paket zu überladen. Wenn Emacs dies mit integrierten Funktionen tun können, ziehe ich das einem Paket von Drittanbietern vor, aber das bin nur ich, bedeutet oder impliziert nichts anderes, als dass ich einfache Dinge gegenüber komplexen langen Konfigurationen mag.quelle
emacs wird mit dem hs-minor-Modus geliefert, der das Falten von Code zwischen ausgeglichenen Ausdrücken vereinfacht. http://www.emacswiki.org/emacs/HideShow
quelle
Ich glaube, dass Ihr Vergleich Ihres "Projekts" mit dem Falten nicht ganz gut ist, da es beim Falten darum geht, das Erscheinungsbild zu ändern, während der Pufferinhalt (der Text) intakt bleibt. Ihr Projekt würde beinhalten, zusätzlichen Text anzuzeigen, während der Pufferinhalt intakt bleibt, AFAIU. So. Es kann nicht als Komposition aus Einfügen und Falten von Text implementiert werden (dann würde der Pufferinhalt geändert).
Aber vielleicht ist es tatsächlich mit dem gleichen Mechanismus möglich, mit dem gefaltet wird - "Overlays" ... Berücksichtigen Sie die Overlay-Eigenschaften "Vor-String" und "Nach-String" . Vielleicht könnten Sie Ihre Funktionsdefinitionen in diese Zeichenfolgen einfügen, die zu einer Überlagerung mit der Länge Null am Punkt gehören. Sehen Sie sich die Funktion " Gliederungsflaggenregion" an, um zu sehen, wie Überlagerungen im Gliederungsmodus verwendet werden.
quelle
Wenn Sie verwenden
hs-minor-mode
, ist es möglicherweise eine gute Idee, auch eine bequemere Verknüpfung festzulegen, z.quelle
Mit Inspiration von einSelbsts Antwort :
Voila,
C-x $
wurde plötzlich nützlich , auch ohneC-u
nochM-4
Geschäft.quelle
Wenn Sie JavaScript verwenden und verwenden
js2-mode.el
, können Sie:C-c C-f
: schalten Sie alle ein / ausC-c C-e
: Element ausblendenC-c C-s
: Element anzeigenquelle