31.2.6 移动遍历平衡表达式

以下是若干与平衡括号表达式相关的函数(在 Emacs 中移动遍历这类表达式时也称作 符号表达式(sexps))。语法表控制这些函数如何解释各类字符;详见 语法表。See 表达式解析 章节介绍用于扫描符号表达式或其片段的底层原语。用户级命令请参考 Commands for Editing with Parentheses in The GNU Emacs Manual

Command: forward-list &optional arg

该函数向前移动越过 arg 组(默认为 1)平衡括号。(单词、成对字符串引号等其他语法单元会被忽略。)

Command: backward-list &optional arg

该函数向后移动越过 arg 组(默认为 1)平衡括号。(单词、成对字符串引号等其他语法单元会被忽略。)

Command: up-list &optional arg escape-strings no-syntax-crossing

该函数向前退出 arg 层(默认为 1)括号。参数为负表示向后移动,但仍移至更浅的层级。若 escape-stringsnil(交互调用时即为真),则同时退出外层字符串。若 no-syntax-crossingnil(交互调用时即为真),则优先退出包裹的字符串,而非移至跨多个字符串的列表开头。出错时点的位置未定义。

Command: backward-up-list &optional arg escape-strings no-syntax-crossing

该函数与 up-list 完全相同,仅参数取反。

Command: down-list &optional arg

该函数向前进入 arg 层(默认为 1)括号。参数为负表示向后移动,但仍向括号更深处进入(−arg 层)。

Command: forward-sexp &optional arg

该函数向前移动越过 arg 个(默认为 1)平衡表达式。平衡表达式既包括括号界定的表达式,也包括单词、字符串常量等其他类型。 See 表达式解析。示例如下:

---------- Buffer: foo ----------
(concat∗ "foo " (car x) y z)
---------- Buffer: foo ----------

(forward-sexp 3)
     ⇒ nil

---------- Buffer: foo ----------
(concat "foo " (car x) y∗ z)
---------- Buffer: foo ----------

若变量 forward-sexp-function 的值非 nilforward-sexp 会调用该函数完成实际工作,并将自身接收的参数原样传递给它。主模式可根据自身需要定义专属的平衡表达式移动函数,并将此变量设为该函数。

Command: backward-sexp &optional arg

该函数向后移动越过 arg 个(默认为 1)平衡表达式。

Command: beginning-of-defun &optional arg

该函数回退至第 arg 个函数定义开头。若 arg 为负,则实际向前移动,但仍移至函数定义开头而非结尾。arg 默认为 1。

Command: end-of-defun &optional arg

该函数向前移至第 arg 个函数定义结尾。若 arg 为负,则实际向后移动,但仍移至函数定义结尾而非开头。arg 默认为 1。

User Option: defun-prompt-regexp

若非 nil,该缓冲区局部变量保存一个正则表达式,用于指定函数定义开头左括号之前可出现的文本。也就是说,函数定义起始于匹配该正则表达式、后跟左括号语法字符的行首。

User Option: open-paren-in-column-0-is-defun-start

若该变量值非 nil,第 0 列出现的左括号将被视为函数定义开头。若为 nil,第 0 列的左括号无特殊含义。默认值为 t。若字符串字面量恰好在第 0 列有括号,可用反斜杠转义以避免误判。

Variable: beginning-of-defun-function

若非 nil,该变量保存一个用于查找函数定义开头的函数。函数 beginning-of-defun 会调用该函数而非使用默认方法,并将可选参数传递给它。若参数非 nil,该函数应按指定次数回退至上一个函数,行为与 beginning-of-defun 一致。

Variable: end-of-defun-function

若非 nil,该变量保存一个用于查找函数定义结尾的函数。函数 end-of-defun 会调用该函数而非使用默认方法。

若 Emacs 编译时包含 tree-sitter 支持,便可利用 tree-sitter 解析信息在语法结构间移动。由于不同语言对“函数定义”的界定不同,主模式应设置 treesit-defun-type-regexp 进行指定。之后模式可直接使用 treesit-beginning-of-defuntreesit-end-of-defun 获得按函数定义导航的能力。

Variable: treesit-defun-type-regexp

该变量决定 Emacs 将哪些节点视为函数定义。它可以是一个匹配函数定义节点类型的正则表达式。(关于“节点”与“节点类型”,参见 see 解析程序源代码。)

例如,python-mode 将此变量设为可匹配 ‘function_definition’ 或 ‘class_definition’ 的正则表达式。

有时正则匹配到的节点并非全部为有效函数定义。因此该变量也可设为形如 (regexp . pred) 的 cons 单元,其中 pred 为一个函数,接收节点作为参数,节点有效时返回非 nil,无效时返回 nil

Variable: treesit-defun-tactic

该变量决定 Emacs 如何处理嵌套函数定义。若值为 top-level,导航函数仅遍历顶层函数定义。若值为 nested,则识别嵌套函数定义。

变量 forward-sentence-function 的值决定如何移动遍历称作 语句(sentences)的语法结构。主模式可为此变量指定自定义函数,以定制 forward-sentence 命令的行为。若 Emacs 编译时包含 tree-sitter 支持,便可利用其解析信息在语法结构间移动。由于不同语言对“语句”的界定不同,主模式应设置 treesit-thing-settings 进行指定。之后 forward-sentence-function 会被设为 treesit-forward-sentence,模式即可直接使用 forward-sentencebackward-sentence 获得按语句导航的能力(see Moving by Sentences in The extensible self-documenting text editor)。

若 Emacs 编译时包含 tree-sitter 支持,便可利用其解析信息在语法结构间移动。由于不同语言对“符号表达式”的界定不同,主模式应设置 treesit-thing-settings 进行指定。之后 forward-sexp-function 会被设为 treesit-forward-sexp,模式即可直接使用 forward-sexpbackward-sexp 获得按符号表达式导航的能力(see Expressions in The extensible self-documenting text editor)。