かっこだけでなく、キーワードで定義されたブロックをforward-sexpに認識させる


10

以下のようなキーワードで定義されたブロックを持った言語(ジュリア)でfor..endbegin..endだけでなく、カッコが、そのようなブロックをスキップする良い方法は何ですか?また、endblockキーワードだけでなく、他の場所で使用される有効な識別子でもあります。

1つの方法は、ブロックの開始/終了の正規表現を探し、すべての文字列、コメント、endsなどをスキップすることですが、これは多少効率が悪く、少し見苦しいです。

emacs独自の構文解析でこのようなブロックキーワードを認識させる方法はありますか?forward/backward-sexpそうすれば、自動的に機能し、現在のブロックの開始を、たとえばの出力からすばやく知ることができsyntax-ppssますか?

[注:ファイルを自分で解析してもかまいませんが、その場合でも、パーサーを残りのemacsに接続する方法を知りたいと思います。]


1
あなたはruby-modeルビに似た何かをすることを見ることができます。別のオプションはsmartparensにフックすることです。これは開始点として使用できるルビーモード用の特別な構成を持っています
Iqbal Ansari

回答:


9

組み込みライブラリSMIE(Simple-Minded Indentation Engineの略)をご覧ください。名前にもかかわらず、インデントはそれが提供する機能の1つにすぎません。これは、ruby-modesexpの動きとインデントを提供するために、多くのモード(コメントで言及されているを含む)で使用される方法です。

言語用のSMIEの展開は、おおよそ2つのステップの仕事です。

  • レクサー識別トークンとともに、言語の文法を定義します。
  • インデントルールを定義します。

あなたの目的のために、最初のステップだけが必要になります!

全体として、このように定義されたパーサーはemacsにうまくプラグインします。たとえばshow-parens、SMIE文法で定義された括弧のような式を強調表示します(少なくとも最近の十分なバージョンのemacsでは)。

syntax-ppss構文テーブルパーサーの結果しか得られないため、囲んでいる環境に関する情報を取得することはできません。しかし、sexpの移動関数(たとえば、がup-list後に続くbackward-sexp)は、代わりに使用できます。


2

このためのライブラリを作成しました

いったん定義されると、前方、後方、コピーなど、一連のコマンドが使用可能になります。

疑似コードでの定義:

(put 'MY-FORM 'beginning-op-at
           (lambda () MY-FORWARD-MOVE-CODE))

(put 'MY-FORM 'end-op-at
     (lambda () MY-BACKWARD-MOVE-CODE))

完了すると、使用可能になります。つまり、このようにコピーして返されます。

(defun MY-FORM-atpt (&optional arg)
  " "
  (interactive "p")
  (ar-th 'MY-FORM arg))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.