Treesitter

Nvim 的 :help 頁面, 原始碼 使用 tree-sitter-vimdoc 解析器產生


Treesitter 整合
Nvim 整合了 tree-sitter 程式庫,用於緩衝區的增量解析:https://tree-sitter.github.io/tree-sitter/
警告: Treesitter 的支援仍處於實驗階段,可能會頻繁變更。此文件可能也無法完全反映最新的變更。

解析器檔案 treesitter-parsers

解析器是 treesitter 的核心。它們是 treesitter 將在 parser 執行時目錄中搜尋的程式庫。
Nvim 包含了這些解析器
C
Lua
Markdown
Vimscript
Vimdoc
Treesitter 查詢檔案 ft-query-plugin
您可以手動安裝更多解析器,或是使用像 https://github.com/nvim-treesitter/nvim-treesitter 這樣的插件。
解析器會在任何 'runtimepath' 目錄中搜尋為 parser/{lang}.*。如果找到同一語言的多個解析器,則會使用第一個找到的。(注意:這通常意味著優先順序為「使用者設定 > 插件 > 捆綁」)。
要從其檔案路徑載入解析器
vim.treesitter.language.add('python', { path = "/path/to/python.so" })
如果檔案系統區分大小寫,則假設解析器名稱為小寫。
若要將某些 檔案類型 與 treesitter 語言(解析器名稱)關聯,請使用 vim.treesitter.language.register()。例如,若要對檔案類型為 svgxslt 的緩衝區使用 xml treesitter 解析器,請使用
vim.treesitter.language.register('xml', { 'svg', 'xslt' })
如果 Nvim 是使用 ENABLE_WASMTIME 建置的,則也可以載入 wasm 解析器
vim.treesitter.language.add('python', { path = "/path/to/python.wasm" })

TREESITTER 查詢 treesitter-query

Treesitter 查詢是一種提取已解析 TSTree 資訊的方式,例如,用於高亮顯示。簡而言之,query 由一個或多個模式組成。pattern 是在語法樹中的節點類型上定義的。match 對應於語法樹中與模式匹配的特定元素。模式可以選擇性地定義捕獲和謂詞。capture 允許您將名稱與模式中的特定節點關聯。predicate 為匹配添加任意元數據和條件資料。
查詢是以類似 lisp 的語言編寫的,文件位於 https://tree-sitter.github.io/tree-sitter/using-parsers#query-syntax 注意:該頁面列出的謂詞與 Nvim 支援的謂詞不同。有關 Nvim 支援的謂詞完整列表,請參閱 treesitter-predicates
Nvim 在 runtimepath 下的 queries 目錄中搜尋 *.scm 檔案中的查詢,其中每個檔案都包含特定語言和用途的查詢,例如,queries/lua/highlights.scm 用於高亮顯示 Lua 檔案。預設情況下,會使用 runtimepath 上的第一個查詢(這通常表示使用者設定優先於插件,而插件優先於 Nvim 捆綁的查詢)。如果查詢應擴展其他查詢而不是取代它們,請使用 treesitter-query-modeline-extends
有關從 Lua 使用 treesitter 查詢的可用方法列表,請參閱 lua-treesitter-query

TREESITTER 查詢謂詞 treesitter-predicates

謂詞是特殊的 scheme 節點,會被評估以有條件地捕獲節點。例如,可以如下使用 eq? 謂詞
((identifier) @variable.builtin
  (#eq? @variable.builtin "self"))
僅匹配對應於 "self" 文字的識別碼。例如,可以使用此類查詢來以不同的方式高亮顯示內建函式或變數。
內建了以下謂詞
eq? treesitter-predicate-eq?
將字串與對應於節點的文字進行比對
((identifier) @variable.builtin (#eq? @variable.builtin "self"))
((node1) @left (node2) @right (#eq? @left @right))
any-eq? treesitter-predicate-any-eq?
eq? 類似,但對於量化模式,只有一個捕獲的節點必須匹配。
match? treesitter-predicate-match?
vim-match? treesitter-predicate-vim-match?
regexp 與對應於節點的文字進行比對
((identifier) @constant (#match? @constant "^[A-Z_]+$"))
注意: ^$ 定位點會比對節點文字的開頭和結尾。
any-match? treesitter-predicate-any-match?
any-vim-match? treesitter-predicate-any-vim-match?
match? 類似,但對於量化模式,只有一個捕獲的節點必須匹配。
lua-match? treesitter-predicate-lua-match?
lua-patterns 與對應於節點的文字進行比對,與 match? 類似
any-lua-match? treesitter-predicate-any-lua-match?
lua-match? 類似,但對於量化模式,只有一個捕獲的節點必須匹配。
contains? treesitter-predicate-contains?
將字串與對應於節點的部分文字進行比對
((identifier) @foo (#contains? @foo "foo"))
((identifier) @foo-bar (#contains? @foo-bar "foo" "bar"))
any-contains? treesitter-predicate-any-contains?
contains? 類似,但對於量化模式,只有一個捕獲的節點必須匹配。
any-of? treesitter-predicate-any-of?
將任何給定的字串與對應於節點的文字進行比對
((identifier) @foo (#any-of? @foo "foo" "bar"))
這是建議檢查節點是否與多個關鍵字之一匹配的方法,因為它已針對此進行最佳化。
has-ancestor? treesitter-predicate-has-ancestor?
將任何給定的節點類型與節點的所有祖先進行比對
((identifier) @variable.builtin
  (#any-of? @variable.builtin "begin" "end")
  (#has-ancestor? @variable.builtin range_expression))
has-parent? treesitter-predicate-has-parent?
將任何給定的節點類型與節點的直接祖先進行比對
(((field_expression
     (field_identifier) @method)) @_parent
 (#has-parent? @_parent template_method function_declarator))
lua-treesitter-not-predicate
每個謂詞都有一個以 not- 為首碼的謂詞,它只是該謂詞的否定。
lua-treesitter-all-predicate
lua-treesitter-any-predicate
查詢可以使用量詞來捕獲多個節點。當捕獲包含多個節點時,只有當捕獲所包含的「所有」節點都符合謂詞時,謂詞才會匹配。某些謂詞 (eq?match?lua-match?contains?) 接受 any- 首碼,以便在捕獲所包含的「任何」節點與謂詞匹配時進行匹配。
例如,考慮以下 Lua 程式碼
-- TODO: This is a
-- very long
-- comment (just imagine it)
使用以下預測查詢
(((comment)+ @comment)
 (#match? @comment "TODO"))
此查詢不會匹配,因為 @comment 捕獲的所有節點都不符合謂詞。請改為使用
(((comment)+ @comment)
 (#any-match? @comment "TODO"))
可以透過 vim.treesitter.query.add_predicate() 添加更多謂詞。使用 vim.treesitter.query.list_predicates() 列出所有可用的謂詞。

TREESITTER 查詢指令 treesitter-directives

Treesitter 指令儲存節點或匹配的元數據並執行副作用。例如,set! 指令會在匹配或節點上設定元數據
((identifier) @foo (#set! type "parameter"))
內建了以下指令
set! treesitter-directive-set!
為特定匹配或捕獲設定鍵/值元數據。值可以作為 metadata[key](特定於匹配)或 metadata[capture_id][key](特定於捕獲)存取。
參數
{capture_id} (選用) {key} {value}
範例
((identifier) @foo (#set! @foo kind "parameter"))
((node1) @left (node2) @right (#set! type "pair"))
((codeblock) @markup.raw.block (#set! priority 90))
offset! treesitter-directive-offset!
取得捕獲節點的範圍並套用偏移。這將以清單的形式設定新的範圍,如 { {start_row}{start_col}{end_row}{end_col} },用於將 capture_id 作為 metadata[capture_id].range 的捕獲節點。適用於 treesitter-language-injections
參數
{capture_id} {start_row} {start_col} {end_row} {end_col}
範例
((identifier) @constant (#offset! @constant 0 1 0 -1))
gsub! treesitter-directive-gsub!
使用 lua-pattern 轉換節點的內容。這將設定新的 metadata[capture_id].text
參數
{capture_id} {pattern} {replacement}
範例
(#gsub! @_node ".*%.(.*)" "%1")
trim! treesitter-directive-trim!
從節點末尾修剪空白行。這將設定新的 metadata[capture_id].range
參數
{capture_id}
範例
(#trim! @fold)
可以透過 vim.treesitter.query.add_directive() 添加更多指令。使用 vim.treesitter.query.list_directives() 列出所有可用的指令。

TREESITTER 查詢模式行 treesitter-query-modeline

Nvim 支援使用一組「模式行」來自訂查詢的行為,也就是說,查詢中以 ; 開頭的註解。以下是目前支援的模式行替代方案
inherits: {lang}... treesitter-query-modeline-inherits
指定此查詢應繼承來自 {lang} 的查詢。除非包含在括弧中:({lang}),否則這會在 {lang} 的查詢中遞迴下降。注意:這旨在用於包含來自另一種語言的查詢。如果您希望您的查詢擴展同一語言的查詢,請使用 extends
extends treesitter-query-modeline-extends
指定此查詢應作為查詢的擴展使用,也就是說,應將其與其他查詢合併。注意:擴展的順序以及將用作基礎的查詢取決於您的 'runtimepath' 值。
注意:這些模式行註解必須位於查詢的頂部,但可以重複,例如,以下兩個模式行區塊都是有效的
;; inherits: typescript,jsx
;; extends
;; extends
;;
;; inherits: css

TREESITTER 語法高亮顯示 treesitter-highlight

語法高亮顯示是透過名為 highlights.scm 的查詢指定的,該查詢會將已解析 TSTree 中的 TSNode 比對到可以分配高亮顯示群組的 capture。例如,查詢
(parameters (identifier) @variable.parameter)
將函式 parameters 節點內的任何 identifier 節點比對到名為 @variable.parameter 的捕獲。例如,對於 Lua 程式碼
function f(foo, bar) end
將被解析為(請參閱 :InspectTree
(function_declaration ; [1:1 - 24]
  name: (identifier) ; [1:10 - 10]
  parameters: (parameters ; [1:11 - 20]
    name: (identifier) ; [1:12 - 14]
    name: (identifier))) ; [1:17 - 19]
上述查詢將 foobar 高亮顯示為 @variable.parameter
也可以比對文字運算式(前提是解析器會傳回它們)
[
  "if"
  "else"
] @keyword.conditional
假設在 runtimepath 中找到合適的解析器和 highlights.scm 查詢,只需透過 vim.treesitter.start() 即可啟用目前緩衝區的 treesitter 高亮顯示。
treesitter-highlight-groups
@ 為首碼的捕獲名稱可以直接用作高亮顯示群組。對於許多常用的捕獲,預設情況下,對應的高亮顯示群組會連結到 Nvim 的標準 高亮顯示群組 (例如,@comment 連結到 Comment),但可以在配色方案中覆寫。
已實作備用系統,讓更特定的群組能回退到更通用的群組。例如,在有獨立文件註解的語言(例如,c、java 等)中,可以使用 @comment.documentation。如果未定義此群組,則會使用一般 @comment 的醒目提示。這樣,現有的色彩配置就可以直接使用,但可以為查詢新增更具體的變體,使其可用。
另一個規則是,可以透過在後面加上語言名稱(用額外的點分隔)來將擷取的醒目提示依語言客製化。例如,若要針對不同語言以不同方式醒目提示註解
hi @comment.c guifg=Blue
hi @comment.lua guifg=DarkBlue
hi link @comment.documentation.java String
以下是在 Nvim 查詢中使用的標準擷取清單,根據目前的色彩配置醒目提示(在其中一個上使用 :Inspect 查看確切的定義)
@variable 各種變數名稱 @variable.builtin 內建變數名稱(例如 thisself)@variable.parameter 函式的參數 @variable.parameter.builtin 特殊參數(例如 _it)@variable.member 物件和結構體欄位
@constant 常數識別符號 @constant.builtin 內建常數值 @constant.macro 預處理器定義的常數
@module 模組或命名空間 @module.builtin 內建模組或命名空間 @label GOTO 和其他標籤(例如 C 中的 label:),包括 here 文檔標籤
@string 字串字面值 @string.documentation 描述程式碼的字串(例如 Python 文件字串)@string.regexp 正規表示式 @string.escape 跳脫序列 @string.special 其他特殊字串(例如日期)@string.special.symbol 符號或原子 @string.special.path 檔案名稱 @string.special.url URI(例如超連結)
@character 字元字面值 @character.special 特殊字元(例如萬用字元)
@boolean 布林字面值 @number 數值字面值 @number.float 浮點數字面值
@type 類型或類別定義和註釋 @type.builtin 內建類型 @type.definition 類型定義中的識別符號(例如 C 中的 typedef <type> <identifier>
@attribute 屬性註釋(例如 Python 修飾詞、Rust 生存期)@attribute.builtin 內建註釋(例如 Python 中的 @property)@property 鍵值對中的鍵
@function 函式定義 @function.builtin 內建函式 @function.call 函式呼叫 @function.macro 預處理器巨集
@function.method 方法定義 @function.method.call 方法呼叫
@constructor 建構函式呼叫和定義 @operator 符號運算子(例如 +*
@keyword 不屬於特定類別的關鍵字 @keyword.coroutine 與協程相關的關鍵字(例如 Go 中的 go、Python 中的 async/await)@keyword.function 定義函式的關鍵字(例如 Go 中的 func、Python 中的 def)@keyword.operator 作為英文單字的運算子(例如 andor)@keyword.import 用於包含或匯出模組的關鍵字(例如 Python 中的 importfrom)@keyword.type 描述命名空間和複合類型的關鍵字(例如 structenum)@keyword.modifier 修改其他結構的關鍵字(例如 conststaticpublic)@keyword.repeat 與迴圈相關的關鍵字(例如 forwhile)@keyword.return 類似 returnyield 的關鍵字 @keyword.debug 與除錯相關的關鍵字 @keyword.exception 與例外相關的關鍵字(例如 throwcatch
@keyword.conditional 與條件式相關的關鍵字(例如 ifelse)@keyword.conditional.ternary 三元運算子(例如 ?:
@keyword.directive 各種預處理器指示詞和 shebang @keyword.directive.define 預處理器定義指示詞
@punctuation.delimiter 分隔符號(例如 ;.,)@punctuation.bracket 括號(例如 (){}[])@punctuation.special 特殊符號(例如字串內插中的 {}
@comment 行和區塊註解 @comment.documentation 描述程式碼的註解
@comment.error 錯誤類型註解(例如 ERRORFIXMEDEPRECATED)@comment.warning 警告類型註解(例如 WARNINGFIXHACK)@comment.todo todo 類型註解(例如 TODOWIP)@comment.note 筆記類型註解(例如 NOTEINFOXXX
@markup.strong 粗體文字 @markup.italic 斜體文字 @markup.strikethrough 刪除線文字 @markup.underline 底線文字(僅限於文字底線標記!)
@markup.heading 標題(包括標記)@markup.heading.1 最上層標題 @markup.heading.2 節標題 @markup.heading.3 小節標題 @markup.heading.4 依此類推 @markup.heading.5 依此類推 @markup.heading.6 六個層級應該足夠所有人使用
@markup.quote 區塊引述 @markup.math 數學環境(例如 LaTeX 中的 $ ... $
@markup.link 文字參考、註腳、引文等 @markup.link.label 連結、參考描述 @markup.link.url URL 樣式的連結
@markup.raw 文字或逐字文字(例如內嵌程式碼)@markup.raw.block 作為獨立區塊的文字或逐字文字
@markup.list 清單標記 @markup.list.checked 已勾選的 todo 樣式清單標記 @markup.list.unchecked 未勾選的 todo 樣式清單標記
@diff.plus 新增的文字(適用於 diff 檔案)@diff.minus 刪除的文字(適用於 diff 檔案)@diff.delta 變更的文字(適用於 diff 檔案)
@tag XML 樣式標籤名稱(例如 XML、HTML 等)@tag.builtin 內建標籤名稱(例如 HTML5 標籤)@tag.attribute XML 樣式標籤屬性 @tag.delimiter XML 樣式標籤分隔符號
treesitter-highlight-spell
特殊的 @spell 擷取可用於指示 Nvim 的內建 拼字檢查程式應該檢查節點的拼字。例如,下列擷取會將註解標記為要檢查的內容
(comment) @spell
還有 @nospell,它會停用具有 @spell 的區域的拼字檢查。
treesitter-highlight-conceal
Treesitter 醒目提示透過 conceal 中繼資料支援 隱藏。依照慣例,要隱藏的節點會擷取為 @conceal,但可以使用任何擷取。例如,可以使用以下查詢來隱藏 Markdown 中的程式碼區塊分隔符號
(fenced_code_block_delimiter @conceal (#set! conceal ""))
也可以用單一字元取代節點,這與舊版語法不同,可以提供自訂的醒目提示。例如,以下(不明智的)查詢會以 Unicode 字形取代 != 運算子,該字形仍然以與其他運算子相同的方式醒目提示
"!=" @operator (#set! conceal "≠")
以這種方式指定的隱藏會遵守 'conceallevel'
treesitter-highlight-priority
Treesitter 使用 nvim_buf_set_extmark() 來設定醒目提示,預設優先順序為 100。這讓外掛程式可以設定比 treesitter 更低或更高的醒目提示優先順序。也可以透過設定其 "priority" 中繼資料屬性來手動變更個別查詢模式的優先順序
((super_important_node) @superimportant (#set! priority 105))

TREESITTER 語言注入 treesitter-language-injections

某些原始程式碼檔案包含以多種不同語言撰寫的程式碼。範例包括
HTML 檔案,其中可能包含 <script> 標籤內的 JavaScript 和 <style> 標籤內的 CSS
ERB 檔案,其中包含 <% %> 標籤內的 Ruby,以及這些標籤外的 HTML
PHP 檔案,其中可能包含 <php 標籤之間的 HTML
JavaScript 檔案,其中包含 regex 字面值內的正規表示式語法
Ruby,其中可能包含 here 文檔字面值內的程式碼片段,其中 here 文檔分隔符號通常會指示語言
Lua,其中可能包含 vim.cmd() 呼叫內的 Vimscript 片段。
Vimscript,其中可能包含 :lua-heredoc 區塊內的 Lua 片段。
所有這些範例都可以用父語法樹和一或多個注入的語法樹來建模,這些語法樹位於父樹中的某些節點內。語言注入查詢讓您可以使用以下擷取來指定這些「注入」
@injection.content - 指示應該使用另一種語言重新剖析擷取的節點的內容。
@injection.language - 指示擷取的節點的文字可能包含應該用於重新剖析 @injection.content 的語言名稱。
@injection.filename - 指示擷取的節點的文字可能包含檔案名稱;然後透過 vim.filetype.match() 查閱對應的檔案類型,並將其視為應該用於重新剖析 @injection.content 的語言名稱。
也可以透過與模式相關聯的某些屬性來設定語言注入行為
injection.language - 可以用來硬式編碼特定語言的名稱。
injection.combined - 指示樹狀結構中的所有相符節點都應該將其內容剖析為一個巢狀文件。
injection.include-children - 指示應該重新剖析 @injection.content 節點的整個文字,包括其子節點的文字。依預設,子節點的文字將會排除在注入的文件之外。
injection.self - 指示應該使用與節點的 LanguageTree 相同的語言剖析節點的文字。
injection.parent - 指示應該使用與節點的父 LanguageTree 相同的語言剖析擷取的節點的文字。

VIM.TREESITTER lua-treesitter

本文件的其餘部分是 vim.treesitter Lua 模組的參考手冊,它是 Nvim treesitter 整合的主要介面。以下大部分內容都是從函式文件自動產生的。
vim.treesitter.language_version
捆綁的 treesitter 程式庫支援的最新剖析器 ABI 版本。
vim.treesitter.minimum_language_version
捆綁的 treesitter 程式庫支援的最早剖析器 ABI 版本。

TREESITTER 樹狀結構 treesitter-tree TSTree

「treesitter 樹狀結構」表示緩衝區剖析的內容,可用於執行進一步分析。它是 treesitter 程式庫持有的物件的 userdata 參考。
treesitter 樹狀結構的 TSTree 執行個體支援下列方法。
TSTree:copy() TSTree:copy()
傳回 TSTree 的複本。
傳回
(TSTree)
TSTree:root() TSTree:root()
傳回此樹狀結構的根節點。
傳回
(TSNode)

TREESITTER 節點 treesitter-node TSNode

「treesitter 節點」表示緩衝區剖析內容的特定元素,可以使用 Query 擷取該元素,例如用於醒目提示。它是 treesitter 程式庫持有的物件的 userdata 參考。
一個 TSNode 樹狀結構節點的實例支援以下方法。
TSNode:byte_length() TSNode:byte_length()
返回此節點所跨越的位元組數。
傳回
(integer)
TSNode:child({index}) TSNode:child()
取得指定 {index} 處的節點子節點,其中 0 代表第一個子節點。
參數
{index} (integer)
傳回
(TSNode?)
TSNode:child_count() TSNode:child_count()
取得節點的子節點數量。
傳回
(integer)
TSNode:child_with_descendant()
TSNode:child_with_descendant({descendant}) 取得包含 {descendant} 的節點子節點(包括 {descendant} 本身)。
例如,以下節點階層結構:
a -> b -> c
a:child_with_descendant(c) == b
a:child_with_descendant(b) == b
a:child_with_descendant(a) == nil
參數
{descendant} (TSNode)
傳回
(TSNode?)
TSNode:descendant_for_range()
TSNode:descendant_for_range({start_row}, {start_col}, {end_row}, {end_col}) 取得此節點內跨越給定 (row, column) 位置範圍的最小節點。
參數
{start_row} (integer)
{start_col} (integer)
{end_row} (integer)
{end_col} (integer)
傳回
(TSNode?)
TSNode:end_() TSNode:end_()
取得節點的結束位置。返回三個值:列、行和總位元組數(皆從零開始)。
返回(多個)
(integer) (integer) (integer)
TSNode:equal({node}) TSNode:equal()
檢查 {node} 是否指向同一樹狀結構內的相同節點。
參數
{node} (TSNode)
傳回
(boolean)
TSNode:extra() TSNode:extra()
檢查節點是否為額外的。額外的節點代表諸如註解之類的事物,這些事物不是文法所必需的,但可以出現在任何地方。
傳回
(boolean)
TSNode:field({name}) TSNode:field()
返回對應於 {name} 欄位的節點表格。
參數
{name} (string)
傳回
(TSNode[])
TSNode:has_changes() TSNode:has_changes()
檢查語法節點是否已編輯。
傳回
(boolean)
TSNode:has_error() TSNode:has_error()
檢查節點是否為語法錯誤,或是否包含任何語法錯誤。
傳回
(boolean)
TSNode:id() TSNode:id()
取得節點在其自身樹狀結構內的唯一識別符。
除了作為具有值相等性的 Lua 基本類型(因此不是表格)之外,不保證此識別符的內部表示。目前它是一個(不可列印的)字串。
注意:不保證 id 對於來自不同樹狀結構的節點是唯一的。
傳回
(string)
TSNode:iter_children() TSNode:iter_children()
迭代 {TSNode} 的所有直接子節點,無論它們是否已命名。返回子節點以及對應於此子節點的最終欄位名稱。
傳回
(fun(): TSNode, string)
TSNode:missing() TSNode:missing()
檢查節點是否遺失。遺失的節點由解析器插入,以便從某些語法錯誤中恢復。
傳回
(boolean)
TSNode:named() TSNode:named()
檢查節點是否已命名。已命名的節點對應於文法中的已命名規則,而匿名節點對應於文法中的字串文字。
傳回
(boolean)
TSNode:named_child({index}) TSNode:named_child()
取得指定 {index} 處的節點已命名子節點,其中 0 代表第一個已命名子節點。
參數
{index} (integer)
傳回
(TSNode?)
TSNode:named_child_count() TSNode:named_child_count()
取得節點的已命名子節點數量。
傳回
(integer)
TSNode:named_descendant_for_range()
TSNode:named_descendant_for_range({start_row}, {start_col}, {end_row}, {end_col}) 取得此節點內跨越給定 (row, column) 位置範圍的最小已命名節點。
參數
{start_row} (integer)
{start_col} (integer)
{end_row} (integer)
{end_col} (integer)
傳回
(TSNode?)
TSNode:next_named_sibling() TSNode:next_named_sibling()
取得節點的下一個已命名兄弟節點。
傳回
(TSNode?)
TSNode:next_sibling() TSNode:next_sibling()
取得節點的下一個兄弟節點。
傳回
(TSNode?)
TSNode:parent() TSNode:parent()
取得節點的直接父節點。為了迭代節點的祖先,建議使用 TSNode:child_with_descendant()
傳回
(TSNode?)
TSNode:prev_named_sibling() TSNode:prev_named_sibling()
取得節點的前一個已命名兄弟節點。
傳回
(TSNode?)
TSNode:prev_sibling() TSNode:prev_sibling()
取得節點的前一個兄弟節點。
傳回
(TSNode?)
TSNode:range({include_bytes}) TSNode:range()
取得節點的範圍。
返回四個或六個值
起始列
起始欄
起始位元組(如果 {include_bytes}true
結束列
結束欄
結束位元組(如果 {include_bytes}true
參數
{include_bytes} (boolean?)
TSNode:sexpr() TSNode:sexpr()
取得以字串形式表示節點的 S-expression。
傳回
(string)
TSNode:start() TSNode:start()
取得節點的起始位置。返回三個值:列、行和總位元組數(皆從零開始)。
返回(多個)
(integer) (integer) (integer)
TSNode:symbol() TSNode:symbol()
取得節點的類型,以數字 ID 表示。
傳回
(integer)
TSNode:tree() TSNode:tree()
取得節點的 TSTree
傳回
(TSTree)
TSNode:type() TSNode:type()
取得節點的類型,以字串表示。
傳回
(string)

Lua 模組:vim.treesitter lua-treesitter-core

foldexpr({lnum}) vim.treesitter.foldexpr()
返回目前緩衝區中 {lnum} 的折疊層級。可以直接設定為 'foldexpr'
vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()'
屬性
自:0.9.0 起
參數
{lnum} (integer?) 要計算折疊層級的行號
傳回
(string)
vim.treesitter.get_captures_at_cursor()
get_captures_at_cursor({winnr}) 返回游標下方的亮顯擷取名稱清單
參數
{winnr} (integer?) 視窗控制代碼或 0 表示目前視窗(預設值)
傳回
(string[]) 擷取名稱清單
vim.treesitter.get_captures_at_pos()
get_captures_at_pos({bufnr}, {row}, {col}) 返回給定位置的亮顯擷取清單
每個擷取都以一個表格表示,其中包含擷取名稱的字串以及元資料表格(priorityconceal 等;如果沒有定義則為空)。
參數
{bufnr} (integer) 緩衝區編號(0 表示目前緩衝區)
{row} (integer) 位置列
{col} (integer) 位置欄
傳回
({capture: string, lang: string, metadata: vim.treesitter.query.TSMetadata}[])
get_node({opts}) vim.treesitter.get_node()
返回給定位置的最小已命名節點
注意:在未剖析的樹狀結構上呼叫此函式可能會產生無效節點。如果已知樹狀結構不是由(例如)活動亮顯器剖析,請先透過下列方式剖析樹狀結構:
vim.treesitter.get_parser(bufnr):parse(range)
參數
{opts} (table?) 可選的關鍵字引數
{bufnr} (integer?) 緩衝區編號(nil 或 0 表示目前緩衝區)
{pos} ([integer, integer]?) 從 0 開始的 (row, col) 元組。預設為目前視窗中的游標位置。如果 {bufnr} 不是目前緩衝區,則為必填
{lang} (string?) 解析器語言。(預設值:來自緩衝區檔案類型)
{ignore_injections} (boolean?) 忽略注入的語言(預設為 true)
{include_anonymous} (boolean?) 包含匿名節點(預設為 false)
傳回
(TSNode?) 給定位置的節點
get_node_range({node_or_range}) vim.treesitter.get_node_range()
返回節點的範圍或展開的範圍表格
參數
{node_or_range} (TSNode|table) 節點或位置表格
返回(多個)
(integer) start_row (integer) start_col (integer) end_row (integer) end_col
vim.treesitter.get_node_text()
get_node_text({node}, {source}, {opts}) 取得對應於給定節點的文字
參數
{node} (TSNode)
{source} (integer|string) 從中擷取 {node} 的緩衝區或字串
{opts} (table?) 可選參數。
metadata (table) 特定擷取的元資料。使用 vim.treesitter.query.add_directive() 時,此值會設定為 metadata[capture_id]
傳回
(string)
get_parser({bufnr}, {lang}, {opts}) vim.treesitter.get_parser()
返回特定緩衝區的解析器,並將其附加至緩衝區
如果需要,這將建立解析器。
如果無法建立任何解析器,則會擲回錯誤。設定 opts.error = false 以隱藏此訊息並返回 nil(以及錯誤訊息)。警告:此行為將在 Nvim 0.12 中成為預設值,並且此選項將會移除。
參數
{bufnr} (integer?) 解析器應綁定的緩衝區(預設值:目前緩衝區)
{lang} (string?) 此解析器的語言(預設值:來自緩衝區檔案類型)
{opts} (table?) 要傳遞給已建立語言樹狀結構的選項
返回(多個)
(vim.treesitter.LanguageTree?) 用於剖析的物件 (string?) 錯誤訊息(如果適用)
get_range({node}, {source}, {metadata}) vim.treesitter.get_range()
取得 TSNode 的範圍。也可以提供 {source}{metadata} 以取得套用指示詞的範圍。
參數
{node} (TSNode)
{source} (integer|string?) 從中擷取 {node} 的緩衝區或字串
{metadata} (vim.treesitter.query.TSMetadata?)
傳回
(table) 包含以下欄位的表格
{[1]} (integer) 起始列
{[2]} (integer) 起始欄
{[3]} (integer) 起始位元組
{[4]} (integer) 結束列
{[5]} (integer) 結束欄
{[6]} (integer) 結束位元組
vim.treesitter.get_string_parser()
get_string_parser({str}, {lang}, {opts}) 返回字串解析器
參數
{str} (string) 要剖析的文字
{lang} (string) 此字串的語言
{opts} (table?) 要傳遞給已建立語言樹狀結構的選項
傳回
(vim.treesitter.LanguageTree) 用於剖析的物件
inspect_tree({opts}) vim.treesitter.inspect_tree()
開啟一個視窗,其中顯示語言樹狀結構中節點的文字表示。
在視窗中時,按 "a" 切換顯示匿名節點,按 "I" 切換顯示每個節點的來源語言,按 "o" 切換查詢編輯器,然後按 <Enter> 跳到來源緩衝區中游標下的節點。折疊功能也適用(嘗試 zozc 等)。
也可以使用 :InspectTree 顯示。:InspectTree
屬性
自:0.9.0 起
參數
{opts} (table?) 可選的選項表格,包含以下可能的鍵值:
lang (string|nil): 來源緩衝區的語言。如果省略,則從來源緩衝區的檔案類型偵測。
bufnr (integer|nil): 要將樹狀結構繪製到的緩衝區。如果省略,則會建立新的緩衝區。
winid (integer|nil): 要在其中顯示樹狀結構緩衝區的視窗 ID。如果省略,則會使用 {command} 建立新的視窗。
command (string|nil): 用於建立視窗的 Vimscript 命令。預設值為 "60vnew"。僅當 {winid} 為 nil 時使用。
title (string|fun(bufnr:integer):string|nil): 視窗的標題。如果是一個函式,則它會接受來源緩衝區的緩衝區編號作為其唯一引數,並且應該傳回一個字串。
is_ancestor({dest}, {source}) vim.treesitter.is_ancestor()
判斷一個節點是否為另一個節點的祖先
參數
{dest} (TSNode) 可能的祖先
{source} (TSNode) 可能的後代
傳回
(boolean) 如果 {dest}{source} 的祖先,則為 True
vim.treesitter.is_in_node_range()
is_in_node_range({node}, {line}, {col}) 判斷 (line, col) 位置是否在節點範圍內
參數
{node} (TSNode) 定義範圍
{line} (integer) 行 (從 0 開始)
{col} (integer) 列 (從 0 開始)
傳回
(boolean) 如果位置在節點範圍內,則為 True
node_contains({node}, {range}) vim.treesitter.node_contains()
判斷一個節點是否包含一個範圍
參數
{node} (TSNode)
{range} (table)
傳回
(boolean) 如果 {node} 包含 {range},則為 True
start({bufnr}, {lang}) vim.treesitter.start()
為緩衝區啟動 treesitter 突出顯示
可以在 ftplugin 或 FileType 自動命令中使用。
注意:預設情況下,會停用正規表示式語法突出顯示,這可能是一些外掛程式所需要的。在這種情況下,在呼叫 start 之後新增 vim.bo.syntax = 'on'
範例
vim.api.nvim_create_autocmd( 'FileType', { pattern = 'tex',
    callback = function(args)
        vim.treesitter.start(args.buf, 'latex')
        vim.bo[args.buf].syntax = 'on'  -- only if additional legacy syntax is needed
    end
})
參數
{bufnr} (integer?) 要突出顯示的緩衝區 (預設值:目前的緩衝區)
{lang} (string?) 分析器的語言 (預設值:來自緩衝區檔案類型)
stop({bufnr}) vim.treesitter.stop()
停止緩衝區的 treesitter 突出顯示
參數
{bufnr} (integer?) 要停止突出顯示的緩衝區 (預設值:目前的緩衝區)

Lua 模組:vim.treesitter.language lua-treesitter-language

add({lang}, {opts}) vim.treesitter.language.add()
載入名稱為 {lang} 的分析器
分析器會在 parser 執行時間目錄或提供的 {path} 中搜尋。可以在啟用 treesitter 功能之前使用,以檢查可用的分析器,例如:
if vim.treesitter.language.add('markdown') then
  vim.treesitter.start(bufnr, 'markdown')
end
參數
{lang} (string) 分析器的名稱 (僅限字母數字和 _)
{opts} (table?) 選項
{path} (string) 分析器所在的選用路徑
{symbol_name} (string) 要載入的語言的內部符號名稱
返回(多個)
(boolean?) 如果載入分析器,則為 True (string?) 如果無法載入分析器,則為錯誤
get_filetypes({lang}) vim.treesitter.language.get_filetypes()
傳回使用名稱為 {lang} 的分析器的檔案類型。
清單包含 {lang} 本身以及透過 vim.treesitter.language.register() 註冊的所有檔案類型。
參數
{lang} (string) 分析器的名稱
傳回
(string[]) 檔案類型
get_lang({filetype}) vim.treesitter.language.get_lang()
傳回在載入 {filetype} 的分析器時要使用的語言名稱。
如果沒有透過 vim.treesitter.language.register() 明確註冊語言,則預設為 {filetype}。對於像 html.glimmer 這樣的複合檔案類型,只會傳回主要的檔案類型。
參數
{filetype} (string)
傳回
(string?)
inspect({lang}) vim.treesitter.language.inspect()
檢查提供的語言。
檢查會提供有關語言的一些有用資訊,例如節點和欄位名稱、ABI 版本,以及語言是否來自 WASM 模組。
節點名稱會在一個表格中傳回,該表格將每個節點名稱對應到一個 boolean 值,表示該節點是否已命名 (即,不是匿名的)。匿名節點會用雙引號 (") 包圍。
參數
{lang} (string) 語言
傳回
(table)
register({lang}, {filetype}) vim.treesitter.language.register()
註冊一個名稱為 {lang} 的分析器,以便用於 {filetype}(s)。
注意:這會新增或覆寫 {filetype} 的對應,任何從其他檔案類型到 {lang} 的現有對應都會保留。
參數
{lang} (string) 分析器的名稱
{filetype} (string|string[]) 要與 lang 關聯的檔案類型

Lua 模組:vim.treesitter.query lua-treesitter-query

vim.treesitter.query.add_directive()
add_directive({name}, {handler}, {opts}) 新增要在查詢中使用的新的指令
處理程式可以透過直接在 metadata 物件上設定來設定比對層級資料 metadata.key = value。此外,處理程式可以透過在 metadata 表格上使用捕獲 ID 來設定節點層級資料 metadata[capture_id].key = value
參數
{name} (string) 指令的名稱,不含開頭的 #
{handler} (fun(match: table<integer,TSNode[]>, pattern: integer, source: integer|string, predicate: any[], metadata: vim.treesitter.query.TSMetadata))
match:一個將捕獲 ID 對應到捕獲節點清單的表格
pattern:查詢檔案中相符模式的索引
predicate:包含正在呼叫的完整指令的字串清單,例如 (node (#set! conceal "-")) 將取得 predicate { "#set!", "conceal", "-" }
{opts} (table) 具有以下欄位的表格
{force} (boolean) 覆寫同名的現有 predicate
{all} (boolean) 使用比對表格的正確實作,其中捕獲 ID 對應到節點清單,而不是單一節點。預設值為 true。此選項將在未來版本中移除。
vim.treesitter.query.add_predicate()
add_predicate({name}, {handler}, {opts}) 新增要在查詢中使用的新的 predicate
參數
{name} (string) predicate 的名稱,不含開頭的 #
{handler} (fun(match: table<integer,TSNode[]>, pattern: integer, source: integer|string, predicate: any[], metadata: vim.treesitter.query.TSMetadata): boolean?)
請參閱 vim.treesitter.query.add_directive() 以了解引數含義
{opts} (table?) 具有以下欄位的表格
{force} (boolean) 覆寫同名的現有 predicate
{all} (boolean) 使用比對表格的正確實作,其中捕獲 ID 對應到節點清單,而不是單一節點。預設值為 true。此選項將在未來版本中移除。
edit({lang}) vim.treesitter.query.edit()
開啟即時編輯器來查詢您啟動的緩衝區。
也可以使用 :EditQuery 顯示。
如果您將游標移動到捕獲名稱 ("@foo"),則在來源緩衝區中會突出顯示比對捕獲的文字。查詢編輯器是暫存緩衝區,請使用 :write 儲存它。您可以在 $VIMRUNTIME/queries/ 找到範例查詢。
參數
{lang} (string?) 要開啟查詢編輯器的語言。如果省略,則從目前緩衝區的檔案類型推斷。
get({lang}, {query_name}) vim.treesitter.query.get()
傳回 {lang} 的執行時間查詢 {query_name}
參數
{lang} (string) 用於查詢的語言
{query_name} (string) 查詢的名稱 (例如 "highlights")
傳回
(vim.treesitter.Query?) 已剖析的查詢。如果找不到查詢檔案,則為 nil
vim.treesitter.query.get_files()
get_files({lang}, {query_name}, {is_included}) 取得用於組成查詢的檔案清單
參數
{lang} (string) 要取得查詢的語言
{query_name} (string) 要載入的查詢名稱 (例如,"highlights")
{is_included} (boolean?) 內部參數,大多數情況下保留為 nil
傳回
(string[]) query_files 要針對給定查詢和語言載入的檔案清單
lint({buf}, {opts}) vim.treesitter.query.lint()
使用已安裝的分析器檢查 treesitter 查詢,或清除檢查錯誤。
在 runtimepath 中使用 treesitter-parsers 來檢查 {buf} 中的查詢檔案是否有錯誤
驗證使用的節點是否為文法中的有效識別碼。
驗證 predicate 和指令是否有效。
驗證最上層的 s-expression 是否有效。
找到的診斷會使用 diagnostic-api 報告。預設情況下,用於驗證的分析器由查詢檔案的包含資料夾決定,例如,如果路徑以 /lua/highlights.scm 結尾,則會使用 lua 語言的分析器。
參數
{buf} (integer) 緩衝區控制代碼
{opts} (table?) 可選的關鍵字引數
{langs} (string|string[]) 用於檢查查詢的語言。如果指定了多種語言,則會針對所有語言驗證查詢
{clear} (boolean) 僅清除目前的檢查錯誤
list_directives() vim.treesitter.query.list_directives()
列出目前可用的指令,以便在查詢中使用。
傳回
(string[]) 支援的指令。
list_predicates() vim.treesitter.query.list_predicates()
列出目前可用的 predicate,以便在查詢中使用。
傳回
(string[]) 支援的 predicate。
omnifunc({findstart}, {base}) vim.treesitter.query.omnifunc()
用於完成 treesitter 查詢中節點名稱和 predicate 的 Omnifunc。
透過以下方式使用:
vim.bo.omnifunc = 'v:lua.vim.treesitter.query.omnifunc'
參數
{findstart} (0|1)
{base} (string)
parse({lang}, {query}) vim.treesitter.query.parse()
{query} 剖析為字串。(如果查詢在檔案中,呼叫者應在呼叫之前將內容讀取到字串中)。
傳回一個 Query (請參閱 lua-treesitter-query) 物件,該物件可以使用 iter_capturesiter_matches 方法來搜尋語法樹中針對 {query} 中定義的模式的節點。
使用有關 {query} 的額外內容公開 infocaptures
captures 包含在 {query} 中定義的唯一捕獲名稱清單。
info.captures 也指向 captures
info.patterns 包含有關 predicate 的資訊。
參數
{lang} (string) 用於查詢的語言
{query} (string) 以 s-expr 語法表示的查詢
傳回
(vim.treesitter.Query) 已剖析的查詢
Query:iter_captures()
Query:iter_captures({node}, {source}, {start}, {stop}) 迭代 {node} 內所有匹配項的所有捕獲。
如果查詢包含謂詞,則需要 {source};然後呼叫者必須確保使用與緩衝區當前文本一致的最新解析樹(如果相關)。可以使用 {start}{stop} 來限制行範圍內的匹配(這通常與根節點作為 {node} 一起使用,即在當前視窗中取得語法高亮匹配)。如果省略,則從給定節點使用 {start}{stop} 行值。
迭代器返回四個值:一個標識捕獲的數字 ID、捕獲的節點、來自任何處理匹配的指令的中繼資料以及匹配本身。以下範例顯示如何按名稱取得捕獲
for id, node, metadata, match in query:iter_captures(tree:root(), bufnr, first, last) do
  local name = query.captures[id] -- name of the capture in the query
  -- typically useful info about the node:
  local type = node:type() -- type of the captured node
  local row1, col1, row2, col2 = node:range() -- range of the capture
  -- ... use the info here ...
end
注意
僅當特定捕獲的查詢模式包含謂詞時,才會傳回捕獲。
參數
{node} (TSNode) 將在其中進行搜尋的節點。
{source} (integer|string) 要從中擷取文字的來源緩衝區或字串
{start} (integer?) 搜尋的起始行。預設為 node:start()
{stop} (integer?) 搜尋的停止行(不包含)。預設為 node:end_()
傳回
(fun(end_line: integer?): integer, TSNode, vim.treesitter.query.TSMetadata, TSQueryMatch) 捕獲 ID、捕獲節點、中繼資料、匹配項
Query:iter_matches()
Query:iter_matches({node}, {source}, {start}, {stop}, {opts}) 在給定範圍內迭代自體的匹配項。
迭代 {node} 內的所有匹配項。參數與 Query:iter_captures() 的參數相同,但迭代的值不同:查詢中模式的(從 1 開始)索引、將捕獲索引對應到節點清單的表格,以及來自任何處理匹配項的指令的中繼資料。
範例
for pattern, match, metadata in cquery:iter_matches(tree:root(), bufnr, 0, -1) do
  for id, nodes in pairs(match) do
    local name = query.captures[id]
    for _, node in ipairs(nodes) do
      -- `node` was captured by the `name` capture in the match
      local node_data = metadata[id] -- Node level metadata
      ... use the info here ...
    end
  end
end
參數
{node} (TSNode) 將在其中進行搜尋的節點。
{source} (integer|string) 要搜尋的來源緩衝區或字串
{start} (integer?) 搜尋的起始行。預設為 node:start()
{stop} (integer?) 搜尋的停止行(不包含)。預設為 node:end_()
{opts} (table?) 可選的關鍵字引數
max_start_depth (integer) 如果為非零,則設定每個匹配項的最大起始深度。這用於防止過度深入樹狀結構。
match_limit (integer) 設定進行中匹配的最大數目(預設值:256)。all (boolean) 當 false(預設值為 true)時,傳回的表格將捕獲 ID 對應到單個(最後一個)節點,而不是完整的匹配節點清單。此選項僅用於向後相容性,並將在未來的版本中移除。
傳回
(fun(): integer, table<integer, TSNode[]>, vim.treesitter.query.TSMetadata) 模式 ID、匹配項、中繼資料
set({lang}, {query_name}, {text}) vim.treesitter.query.set()
{lang} 設定名為 {query_name} 的執行階段查詢
這允許使用者覆寫任何執行階段檔案和/或外掛程式設定的組態。
參數
{lang} (string) 用於查詢的語言
{query_name} (string) 查詢名稱(例如,「highlights」)
{text} (string) 查詢文字(未解析)。

Lua 模組:vim.treesitter.languagetree lua-treesitter-languagetree

LanguageTree 包含一個解析器樹:{lang} 的根 treesitter 解析器和任何「注入」的語言解析器,它們本身可以遞迴地注入其他語言。例如,一個包含一些 Vimscript 命令的 Lua 緩衝區需要多個解析器才能完全理解其內容。
若要為給定的緩衝區和語言建立 LanguageTree(解析器物件),請使用
local parser = vim.treesitter.get_parser(bufnr, lang)
(其中 bufnr=0 表示目前的緩衝區)。lang 預設為 'filetype' 注意:目前,解析器會保留在緩衝區的生命週期內,但這可能會變更;如果外掛程式需要增量更新,則應保留對解析器物件的參照。
每當您需要存取目前的語法樹時,請解析緩衝區
local tree = parser:parse({ start_row, end_row })
這會傳回一個不可變的 treesitter-tree 物件的表格,代表緩衝區的目前狀態。當外掛程式想要在(可能)編輯後存取狀態時,必須再次呼叫 parse()。如果沒有編輯緩衝區,則會再次傳回相同的樹狀結構,而不會額外執行作業。如果先前已解析緩衝區,則會對變更的部分執行增量解析。
注意:若要在 nvim_buf_attach() Lua 回呼內直接使用解析器,您必須在註冊回呼之前呼叫 vim.treesitter.get_parser()。但最好不要在變更回呼中直接執行解析,因為它們會非常頻繁。相反地,任何對樹狀結構進行分析的外掛程式都應使用計時器來限制過於頻繁的更新。
LanguageTree:children() LanguageTree:children()
傳回語言對子樹的對應。
LanguageTree:contains({range}) LanguageTree:contains()
判斷 {range} 是否包含在 LanguageTree 中。
參數
{range} (table) 具有下列欄位的表格
{[1]} (integer) 起始列
{[2]} (integer) 起始欄
{[3]} (integer) 結束列
{[4]} (integer) 結束欄
傳回
(boolean)
LanguageTree:destroy() LanguageTree:destroy()
銷毀此 LanguageTree 及其所有子樹。
任何清除邏輯都應該在此處執行。
注意:這不會將此樹狀結構從父項中移除。相反地,必須在父項上呼叫 remove_child 才能將其移除。
LanguageTree:for_each_tree({fn}) LanguageTree:for_each_tree()
針對每個 LanguageTree 遞迴地叫用回呼。
注意:這也包括叫用樹狀結構的子樹。
參數
{fn} (fun(tree: TSTree, ltree: vim.treesitter.LanguageTree))
LanguageTree:included_regions() LanguageTree:included_regions()
取得此 LanguageTree 管理的包含區域集合。這可能與注入查詢設定的區域不同,因為部分 LanguageTree:parse() 會捨棄要求範圍之外的區域。每個清單都以 { {start_row}, {start_col}, {start_bytes}, {end_row}, {end_col}, {end_bytes} } 的形式表示一個範圍。
傳回
(table<integer, Range6[]>)
LanguageTree:invalidate({reload}) LanguageTree:invalidate()
使此解析器及其子項失效。
只有在 LanguageTree 的追蹤狀態相對於 treesitter 中的解析樹無效時,才應呼叫。不會清除檔案系統快取。會經常呼叫,因此需要快速執行。
參數
{reload} (boolean?)
LanguageTree:is_valid({exclude_children}) LanguageTree:is_valid()
傳回此 LanguageTree 是否有效,也就是說,LanguageTree:trees() 反映了來源的最新狀態。如果無效,使用者應呼叫 LanguageTree:parse()
參數
{exclude_children} (boolean?) 是否忽略子項的有效性(預設值為 false
傳回
(boolean)
LanguageTree:lang() LanguageTree:lang()
取得此樹狀節點的語言。
LanguageTree:language_for_range()
LanguageTree:language_for_range({range}) 取得包含 {range} 的適當語言。
參數
{range} (table) 具有下列欄位的表格
{[1]} (integer) 起始列
{[2]} (integer) 起始欄
{[3]} (integer) 結束列
{[4]} (integer) 結束欄
傳回
(vim.treesitter.LanguageTree) 管理 {range} 的樹狀結構
LanguageTree:named_node_for_range()
LanguageTree:named_node_for_range({range}, {opts}) 取得包含 {range} 的最小命名節點。
參數
{range} (table) 具有下列欄位的表格
{[1]} (integer) 起始列
{[2]} (integer) 起始欄
{[3]} (integer) 結束列
{[4]} (integer) 結束欄
{opts} (table?) 具有以下欄位的表格
{ignore_injections} (boolean,預設值:true) 忽略注入的語言
傳回
(TSNode?)
LanguageTree:node_for_range()
LanguageTree:node_for_range({range}, {opts}) 取得包含 {range} 的最小節點。
參數
{range} (table) 具有下列欄位的表格
{[1]} (integer) 起始列
{[2]} (integer) 起始欄
{[3]} (integer) 結束列
{[4]} (integer) 結束欄
{opts} (table?) 具有以下欄位的表格
{ignore_injections} (boolean,預設值:true) 忽略注入的語言
傳回
(TSNode?)
LanguageTree:parse({range}) LanguageTree:parse()
使用對應語言的 treesitter-parsers 遞迴地解析語言樹狀結構中的所有區域,並在已解析的樹狀結構上執行注入查詢,以判斷是否應建立和解析子樹狀結構。
任何具有空白範圍({},通常只有根樹狀結構)的區域都會一律解析;否則(通常是注入)僅當它與 {range} 相交時才會解析(或者如果 {range}true)。
參數
{range} (boolean|Range?) 在解析器的來源中解析此範圍。設定為 true 以執行來源的完整解析(注意:可能很慢!) 設定為 false|nil 以僅解析具有空白範圍的區域(通常只有沒有注入的根樹狀結構)。
傳回
(table<integer, TSTree>)
LanguageTree:register_cbs()
LanguageTree:register_cbs({cbs}, {recursive}) 為 LanguageTree 註冊回呼。
參數
{cbs} (table<TSCallbackNameOn,function>) 具有下列處理常式的 nvim_buf_attach() 類似表格引數
on_bytes:請參閱 nvim_buf_attach(),但在解析器回呼之後會呼叫此回呼。
on_changedtree:每次樹狀結構有語法變更時都會呼叫的回呼。它會傳遞兩個引數:已變更範圍(作為節點範圍)的表格和已變更的樹狀結構。
on_child_added:在將子項新增至樹狀結構時發出。
on_child_removed:在從樹狀結構中移除子項時發出。
on_detach:在緩衝區分離時發出,請參閱 nvim_buf_detach_event。採用一個引數,即緩衝區的編號。
{recursive} (boolean?) 為所有子項遞迴套用回呼。任何新的子項也會繼承回呼。
LanguageTree:source() LanguageTree:source()
傳回語言樹狀結構的來源內容(bufnr 或字串)。
LanguageTree:tree_for_range()
LanguageTree:tree_for_range({range}, {opts}) 取得包含 {range} 的樹狀結構。
參數
{range} (table) 具有下列欄位的表格
{[1]} (integer) 起始列
{[2]} (integer) 起始欄
{[3]} (integer) 結束列
{[4]} (integer) 結束欄
{opts} (table?) 具有以下欄位的表格
{ignore_injections} (boolean,預設值:true) 忽略注入的語言
傳回
(TSTree?)
LanguageTree:trees() LanguageTree:trees()
傳回此解析器解析之區域的所有樹狀結構。不包括子語言。如果下列情況,則結果會類似清單
此 LanguageTree 是根,在這種情況下,結果為空或單例清單;或
完全解析了根 LanguageTree。
傳回
(table<integer, TSTree>)
主要
命令索引
快速參考