Chcę nawigować między wierszami pliku na podstawie wcięcia. Plik ma strukturę wcięcia: linia, która jest bardziej wcięta niż poprzednia linia, jest potomkiem poprzedniej linii, która ma takie samo wcięcie jak poprzednia linia, jest jej rodzeństwem. Głównie szukam trzech poleceń:
- Przejdź do następnego rodzeństwa, tj. Następnego wiersza z tym samym wcięciem, pomijając wiersze, które są bardziej wcięte, ale nie pomijaj linii mniej wciętej.
- Przejdź do poprzedniego rodzeństwa, tj. Tego samego w przeciwnym kierunku.
- Przejdź do elementu nadrzędnego, tj. Do poprzedniej linii z mniejszym wcięciem.
Pozycja kolumny w punkcie nie powinna się zmienić.
Są to analogi dla danych o strukturze do wcięć forward-sexp
, backward-sexp
a backward-up-list
dla danych s-wyrażenie strukturze. Wcięcie odpowiada strukturze programu w językach takich jak Haskell i Python; funkcje te mogą być szczególnie przydatne w tym kontekście, ale nie szukam niczego specyficznego dla danego trybu (moim podstawowym przypadkiem użycia są dane o strukturze intendacyjnej w innym formacie pliku).
Poziomy wcięć kolorowania mogą pomóc w ręcznej nawigacji za pomocą Up/, Downale chcę coś automatycznego.
To pytanie superużytkownika jest podobne, ale ma słabsze wymagania i obecnie nie ma odpowiedzi, które spełniają moje wymagania.
źródło
set-selective-display
się do tego, czego potrzebujesz?indent-tools
w melpa ( narzędzia wcięcia ), który prawdopodobnie działa w tym celu. Pierwsze zatwierdzenie nastąpiło 16 maja 2016 r., Około 3 miesiące po zadaniu tego pytania.Odpowiedzi:
Analizując cztery dostępne obecnie odpowiedzi ( dwie na Super User i dwie na to pytanie), widzę następujące problemy:
outline.el
, i tak w zasadzie i tak przechodzi on linijka po linii (outline-next-visible-heading
w naszym przypadku), ponieważ (prawie) wszystkie linie pasują do wyrażenia regularnego konspektu i liczą się jako „nagłówek”.Tak więc, łącząc kilka pomysłów każdego z nich, mam następujące: iść naprzód linia po linii, przeskakując puste i bardziej wcięte linie. Jeśli masz równe wcięcie, jest to następne rodzeństwo. Podstawowy pomysł wygląda następująco:
Odpowiednio uogólnione (do przodu / do tyłu / w górę / w dół) to, czego używam, wygląda następująco:
Pożądana jest jeszcze większa funkcjonalność, a przeglądanie
outline.el
i ponowne wdrażanie niektórych z nich może pomóc, ale na razie jestem zadowolony z tego, dla moich celów.źródło
(current-line)
to, że coś zmisc-fns.el
tego mam w instalacji Aquamacs jako częśćoneonone.el
biblioteki.Ta funkcja istnieje w Emacsie. Tryb konspektu opisuje dokument jako zawierający linie nagłówka z poziomem i umożliwia przechodzenie między poziomami. Możemy zdefiniować każdą linię jako linię nagłówka z poziomem, który odzwierciedla jej wcięcie: ustaw
outline-regexp
na wcięcie. Dokładniej, wcięcie plus pierwszy znak zakaz spacje (i początek pliku to poziom najwyższy)\`\|\s-+\S-
.W Emacsie 22.1–24.3 możesz to uprościć, aby:
Następnie możesz użyć poleceń ruchu konspektu :
C-C @ C-f
(outline-forward-same-level
), aby przejść do następnego rodzeństwa;C-C @ C-b
(outline-backward-same-level
), aby przejść do poprzedniego rodzeństwa;C-C @ C-u
(outline-up-heading
), aby przejść do rodzica.Jedna zakładka i jedna spacja liczą się dla tej samej wielkości wcięcia. Jeśli masz kombinację tabulatorów i spacji, ustaw
tab-width
odpowiednio i zadzwońuntabify
.Jeśli bieżący tryb główny ma ustawienia konturu, mogą powodować konflikty. W takim przypadku możesz użyć jednego z wielu rozwiązań dla wielu głównych trybów , najprostszym z nich jest utworzenie bufora pośredniego i ustawienie go na Zarys trybu głównego. W trybie Zarys główny domyślne skróty klawiaturowe są łatwiejsze do wpisania:
C-c C-f
itd.źródło
M-x make-local-variable RET outline-regexp RET
nie akceptuje tej zmiennej i mówi tylko „[Brak dopasowania]`. Mam jeszcze przyjrzeć się temu dokładniej.outline-regexp
nie jest już defcustom i nie można jej tak łatwo ustawić interaktywnie.Poniższe trzy polecenia, minimalnie przetestowane, powinny umożliwić podstawową nawigację według wciętych linii. Przepraszamy za powtórzenie kodu.
źródło
(current-column)
ale powoduje to, że kursor się nie porusza), ale nie do końca odpowiada mojej specyfikacji: poruszanie się na poziomie wcięcia przesuwa się mniej niż wcięte linie.ind-forward-sibling
prostu szuka następnej linii z tym samym wcięciem, więc przeskakuje przez linie z mniejszą wcięciem (idzie do przodu, nawet jeśli nie ma rodzeństwa do przodu).