`syntax-ppss`はどの言語に適していますか?


12

現在のバッファがどのようにフォント化されているかを調べることにより、ポイントがコメント上にあるかどうかを検出する方法を検討しています。

Smartparensはsp-point-in-comment、に依存しsyntax-ppssます。しかし、ようだsyntax-ppssparse-partial-sexp、彼らはS式を使用していない場合でも、任意の言語のために使用することができます。

たとえば、このPython:

x = 1
# I'm a comment
y = 2

コメント内にポイントを配置して評価(if (nth 4 (syntax-ppss)) 'comment 'not-comment)することは正しく機能します。

syntax-ppss任意のプログラミングモードのために仕事を?docstringsがs-expressionsを議論するのはなぜですか?


1
これを徹底的に検討したわけではありませんが、機能しない言語をまだ見つけていません。ラテックスなどのテキスト派生モードでも、私にとってはうまく機能しました。
マラバルバ14年

回答:


13

さて、s式は本質的に「抽象構文」であり、抽象構文ツリーの単なる具体的な構文であるため、どの言語もs式として表現でき、s式コマンドで操作できます。したがって、syntax-ppss「Sexps」といえば、単に抽象構文木について話すLispの方法です。

ただし、実際には、syntax-ppssどのモードでも一般的に機能しません。基本的にはLispのような言語を対象としているため、言語の具体的な言語がSexpsから大きく逸脱している場合、Sexpコマンドを使用して言語を操作することはあまり意味がありません。それは機能しますが、抽象的な表現と具体的な構文の間にあまりにも大きなギャップがあり、ほとんどのコマンドが直観に反します。

ただし、基盤となるインフラストラクチャの一部syntax-ppssはかなり汎用的です。メジャーモードは、多くの組み込みEmacsの機能とうまく機能し、Smartparensなどの他のサードパーティパッケージ用の汎用インターフェイスを提供するため、通常はプラグインに一生懸命に試みます。

特に、文字列とコメントの構文テーブルsyntax-ppss依存しています。構文テーブルは、構文クラスごとに個々の文字を分類します。ペアの区切り文字、文字列区切り文字、コメント文字のクラスがあります。

文字列とコメントの構造は、ほとんどすべてのプログラミング言語でかなり似ています。通常、文字列は特別な区切り文字で囲まれています。コメントには特別な区切り文字を含めることも、特定の文字で始まり行末まで拡張することもできます。これらの構造は構文テーブルに簡単に取り込むことができ、Emacsの構文強化から利益を得るためだけに、ほとんどすべての主要なモードが適切な構文テーブルを定義します。

したがって、syntax-ppssほぼすべての言語の文字列とコメントに対して適切に機能しますが、他の機能のサポートと「有用性」は異なります。


4

@lunaryornの答えに加えて、syntax-ppssは、ほとんどの言語でコメントと文字列に対して機能するemacsの構文テーブルシステムの堅牢性に依存していると思います。しかし、言語に構文テーブルがキャプチャできない構文があり、モードが構文プロパティを適切な場所に追加するパーサーを構築しなかった場合、syntax-ppss失敗します。

でこれを試してくださいhtml-mode

<p class="aa" id='bb'>"cc" 'dd'</p>

そして、次のコマンドを呼び出します。

(defun inside-string-p (&optional pos)
  "Return non-nil if inside string, else nil.
This depends on major mode having setup syntax table properly."
  (interactive)
  (let ((result (nth 3 (syntax-ppss pos))))
    (print result)
    result))

aaのみが真ですが、bbも真でなければなりません。

の場合nxml-mode、いずれもtrueを返しませんが、少なくともaaはtrueでなければなりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.