プログラムでバッファをナビゲートするための、言語にとらわれない優れた抽象化は、sexp と構文テーブルです。モードの構文テーブルが適切に構築されている場合は、 と を使用して移動できforward-sexp
ますscan-sexps
。これらがうまくいかない場合にのみ正規表現を使用し、最終的に持っている場合はそれらによって提供された値を使用することをお勧めします(その引数re-search-forward
を参照してください)。BOUND
またsyntax-ppss
、コメントまたは文字列リテラル内にあるかどうかを簡単に識別したり、文字エスケープの状況に対処したりするために使用します。Emacs Lisp info ノードの構文表を参照してください。
(syntax-ppss)
確かに、すべてがリストであり、「深さは何レベルですか?」などの質問を簡単に行うことができるため、sexp はおそらく Lisp のインデントにうまく機能し(point)
ます。Ruby のようなブロック区切り文字を使用するbegin
とend
、クレイジーな正規表現の領域に入ります。
したがって(syntax-ppss)
、他の言語でのような良さを得るには、そのためだけにパーサーを作成する必要があります。たとえばruby-mode
、パーサーを実装し、nxml-mode
これの信じられないほどの例を見てください。
with-syntax-table
また、バッファを一時的に別の視点から見ることができるため、多くのことができることに注意してください。インデントではありませんが、http://github.com/joaotavora/autopairのこの例を検討してください。これにより、一部の括弧タイプを無視できます
(defvar autopair-empty-syntax-table
(let ((empty (make-syntax-table)))
(dotimes (char 256)
(let ((syntax-entry (aref empty char)))
(when (and (consp syntax-entry)
(or (eq (car (string-to-syntax "("))
(car syntax-entry))
(eq (car (string-to-syntax ")"))
(car syntax-entry))))
(modify-syntax-entry char "w" empty))))
empty)
"A syntax table no \"(\" or \")\" syntaxes")
(defun autopair-just-for-delim-syntax-table (delim)
"A syntax table that has \"parenthesis\" syntax just for DELIM."
(let* ((syntax-entry (aref (syntax-table) delim))
(other-syntax-entry (and syntax-entry
(cdr syntax-entry)
(aref (syntax-table) (cdr syntax-entry)))))
(when (consp other-syntax-entry)
(let ((retval (make-syntax-table autopair-empty-syntax-table)))
(aset retval delim syntax-entry)
(aset retval (cdr syntax-entry) other-syntax-entry)
retval))))
[]
さて、混合された,()
と状況のバッファーでは、後者が のみをカウントする場所でor{}
を要求するのはまったく異なります。どの言語をインデントしようとしているかはわかりませんが、これは、たとえば C ブロックをインデントするための適切な作業を行うのに役立ちます。(syntax-ppss)
(with-syntax-table (autopair-just-for-delim-syntax-table ?{ ) (syntax-ppss))
{}