Emacs当中什么东西决定了word, list, sexp这些东西在一种语法下的定义呢?

比方说bounds-of-thing-at-point之类会接受一个叫thing的参数,这个thing在不同语言中的定义是什么样实现的?

THING 是一个有 'end-op'beginning-op property 分別都是个 function 的 symbol。

;;  Buffer

(put 'buffer 'end-op (lambda () (goto-char (point-max))))
(put 'buffer 'beginning-op (lambda () (goto-char (point-min))))

这玩意本身不是编程语言敏感的。想要编程语言敏感那就在 'end-op'beginning-op 里写判斷当前 major mode 的好了

m-x info c-s elisp 回车

c-s syntax-table

thingatpt 也就是在 lisp 类的模式中还能用,其他模式不太准确,可能要等到《 tree-sitter:编辑器语法树的未来? 》实现之后。

也就是说这个东西是每个buffer独立的吗?

嗯,就是遇到了在js2-mode里面list的判断不太对,我自己的模式依赖这些东西,所以想针对一些具体的模式调整一下。

否定的。这个东西是全局都是同一个设置的。

原来如此,非常感谢!

还没有完全搞明白,在看为什么js2-mode里面,() 这样的东西不会被当作是一个list。

在官方定案前,你可以先行体验一下这个 tree-sitter 动态模块 elisp-tree-sitter/README.md at master · emacs-tree-sitter/elisp-tree-sitter · GitHub

这个tree-sitter支持的语言好少。

⋊> ls ~/.tree-sitter/bin/
agda.so       css.so        javascript.so php.so        swift.so
bash.so       fluent.so     jsdoc.so      python.so     tsx.so
c.so          go.so         json.so       ruby.so       typescript.so
c_sharp.so    html.so       julia.so      rust.so
cpp.so        java.so       ocaml.so      scala.so

Lisp系的都没有…

lisp系直接用自带的forward-sexp就行