回答:
によって返されるリストの4番目の*値を確認しますsyntax-ppss。
(nth 4 (syntax-ppss))
それだnil点は、任意のコメント外にある場合、tもし非入れ子式コメント、または整数(ネストの深さ)内の入れ子式コメント内部場合。詳細については、docstringを参照してparse-partial-sexpください。
*ゼロベース。
これは組織モードでは機能しないことに注意してください。これを使用する必要があります。
(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)))))
parse-partial-sexpます。
syntax-ppssを指しparse-partial-sexp、後者はこれらの関数によって返されるすべてのものの説明を提供します。うまくいけば、それがスタートに役立つでしょう。
font-faceを使用します。これは、私がflyspellから学んだトリックです。
syntax-ppss2年前に試しましたが、2つの理由で機能しません。
コメントの端では機能しません(コメント制限)。たとえば、// this is commentc ++モードのようなコメントの場合、カーソルを/文字の上に置くと、結果(nth 4 (syntax-ppss))はnilになります。
Webモードのようなメジャーモードではまったく機能しない
flyspellからコピーしたコードは次のとおりです。
(defun evilnc--in-comment-p (&optional pos)
"Test if character at POS is comment. If POS is nil, character at `(point)' is tested"
(interactive)
(unless pos (setq pos (point)))
(let* ((fontfaces (get-text-property pos 'face)))
(when (not (listp fontfaces))
(setf fontfaces (list fontfaces)))
(delq nil
(mapcar #'(lambda (f)
;; learn this trick from flyspell
(or (eq f 'font-lock-comment-face)
(eq f 'font-lock-comment-delimiter-face)))
fontfaces))))
フォントファズマッチングによって新しいメジャーモードをサポートするようにコードを拡張できることに注意してください。
私はこのトリックを失敗せずに約3年間使用しています。それに、フライスペルは長い間広く使われていることを考えると、この方法は信頼できると言えるでしょう。
同様の質問については、文字列から移動するために使用するキーボードショートカットを参照してください。
POS引数を使用せずにを使用する別のバージョンが提案されましたpoint。このようなバージョンを2つ使用するよりも、argをPOSオプションにし(point)、whenに設定することをお勧めしますnil。
syntax-ppss提供する他のすべての情報のドキュメントはありますか?