一致したペア内にあるかどうかを検出する方法は?


16

Q:ポイントが文字の一致ペア内にあるかどうかを検出する一般的な方法はありますか?

つまり、ポイントが一致したペアまたは任意に選択された文字の間にあるかどうかを判断できる一般的な述語関数(または何か)はありますか?ポイントt!参照して、たとえば次のシナリオで評価するものについて考えています:

"!"   (quotes in general)
``!'' (LaTeX quotes)
$!$   (LaTeX math)
(!)   (lisp parens)
*!*   (org emphasis)

編集syntax-ppss良い出発点のようですが、どのように複数文字の一致するペア(たとえば、「LaTeX引用符」、さらにはmatched <b>html tags</b>)にそれを適応させるかは明確ではありません。一般的な解決策があるのか​​、それとも専用のパーサーが必要なのか疑問に思っています。

回答:


16

syntax-ppssここで役立つかもしれません。それはリストを返すも、これらの要素があります。

  • 要素0:括弧の深さ
  • 要素3:文字列内にある場合は非nil

次のように使用できます。

(or (> (nth 0 (syntax-ppss)) 0)
    (nth 3 (syntax-ppss)))

バッファに構文テーブルを適切に設定すると(文字列と一致する括弧の場合)、関数は期待どおりに動作するはずです。モードの構文テーブルを使用できない場合は、を使用することに頼ることができますwith-syntax-table


のdocstring parse-partial-sexpは、返されたデータ構造をsyntax-ppss、私がリンクしているElispのマニュアルセクションよりも詳細に説明していることを指摘する必要があります。
パプリカ14年

2

たとえば、中括弧の間にあるかどうかを確認したい場合は、これを使用します:

(and (looking-back "{") (looking-at "}"))

もちろん、中かっこを好きなものに置き換えることができます。

編集:

より便利な関数は、これに近いものです:

(defun test-inside-curly-braces ()
 (interactive)
 (when (and (looking-back "{\\(.*?\\)") (looking-at "\\(.*?\\)}"))
  (message "inside curly braces")))

2
ポイントがクロージング}にあり、の間に何もない場合にのみ機能し{}ます。正規表現とペアの区切り文字を正しく取得するのは難しい場合があります。syntax-pps@paprikaが提案したように使用する方が良い。
タイラー14年

@Tylerは、決算上のポイントは場合にのみ機能します}\しかし、ええ、ペアは正規表現を使用して取得することは確かに、注意が必要です:私が見た動作ではありません
Nsukami _

looking-atポイントから始まるテキストを調べます。}上記の最初のステートメントにポイントがない限り、動作しませんか?Emacsのバージョン間の違いかもしれません。:/
タイラー14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.