Skip to content

Semantic Tokens [简体中文版]

Andy Stewart edited this page May 2, 2024 · 1 revision

语义符号高亮

Emacs 中符号的高亮基于 treesit ,但是 treesit 无法高亮一些语义符号,比如 C 或者 C++ 中的宏定义:

image

所以 lsp-bridge 提供 lsp-bridge-semantic-tokens-mode ,指定 Emacs 高亮一些特殊语义符号,下图是启用后的效果:

image

自定义符号显示

在 lsp 协议中,语义符号由类型和修饰组成,比如全局变量,它的类型是变量,修饰是全局作用域,某些语义符号没有修饰,比如注释类型。

lsp-bridge-semantic-tokens-mode 提供三个变量控制高亮哪些语义符号:

  1. lsp-bridge-semantic-tokens-type-faces: 符号类型对应的 face
  2. lsp-bridge-semantic-tokens-type-modifier-faces: 符号修饰对应的 face
  3. lsp-bridge-semantic-tokens-ignore-modifier-limit-types: 符号定义了类型的 face 和修饰的 face 才能够高亮,将类型加到这个变量中能够忽略符号修饰的检查

比如高亮全局变量需要在 lsp-bridge-mode 启动前做如下的设置

(defface lsp-bridge-semantic-tokens-variable-face
  '((t (:inherit font-lock-variable-name-face)))
  "Face used for variable name."
  :group 'lsp-bridge-semantic-tokens)

(defface lsp-bridge-semantic-tokens-global-scope-face
  '((t :weight extra-bold))
  "Face used for globalScope token."
  :group 'lsp-bridge-semantic-tokens)

(setq-default lsp-bridge-semantic-tokens-type-faces
    [("variable" . lsp-bridge-semantic-tokens-variable-face)])

(setq-default lsp-bridge-semantic-tokens-type-modifier-faces
    [("globalScope" . lsp-bridge-semantic-tokens-global-scope-face)])

(setq-default lsp-bridge-semantic-tokens-ignore-modifier-limit-types [])

如果想要高亮所有变量,不管它是全局变量还是本地变量,可以将 variable 类型加入到 lsp-bridge-semantic-tokens-ignore-modifier-limit-types 中,忽略掉修饰的检查

(setq-default lsp-bridge-semantic-tokens-ignore-modifier-limit-types ["variable"])