ポイントがコメント領域内にあるかどうかを検出する方法は?


15

ポイントがコメント領域内にあるかどうかを検出する方法は?

回答:


19

によって返されるリストの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)))))

完璧な、syntax-ppss提供する他のすべての情報のドキュメントはありますか?
名前

2
はい、それはのdocstringにありparse-partial-sexpます。
レゴシア

2
@Name:のdocstringはsyntax-ppssを指しparse-partial-sexp、後者はこれらの関数によって返されるすべてのものの説明を提供します。うまくいけば、それがスタートに役立つでしょう。
ダン

1
Emacs Lispマニュアルのセクション34.6「式の解析」も参照してください。
スーD.ニンム

7

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年間使用しています。それに、フライスペルは長い間広く使われていることを考えると、この方法は信頼できると言えるでしょう。

同様の質問については、文字列から移動するために使用するキーボードショートカットを参照してください。


1
編集では、POS引数を使用せずにを使用する別のバージョンが提案されましたpoint。このようなバージョンを2つ使用するよりも、argをPOSオプションにし(point)、whenに設定することをお勧めしますnil
ドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.