Wie erkenne ich, ob sich der Punkt innerhalb eines Kommentarbereichs befindet?
15
Überprüfen Sie den vierten * Wert in der Liste, die zurückgegeben wird von syntax-ppss
:
(nth 4 (syntax-ppss))
Es ist, nil
wenn point außerhalb eines Kommentars liegt, t
wenn es sich innerhalb eines nicht verschachtelbaren Kommentars befindet, oder eine Ganzzahl (die Verschachtelungstiefe), wenn es sich innerhalb eines verschachtelbaren Kommentars befindet. Weitere Informationen finden Sie in der Dokumentation parse-partial-sexp
.
* Auf Null basierend.
Beachten Sie, dass dies im Org-Modus nicht funktioniert. Sie sollten dies verwenden:
(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
bereitstellen?parse-partial-sexp
.syntax-ppss
aufparse-partial-sexp
, der eine Beschreibung aller von diesen Funktionen zurückgegebenen Elemente enthält . Hoffentlich hilft das erstmal.benutze die Schriftart, das ist der Trick, den ich von flyspell gelernt habe.
Ich habe es vor
syntax-ppss
zwei Jahren versucht , es funktioniert aus zwei Gründen nicht:Arbeiten Sie nicht an der Kante des Kommentars (Kommentar-Limit), zum Beispiel für Kommentare wie
// this is comment
im C ++ - Modus. Wenn Sie den Cursor über das/
Zeichen setzen, ist das Ergebnis von(nth 4 (syntax-ppss))
Null.Funktioniert im Hauptmodus überhaupt nicht wie im Webmodus
Hier ist der Code, den ich aus flyspell kopiert habe:
Bitte beachten Sie, dass der Code erweitert werden kann, um neue Hauptmodi durch Fuzz Matching Font Face zu unterstützen.
Ich habe diesen Trick ungefähr drei Jahre lang ohne Fehler angewendet. Abgesehen davon, dass Flyspell so lange weit verbreitet ist, könnte ich behaupten, diese Methode ist zuverlässig.
Eine ähnliche Frage finden Sie unter Welche Tastenkombination zum Navigieren aus einer Zeichenfolge verwendet werden soll .
quelle
POS
Argument benötigt und verwendetpoint
. Besser als zwei solcher Versionen ist es, argPOS
optional zu machen und auf(point)
when zu setzennil
.