Jak wykryć, czy punkt znajduje się w obszarze komentarza?
15
Sprawdź czwartą * wartość na liście zwróconą przez syntax-ppss
:
(nth 4 (syntax-ppss))
Dzieje się tak, nil
jeśli punkt znajduje się poza komentarzem, t
jeśli znajduje się wewnątrz komentarza, którego nie można zagnieździć, lub liczbą całkowitą (głębokość zagnieżdżenia), jeśli znajduje się w komentarzu zagnieżdżonym. Aby parse-partial-sexp
uzyskać więcej informacji, zobacz dokumentację.
* Zero.
Pamiętaj, że to nie działa w trybie Org, powinieneś użyć tego:
(defun in-comment-p ()
"Testy if cursor/point in a commented line?"
(save-excursion
(if (derived-mode-p 'org-mode)
(save-match-data (beginning-of-line) (looking-at "^[ \t]*#"))
(nth 4 (syntax-ppss)))))
syntax-ppss
zawiera?parse-partial-sexp
.syntax-ppss
wskaże cięparse-partial-sexp
, a ten ostatni da ci opis wszystkich rzeczy zwróconych przez te funkcje. Mam nadzieję, że to pomoże na początek.użyj font-face, to jest sztuczka, której nauczyłem się od flyspell.
Próbowałem
syntax-ppss
dwa lata temu, to nie działa z dwóch powodów:nie działa na krawędzi komentarza (limit komentarzy), na przykład dla komentarza jak
// this is comment
w trybie c ++ - jeśli umieścisz kursor nad/
znakiem, wynik(nth 4 (syntax-ppss))
jest równy zero.w ogóle nie działa w trybie głównym, takim jak tryb internetowy
Oto kod, który skopiowałem z flyspell:
Uwaga: kod można rozszerzyć o obsługę nowych głównych trybów poprzez dopasowanie czcionki fuzz.
Używam tej sztuczki od około trzech lat bez żadnych awarii. Poza tym, biorąc pod uwagę, że Flyspell jest szeroko stosowany przez tak długi czas, mogę stwierdzić, że ta metoda jest niezawodna.
Zobacz, którego skrótu klawiaturowego użyć do nawigowania poza ciągiem znaków w przypadku podobnego pytania.
źródło
POS
arg i używapoint
. Lepszym rozwiązaniem niż posiadanie dwóch takich wersji jest uczynienie argPOS
opcjonalnym i ustawienie go na(point)
kiedynil
.