Ich möchte zwischen den Zeilen einer Datei basierend auf Einrückungen navigieren. Die Datei ist durch Einrückung strukturiert: Eine Zeile, die stärker eingerückt ist als die vorherige Zeile, ist ein untergeordnetes Element der vorherigen Zeile. Eine Zeile mit derselben Einrückung wie die vorherige Zeile ist das gleichrangige Element. Ich suche hauptsächlich drei Befehle:
- Gehen Sie zum nächsten Geschwister, dh zur nächsten Zeile mit demselben Einzug, und überspringen Sie Zeilen, die stärker eingerückt sind, jedoch nicht hinter einer Zeile, die weniger eingerückt ist.
- Gehe zum vorherigen Geschwister, dh dasselbe in die andere Richtung.
- Gehen Sie zum übergeordneten Element, dh zur vorherigen Zeile mit weniger Einrückung.
Die Spaltenposition des Punktes sollte sich nicht ändern.
Diese sind Analoga für die Einrückung strukturierte Daten forward-sexp
, backward-sexp
und backward-up-list
für sexp strukturierten Daten. Einrückung entspricht Programmstruktur in Sprachen wie Haskell und Python; Diese Funktionen können in diesem Zusammenhang besonders nützlich sein, aber ich suche nichts Modusspezifisches (mein Hauptanwendungsfall sind Daten mit Absichtsstruktur in einem anderen Dateiformat).
Das Färben von Einrückungsstufen kann beim manuellen Navigieren mit Up/ hilfreich sein, Downaber ich möchte etwas Automatisches.
Diese Superuser-Frage ist ähnlich, hat jedoch geringere Anforderungen und enthält derzeit keine Antworten, die meinen Anforderungen entsprechen.
quelle
set-selective-display
erhalten Sie in der Nähe zu dem, was Sie brauchen?indent-tools
in melpa (indent -tools ) aufgefallen , das wahrscheinlich für diesen Zweck funktioniert. Die erste Übergabe erfolgte am 16. Mai 2016, ungefähr 3 Monate nachdem diese Frage gestellt wurde.Antworten:
Wenn ich die vier derzeit verfügbaren Antworten ( zwei für Superuser und zwei für diese Frage) betrachte, sehe ich die folgenden Probleme:
outline.el
, geht esoutline-next-visible-heading
in unserem Fall ohnehin auch grundsätzlich zeilenweise (mit ), da (fast) alle Zeilen dem regulären Ausdruck der Gliederung entsprechen und als "Überschrift" zählen würden.Wenn ich also einige Ideen für jede zusammenstelle, habe ich Folgendes: Gehen Sie Zeile für Zeile vor, und überspringen Sie leere und stärker eingerückte Zeilen. Wenn Sie die gleiche Einrückung haben, ist es das nächste Geschwister. Die Grundidee sieht so aus:
Entsprechend verallgemeinert (vorwärts / rückwärts / aufwärts / abwärts) sieht das, was ich verwende, derzeit folgendermaßen aus:
Es ist noch etwas mehr Funktionalität wünschenswert, und
outline.el
es kann hilfreich sein, einige davon zu betrachten und neu zu implementieren, aber ich bin für meine Zwecke im Moment damit zufrieden.quelle
(current-line)
so ausmisc-fns.el
, als hätte ich etwas davon in meiner Aquamacs-Installation als Teil eineroneonone.el
Bibliothek.Die folgenden drei Befehle, die nur minimal getestet wurden, sollten eine einfache Navigation durch eingerückte Zeilen ermöglichen. Entschuldigung für die Code-Wiederholung.
quelle
(current-column)
aber der Cursor bewegt sich nicht), aber entspricht nicht genau meiner Spezifikation: Bewegen auf einer Einrückungsstufe bewegt sich über weniger hinaus. eingerückte Zeilen.ind-forward-sibling
sucht einfach nach der nächsten Zeile mit dem gleichen Einzug, überspringt also Zeilen mit weniger Einzug (geht vorwärts, auch wenn es kein vorwärtsgeschwister gibt).Diese Funktion ist in Emacs vorhanden. Der Gliederungsmodus beschreibt ein Dokument so, dass es Überschriften mit einer Ebene enthält, und verfügt über Funktionen zum Verschieben zwischen Ebenen. Wir können jede Zeile als Überschriftenzeile mit einer Ebene definieren, die den Einzug widerspiegelt: Setzen Sie diese
outline-regexp
auf den Einzug. Mehr die Vertiefung und das erste Nicht-Leerzeichen genau (und der Anfang der Datei ist , die oberste Ebene)\`\|\s-+\S-
.In Emacs 22.1–24.3 können Sie dies vereinfachen, um:
Dann können Sie Gliederungsbewegungsbefehle verwenden :
C-C @ C-f
(outline-forward-same-level
) zum nächsten Geschwister wechseln;C-C @ C-b
(outline-backward-same-level
) zum vorherigen Geschwister wechseln;C-C @ C-u
(outline-up-heading
), um zum übergeordneten Element zu wechseln.Ein Tabulator und ein Leerzeichen zählen für das gleiche Maß an Einrückung. Wenn Sie eine Mischung aus Tabulatoren und Leerzeichen haben, legen Sie dies
tab-width
entsprechend fest und rufen Sie anuntabify
.Wenn der aktuelle Hauptmodus Gliederungseinstellungen enthält, können Konflikte auftreten. In diesem Fall können Sie eine der vielen Hauptmodi verwenden. Am einfachsten ist es, einen indirekten Puffer zu erstellen und auf den Hauptmodus " Gliederung" zu setzen. Im Hauptmodus "Gliederung" sind die Standardtastenkürzel einfacher einzugeben:
C-c C-f
usw.quelle
M-x make-local-variable RET outline-regexp RET
akzeptiert diese Variable nicht und sagt nur "[No match]". Bin noch nicht genauer dran.outline-regexp
ist keine Standardanpassung mehr und kann nicht so einfach interaktiv festgelegt werden.