Lua

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


Lua 引擎 Lua

簡介 lua-intro

Lua 5.1 腳本引擎是內建的且始終可用。請嘗試以下指令來了解其內部的運作原理。
:lua vim.print(package.loaded)
Nvim 為 Lua 包含一個「標準函式庫」lua-stdlib。它補充了「編輯器標準函式庫」(builtin-functionsEx-commands)以及 API,所有這些都可以在 Lua 程式碼中使用(lua-vimscript vim.api)。這些「命名空間」共同構成了 Nvim 程式設計介面。
Lua 外掛程式和使用者配置會自動偵測並載入,就像 Vimscript 一樣。有關實用指南,請參閱 lua-guide
您也可以使用 -l 參數從您的 shell 執行 Lua 腳本。
nvim -l foo.lua [args...]
lua-compat
Lua 5.1 是 Nvim Lua 的永久介面。外掛程式應以 luaref 中指定的 Lua 5.1 為目標;較新的版本(本質上是不同的、不相容的方言)不受支援。這包括某些 Lua 5.1 直譯器(例如 LuaJIT)可能支援的擴充功能,例如 goto
lua-luajit
雖然 Nvim 官方只要求支援 Lua 5.1,但出於效能考量,在支援的平台上應該使用 LuaJIT 或相容的分支來建置。LuaJIT 還帶有一些有用的擴充功能,例如 ffilua-profile 和增強的標準函式庫功能;這些不能假定為可用,並且 init.lua 或外掛程式中的 Lua 程式碼在使用它們之前應檢查 jit 全域變數。
if jit then
  -- code for luajit
else
  -- code for plain lua 5.1
end
lua-bit
一個例外是 LuaJIT 的 bit 擴充功能,它始終可用:當使用 PUC Lua 建置時,Nvim 會包含一個備用實作,該實作會提供 require("bit")
lua-profile
如果 Nvim 是使用 LuaJIT 建置的,則可以透過以下方式對 Lua 程式碼進行效能分析
-- Start a profiling session:
require('jit.p').start('ri1', '/tmp/profile')
-- Perform arbitrary tasks (use plugins, scripts, etc.) ...
-- Stop the session. Profile is written to /tmp/profile.
require('jit.p').stop()
有關詳細資訊,請參閱 https://luajit.org/ext_profiler.htmlp.lua 原始碼。
:lua vim.cmd.edit(package.searchpath('jit.p', package.path))

Lua 概念和慣用語 lua-concepts

Lua 非常簡單且_一致_:雖然有一些怪癖,但一旦您理解了這些怪癖,一切都會在任何地方以相同的方式運作。尤其作用域(閉包)非常一致,不像 JavaScript 或大多數其他語言。
Lua 有三個基本機制—「每個程式設計的主要方面」各一個:表格、閉包和協程。https://lua.dev.org.tw/doc/cacm2018.pdf
表格是「物件」或容器資料結構:它們既代表列表又代表地圖,您可以使用 metatable(如 Python 的「資料模型」)擴充它們以代表您自己的資料類型並變更它們的行為。
Lua 中的每個作用域都是閉包:函式是閉包,模組是閉包,do 區塊(lua-do)是閉包--它們的運作方式都相同。Lua 模組實際上只是一個在「路徑」(找到模組的位置:package.cpath)上找到的大型閉包。
堆疊式協程可實現協作式多執行緒、產生器以及 Lua 及其主機 (Nvim) 的多功能控制。
lua-error-handling
Lua 函式可能會因為異常(意外)故障而擲出 lua-errors,您可以使用 pcall() 來處理這些錯誤。lua-result-or-message
當失敗是正常且預期的時,慣例是傳回 nil,這會向呼叫者發出訊號,表示失敗不是「異常」,必須處理。此「結果或訊息」模式表示為多值傳回類型 any|nil,nil|string,或在 LuaLS 表示法中。
---@return any|nil    # result on success, nil on failure.
---@return nil|string # nil on success, error message on failure.
「結果或訊息」模式的範例
當呼叫者無法在失敗時繼續時,慣例是對「結果或訊息」結果使用 assert()
local value = assert(fn())
指南:對於以下情況,請使用「結果或訊息」模式...
預期會發生失敗的函式,尤其是在與外部世界通訊時。例如,即使呼叫者做對了一切,HTTP 請求或 LSP 請求也經常會因為伺服器問題而失敗。
傳回值的函式,例如 Foo:new()。
當有一個已知錯誤碼列表可以作為第三個值傳回時(如 luv-error-handling)。
iterator
迭代器只是一個可以重複呼叫以取得集合的「下一個」值的函式(或任何其他 可迭代的函式)。for-in 迴圈會預期此介面,由 pairs() 產生,vim.iter 等支援。https://lua.dev.org.tw/pil/7.1.html
iterable
「可迭代」是任何 vim.iter() 可以使用的東西:表格、字典、列表、迭代器函式、實作 __call() 元方法和 vim.iter() 物件的表格。
list-iterator
lua-list 表格上的迭代器有「中間」和「結束」,而一般的迭代器在邏輯上可能是無限的。因此,某些 vim.iter 操作(例如 Iter:rev())僅在類似列表的表格(根據定義是有限的)上才有意義。
lua-function-call
Lua 函式可以用多種方式呼叫。考慮函式
local foo = function(a, b)
    print("A: ", a)
    print("B: ", b)
end
呼叫此函式的第一種方法是
foo(1, 2)
-- ==== Result ====
-- A: 1
-- B: 2
這種呼叫函式的方式在大多數腳本語言中都很熟悉。在 Lua 中,任何遺失的引數都會以 nil 傳遞,而額外的參數會被靜默捨棄。範例
foo(1)
-- ==== Result ====
-- A: 1
-- B: nil
kwargs
在呼叫函式時,如果函式恰好採用一個字串常值 ("foo") 或表格常值 ({1,2,3}),則可以省略括號。後者通常用於模擬「命名參數」(「kwargs」或「關鍵字引數」),如 Python 和 C# 等語言。範例
local func_with_opts = function(opts)
    local will_do_foo = opts.foo
    local filename = opts.filename
    ...
end
func_with_opts { foo = true, filename = "hello.world" }
這裡沒有什麼特別之處,只是隱含地新增了括號。但在視覺上,這種微小的語法糖會相當接近「關鍵字引數」介面。
lua-regex
Lua 有意不支援正規表示式,而是具有有限的 lua-patterns,可避免擴充正規表示式的效能陷阱。Lua 腳本也可以透過 vim.regex() 使用 Vim 正規表示式。
範例
print(string.match("foo123bar123", "%d+"))
-- 123
print(string.match("foo123bar123", "[^%d]+"))
-- foo
print(string.match("foo123bar123", "[abc]+"))
-- ba
print(string.match("foo.bar", "%.bar"))
-- .bar

匯入 Lua 模組 lua-module-load

會在 'runtimepath' 中指定的目錄下搜尋模組,依它們出現的順序。模組名稱中的任何 "." 在搜尋時都會被視為目錄分隔符號。對於模組 foo.bar,每個目錄都會搜尋 lua/foo/bar.lua,然後是 lua/foo/bar/init.lua。如果找不到任何檔案,則會再次搜尋目錄,尋找名稱與 lua/foo/bar.? 相符的共用程式庫,其中 ? 是從 package.cpath 的初始值衍生而來的字尾清單(例如 sodll)。如果仍然找不到任何檔案,則 Nvim 會回復為 Lua 的預設搜尋機制。找到的第一個腳本會執行,如果有的話,require() 會傳回腳本傳回的值,否則傳回 true
在第一次呼叫每個模組的 require() 之後,傳回值會被快取,後續的呼叫會傳回快取的值,而不會搜尋或執行任何腳本。有關詳細資訊,請參閱 require()
例如,如果 'runtimepath'foo,bar,而啟動時 package.cpath./?.so;./?.dll,則 require('mod') 會依順序搜尋以下路徑並載入找到的第一個模組(「先找到者優先」)。
foo/lua/mod.lua
foo/lua/mod/init.lua
bar/lua/mod.lua
bar/lua/mod/init.lua
foo/lua/mod.so
foo/lua/mod.dll
bar/lua/mod.so
bar/lua/mod.dll
lua-package-path
Nvim 會根據有效的 'runtimepath' 值自動調整 package.pathpackage.cpath。每當 'runtimepath' 變更時,就會進行調整。package.path 的調整方式很簡單,就是將 /lua/?.lua/lua/?/init.lua 附加到 'runtimepath' 中的每個目錄(/ 實際上是 package.config 的第一個字元)。
package.path 類似,來自 'runtimepath' 的修改目錄也會新增至 package.cpath。在這種情況下,不是將 /lua/?.lua/lua/?/init.lua 附加到每個 runtimepath,而是會使用現有 package.cpath 的所有唯一包含 ? 的字尾。範例
1. 假設
'runtimepath' 包含 /foo/bar,/xxx;yyy/baz,/abc
初始 package.cpath(在編譯時定義或從 $LUA_CPATH / $LUA_INIT 衍生)包含 ./?.so;/def/ghi/a?d/j/g.elf;/def/?.so
2. 它會依序找到包含 ? 的字尾 /?.so/a?d/j/g.elf/?.so:從包含問號和前一個路徑分隔符號的第一個路徑元件開始的路徑部分。
3. /def/?.so 的字尾 (即 /?.so) 不是唯一的,因為它與 package.path 中第一個路徑的字尾相同(即 ./?.so)。這會留下 /?.so/a?d/j/g.elf,依此順序。
4. 'runtimepath' 有三個路徑:/foo/bar/xxx;yyy/baz/abc。第二個路徑包含一個分號,這是路徑分隔符號,因此不使用,僅留下 /foo/bar/abc,依此順序。
5. 會採用 4 中的路徑和 3 中的字尾的笛卡爾乘積,得到四種變體。在每個變體中,會在路徑和字尾之間插入 /lua 路徑區段,留下
/foo/bar/lua/?.so
/foo/bar/lua/a?d/j/g.elf
/abc/lua/?.so
/abc/lua/a?d/j/g.elf
6. 新路徑會附加到原始 package.cpath 的前面。
結果會如下所示
/foo/bar,/xxx;yyy/baz,/abc ('runtimepath')
× ./?.so;/def/ghi/a?d/j/g.elf;/def/?.so (package.cpath)
= /foo/bar/lua/?.so;/foo/bar/lua/a?d/j/g.elf;/abc/lua/?.so;/abc/lua/a?d/j/g.elf;./?.so;/def/ghi/a?d/j/g.elf;/def/?.so
注意
為了追蹤 'runtimepath' 更新,會記住在上一次更新時新增的路徑,並在下一次更新時移除,同時會如上所述,將從新 'runtimepath' 衍生的所有路徑附加到前面。這允許在從 'runtimepath' 移除路徑時移除路徑,在新增路徑時新增路徑,以及在 'runtimepath' 重新排序時重新排序 package.path/|package.cpath| 內容。
雖然調整會自動進行,但 Nvim 不會追蹤 package.pathpackage.cpath 的目前值。如果您碰巧從那裡刪除了一些路徑,您可以設定 'runtimepath' 來觸發更新。
let &runtimepath = &runtimepath
跳過 'runtimepath' 中包含分號的路徑適用於 package.pathpackage.cpath。鑑於有一些編寫不佳的外掛程式使用 shell,這會無法使用包含分號的路徑,因此最好不要在 'runtimepath' 中包含它們。

命令 lua-commands

這些命令會從命令列 (:lua、:luado) 或檔案 (:luafile) 在給定的行 [範圍] 執行 Lua 區塊。與 Lua 中一律一樣,每個區塊都有其自己的作用域(閉包),因此只有全域變數會在命令呼叫之間共用。lua-stdlib 模組、使用者模組和 package.path 上的任何其他模組都可用。
Lua 的 print() 函式會將其輸出重新導向至 Nvim 訊息區域,引數之間會使用「 」(空格)分隔,而不是「\t」(Tab)。
:lua= :lua :lua {區塊} 執行 Lua 區塊 {區塊}。如果 {區塊} 以「=」開頭,則會將區塊的其餘部分評估為運算式並印出。:lua =expr:=expr 等效於 :lua vim.print(expr)
範例
:lua vim.api.nvim_command('echo "Hello, Nvim!"')
若要查看 Lua 版本
:lua print(_VERSION)
若要查看 LuaJIT 版本
:lua =jit.version
:{範圍}lua 將 {範圍} 中的緩衝區行當作 Lua 程式碼執行。與 :source 不同,這會一律將行當作 Lua 程式碼處理。
範例:選取以下程式碼,然後輸入「:lua<Enter>」來執行它
print(string.format(
    'unix time: %s', os.time()))
:lua-heredoc
:lua << [trim] [{endmarker}] {script} {endmarker} 從 Vimscript 內執行 Lua 腳本 {script}。您可以在 "<<" 後省略 [endmarker],並在 {script} 後使用點號 "." (類似於 :append, :insert)。請參閱 :let-heredoc 以取得更多資訊。
範例
function! CurrentLineInfo()
lua << EOF
local linenr = vim.api.nvim_win_get_cursor(0)[1]
local curline = vim.api.nvim_buf_get_lines(0, linenr - 1, linenr, false)[1]
print(string.format('Line [%d] has %d bytes', linenr, #curline))
EOF
endfunction
請注意,當區塊結束時,local 變數將會消失,但全域變數不會。
:luado
:[range]luado {body} 為 [range] 中每個緩衝區行執行 Lua 程式碼片段 "function(line, linenr) {body} end",其中 line 是目前行的文字 (不包含 <EOL>),而 linenr 是目前行的行號。如果函式傳回字串,則該字串會成為相應緩衝區行的文字。預設的 [range] 是整個檔案:"1,$"。
範例
:luado return string.format("%s\t%d", line:reverse(), #line)
:lua require"lpeg"
:lua -- balanced parenthesis grammar:
:lua bp = lpeg.P{ "(" * ((1 - lpeg.S"()") + lpeg.V(1))^0 * ")" }
:luado if bp:match(line) then return "=>\t" .. line end
:luafile
:luafile {file} 執行 {file} 中的 Lua 腳本。整個參數會被當作檔名使用 (類似 :edit),空格不需要跳脫字元。或者,您可以使用 :source 來執行 Lua 檔案。
範例
:luafile script.lua
:luafile %

luaeval() lua-eval

"luaeval" 是 "vim.eval" 的 (雙重) 對等物,用於將 Lua 值傳遞給 Nvim。"luaeval" 接受一個表達式字串和一個可選的引數,該引數用於表達式內的 _A,並傳回表達式的結果。它在 Lua 中的語義等同於
local chunkheader = "local _A = select(1, ...) return "
function luaeval (expstr, arg)
    local chunk = assert(loadstring(chunkheader .. expstr, "luaeval"))
    return chunk(arg) -- return typval
end
Lua 的 nil、數字、字串、表格和布林值會轉換為對應的 Vimscript 類型。如果 Lua 字串包含 NUL 位元組,它將會轉換為 Blob。轉換其他 Lua 類型會導致錯誤。
魔術全域變數 "_A" 包含 luaeval() 的第二個引數。
範例
:echo luaeval('_A[1] + _A[2]', [40, 2])
" 42
:echo luaeval('string.match(_A, "[a-z]+")', 'XYXfoo123')
" foo
lua-table-ambiguous
Lua 表格既可作為字典使用,也可作為清單使用,因此無法判斷空表格是清單還是字典。此外,Lua 沒有整數數字。為了消除這些歧義,我們定義:lua-list
0. 空表格是清單。使用 vim.empty_dict() 來表示空字典。1. 具有 N 個連續 (無 nil 值,又稱 "洞") 整數鍵 1…N 的表格是清單。另請參閱 list-iteratorlua-dict
2. 具有字串鍵且鍵中不包含 NUL 位元組的表格是字典。3. 具有字串鍵且其中至少一個鍵包含 NUL 位元組的表格也被視為字典,但這次它會轉換為 msgpack-special-maplua-special-tbl
4. 具有 vim.type_idx 鍵的表格可能是字典、清單或浮點數值
{[vim.type_idx]=vim.types.float, [vim.val_idx]=1} 會轉換為浮點數 1.0。請注意,預設情況下,整數 Lua 數字會轉換為 Number,非整數數字會轉換為 Float。此變體允許整數 Float
{[vim.type_idx]=vim.types.dictionary} 會轉換為空字典,{[vim.type_idx]=vim.types.dictionary, [42]=1, a=2} 會轉換為字典 {'a': 42}:非字串鍵會被忽略。沒有 vim.type_idx 鍵的表格,若其鍵不符合 1.、2. 或 3. 的條件,則會產生錯誤。
{[vim.type_idx]=vim.types.array} 會轉換為空清單。{[vim.type_idx]=vim.types.array, [42]=1} 也是如此:不形成從 1 到 N 的 1 步序列的整數鍵會被忽略,所有非整數鍵也會被忽略。
範例
:echo luaeval('math.pi')
:function Rand(x,y) " random uniform between x and y
:  return luaeval('(_A.y-_A.x)*math.random()+_A.x', {'x':a:x,'y':a:y})
:  endfunction
:echo Rand(1,10)
注意: luaeval 的第二個引數會從 Vimscript 轉換 ("marshal") 為 Lua,因此變更 Lua 容器不會影響 Vimscript 中的值。傳回值也始終會轉換。轉換時,會特別處理 msgpack-special-dict

Vimscript v:lua 介面 v:lua-call

在 Vimscript 中,可以使用特殊前綴 v:lua 來呼叫 Lua 函式,這些函式是全域的或可從全域表格存取。表達式
call v:lua.func(arg1, arg2)
等效於 Lua 程式碼片段
return func(...)
其中 args 會轉換為 Lua 值。表達式
call v:lua.somemod.func(args)
等效於 Lua 程式碼片段
return somemod.func(...)
此外,可以像這樣存取套件的函式
call v:lua.require'mypack'.func(arg1, arg2)
call v:lua.require'mypack.submod'.func(arg1, arg2)
注意: 只允許使用不帶括號的單引號形式。使用 require"mypack"require('mypack') 作為前綴是無效的 (後者仍然有效,可以作為其自身的函式呼叫,以防 require 傳回有用的值)。
v:lua 前綴可以用來將 Lua 函式當作方法呼叫。例如
:eval arg1->v:lua.somemod.func(arg2)
您可以在 "func" 選項中使用 v:lua,例如 'tagfunc''omnifunc' 等。例如,考慮下列 Lua omnifunc 處理常式
function mymod.omnifunc(findstart, base)
  if findstart == 1 then
    return 0
  else
    return {'stuff', 'steam', 'strange things'}
  end
end
vim.bo[buf].omnifunc = 'v:lua.mymod.omnifunc'
注意: 模組 (在上述範例中為 "mymod") 必須是 Lua 全域變數,或者使用如上所示的 require() 從套件存取。
注意:在 Vimscript 表達式中不允許使用沒有呼叫的 v:luaFuncref 無法表示 Lua 函式。以下是錯誤的
let g:Myvar = v:lua.myfunc        " Error
call SomeFunc(v:lua.mycallback)   " Error
let g:foo = v:lua                 " Error
let g:foo = v:['lua']             " Error

Lua 標準模組 lua-stdlib

Nvim Lua "標準函式庫" (stdlib) 是 vim 模組,它公開各種函式和子模組。它始終處於載入狀態,因此 require("vim") 是不必要的。
您可以查看模組屬性
:lua vim.print(vim)
結果類似於這樣
{
  _os_proc_children = <function 1>,
  _os_proc_info = <function 2>,
  ...
  api = {
    nvim__id = <function 5>,
    nvim__id_array = <function 6>,
    ...
  },
  deepcopy = <function 106>,
  gsplit = <function 107>,
  ...
}
若要尋找例如 "deepcopy" 函式的說明文件
:help vim.deepcopy()
請注意,底線開頭的函式 (例如 "_os_proc_children") 是內部/私有的,外掛程式不得使用。

VIM.UV lua-loop vim.uv

vim.uv 公開了 Nvim 用於網路、檔案系統和程序管理的 libUV 程式庫的 "luv" Lua 綁定,請參閱 luvref.txt。特別是,它允許與主要的 Nvim luv-事件迴圈互動。
E5560 lua-loop-callbacks 直接在 vim.uv 回呼中呼叫 vim.api 函式 (除了 api-fast 以外) 會產生錯誤。例如,這是一個錯誤
local timer = vim.uv.new_timer()
timer:start(1000, 0, function()
  vim.api.nvim_command('echomsg "test"')
end)
為了避免錯誤,請使用 vim.schedule_wrap() 來延遲回呼
local timer = vim.uv.new_timer()
timer:start(1000, 0, vim.schedule_wrap(function()
  vim.api.nvim_command('echomsg "test"')
end))
(對於一次性計時器,請參閱 vim.defer_fn(),它會自動新增封裝。)
範例:重複計時器 1. 將此程式碼儲存到檔案。2. 使用 ":luafile %" 執行它。
-- Create a timer handle (implementation detail: uv_timer_t).
local timer = vim.uv.new_timer()
local i = 0
-- Waits 1000ms, then repeats every 750ms until timer:close().
timer:start(1000, 750, function()
  print('timer invoked! i='..tostring(i))
  if i > 4 then
    timer:close()  -- Always close handles to avoid leaks.
  end
  i = i + 1
end)
print('sleeping');
範例:檔案變更偵測 watch-file
1. 將此程式碼儲存到檔案。2. 使用 ":luafile %" 執行它。3. 使用 ":Watch %" 監看任何檔案。4. 嘗試從另一個文字編輯器編輯該檔案。5. 請注意,該檔案會在 Nvim 中重新載入 (因為 on_change() 會呼叫 :checktime)。
local w = vim.uv.new_fs_event()
local function on_change(err, fname, status)
  -- Do work...
  vim.api.nvim_command('checktime')
  -- Debounce: stop/start.
  w:stop()
  watch_file(fname)
end
function watch_file(fname)
  local fullpath = vim.api.nvim_call_function(
    'fnamemodify', {fname, ':p'})
  w:start(fullpath, {}, vim.schedule_wrap(function(...)
    on_change(...) end))
end
vim.api.nvim_command(
  "command! -nargs=1 Watch call luaeval('watch_file(_A)', expand('<args>'))")
inotify-限制
在 Linux 上,您可能需要增加 inotify 監看和佇列事件的最大數量,因為預設限制可能太低。若要增加限制,請執行
sysctl fs.inotify.max_user_watches=494462
這會將限制增加到 494462 個監看和佇列事件。可以將這些行新增到 /etc/sysctl.conf 中,以使變更永久生效。
請注意,每個監看都是核心中的一個結構,因此可用記憶體也是使用 inotify 的瓶頸。實際上,一個監看最多可以佔用 1KB 的空間。這表示一百萬個監看可能會導致額外使用 1GB 的 RAM。
範例:TCP 回聲伺服器 tcp-server
1. 將此程式碼儲存到檔案。2. 使用 ":luafile %" 執行它。3. 請注意連接埠號碼。4. 從任何 TCP 用戶端連線 (例如 "nc 0.0.0.0 36795")
local function create_server(host, port, on_connect)
  local server = vim.uv.new_tcp()
  server:bind(host, port)
  server:listen(128, function(err)
    assert(not err, err)  -- Check for errors.
    local sock = vim.uv.new_tcp()
    server:accept(sock)  -- Accept client connection.
    on_connect(sock)  -- Start reading messages.
  end)
  return server
end
local server = create_server('0.0.0.0', 0, function(sock)
  sock:read_start(function(err, chunk)
    assert(not err, err)  -- Check for errors.
    if chunk then
      sock:write(chunk)  -- Echo received messages to the channel.
    else  -- EOF (stream closed).
      sock:close()  -- Always close handles to avoid leaks.
    end
  end)
end)
print('TCP echo-server listening on port: '..server:getsockname().port)
多執行緒lua-loop-threading
外掛程式可以使用 luv 中的執行緒 API,例如 vim.uv.new_thread,在個別的 (作業系統層級) 執行緒中執行工作。請注意,每個執行緒都有其自己的獨立 Lua 直譯器狀態,無法存取主要執行緒中的 Lua 全域變數。執行緒也無法直接存取編輯器的狀態 (緩衝區、視窗等)。
vim.* API 的子集在執行緒中可用。這包括
vim.uv,每個執行緒都有個別的事件迴圈。
vim.mpackvim.json (對於在執行緒之間序列化訊息很有用)
執行緒中的 require 可以使用全域 package.path 中的 Lua 套件
print()vim.inspect
vim.diff
vim.* 中用於處理純 Lua 值的大多數公用程式函式,例如 vim.splitvim.tbl_*vim.list_* 等。
vim.is_thread() 從非主要執行緒傳回 true。

VIM.HL vim.hl

vim.hl.on_yank({opts}) vim.hl.on_yank()
TextYankPost 事件期間,反白顯示已複製的文字。
將以下內容新增至您的 init.vim
autocmd TextYankPost * silent! lua vim.hl.on_yank {higroup='Visual', timeout=300}
參數
{opts} (table?) 可選參數
higroup 複製區域的醒目標示群組 (預設為 "IncSearch")
timeout 在清除醒目標示之前的毫秒數 (預設為 150)
on_macro 執行巨集時醒目標示 (預設為 false)
on_visual 複製視覺選取範圍時醒目標示 (預設為 true)
event 事件結構 (預設為 vim.v.event)
priority 整數優先順序 (預設為 vim.hl.priorities.user)
vim.hl.priorities vim.hl.priorities
用於醒目標示的預設優先順序表格
syntax50,用於標準語法醒目標示
treesitter100,用於基於 treesitter 的醒目標示
semantic_tokens125,用於 LSP 語意 Token 醒目標示
diagnostics150,用於程式碼分析,例如診斷
user200,用於使用者觸發的醒目標示,例如 LSP 文件符號或 on_yank 自動指令
vim.hl.range()
vim.hl.range({bufnr}, {ns}, {higroup}, {start}, {finish}, {opts}) 將高亮群組套用至文字範圍。
參數
{bufnr} (integer) 要套用高亮的緩衝區編號
{ns} (integer) 要加入高亮的命名空間
{higroup} (string) 用於高亮顯示的高亮群組
{start} (integer[]|string) 區域的起始位置,以 (行, 列) 元組或 getpos() 可接受的字串表示
{finish} (integer[]|string) 區域的結束位置,以 (行, 列) 元組或 getpos() 可接受的字串表示
{opts} (table?) 包含以下欄位的表格
{regtype} (string, 預設值: 'v',即字元式) 範圍的類型。請參閱 getregtype()
{inclusive} (boolean, 預設值: false) 指示範圍是否包含結束位置
{priority} (integer, 預設值: vim.hl.priorities.user) 高亮優先級

VIM.DIFF vim.diff

vim.diff({a}, {b}, {opts}) vim.diff()
對字串 {a}{b} 執行 diff。此函式傳回的任何索引,無論是直接傳回或透過回呼引數傳回,都是以 1 為基礎。
範例
vim.diff('a\n', 'b\nc\n')
-- =>
-- @@ -1 +1,2 @@
-- -a
-- +b
-- +c
vim.diff('a\n', 'b\nc\n', {result_type = 'indices'})
-- =>
-- {
--   {1, 1, 1, 2}
-- }
參數
{a} (string) 要比較的第一个字串
{b} (string) 要比較的第二個字串
{opts} (table?) 可選參數
{on_hunk} (fun(start_a: integer, count_a: integer, start_b: integer, count_b: integer): integer?) 針對 diff 中的每個 hunk 呼叫。傳回負數以取消其餘 hunk 的回呼。引數
start_a (integer): {a} 中 hunk 的起始行。
count_a (integer): {a} 中的 hunk 大小。
start_b (integer): {b} 中 hunk 的起始行。
count_b (integer): {b} 中的 hunk 大小。
{result_type} ('unified'|'indices', 預設值: 'unified') 傳回的 diff 形式
unified: 統一格式的字串。
indices: hunk 位置的陣列。注意: 如果使用 on_hunk,則會忽略此選項。
{linematch} (boolean|integer) 對 xdiff 產生的 hunk 執行 linematch。當為整數時,只有行數小於此值的 hunk 才會透過 linematch 執行。需要 result_type = indices,否則會忽略。
{algorithm} ('myers'|'minimal'|'patience'|'histogram', 預設值: 'myers') 要使用的 diff 演算法。值
myers: 預設演算法
minimal: 花費額外時間來產生最小的 diff
patience: patience diff 演算法
histogram: histogram diff 演算法
{ctxlen} (integer) 上下文長度
{interhunkctxlen} (integer) Hunk 間上下文長度
{ignore_whitespace} (boolean) 忽略空格
{ignore_whitespace_change} (boolean) 忽略空格變更
{ignore_whitespace_change_at_eol} (boolean) 忽略行尾的空格變更。
{ignore_cr_at_eol} (boolean) 忽略行尾的回車符
{ignore_blank_lines} (boolean) 忽略空白行
{indent_heuristic} (boolean) 對於內部 diff 函式庫使用縮排啟發法。
傳回
(string|integer[][]?) 請參閱 {opts.result_type}。如果指定 {opts.on_hunk},則為 nil

VIM.MPACK vim.mpack

此模組提供 Lua 物件與 msgpack 編碼字串之間的編碼和解碼。支援 vim.NILvim.empty_dict()
vim.mpack.decode({str}) vim.mpack.decode()
將 msgpack 編碼的 {str} 解碼(或「解封裝」)為 Lua 物件。
參數
{str} (string)
傳回
(any)
vim.mpack.encode({obj}) vim.mpack.encode()
將 Lua 物件 {obj} 編碼(或「封裝」)為 Lua 字串中的 msgpack。
參數
{obj} (any)
傳回
(string)

VIM.JSON vim.json

此模組提供 Lua 物件與 JSON 編碼字串之間的編碼和解碼。支援 vim.NILvim.empty_dict()
vim.json.decode({str}, {opts}) vim.json.decode()
將 JSON 編碼的 {str} 解碼(或「解封裝」)為 Lua 物件。
將 JSON "null" 解碼為 vim.NIL(可透過 {opts} 控制,請參閱下方)。
將空物件解碼為 vim.empty_dict()
將空陣列解碼為 {}(空 Lua 表格)。
範例
vim.print(vim.json.decode('{"bar":[],"foo":{},"zub":null}'))
-- { bar = {}, foo = vim.empty_dict(), zub = vim.NIL }
參數
{str} (string) 字串化的 JSON 資料。
{opts} (table<string,any>?) 具有鍵的選項表格
luanil: (表格) 具有鍵的表格
object: (boolean) 為 true 時,將 JSON 物件中的 null 轉換為 Lua nil,而不是 vim.NIL
array: (boolean) 為 true 時,將 JSON 陣列中的 null 轉換為 Lua nil,而不是 vim.NIL
傳回
(any)
vim.json.encode({obj}) vim.json.encode()
將 Lua 物件 {obj} 編碼(或「封裝」)為 Lua 字串中的 JSON。
參數
{obj} (any)
傳回
(string)

VIM.BASE64 vim.base64

vim.base64.decode({str}) vim.base64.decode()
解碼 Base64 編碼的字串。
參數
{str} (string) Base64 編碼的字串
傳回
(string) 解碼的字串
vim.base64.encode({str}) vim.base64.encode()
使用 Base64 編碼 {str}
參數
{str} (string) 要編碼的字串
傳回
(string) 編碼的字串

VIM.SPELL vim.spell

vim.spell.check({str}) vim.spell.check()
檢查 {str} 的拼寫錯誤。類似於 Vimscript 函式 spellbadword()
注意: 此函式的行為取決於:'spelllang''spellfile''spellcapcheck''spelloptions',這些都可能是緩衝區的局部設定。請考慮使用 nvim_buf_call() 呼叫此函式。
範例
vim.spell.check("the quik brown fox")
-- =>
-- {
--     {'quik', 'bad', 5}
-- }
參數
{str} (string)
傳回
([string, 'bad'|'rare'|'local'|'caps', integer][]) 包含三個項目的元組列表
拼寫錯誤的單字。
拼寫錯誤的類型:「bad」拼寫錯誤、「rare」罕見字、「local」僅在其他區域有效的單字、「caps」單字應以大寫字母開頭
{str} 中單字開始的位置。
vim.api.{func}({...}) vim.api
使用引數 {...} 呼叫 Nvim API 函式 {func}。範例:呼叫 "nvim_get_current_line()" API 函式
print(tostring(vim.api.nvim_get_current_line()))
vim.NIL vim.NIL
RPC 中表示 NIL 的特殊值,以及在 Vimscript 轉換中表示 v:null,以及類似的情況。Lua nil 不能作為代表字典或陣列的 Lua 表格的一部分使用,因為它會被視為遺失:{"foo", nil}{"foo"} 相同。
vim.type_idx vim.type_idx
用於 lua-special-tbl 的類型索引。指定 vim.types 中的其中一個值,可以輸入空表格(不清楚空 Lua 表格代表空列表還是空陣列)並強制整數為 Float。請參閱 lua-special-tbl 以取得更多詳細資訊。
vim.val_idx vim.val_idx
代表 Float 的表格的值索引。代表浮點值 1.0 的表格如下所示
{
  [vim.type_idx] = vim.types.float,
  [vim.val_idx] = 1.0,
}
另請參閱 vim.type_idxlua-special-tbl
vim.types vim.types
具有 vim.type_idx 可能值的表格。包含兩組鍵值對:第一組將 vim.type_idx 的可能值對應至人類可讀的字串,第二組將人類可讀的類型名稱對應至 vim.type_idx 的值。目前包含 floatarraydictionary 類型的配對。
注意: 必須預期對應於 vim.types.floatvim.types.arrayvim.types.dictionary 的值僅符合以下兩個假設:1. 值可以同時作為表格中的鍵和值。根據 Lua 表格的屬性,這基本上表示「值不是 nil」。2. 對於 vim.types 表格中的每個值,vim.types[vim.types[value]]value 相同。對類型沒有其他限制,並且不保證對應於 vim.types.floatvim.types.arrayvim.types.dictionary 的值不會變更,或 vim.types 表格只會包含這三種類型的值。
log_levels vim.log.levels 日誌等級是 vim.log.levels 中定義的值之一
vim.log.levels.DEBUG vim.log.levels.ERROR vim.log.levels.INFO vim.log.levels.TRACE vim.log.levels.WARN vim.log.levels.OFF
vim.empty_dict() vim.empty_dict()
建立一個特殊的空表格(標記有元表格),當 Nvim 將 Lua 值轉換為 Vimscript 或 API 類型時,會將其轉換為空字典。預設情況下,Nvim 會將沒有此元表格的空表格 {} 轉換為列表/陣列。
注意: 如果表格中存在數字鍵,Nvim 會忽略元表格標記,並將字典轉換為列表/陣列。
傳回
(table)
vim.iconv({str}, {from}, {to}) vim.iconv()
結果是一個字串,它是將文字 {str} 從編碼 {from} 轉換為編碼 {to} 的結果。當轉換失敗時,會返回 nil。當某些字元無法轉換時,它們會被替換為 "?"。編碼名稱是 iconv() 函式庫可以接受的任何名稱,請參閱 ":Man 3 iconv"。
參數
{str} (string) 要轉換的文字
{from} (string) {str} 的編碼
{to} (string) 目標編碼
傳回
(string?) 如果轉換成功,則返回轉換後的字串,否則返回 nil
vim.in_fast_event() vim.in_fast_event()
如果程式碼正在作為「快速」事件處理程式的一部分執行,則返回 true,在這種情況下,大多數 API 都會被禁用。這些是低階事件(例如 lua-loop-callbacks),可以在 Nvim 輪詢輸入時隨時調用。當此值為 false 時,大多數 API 函式都可調用(但可能會受到其他限制,例如 textlock)。
vim.rpcnotify({channel}, {method}, {...}) vim.rpcnotify()
透過 RPC{event} 送到 {channel},並立即返回。如果 {channel} 為 0,則事件會廣播到所有頻道。
此函式也適用於快速回呼 lua-loop-callbacks
參數
{channel} (integer)
{method} (string)
{...} (any?)
vim.rpcrequest({channel}, {method}, {...}) vim.rpcrequest()
{channel} 發送請求,以透過 RPC 調用 {method},並會阻塞直到收到回應。
注意: 回傳值中的 NIL 值以 vim.NIL 特殊值表示
參數
{channel} (integer)
{method} (string)
{...} (any?)
vim.schedule({fn}) vim.schedule()
排程 {fn} 以便稍後由主事件迴圈調用。可用於避免 textlock 或其他暫時性限制。
參數
{fn} (fun())
vim.str_utf_end({str}, {index}) vim.str_utf_end()
取得從 {index} 指向的碼位(字元)的最後一個位元組到該碼位的位元組距離。
範例
-- The character 'æ' is stored as the bytes '\xc3\xa6' (using UTF-8)
-- Returns 0 because the index is pointing at the last byte of a character
vim.str_utf_end('æ', 2)
-- Returns 1 because the index is pointing at the penultimate byte of a character
vim.str_utf_end('æ', 1)
參數
{str} (string)
{index} (integer)
傳回
(integer)
vim.str_utf_pos({str}) vim.str_utf_pos()
取得給定字串中每個 UTF-8 碼位的起始位元組位置的清單。
嵌入的 NUL 位元組會被視為字串的終止。
參數
{str} (string)
傳回
(integer[])
vim.str_utf_start({str}, {index}) vim.str_utf_start()
取得從 {index} 指向的碼位(字元)的起始位元組到該碼位的位元組距離。
結果可以加到 {index} 以取得字元的起始位元組。
範例
-- The character 'æ' is stored as the bytes '\xc3\xa6' (using UTF-8)
-- Returns 0 because the index is pointing at the first byte of a character
vim.str_utf_start('æ', 1)
-- Returns -1 because the index is pointing at the second byte of a character
vim.str_utf_start('æ', 2)
參數
{str} (string)
{index} (integer)
傳回
(integer)
vim.stricmp({a}, {b}) vim.stricmp()
比較字串時不區分大小寫。
參數
{a} (string)
{b} (string)
傳回
(0|1|-1) 如果字串相等,則 {a} 大於 {b}{a} 小於 {b},依此類推。
vim.ui_attach({ns}, {options}, {callback}) vim.ui_attach()
警告: 此功能為實驗性/不穩定功能。
附加到 ui-events,類似於 nvim_ui_attach(),但是會將事件接收為 Lua 回呼。可用於在 Lua 中實作螢幕元素,例如彈出式選單或訊息處理。
{options} 應為類似字典的表格,其中應將 ext_... 選項設定為 true,以接收各個外部元素的事件。
{callback} 接收事件名稱和其他參數。請參閱 ui-popupmenu 和下方各節,了解各個事件的事件格式。
警告: 此 API 被視為實驗性。不同螢幕元素的可用性將有所不同。特別是 ext_messages 行為會進一步變更,並會進行可用性改進。當將 'cmdheight' 設定為零時(這也是實驗性功能),預期會使用此功能來處理訊息。
範例(ui-popupmenu 實作的虛擬程式碼)
ns = vim.api.nvim_create_namespace('my_fancy_pum')
vim.ui_attach(ns, {ext_popupmenu=true}, function(event, ...)
  if event == "popupmenu_show" then
    local items, selected, row, col, grid = ...
    print("display pum ", #items)
  elseif event == "popupmenu_select" then
    local selected = ...
    print("selected", selected)
  elseif event == "popupmenu_hide" then
    print("FIN")
  end
end)
參數
{ns} (integer)
{options} (table<string, any>)
{callback} (fun())
vim.ui_detach({ns}) vim.ui_detach()
分離先前使用 vim.ui_attach() 針對給定命名空間 {ns} 附加的回呼。
參數
{ns} (integer)
vim.wait({time}, {callback}, {interval}, {fast_only}) vim.wait()
等待 {time} (以毫秒為單位),直到 {callback} 返回 true
立即執行 {callback},並大約每 {interval} 毫秒(預設為 200)執行一次。Nvim 在這段時間內仍然會處理其他事件。
api-fast 事件中無法呼叫。
範例
---
-- Wait for 100 ms, allowing other events to process
vim.wait(100, function() end)
---
-- Wait for 100 ms or until global variable set.
vim.wait(100, function() return vim.g.waiting_for_var end)
---
-- Wait for 1 second or until global variable set, checking every ~500 ms
vim.wait(1000, function() return vim.g.waiting_for_var end, 500)
---
-- Schedule a function to set a value in 100ms
vim.defer_fn(function() vim.g.timer_result = true end, 100)
-- Would wait ten seconds if results blocked. Actually only waits  100 ms
if vim.wait(10000, function() return vim.g.timer_result end) then
  print('Only waiting a little bit of time!')
end
參數
{time} (integer) 要等待的毫秒數
{callback} (fun(): boolean?) 選用回呼。等待直到 {callback} 返回 true
{interval} (integer?) 輪詢之間要等待的(大約)毫秒數
{fast_only} (boolean?) 如果為 true,則只會處理 api-fast 事件。
返回(多個)
(boolean) (-1|-2?)
如果在 {time} 期間 {callback} 返回 truetrue, nil
如果在 {time} 期間 {callback} 從未返回 truefalse, -1
如果在 {time} 期間 {callback} 被中斷:false, -2
如果 {callback} 發生錯誤,則會引發錯誤。

LUA-VIMSCRIPT 橋接 lua-vimscript

Nvim Lua 提供一個介面或「橋接器」,可連接 Vimscript 變數和函式,以及編輯器命令和選項。
在此橋接器上傳遞的物件會被「複製」(封送處理):沒有「參考」。lua-guide-variables 例如,在 Lua 清單上使用 vim.fn.remove() 會將清單物件複製到 Vimscript,而不會修改 Lua 清單
local list = { 1, 2, 3 }
vim.fn.remove(list, 0)
vim.print(list)  --> "{ 1, 2, 3 }"
vim.call({func}, {...}) vim.call()
使用引數 {...} 調用 vim-functionuser-function {func}。另請參閱 vim.fn。等同於
vim.fn[func]({...})
vim.cmd({command}) 請參閱 vim.cmd()
vim.fn.{func}({...}) vim.fn
使用引數 {...} 調用 vim-functionuser-function {func}。若要呼叫自動載入函式,請使用以下語法
vim.fn['some#function']({...})
與 vim.api.|nvim_call_function()| 不同,此函式會在 Vim 物件和 Lua 物件之間直接轉換。如果 Vim 函式返回浮點數,則會直接以 Lua 數字表示。空清單和字典都會以空表格表示。
注意: 回傳值中的 v:null 值以 vim.NIL 特殊值表示
注意: vim.fn 索引鍵是延遲產生的,因此 pairs(vim.fn) 只會列舉至少呼叫過一次的函式。
注意: 大多數函式都無法在 api-fast 回呼中執行,但有一些未記載的例外情況是允許的。
lua-vim-variables
Vim 編輯器全域字典 g: w: b: t: v: 可以從 Lua 以方便且慣用的方式存取,方法是參照下面說明的 vim.* Lua 表格。透過這種方式,您可以輕鬆地從 Lua 讀取和修改全域 Vimscript 變數。
範例
vim.g.foo = 5     -- Set the g:foo Vimscript variable.
print(vim.g.foo)  -- Get and print the g:foo Vimscript variable.
vim.g.foo = nil   -- Delete (:unlet) the Vimscript variable.
vim.b[2].foo = 6  -- Set b:foo for buffer 2
請注意,直接設定字典欄位不會將它們寫回 Nvim。這是因為命名空間中的索引只會返回複本。必須將整個字典一次寫入。這可以透過建立短暫的臨時物件來實現。
範例
vim.g.my_dict.field1 = 'value'  -- Does not work
local my_dict = vim.g.my_dict   --
my_dict.field1 = 'value'        -- Instead do
vim.g.my_dict = my_dict         --
vim.g vim.g
全域 (g:) 編輯器變數。索引鍵沒有值則返回 nil
vim.b vim.b
目前緩衝區的緩衝區範圍 (b:) 變數。無效或未設定的索引鍵返回 nil。可以使用整數索引來存取特定緩衝區的變數。
vim.w vim.w
目前視窗的視窗範圍 (w:) 變數。無效或未設定的索引鍵返回 nil。可以使用整數索引來存取特定視窗的變數。
vim.t vim.t
目前索引標籤頁的索引標籤頁範圍 (t:) 變數。無效或未設定的索引鍵返回 nil。可以使用整數索引來存取特定索引標籤頁的變數。
vim.v vim.v
v: 變數。無效或未設定的索引鍵返回 nil
可以透過 vim.o 存取 Vim 選項,其行為類似於 Vimscript :set
範例
若要設定布林值切換:Vimscript:set number Lua:vim.o.number = true
若要設定字串值:Vimscript:set wildignore=*.o,*.a,__pycache__ Lua:vim.o.wildignore = '*.o,*.a,__pycache__'
同樣地,還有 vim.bovim.wo 可用於設定緩衝區範圍和視窗範圍的選項。請注意,這絕不能與 local-options:setlocal 混淆。還有 vim.go,它只會存取 global-local 選項的全域值,請參閱 :setglobal
存在一個特殊介面 vim.opt,可方便地從 Lua 與清單和對應樣式的選項互動:它允許將它們存取為 Lua 表格,並提供物件導向方法來新增和移除項目。
範例
以下設定清單樣式選項的方法是等效的:在 Vimscript 中
set wildignore=*.o,*.a,__pycache__
在 Lua 中使用 vim.o
vim.o.wildignore = '*.o,*.a,__pycache__'
在 Lua 中使用 vim.opt
vim.opt.wildignore = { '*.o', '*.a', '__pycache__' }
若要複製 :set+= 的行為,請使用
vim.opt.wildignore:append { "*.pyc", "node_modules" }
若要複製 :set^= 的行為,請使用
vim.opt.wildignore:prepend { "new_first_value" }
若要複製 :set-= 的行為,請使用
vim.opt.wildignore:remove { "node_modules" }
以下設定對應樣式選項的方法是等效的:在 Vimscript 中
set listchars=space:_,tab:>~
在 Lua 中使用 vim.o
vim.o.listchars = 'space:_,tab:>~'
在 Lua 中使用 vim.opt
vim.opt.listchars = { space = '_', tab = '>~' }
請注意,vim.opt 會返回 Option 物件,而不是選項的值,該值是透過 vim.opt:get() 存取的
範例
以下取得清單樣式選項的方法是等效的:在 Vimscript 中
echo wildignore
在 Lua 中使用 vim.o
print(vim.o.wildignore)
在 Lua 中使用 vim.opt
vim.print(vim.opt.wildignore:get())
在上述任何範例中,若要複製 :setlocal 的行為,請使用 vim.opt_local。此外,若要複製 :setglobal 的行為,請使用 vim.opt_global
Option:append({value}) vim.opt:append()
將值附加到字串樣式的選項。請參閱 :set+=
這些是等效的
vim.opt.formatoptions:append('j')
vim.opt.formatoptions = vim.opt.formatoptions + 'j'
參數
{value} (string) 要附加的值
Option:get() vim.opt:get()
傳回選項的 Lua 表示形式。布林值、數字和字串值將以完全相同的方式傳回。
對於以逗號分隔的列表值,將會傳回一個陣列,其中值為陣列中的項目
vim.cmd [[set wildignore=*.pyc,*.o]]
vim.print(vim.opt.wildignore:get())
-- { "*.pyc", "*.o", }
for _, ignore_pattern in ipairs(vim.opt.wildignore:get()) do
    print("Will ignore:", ignore_pattern)
end
-- Will ignore: *.pyc
-- Will ignore: *.o
對於以逗號分隔的映射值,將會傳回一個表格,其中名稱為鍵,值為項目
vim.cmd [[set listchars=space:_,tab:>~]]
vim.print(vim.opt.listchars:get())
--  { space = "_", tab = ">~", }
for char, representation in pairs(vim.opt.listchars:get()) do
    print(char, "=>", representation)
end
對於旗標列表值,將會傳回一個集合,其中旗標為鍵,true 為項目。
vim.cmd [[set formatoptions=njtcroql]]
vim.print(vim.opt.formatoptions:get())
-- { n = true, j = true, c = true, ... }
local format_opts = vim.opt.formatoptions:get()
if format_opts.j then
    print("J is enabled!")
end
傳回
(string|integer|boolean?) 選項的值
Option:prepend({value}) vim.opt:prepend()
將值加到字串樣式的選項前面。請參閱 :set^=
這些是等效的
vim.opt.wildignore:prepend('*.o')
vim.opt.wildignore = vim.opt.wildignore ^ '*.o'
參數
{value} (string) 要加在前面的值
Option:remove({value}) vim.opt:remove()
從字串樣式的選項中移除值。請參閱 :set-=
這些是等效的
vim.opt.wildignore:remove('*.pyc')
vim.opt.wildignore = vim.opt.wildignore - '*.pyc'
參數
{value} (string) 要移除的值
vim.bo[{bufnr}] vim.bo
取得或設定緩衝區範圍的選項,用於編號為 {bufnr} 的緩衝區。類似 :setlocal。如果省略 {bufnr},則使用目前的緩衝區。無效的 {bufnr} 或鍵會產生錯誤。
範例
local bufnr = vim.api.nvim_get_current_buf()
vim.bo[bufnr].buflisted = true    -- same as vim.bo.buflisted = true
print(vim.bo.comments)
print(vim.bo.baz)                 -- error: invalid key
vim.env vim.env
在編輯器會期中定義的環境變數。請參閱 expand-env:let-environment 以了解 Vimscript 的行為。無效或未設定的鍵會傳回 nil
範例
vim.env.FOO = 'bar'
print(vim.env.TERM)
vim.go vim.go
取得或設定全域選項。類似 :setglobal。無效的鍵會產生錯誤。
注意:這與 vim.o 不同,因為這會存取全域選項值,因此主要用於全域-本機選項。
範例
vim.go.cmdheight = 4
print(vim.go.columns)
print(vim.go.bar)     -- error: invalid key
vim.o vim.o
取得或設定選項。類似 :set。無效的鍵會產生錯誤。
注意:這會使用目前的緩衝區和視窗,對緩衝區範圍和視窗範圍的選項都有效。
範例
vim.o.cmdheight = 4
print(vim.o.columns)
print(vim.o.foo)     -- error: invalid key
vim.wo[{winid}][{bufnr}] vim.wo
取得或設定視窗範圍的選項,用於控制代碼為 {winid} 的視窗和編號為 {bufnr} 的緩衝區。如果設定全域-本機選項或提供 {bufnr},則類似 :setlocal;否則類似 :set。如果省略 {winid},則使用目前的視窗。無效的 {winid}{bufnr} 或鍵會產生錯誤。
注意:僅支援 {bufnr} 的值為 0 (視窗中的目前緩衝區)。
範例
local winid = vim.api.nvim_get_current_win()
vim.wo[winid].number = true    -- same as vim.wo.number = true
print(vim.wo.foldmarker)
print(vim.wo.quux)             -- error: invalid key
vim.wo[winid][0].spell = false -- like ':setlocal nospell'

Lua 模組:vim lua-vim

vim.cmd({command}) vim.cmd()
執行 Vim 指令碼命令。
請注意,可以使用指令名稱為 vim.cmd 建立索引,以傳回可呼叫的命令函式。
範例
vim.cmd('echo 42')
vim.cmd([[
  augroup My_group
    autocmd!
    autocmd FileType c setlocal cindent
  augroup END
]])
-- Ex command :echo "foo"
-- Note string literals need to be double quoted.
vim.cmd('echo "foo"')
vim.cmd { cmd = 'echo', args = { '"foo"' } }
vim.cmd.echo({ args = { '"foo"' } })
vim.cmd.echo('"foo"')
-- Ex command :write! myfile.txt
vim.cmd('write! myfile.txt')
vim.cmd { cmd = 'write', args = { "myfile.txt" }, bang = true }
vim.cmd.write { args = { "myfile.txt" }, bang = true }
vim.cmd.write { "myfile.txt", bang = true }
-- Ex command :colorscheme blue
vim.cmd('colorscheme blue')
vim.cmd.colorscheme('blue')
參數
{command} (string|table) 要執行的命令。如果是字串,則一次執行多行 Vim 指令碼。在這種情況下,它是 nvim_exec2() 的別名,其中 opts.output 設定為 false。因此,它的運作方式與 :source 相同。如果是表格,則執行單一命令。在這種情況下,它是 nvim_cmd() 的別名,其中 opts 為空。
另請參閱
vim.defer_fn({fn}, {timeout}) vim.defer_fn()
將呼叫 {fn} 延遲到 {timeout} 毫秒經過之後。
用來執行呼叫 {fn} 的單次計時器。注意:{fn} 會自動被 vim.schedule_wrap() 包裝,因此可以安全地呼叫 API 函式。
參數
{fn} (function) 在 timeout 過期後呼叫的回呼
{timeout} (integer) 在呼叫 fn 之前等待的毫秒數
傳回
(table) 計時器 luv 計時器物件
vim.deprecate()
vim.deprecate({name}, {alternative}, {version}, {plugin}, {backtrace}) 向使用者顯示棄用訊息。
參數
{name} (string)已棄用的功能 (函式、API 等)。
{alternative} (string?) 建議的替代功能。
{version} (string) 將移除已棄用函式的版本。
{plugin} (string?) 擁有已棄用功能的外掛程式名稱。預設為「Nvim」。
{backtrace} (boolean?) 列印回溯追蹤。預設為 true。
傳回
(string?)已棄用的訊息,如果未顯示訊息則為 nil。
vim.inspect() vim.inspect()
取得給定物件的人類可讀表示形式。
傳回
(string)
vim.keycode({str}) vim.keycode()
翻譯鍵碼。
範例
local k = vim.keycode
vim.g.mapleader = k'<bs>'
參數
{str} (string) 要轉換的字串。
傳回
(string)
vim.lua_omnifunc({find_start}) vim.lua_omnifunc()
Omnifunc 用於從執行階段 Lua 解譯器完成 Lua 值,類似於 :lua 命令的內建完成。
在 Lua 緩衝區中使用 set omnifunc=v:lua.vim.lua_omnifunc 啟動。
參數
{find_start} (1|0)
vim.notify({msg}, {level}, {opts}) vim.notify()
向使用者顯示通知。
此外掛程式可以覆寫此函式,以使用自訂提供者 (例如系統通知提供者) 顯示通知。預設會寫入 :messages
參數
{msg} (string) 要向使用者顯示的通知內容。
{level} (integer?) vim.log.levels 的其中一個值。
{opts} (table?) 選用參數。預設未使用。
vim.notify_once({msg}, {level}, {opts}) vim.notify_once()
只顯示一次通知。
類似 vim.notify(),但後續使用相同訊息呼叫不會顯示通知。
參數
{msg} (string) 要向使用者顯示的通知內容。
{level} (integer?) vim.log.levels 的其中一個值。
{opts} (table?) 選用參數。預設未使用。
傳回
(boolean) 如果已顯示訊息則為 true,否則為 false
vim.on_key({fn}, {ns_id}, {opts}) vim.on_key()
將 Lua 函式 {fn} 與命名空間 ID {ns_id} 新增為每個 (是的,每個) 輸入鍵的接聽程式。
Nvim 命令列選項 -w 相關,但不支援回呼,也無法動態切換。
注意
發生錯誤時將移除 {fn}
{fn} 不會以遞迴方式叫用,也就是說,如果 {fn} 本身會取用輸入,則不會針對這些按鍵叫用它。
{fn} 不會被 nvim_buf_clear_namespace() 清除
參數
{fn} (fun(key: string, typed: string): string??) 為每個輸入鍵叫用的函式,在套用對應之後,但在進一步處理之前。引數 {key}{typed} 是原始鍵碼,其中 {key} 是在套用對應之後的按鍵,而 {typed} 是在套用對應之前的按鍵。如果 {key} 是由非鍵入按鍵或與產生先前 {key} 的相同鍵入按鍵所產生,則 {typed} 可能為空。如果 {fn} 傳回空字串,則會捨棄/忽略 {key}。當 {fn}nil 時,會移除與命名空間 {ns_id} 相關聯的回呼。
{ns_id} (integer?) 命名空間 ID。如果為 nil 或 0,則會產生並傳回新的 nvim_create_namespace() ID。
{opts} (table?) 可選參數
傳回
(integer) 與 {fn} 相關聯的命名空間 ID。如果呼叫 on_key() 時未提供引數,則會傳回所有回呼的計數。
另請參閱
vim.paste({lines}, {phase}) vim.paste()
nvim_paste() 叫用的貼上處理程式。
注意:這僅作為「鉤子」提供,請勿直接呼叫它;而是呼叫 nvim_paste(),此函式會安排重做 (點重複) 並叫用 vim.paste
範例:在貼上時移除 ANSI 顏色代碼
vim.paste = (function(overridden)
  return function(lines, phase)
    for i,line in ipairs(lines) do
      -- Scrub ANSI color codes from paste input.
      lines[i] = line:gsub('\27%[[0-9;mK]+', '')
    end
    return overridden(lines, phase)
  end
end)(vim.paste)
參數
{lines} (string[]) 要貼上的 readfile() 樣式行清單。通道行
{phase} (-1|1|2|3) -1:「非串流」貼上:呼叫包含所有行。如果貼上是「串流的」,則 phase 表示串流狀態
1:開始貼上 (完全一次)
2:繼續貼上 (零或多次)
3:結束貼上 (完全一次)
傳回
(boolean) 如果用戶端應取消貼上,則結果為 false。
另請參閱
vim.print({...}) vim.print()
「美化列印」給定的引數,並傳回未修改的引數。
範例
local hl_normal = vim.print(vim.api.nvim_get_hl(0, { name = 'Normal' }))
參數
{...} (any)
傳回
(any) 給定的引數。
另請參閱
:=
vim.schedule_wrap({fn}) vim.schedule_wrap()
傳回透過 vim.schedule() 呼叫 {fn} 的函式。
傳回的函式會將所有引數傳遞至 {fn}
範例
function notify_readable(_err, readable)
  vim.notify("readable? " .. tostring(readable))
end
vim.uv.fs_access(vim.fn.stdpath("config"), "R", vim.schedule_wrap(notify_readable))
參數
{fn} (function)
傳回
(function)
vim.str_byteindex()
vim.str_byteindex({s}, {encoding}, {index}, {strict_indexing}) 將 UTF-32、UTF-16 或 UTF-8 {index} 轉換為位元組索引。如果 {strict_indexing} 為 false,則超出範圍的索引會傳回位元組長度,而不是擲回錯誤。
無效的 UTF-8 和 NUL 的處理方式與 vim.str_utfindex() 中相同。UTF-16 序列中間的 {index} 會向上捨入到該序列的結尾。
參數
{s} (string)
{encoding} ("utf-8"|"utf-16"|"utf-32")
{index} (integer)
{strict_indexing} (boolean?) 預設值:true
傳回
(integer)
vim.str_utfindex()
vim.str_utfindex({s}, {encoding}, {index}, {strict_indexing}) 將位元組索引轉換為 UTF-32、UTF-16 或 UTF-8 索引。如果未提供 {index},則會使用字串長度。所有索引都是以零為基礎。
如果 {strict_indexing} 為 false,則超出範圍的索引會傳回字串長度,而不是擲回錯誤。無效的 UTF-8 位元組和內嵌代理項各算作一個程式碼點。UTF-8 序列中間的 {index} 會向上捨入到該序列的結尾。
參數
{s} (string)
{encoding} ("utf-8"|"utf-16"|"utf-32")
{index} (integer?)
{strict_indexing} (boolean?) 預設值:true
傳回
(integer)
vim.system({cmd}, {opts}, {on_exit}) vim.system()
執行系統命令,如果無法執行 {cmd} 則拋出錯誤。
範例
local on_exit = function(obj)
  print(obj.code)
  print(obj.signal)
  print(obj.stdout)
  print(obj.stderr)
end
-- Runs asynchronously:
vim.system({'echo', 'hello'}, { text = true }, on_exit)
-- Runs synchronously:
local obj = vim.system({'echo', 'hello'}, { text = true }):wait()
-- { code = 0, signal = 0, stdout = 'hello', stderr = '' }
詳見 uv.spawn()注意:uv.spawn() 不同,如果無法執行 {cmd},vim.system 會拋出錯誤。
參數
{cmd} (string[]) 要執行的命令
{opts} (vim.SystemOpts?) 選項
cwd: (string) 設定子程序的目前工作目錄。
env: table<string,string> 為新程序設定環境變數。繼承目前的環境,並將 NVIM 設定為 v:servername
clear_env: (boolean) env 精確定義工作環境,而不是合併目前的環境。
stdin: (string|string[]|boolean) 如果為 true,則會開啟一個到標準輸入的管道,並可透過 SystemObj 的 write() 方法寫入。如果為 string 或 string[],則會寫入到標準輸入並關閉。預設為 false
stdout: (boolean|function) 處理來自標準輸出的輸出。當作為函式傳入時,必須具有 fun(err: string, data: string) 的簽名。預設為 true
stderr: (boolean|function) 處理來自標準錯誤輸出的輸出。當作為函式傳入時,必須具有 fun(err: string, data: string) 的簽名。預設為 true
text: (boolean) 將標準輸出和標準錯誤輸出視為文字處理。將 \r\n 替換為 \n
timeout: (integer) 使用時間限制執行命令。逾時時,程序會收到 TERM 訊號 (15),且退出碼會設定為 124。
detach: (boolean) 如果為 true,則以分離狀態產生子程序 - 這會使其成為程序群組領導者,並有效地使子程序在父程序結束後繼續執行。請注意,除非父程序對子程序的程序處理呼叫 uv.unref(),否則子程序仍會保持父程序的事件迴圈運作。
{on_exit} (fun(out: vim.SystemCompleted)?) 當子程序結束時呼叫。當提供時,命令會以非同步方式執行。接收 SystemCompleted 物件,請參閱 SystemObj:wait() 的傳回值。
傳回
(vim.SystemObj) 具有以下欄位的物件
cmd (string[]) 命令名稱和引數
pid (integer) 程序 ID
wait (fun(timeout: integer|nil): SystemCompleted) 等待程序完成。逾時時,程序會收到 KILL 訊號 (9),且退出碼會設定為 124。無法在 api-fast 中呼叫。
SystemCompleted 是一個具有以下欄位的物件
code: (integer)
signal: (integer)
stdout: (string), 如果傳遞標準輸出引數則為 nil
stderr: (string), 如果傳遞標準錯誤輸出引數則為 nil
kill (fun(signal: integer|string))
write (fun(data: string|nil)) 需要 stdin=true。傳遞 nil 以關閉串流。
is_closing (fun(): boolean)

Lua 模組:vim.inspector vim.inspector

vim.inspect_pos({bufnr}, {row}, {col}, {filter}) vim.inspect_pos()
取得指定緩衝區位置的所有項目。
也可以使用 :Inspect! 以易於閱讀的格式列印。:Inspect!
屬性
自:0.9.0 起
參數
{bufnr} (integer?) 預設為目前的緩衝區
{row} (integer?) 要檢查的列,從 0 開始。預設為目前游標的列
{col} (integer?) 要檢查的欄,從 0 開始。預設為目前游標的欄
{filter} (table?) 具有鍵值對以篩選項目的表格
{syntax} (boolean, 預設值:true) 包含基於語法的醒目提示群組。
{treesitter} (boolean, 預設值:true) 包含基於 treesitter 的醒目提示群組。
{extmarks} (boolean|"all", 預設值:true) 包含 extmark。當為 all 時,也會包含沒有 hl_group 的 extmark。
{semantic_tokens} (boolean, 預設值:true) 包含語意符記醒目提示。
傳回
(table) 具有以下鍵值對的表格。項目按照「遍歷順序」排列
treesitter: treesitter 擷取的清單
syntax: 語法群組的清單
semantic_tokens: 語意符記的清單
extmarks: extmark 的清單
buffer: 用於取得項目的緩衝區
row: 用於取得項目的列
col: 用於取得項目的欄
vim.show_pos({bufnr}, {row}, {col}, {filter}) vim.show_pos()
顯示指定緩衝區位置的所有項目。
也可以使用 :Inspect 顯示。:Inspect
屬性
自:0.9.0 起
參數
{bufnr} (integer?) 預設為目前的緩衝區
{row} (integer?) 要檢查的列,從 0 開始。預設為目前游標的列
{col} (integer?) 要檢查的欄,從 0 開始。預設為目前游標的欄
{filter} (table?) 具有以下欄位的表格
{syntax} (boolean, 預設值:true) 包含基於語法的醒目提示群組。
{treesitter} (boolean, 預設值:true) 包含基於 treesitter 的醒目提示群組。
{extmarks} (boolean|"all", 預設值:true) 包含 extmark。當為 all 時,也會包含沒有 hl_group 的 extmark。
{semantic_tokens} (boolean, 預設值:true) 包含語意符記醒目提示。
欄位
{clear} (fun()) 清除所有項目
{push} (fun(item: T)) 新增一個項目,如果緩衝區已滿,則覆蓋最舊的項目。
{pop} (fun(): T?) 移除並傳回第一個未讀取的項目
{peek} (fun(): T?) 傳回第一個未讀取的項目,但不移除它
Ringbuf:clear() Ringbuf:clear()
清除所有項目
Ringbuf:peek() Ringbuf:peek()
傳回第一個未讀取的項目,但不移除它
傳回
(any?)
Ringbuf:pop() Ringbuf:pop()
移除並傳回第一個未讀取的項目
傳回
(any?)
Ringbuf:push({item}) Ringbuf:push()
新增一個項目,如果緩衝區已滿,則覆蓋最舊的項目。
參數
{item} (any)
vim.deep_equal({a}, {b}) vim.deep_equal()
深度比較值是否相等
除非表格都提供 eq 元方法,否則會以遞迴方式比較表格。所有其他類型都使用相等 == 運算子進行比較。
參數
{a} (any) 第一個值
{b} (any) 第二個值
傳回
(boolean) 如果值相等,則為 true,否則為 false
vim.deepcopy({orig}, {noref}) vim.deepcopy()
傳回指定物件的深度複製。非表格物件的複製方式與典型的 Lua 指派相同,而表格物件則以遞迴方式複製。函式會以簡單的方式複製,因此複製的表格中的函式會指向與輸入表格中相同的函式。不會複製使用者資料和執行緒,並會拋出錯誤。
注意:對於具有唯一表格欄位的表格,noref=true 的效能更高,而對於重複使用表格欄位的表格,noref=false 的效能更高。
參數
{orig} (table) 要複製的表格
{noref} (boolean?) 當為 false (預設值) 時,包含的表格只會複製一次,且所有參照都會指向此單一副本。當為 true 時,表格的每次出現都會產生新的副本。這也表示迴圈參照可能導致 deepcopy() 失敗。
傳回
(table) 已複製的鍵和 (巢狀) 值的表格。
vim.defaulttable({createfn}) vim.defaulttable()
建立一個表格,其遺失的鍵由 {createfn} 提供 (類似 Python 的 "defaultdict")。
如果 {createfn}nil,則預設為 defaulttable() 本身,因此存取巢狀鍵會建立巢狀表格
local a = vim.defaulttable()
a.b.c = 1
參數
{createfn} (fun(key:any):any?) 為遺失的 key 提供值。
傳回
(table) 具有 __index 元方法的空表格。
vim.endswith({s}, {suffix}) vim.endswith()
測試 s 是否以 suffix 結尾。
參數
{s} (string) 字串
{suffix} (string) 要比對的後綴
傳回
(boolean) 如果 suffixs 的後綴,則為 true
vim.gsplit({s}, {sep}, {opts}) vim.gsplit()
取得一個 迭代器,該迭代器會在分隔符號的每個執行個體處分割字串,以「惰性」方式 (與「積極」的 vim.split() 相反)。
範例
for s in vim.gsplit(':aa::b:', ':', {plain=true}) do
  print(s)
end
如果您也想檢查分隔符號本身 (而不是捨棄它),請使用 string.gmatch()。範例
for word, num in ('foo111bar222'):gmatch('([^0-9]*)(%d*)') do
  print(('word: %s num: %s'):format(word, num))
end
參數
{s} (string) 要分割的字串
{sep} (string) 分隔符號或模式
{opts} (table?) 關鍵字引數 kwargs
{plain} (boolean) 字面使用 sep (如 string.find 中)。
{trimempty} (boolean) 捨棄序列開頭和結尾的空片段。
傳回
(fun():string?) 分割元件的迭代器
vim.is_callable({f}) vim.is_callable()
如果物件 f 可以作為函式呼叫,則傳回 true。
參數
{f} (any) 任何物件
傳回
(boolean) 如果 f 可呼叫,則為 true,否則為 false
vim.isarray({t}) vim.isarray()
測試 t 是否為「陣列」:一個僅以整數 (可能不連續) 索引的表格。
如果索引從 1 開始且連續,則陣列也是一個列表。 vim.islist()
空表格 {} 是一個陣列,除非它是透過 vim.empty_dict() 建立,或是以類似字典的 API 或 Vimscript 結果傳回,例如來自 rpcrequest()vim.fn
參數
{t} (table?)
傳回
(boolean) 如果是類似陣列的表格,則為 true,否則為 false
vim.islist({t}) vim.islist()
測試 t 是否為「列表」:一個僅以從 1 開始的連續整數索引的表格 (也就是 lua-length 所謂的「規則陣列」)。
空表格 {} 是一個列表,除非它是透過 vim.empty_dict() 建立,或是以類似字典的 API 或 Vimscript 結果傳回,例如來自 rpcrequest()vim.fn
參數
{t} (table?)
傳回
(boolean) 如果是類似列表的表格,則為 true,否則為 false
另請參閱
vim.list_contains({t}, {value}) vim.list_contains()
檢查類似列表的表格 (沒有間隙的整數鍵) 是否包含 value
參數
{t} (table) 要檢查的表格 (必須類似列表,未驗證)
{value} (any) 要比較的值
傳回
(boolean) 如果 t 包含 value,則為 true
另請參閱
vim.tbl_contains() 用於檢查一般表格中的值
vim.list_extend({dst}, {src}, {start}, {finish}) vim.list_extend()
使用另一個類列表的表格的值來擴展一個類列表的表格。
注意: 這會改變 dst!
參數
{dst} (table) 將被修改並附加的列表
{src} (table) 將插入值的列表
{start} (integer?) src 的起始索引。預設為 1
{finish} (integer?) src 的最終索引。預設為 #src
傳回
(table) dst
另請參閱
vim.list_slice({list}, {start}, {finish}) vim.list_slice()
建立一個表格的副本,其中僅包含從開始到結束(包含)的元素
參數
{list} (any[]) 表格
{start} (integer?) 切片的起始範圍
{finish} (integer?) 切片的結束範圍
傳回
(any[]) 從開始到結束(包含)切割的表格副本
vim.pesc({s}) vim.pesc()
轉義 lua-patterns 中的魔法字元。
參數
{s} (string) 要轉義的字串
傳回
(string) %-轉義的模式字串
vim.ringbuf({size}) vim.ringbuf()
建立一個限制最大項目數的環形緩衝區。一旦緩衝區已滿,新增一個新條目會覆蓋最舊的條目。
local ringbuf = vim.ringbuf(4)
ringbuf:push("a")
ringbuf:push("b")
ringbuf:push("c")
ringbuf:push("d")
ringbuf:push("e")    -- overrides "a"
print(ringbuf:pop()) -- returns "b"
print(ringbuf:pop()) -- returns "c"
-- Can be used as iterator. Pops remaining items:
for val in ringbuf do
  print(val)
end
返回具有以下方法的 Ringbuf 實例
參數
{size} (integer)
傳回
(vim.Ringbuf) ringbuf 請參閱 vim.Ringbuf
vim.spairs({t}) vim.spairs()
列舉表格的鍵值對,並依鍵排序。
參數
{t} (table) 類似字典的表格
返回(多個)
(fun(table: table<K, V>, index?: K):K, V) 排序鍵及其值的 for-in 迭代器 (table)
vim.split({s}, {sep}, {opts}) vim.split()
在每個分隔符號的實例處分割字串,並將結果作為表格返回(與 vim.gsplit() 不同)。
範例
split(":aa::b:", ":")                   --> {'','aa','','b',''}
split("axaby", "ab?")                   --> {'','x','y'}
split("x*yz*o", "*", {plain=true})      --> {'x','yz','o'}
split("|x|y|z|", "|", {trimempty=true}) --> {'x', 'y', 'z'}
參數
{s} (string) 要分割的字串
{sep} (string) 分隔符號或模式
{opts} (table?) 關鍵字引數 kwargs
{plain} (boolean) 字面使用 sep (如 string.find 中)。
{trimempty} (boolean) 捨棄序列開頭和結尾的空片段。
傳回
(string[]) 分割元件的列表
vim.startswith({s}, {prefix}) vim.startswith()
測試 s 是否以 prefix 開頭。
參數
{s} (string) 字串
{prefix} (string) 要匹配的前綴
傳回
(boolean) 如果 prefixs 的前綴,則為 true
vim.tbl_contains({t}, {value}, {opts}) vim.tbl_contains()
檢查表格是否包含給定的值,可以直接指定,或透過檢查每個值的謂詞來指定。
範例
vim.tbl_contains({ 'a', { 'b', 'c' } }, function(v)
  return vim.deep_equal(v, { 'b', 'c' })
end, { predicate = true })
-- true
參數
{t} (table) 要檢查的表格
{value} (any) 要比較的值或謂詞函數參考
{opts} (table?) 關鍵字引數 kwargs
{predicate} (boolean) value 是一個要檢查的函數參考 (預設為 false)
傳回
(boolean) 如果 t 包含 value,則為 true
另請參閱
vim.list_contains() 用於檢查類列表表格中的值
vim.tbl_count({t}) vim.tbl_count()
計算表格 t 中非 nil 值的數量。
vim.tbl_count({ a=1, b=2 })  --> 2
vim.tbl_count({ 1, 2 })      --> 2
參數
{t} (table) 表格
傳回
(integer) 表格中非 nil 值的數量
vim.tbl_deep_extend({behavior}, {...}) vim.tbl_deep_extend()
以遞迴方式合併兩個或多個表格。
只有空表格或不是 lua-list 的表格(由從 1 開始的連續整數索引)才會以遞迴方式合併。這對於合併巢狀表格(如預設值和使用者組態,其中列表應被視為字面值(即,覆蓋而不是合併))很有用。
參數
{behavior} ('error'|'keep'|'force') 決定如果多個映射中找到一個鍵時該怎麼辦
"error": 引發錯誤
"keep": 使用最左邊映射中的值
"force": 使用最右邊映射中的值
{...} (table) 兩個或多個表格
傳回
(table) 合併的表格
另請參閱
vim.tbl_extend({behavior}, {...}) vim.tbl_extend()
合併兩個或多個表格。
參數
{behavior} ('error'|'keep'|'force') 決定如果多個映射中找到一個鍵時該怎麼辦
"error": 引發錯誤
"keep": 使用最左邊映射中的值
"force": 使用最右邊映射中的值
{...} (table) 兩個或多個表格
傳回
(table) 合併的表格
另請參閱
vim.tbl_filter({func}, {t}) vim.tbl_filter()
使用謂詞函數篩選表格
參數
{func} (function) 函數
{t} (table) 表格
傳回
(any[]) 篩選值的表格
vim.tbl_get({o}, {...}) vim.tbl_get()
透過作為後續引數傳遞的字串鍵,索引到表格(第一個引數)。如果鍵不存在,則返回 nil
範例
vim.tbl_get({ key = { nested_key = true }}, 'key', 'nested_key') == true
vim.tbl_get({ key = {}}, 'key', 'nested_key') == nil
參數
{o} (table) 要索引的表格
{...} (any) 可選的鍵(0 個或多個,可變引數),透過這些鍵來索引表格
傳回
(any) 由鍵索引的巢狀值(如果存在),否則為 nil
vim.tbl_isempty({t}) vim.tbl_isempty()
檢查表格是否為空。
參數
{t} (table) 要檢查的表格
傳回
(boolean) 如果 t 為空,則為 true
vim.tbl_keys({t}) vim.tbl_keys()
返回表格中使用的所有鍵的列表。但是,無法保證返回鍵表格的順序。
參數
{t} (table) 表格
傳回
(any[]) 鍵的列表
vim.tbl_map({func}, {t}) vim.tbl_map()
將函數套用到表格的所有值。
參數
{func} (fun(value: T): any) 函數
{t} (table<any, T>) 表格
傳回
(table) 已轉換的值的表格
vim.tbl_values({t}) vim.tbl_values()
返回表格中使用的所有值的列表。但是,無法保證返回值表格的順序。
參數
{t} (table) 表格
傳回
(any[]) 值的列表
vim.trim({s}) vim.trim()
從字串的兩側修剪空白(Lua 模式 "%s")。
參數
{s} (string) 要修剪的字串
傳回
(string) 從開頭和結尾移除空白的字串
vim.validate()
vim.validate({name}, {value}, {validator}, {optional}, {message}) 驗證函數引數。
此函數有兩種有效形式:1. vim.validate(name, value, validator[, optional][, message]) 驗證具有值 {value} 的引數 {name} 是否滿足 {validator}。如果給定 {optional} 且為 true,則 {value} 可以為 nil。如果給定 {message},則它會用作錯誤訊息中的預期類型。範例
 function vim.startswith(s, prefix)
  vim.validate('s', s, 'string')
  vim.validate('prefix', prefix, 'string')
  ...
end
2. vim.validate(spec) (已棄用) 其中 spec 的類型為 table<string,[value:any, validator: vim.validate.Validator, optional_or_msg? : boolean|string]>) 驗證引數規範。規格會依字母順序評估,直到第一個失敗為止。範例
 function user.new(name, age, hobbies)
  vim.validate{
    name={name, 'string'},
    age={age, 'number'},
    hobbies={hobbies, 'table'},
  }
  ...
end
帶有明確引數值的範例(可以直接執行)
vim.validate('arg1', {'foo'}, 'table')
   --> NOP (success)
vim.validate('arg2', 'foo', 'string')
   --> NOP (success)
vim.validate('arg1', 1, 'table')
   --> error('arg1: expected table, got number')
vim.validate('arg1', 3, function(a) return (a % 2) == 0 end, 'even number')
   --> error('arg1: expected even number, got 3')
如果多個類型有效,則可以將它們作為列表給定。
vim.validate('arg1', {'foo'}, {'table', 'string'})
vim.validate('arg2', 'foo', {'table', 'string'})
-- NOP (success)
vim.validate('arg1', 1, {'string', 'table'})
-- error('arg1: expected string|table, got number')
注意
validator 設定為 lua-type() 返回的值,可提供最佳效能。
參數
{name} (string) 引數名稱
{value} (string) 引數值
{validator} (vim.validate.Validator)
(string|string[]):除了 'callable' 之外,還可以從 lua-type() 返回的任何值:'boolean''callable''function''nil''number''string''table''thread''userdata'
(fun(val:any): boolean, string?) 返回布林值和可選字串訊息的函數。
{optional} (boolean?) 引數是可選的(可以省略)
{message} (string?) 驗證失敗時的訊息

Lua 模組:vim.loader vim.loader

vim.loader.disable() vim.loader.disable()
警告: 此功能為實驗性/不穩定功能。
停用實驗性的 Lua 模組載入器
移除載入器
新增預設的 Nvim 載入器
vim.loader.enable() vim.loader.enable()
警告: 此功能為實驗性/不穩定功能。
啟用實驗性的 Lua 模組載入器
覆寫 loadfile
新增使用位元組編譯快取的 Lua 載入器
新增 libs 載入器
移除預設的 Nvim 載入器
vim.loader.find({modname}, {opts}) vim.loader.find()
警告: 此功能為實驗性/不穩定功能。
尋找指定模組名稱的 Lua 模組。
參數
{modname} (string) 模組名稱,或 "*" 以改為尋找最上層的模組
{opts} (table?) 尋找模組的選項
{rtp} (boolean,預設值:true) 在執行階段路徑中搜尋 modname。
{paths} (string[],預設值:{}) 搜尋 modname 的額外路徑
{patterns} (string[],預設值:{"/init.lua", ".lua"}) 搜尋模組時要使用的模式清單。模式是一個新增到正在搜尋的 Lua 模組基本名稱的字串。
{all} (boolean,預設值:false) 搜尋所有符合項。
傳回
(table[]) 具有以下欄位的物件列表
{modpath} (string) 模組的路徑
{modname} (string) 模組的名稱
{stat} (uv.fs_stat.result) 模組路徑的 fs_stat。對於 modname="*" 不會回傳。
vim.loader.reset({path}) vim.loader.reset()
警告: 此功能為實驗性/不穩定功能。
重設路徑的快取,如果 path 為 nil,則重設所有路徑的快取。
參數
{path} (string?) 要重設的路徑

Lua 模組:vim.uri vim.uri

vim.uri_decode({str}) vim.uri_decode()
URI 解碼包含百分比編碼的字串。
參數
{str} (string) 要解碼的字串
傳回
(string) 解碼後的字串
vim.uri_encode({str}, {rfc}) vim.uri_encode()
使用百分比編碼來 URI 編碼字串。
參數
{str} (string) 要編碼的字串
{rfc} ("rfc2396"|"rfc2732"|"rfc3986"?)
傳回
(string) 編碼後的字串
vim.uri_from_bufnr({bufnr}) vim.uri_from_bufnr()
從 bufnr 取得 URI。
參數
{bufnr} (integer)
傳回
(string) URI
vim.uri_from_fname({path}) vim.uri_from_fname()
從檔案路徑取得 URI。
參數
{path} (string) 檔案路徑
傳回
(string) URI
vim.uri_to_bufnr({uri}) vim.uri_to_bufnr()
取得 URI 的緩衝區。如果 URI 的緩衝區尚不存在,則建立一個新的未載入的緩衝區。
參數
{uri} (string)
傳回
(integer) bufnr
vim.uri_to_fname({uri}) vim.uri_to_fname()
從 URI 取得檔名。
參數
{uri} (string)
傳回
(string) 檔名,或對於非檔案 URI 的未變更的 URI

Lua 模組:vim.ui vim.ui

vim.ui.input({opts}, {on_confirm}) vim.ui.input()
提示使用者輸入,允許任意(可能非同步)工作直到 on_confirm
範例
vim.ui.input({ prompt = 'Enter value for shiftwidth: ' }, function(input)
    vim.o.shiftwidth = tonumber(input)
end)
參數
{opts} (table?) 額外選項。請參閱 input()
prompt (string|nil) 提示文字
default (string|nil) 輸入的預設回覆
completion (string|nil) 指定輸入支援的補全類型。支援的類型與使用 "-complete=" 參數提供給使用者定義命令的類型相同。請參閱 :command-completion
highlight (function) 用於突出顯示使用者輸入的函式。
{on_confirm} (function) ((input|nil) -> ()) 一旦使用者確認或中止輸入時呼叫。input 是使用者輸入的內容(如果未輸入任何內容,則可能為空字串),如果使用者中止對話框,則為 nil
vim.ui.open({path}, {opt}) vim.ui.open()
使用系統預設處理程式開啟 path (macOS open、Windows explorer.exe、Linux xdg-open, ...),如果失敗則傳回(但不顯示)錯誤訊息。
展開檔案系統路徑中的 "~/" 和環境變數。
範例
-- Asynchronous.
vim.ui.open("https://neovim.dev.org.tw/")
vim.ui.open("~/path/to/file")
-- Use the "osurl" command to handle the path or URL.
vim.ui.open("gh#neovim/neovim!29490", { cmd = { 'osurl' } })
-- Synchronous (wait until the process exits).
local cmd, err = vim.ui.open("$VIMRUNTIME")
if cmd then
  cmd:wait()
end
參數
{path} (string) 要開啟的路徑或 URL
{opt} ({ cmd?: string[] }?) 選項
cmd string[]|nil 用於開啟路徑或 URL 的命令。
返回(多個)
(vim.SystemObj?) 命令物件,如果找不到則為 nil。(string?) 如果失敗則為錯誤訊息,如果成功則為 nil。
另請參閱
vim.ui.select({items}, {opts}, {on_choice}) vim.ui.select()
提示使用者從項目清單中選擇,允許任意(可能非同步)工作直到 on_choice
範例
vim.ui.select({ 'tabs', 'spaces' }, {
    prompt = 'Select tabs or spaces:',
    format_item = function(item)
        return "I'd like to choose " .. item
    end,
}, function(choice)
    if choice == 'spaces' then
        vim.o.expandtab = true
    else
        vim.o.expandtab = false
    end
end)
參數
{items} (any[]) 任意項目
{opts} (table) 額外選項
prompt (string|nil) 提示文字。預設為 Select one of:
format_item (function item -> text) 用於格式化 items 中個別項目的函式。預設為 tostring
kind (string|nil) 指示項目形狀的任意提示字串。重新實作 vim.ui.select 的外掛程式可能希望使用此字串來推斷 items 的結構或語義,或呼叫 select() 的上下文。
{on_choice} (fun(item: T?, idx: integer?)) 一旦使用者做出選擇時呼叫。idxitemitems 中的從 1 開始的索引。如果使用者中止對話框,則為 nil

Lua 模組:vim.filetype vim.filetype

vim.filetype.add({filetypes}) vim.filetype.add()
新增新的檔案類型對應。
檔案類型對應可以透過副檔名或檔名(「尾部」或完整檔案路徑)新增。首先檢查完整的檔案路徑,然後檢查檔名。如果使用檔名找不到匹配項,則將檔名與 lua-patterns 清單(按優先順序排序)進行匹配,直到找到匹配項。最後,如果模式匹配沒有找到檔案類型,則使用檔案副檔名。
檔案類型可以是字串(在這種情況下,它會直接用作檔案類型)或函式。如果是函式,它會將檔案的完整路徑和緩衝區編號作為引數(以及來自匹配模式的擷取,如果有),並應傳回將用作緩衝區檔案類型的字串。或者,函式可以傳回第二個函式值,當呼叫時,它會修改緩衝區的狀態。例如,這可用於設定特定於檔案類型的緩衝區變數。Nvim 會在設定緩衝區的檔案類型之前呼叫此函式。
檔名模式可以指定可選的優先順序,以解決檔案路徑與多個模式匹配的情況。較高的優先順序會先匹配。如果省略,則優先順序預設為 0。模式可以包含 "${SOME_VAR}" 形式的環境變數,這些變數將自動展開。如果未設定環境變數,則不會匹配模式。
請參閱 $VIMRUNTIME/lua/vim/filetype.lua 以取得更多範例。
範例
vim.filetype.add({
  extension = {
    foo = 'fooscript',
    bar = function(path, bufnr)
      if some_condition() then
        return 'barscript', function(bufnr)
          -- Set a buffer variable
          vim.b[bufnr].barscript_version = 2
        end
      end
      return 'bar'
    end,
  },
  filename = {
    ['.foorc'] = 'toml',
    ['/etc/foo/config'] = 'toml',
  },
  pattern = {
    ['.*/etc/foo/.*'] = 'fooscript',
    -- Using an optional priority
    ['.*/etc/foo/.*%.conf'] = { 'dosini', { priority = 10 } },
    -- A pattern containing an environment variable
    ['${XDG_CONFIG_HOME}/foo/git'] = 'git',
    ['.*README.(%a+)'] = function(path, bufnr, ext)
      if ext == 'md' then
        return 'markdown'
      elseif ext == 'rst' then
        return 'rst'
      end
    end,
  },
})
若要新增內容的備用匹配,請使用
vim.filetype.add {
  pattern = {
    ['.*'] = {
      function(path, bufnr)
        local content = vim.api.nvim_buf_get_lines(bufnr, 0, 1, false)[1] or ''
        if vim.regex([[^#!.*\\<mine\\>]]):match_str(content) ~= nil then
          return 'mine'
        elseif vim.regex([[\\<drawing\\>]]):match_str(content) ~= nil then
          return 'drawing'
        end
      end,
      { priority = -math.huge },
    },
  },
}
參數
{filetypes} (table) 包含新檔案類型對應的表格(請參閱範例)。
{pattern} (vim.filetype.mapping)
{extension} (vim.filetype.mapping)
{filename} (vim.filetype.mapping)
vim.filetype.get_option()
vim.filetype.get_option({filetype}, {option}) 取得 {filetype} 的預設選項值。
傳回的值是設定 'filetype' 後在新的緩衝區中設定的值,表示它應遵循所有 FileType 自動指令和 ftplugin 檔案。
範例
vim.filetype.get_option('vim', 'commentstring')
注意:這使用 nvim_get_option_value() 但會快取結果。這表示 ftpluginFileType 自動指令只會觸發一次,可能無法反映後續的變更。
屬性
自:0.9.0 起
參數
{filetype} (string) 檔案類型
{option} (string) 選項名稱
傳回
(string|boolean|integer) 選項值
vim.filetype.match({args}) vim.filetype.match()
執行檔案類型偵測。
可以使用三種方法之一來偵測檔案類型:1. 使用現有的緩衝區 2. 僅使用檔名 3. 僅使用檔案內容
其中,選項 1 提供最準確的結果,因為它同時使用緩衝區的檔名和(可選)緩衝區內容。選項 2 和 3 可以在沒有現有緩衝區的情況下使用,但在檔名(或內容)無法明確判斷檔案類型的情況下,可能無法提供匹配項。
這三個選項中的每一個都使用此函式單一引數的鍵來指定。範例
-- Using a buffer number
vim.filetype.match({ buf = 42 })
-- Override the filename of the given buffer
vim.filetype.match({ buf = 42, filename = 'foo.c' })
-- Using a filename without a buffer
vim.filetype.match({ filename = 'main.lua' })
-- Using file contents
vim.filetype.match({ contents = {'#!/usr/bin/env bash'} })
參數
{args} (table) 指定要使用哪種匹配策略的表格。接受的鍵為
{buf} (integer) 用於匹配的緩衝區編號。與 {contents} 互斥
{filename} (string) 用於匹配的檔名。當給定 {buf} 時,預設為給定緩衝區編號的檔名。該檔案實際上不需要存在於檔案系統中。當不使用 {buf} 時,僅使用檔案名稱進行檔案類型匹配。如果檔名不足以消除檔案類型歧義,這可能會導致無法偵測到檔案類型。
{contents} (string[]) 代表用於匹配的檔案內容的行陣列。可以與 {filename} 一起使用。與 {buf} 互斥。
返回(多個)
(string?) 如果找到匹配項,則為匹配的檔案類型。(function?) 一個函式,當呼叫時會修改緩衝區狀態(例如,設定一些特定於檔案類型的緩衝區變數)。該函式接受一個緩衝區編號作為其唯一引數。

Lua 模組:vim.keymap vim.keymap

vim.keymap.del({modes}, {lhs}, {opts}) vim.keymap.del()
移除現有的對應。範例
vim.keymap.del('n', 'lhs')
vim.keymap.del({'n', 'i', 'v'}, '<leader>w', { buffer = 5 })
參數
{modes} (string|string[])
{lhs} (string)
{opts} (table?) 包含以下欄位的表格
{buffer} (integer|boolean) 從給定的緩衝區中移除對應。當為 0true 時,使用目前的緩衝區。
另請參閱
vim.keymap.set({mode}, {lhs}, {rhs}, {opts}) vim.keymap.set()
定義 對應 按鍵碼 到函式或按鍵碼。
範例
-- Map "x" to a Lua function:
vim.keymap.set('n', 'x', function() print("real lua function") end)
-- Map "<leader>x" to multiple modes for the current buffer:
vim.keymap.set({'n', 'v'}, '<leader>x', vim.lsp.buf.references, { buffer = true })
-- Map <Tab> to an expression (|:map-<expr>|):
vim.keymap.set('i', '<Tab>', function()
  return vim.fn.pumvisible() == 1 and "<C-n>" or "<Tab>"
end, { expr = true })
-- Map "[%%" to a <Plug> mapping:
vim.keymap.set('n', '[%%', '<Plug>(MatchitNormalMultiBackward)')
參數
{mode} (string|string[]) 模式「短名稱」(請參閱 nvim_set_keymap()),或其清單。
{lhs} (string) 對應的左側 {lhs}
{rhs} (string|function) 對應的右側 {rhs},可以是 Lua 函式。
{opts} (table?) :map-arguments 表格。與 nvim_set_keymap(){opts} 相同,除了
如果 "expr" 為 true,則 {replace_keycodes} 預設為 true
也接受
{buffer} (integer|boolean) 建立緩衝區局部對應,0true 表示目前的緩衝區。
{remap} (boolean, 預設值:false) 使對應成為遞迴的。與 {noremap} 相反。

Lua 模組:vim.fs vim.fs

vim.fs.basename({file}) vim.fs.basename()
返回給定路徑的檔案名稱
屬性
起始版本: 0.8.0
參數
{file} (string?) 路徑
傳回
(string?) {file} 的檔案名稱
vim.fs.dir({path}, {opts}) vim.fs.dir()
返回一個迭代器,用於迭代 {path} 中包含的項目
屬性
起始版本: 0.8.0
參數
{path} (string) 要迭代的目錄的絕對或相對路徑。該路徑會先進行正規化 vim.fs.normalize()
{opts} (table?) 可選的關鍵字參數
depth: integer|nil 遍歷的深度 (預設值為 1)
skip: (fun(dir_name: string): boolean)|nil 用於控制遍歷的判斷式。返回 false 將停止搜尋目前目錄。僅在 depth > 1 時有效
傳回
(Iterator) 迭代 {path} 中的項目。每次迭代會產生兩個值:"name" 和 "type"。"name" 是項目相對於 {path} 的檔案名稱。"type" 是下列其中之一:"file"、"directory"、"link"、"fifo"、"socket"、"char"、"block"、"unknown"。
vim.fs.dirname({file}) vim.fs.dirname()
返回給定路徑的父目錄
屬性
起始版本: 0.8.0
參數
{file} (string?) 路徑
傳回
(string?) {file} 的父目錄
vim.fs.find({names}, {opts}) vim.fs.find()
在給定路徑中尋找檔案或目錄(或由 opts.type 指定的其他項目)。
{path} 開始尋找 {names} 中給定的項目。如果 {upward} 為 "true",則搜尋會向上遍歷父目錄;否則,搜尋會向下遍歷。請注意,向下搜尋是遞迴的,可能會搜尋許多目錄!如果 {stop} 不為 nil,則當到達 {stop} 中給定的目錄時,搜尋會停止。當找到 {limit} (預設值為 1) 個符合的項目時,搜尋會終止。您可以將 {type} 設為 "file"、"directory"、"link"、"socket"、"char"、"block" 或 "fifo",以將搜尋範圍縮小到僅尋找該類型。
範例
-- list all test directories under the runtime directory
local test_dirs = vim.fs.find(
  {'test', 'tst', 'testdir'},
  {limit = math.huge, type = 'directory', path = './runtime/'}
)
-- get all files ending with .cpp or .hpp inside lib/
local cpp_hpp = vim.fs.find(function(name, path)
  return name:match('.*%.[ch]pp$') and path:match('[/\\\\]lib$')
end, {limit = math.huge, type = 'file'})
屬性
起始版本: 0.8.0
參數
{names} (string|string[]|fun(name: string, path: string): boolean) 要尋找的項目名稱。必須是檔案名稱,當 {names} 為字串或表格時,不支援路徑和 glob 模式。如果 {names} 是一個函式,則會針對每個遍歷的項目呼叫該函式,並帶有參數
name: 目前項目的檔案名稱
path: 目前項目的完整路徑。如果給定項目被視為符合,則該函式應返回 true
{opts} (table) 可選的關鍵字參數
{path} (string) 開始搜尋的路徑。如果省略,則會使用目前目錄
{upward} (boolean, 預設值: false) 向上搜尋父目錄。否則,搜尋子目錄(遞迴)。
{stop} (string) 當到達此目錄時停止搜尋。不會搜尋該目錄本身。
{type} (string) 僅尋找給定類型的項目。如果省略,則會包含所有符合 {names} 的項目。
{limit} (number, 預設值: 1) 在找到這麼多個符合的項目後停止搜尋。使用 math.huge 對符合的項目數量不設限制。
傳回
(string[]) 所有符合項目的正規化路徑 vim.fs.normalize()
vim.fs.joinpath({...}) vim.fs.joinpath()
將目錄和/或檔案路徑串連成一個具有正規化的單一路徑 (例如,"foo/""bar" 會被連接成 "foo/bar")
屬性
起始版本: 0.10.0
參數
{...} (string)
傳回
(string)
vim.fs.normalize({path}, {opts}) vim.fs.normalize()
將路徑正規化為標準格式。路徑開頭的波浪符號 (~) 字元會展開為使用者的主目錄,並且也會展開環境變數。也會解析 "." 和 ".." 元件,除非路徑是相對的,而且嘗試解析會導致絕對路徑。
"." 作為相對路徑中唯一的組成部分
"." => "."
"././" => "."
".." 當它導向目前目錄之外時
"foo/../../bar" => "../bar"
"../../foo" => "../../foo"
根目錄中的 ".." 會返回根目錄。
"/../../" => "/"
在 Windows 上,反斜線 (\) 字元會轉換為正斜線 (/)。
範例
[[C:\Users\jdoe]]                         => "C:/Users/jdoe"
"~/src/neovim"                            => "/home/jdoe/src/neovim"
"$XDG_CONFIG_HOME/nvim/init.vim"          => "/Users/jdoe/.config/nvim/init.vim"
"~/src/nvim/api/../tui/./tui.c"           => "/home/jdoe/src/nvim/tui/tui.c"
"./foo/bar"                               => "foo/bar"
"foo/../../../bar"                        => "../../bar"
"/home/jdoe/../../../bar"                 => "/bar"
"C:foo/../../baz"                         => "C:../baz"
"C:/foo/../../baz"                        => "C:/baz"
[[\\?\UNC\server\share\foo\..\..\..\bar]] => "//?/UNC/server/share/bar"
屬性
起始版本: 0.8.0
參數
{path} (string) 要正規化的路徑
{opts} (table?) 包含以下欄位的表格
{expand_env} (boolean, 預設值: true) 展開環境變數。
{win} (boolean, 在 Windows 中預設值為 true,否則為 false) 路徑是 Windows 路徑。
傳回
(string) 正規化路徑
vim.fs.parents({start}) vim.fs.parents()
迭代給定路徑的所有父目錄。
範例
local root_dir
for dir in vim.fs.parents(vim.api.nvim_buf_get_name(0)) do
  if vim.fn.isdirectory(dir .. "/.git") == 1 then
    root_dir = dir
    break
  end
end
if root_dir then
  print("Found git repository at", root_dir)
end
屬性
起始版本: 0.8.0
參數
{start} (string) 起始路徑。
返回(多個)
(fun(_, dir: string): string?) 迭代器 (nil) (string?)
vim.fs.rm({path}, {opts}) vim.fs.rm()
警告: 此功能為實驗性/不穩定功能。
移除檔案或目錄
參數
{path} (string) 要移除的路徑
{opts} (table?) 包含以下欄位的表格
{recursive} (boolean) 遞迴移除目錄及其內容
{force} (boolean) 忽略不存在的檔案和引數
vim.fs.root({source}, {marker}) vim.fs.root()
相對於檔案路徑或緩衝區,尋找包含特定「標記」的第一個父目錄。
如果緩衝區未命名(沒有備份檔案)或具有非空的 'buftype',則搜尋會從 Nvim 的 目前目錄開始。
範例
-- Find the root of a Python project, starting from file 'main.py'
vim.fs.root(vim.fs.joinpath(vim.env.PWD, 'main.py'), {'pyproject.toml', 'setup.py' })
-- Find the root of a git repository
vim.fs.root(0, '.git')
-- Find the parent directory containing any file with a .csproj extension
vim.fs.root(0, function(name, path)
  return name:match('%.csproj$') ~= nil
end)
屬性
起始版本: 0.10.0
參數
{source} (integer|string) 要開始搜尋的緩衝區編號(目前緩衝區為 0)或檔案路徑(絕對或相對於目前目錄)。
{marker} (string|string[]|fun(name: string, path: string): boolean) 要搜尋的標記或標記列表。如果是一個函式,則會針對每個評估的項目呼叫該函式,並且如果 {name}{path} 符合,則應返回 true。
傳回
(string?) 包含給定標記之一的目錄路徑,如果找不到目錄則為 nil。

Lua 模組:vim.glob vim.glob

vim.glob.to_lpeg({pattern}) vim.glob.to_lpeg()
將原始 glob 模式剖析為 lua-lpeg 模式。
Glob 模式可以具有下列語法
* 比對路徑段中的一或多個字元
? 比對路徑段中的一個字元
** 比對任何數量的路徑段,包括無
{} 將條件分組 (例如,*.{ts,js} 比對 TypeScript 和 JavaScript 檔案)
[] 宣告要在路徑段中比對的字元範圍 (例如,example.[0-9] 比對 example.0example.1、…)
[!...] 對路徑段中比對的字元範圍求反 (例如,example.[!0-9] 比對 example.aexample.b,但不比對 example.0)
參數
{pattern} (string) 原始 glob 模式
傳回
(vim.lpeg.Pattern) 模式:模式的 lua-lpeg 表示

VIM.LPEG vim.lpeg

LPeg 是一個 Lua 的模式比對程式庫,基於剖析表示文法 (PEGs)。 https://bford.info/packrat/
lua-lpeg vim.lpeg.Pattern 用於剖析表示文法的 LPeg 程式庫以 vim.lpeg 包含 (https://www.inf.puc-rio.br/~roberto/lpeg/)。
此外,其類似 regex 的介面可用作 vim.re (https://www.inf.puc-rio.br/~roberto/lpeg/re.html)。
Pattern:match({subject}, {init}, {...}) Pattern:match()
根據 subject 字串比對給定的 pattern。如果比對成功,則會返回 subject 中比對後第一個字元的索引,或返回擷取的值(如果模式擷取了任何值)。可選的數值引數 init 會使比對從 subject 字串中的該位置開始。如同 Lua 程式庫中常見的情況,負值會從結尾開始計算。與典型的模式比對函式不同,match 僅在錨定模式下運作;也就是說,它會嘗試將模式與給定 subject 字串的字首(在位置 init)進行比對,而不是與 subject 的任意子字串進行比對。因此,如果我們想要在字串中的任何位置尋找模式,我們必須在 Lua 中編寫迴圈,或編寫一個在任何位置比對的模式。
範例
local pattern = lpeg.R('az') ^ 1 * -1
assert(pattern:match('hello') == 6)
assert(lpeg.match(pattern, 'hello') == 6)
assert(pattern:match('1 hello') == nil)
參數
{subject} (string)
{init} (integer?)
{...} (any)
傳回
(any) ...
vim.lpeg.B({pattern}) vim.lpeg.B()
返回一個模式,該模式只有在目前位置的輸入字串前面有 patt 時才比對。模式 patt 必須僅比對具有一些固定長度的字串,並且不能包含擷取。與 and 述詞一樣,此模式永遠不會使用任何輸入,無論成功或失敗。
參數
{pattern} (vim.lpeg.Pattern|string|integer|boolean|table)
傳回
(vim.lpeg.Pattern)
vim.lpeg.C({patt}) vim.lpeg.C()
建立一個簡單的擷取,該擷取會擷取與 patt 比對的 subject 子字串。擷取的值是一個字串。如果 patt 有其他擷取,則它們的值會在此值之後返回。
範例
local function split (s, sep)
  sep = lpeg.P(sep)
  local elem = lpeg.C((1 - sep) ^ 0)
  local p = elem * (sep * elem) ^ 0
  return lpeg.match(p, s)
end
local a, b, c = split('a,b,c', ',')
assert(a == 'a')
assert(b == 'b')
assert(c == 'c')
參數
{patt} (vim.lpeg.Pattern|string|integer|boolean|table|function)
傳回
(vim.lpeg.Capture)
vim.lpeg.Carg({n}) vim.lpeg.Carg()
建立一個引數擷取。此模式比對空字串,並產生在呼叫 lpeg.match 時作為第 n 個額外引數給定的值。
參數
{n} (integer)
傳回
(vim.lpeg.Capture)
vim.lpeg.Cb({name}) vim.lpeg.Cb()
建立一個返回擷取。此模式比對空字串,並產生最近使用名稱 name 的群組擷取(其中 name 可以是任何 Lua 值)所產生的值。最近使用是指具有給定名稱的最後一個完整最外層群組擷取。完整擷取是指與擷取對應的整個模式已比對。最外層擷取是指擷取不在另一個完整擷取內部。與 LPeg 不指定何時評估擷取的方式相同,它不會指定是否重複使用先前由群組產生的值,還是重新評估它們。
參數
{name} (any)
傳回
(vim.lpeg.Capture)
vim.lpeg.Cc({...}) vim.lpeg.Cc()
建立一個常數擷取。此模式比對空字串,並產生所有給定的值作為其擷取的值。
參數
{...} (any)
傳回
(vim.lpeg.Capture)
vim.lpeg.Cf({patt}, {func}) vim.lpeg.Cf()
建立一個摺疊擷取。如果 patt 產生擷取列表 C1 C2 ... Cn,則此擷取將產生值 func(...func(func(C1, C2), C3)...,Cn),也就是說,它將使用函式 func 來摺疊(或累積,或簡化)patt 的擷取。此擷取假設 patt 至少應產生一個至少有一個值(任何類型)的擷取,此擷取會成為累加器的初始值。(如果您需要特定的初始值,您可以在 patt 前面加上常數擷取。)對於每個後續擷取,LPeg 會以累加器作為第一個引數和擷取產生所有值作為額外引數來呼叫 func;此呼叫的第一個結果會成為累加器的新值。累加器的最終值會成為擷取的值。
範例
local number = lpeg.R('09') ^ 1 / tonumber
local list = number * (',' * number) ^ 0
local function add(acc, newvalue) return acc + newvalue end
local sum = lpeg.Cf(list, add)
assert(sum:match('10,30,43') == 83)
參數
{patt} (vim.lpeg.Pattern|string|integer|boolean|table|function)
{func} (fun(acc, newvalue))
傳回
(vim.lpeg.Capture)
vim.lpeg.Cg({patt}, {name}) vim.lpeg.Cg()
建立一個群組捕獲。它將 patt 返回的所有值分組到單一捕獲中。群組可以是匿名的(如果沒有給定名稱),或使用給定的名稱命名(該名稱可以是任何非 nil 的 Lua 值)。
參數
{patt} (vim.lpeg.Pattern|string|integer|boolean|table|function)
{name} (string?)
傳回
(vim.lpeg.Capture)
vim.lpeg.Cmt({patt}, {fn}) vim.lpeg.Cmt()
建立一個匹配時捕獲。與所有其他捕獲不同,這個捕獲會在匹配發生時立即進行評估(即使它是稍後會失敗的較大模式的一部分)。它會強制立即評估其所有巢狀捕獲,然後呼叫 function。給定的函式會收到整個主題、目前位置(在 patt 匹配之後),以及 patt 產生的任何捕獲值作為參數。函式返回的第一個值定義了匹配如何發生。如果呼叫返回一個數字,則匹配成功,且返回的數字會成為新的目前位置。(假設主題為 s 且目前位置為 i,則返回的數字必須在 [i, len(s) + 1] 範圍內。)如果呼叫返回 true,則匹配成功且不消耗任何輸入(因此,返回 true 等同於返回 i)。如果呼叫返回 falsenil 或沒有值,則匹配失敗。函式返回的任何額外值都會成為捕獲產生的值。
參數
{patt} (vim.lpeg.Pattern|string|integer|boolean|table|function)
{fn} (fun(s: string, i: integer, ...: any)) (position: boolean|integer, ...: any)
傳回
(vim.lpeg.Capture)
vim.lpeg.Cp() vim.lpeg.Cp()
建立一個位置捕獲。它會匹配空字串並捕獲主題中發生匹配的位置。捕獲的值是一個數字。
範例
local I = lpeg.Cp()
local function anywhere(p) return lpeg.P({I * p * I + 1 * lpeg.V(1)}) end
local match_start, match_end = anywhere('world'):match('hello world!')
assert(match_start == 7)
assert(match_end == 12)
傳回
(vim.lpeg.Capture)
vim.lpeg.Cs({patt}) vim.lpeg.Cs()
建立一個替換捕獲。此函式會建立一個替換捕獲,它會捕獲與 patt 匹配的主題子字串,並進行替換。對於 patt 內任何具有值的捕獲,與該捕獲匹配的子字串會被替換為捕獲值(應為字串)。最終捕獲的值是所有替換產生的字串。
範例
local function gsub (s, patt, repl)
  patt = lpeg.P(patt)
  patt = lpeg.Cs((patt / repl + 1) ^ 0)
  return lpeg.match(patt, s)
end
assert(gsub('Hello, xxx!', 'xxx', 'World') == 'Hello, World!')
參數
{patt} (vim.lpeg.Pattern|string|integer|boolean|table|function)
傳回
(vim.lpeg.Capture)
vim.lpeg.Ct({patt}) vim.lpeg.Ct()
建立一個表格捕獲。此捕獲會傳回一個表格,其中包含 patt 內所有匿名捕獲產生的值,並以連續的整數鍵(從 1 開始)儲存在此表格中。此外,對於 patt 建立的每個命名捕獲群組,該群組的第一個值會以群組名稱作為其鍵放入表格中。捕獲的值只有表格。
參數
{patt} (vim.lpeg.Pattern|string|integer|boolean|table|function)
傳回
(vim.lpeg.Capture)
vim.lpeg.locale({tab}) vim.lpeg.locale()
傳回一個表格,其中包含根據目前地區設定匹配某些字元類別的模式。表格具有名為 alnumalphacntrldigitgraphlowerprintpunctspaceupperxdigit 的欄位,每個欄位都包含一個對應的模式。每個模式都會匹配屬於其類別的任何單一字元。如果使用引數 table 呼叫,則會在給定表格內建立這些欄位並傳回該表格。
範例
lpeg.locale(lpeg)
local space = lpeg.space ^ 0
local name = lpeg.C(lpeg.alpha ^ 1) * space
local sep = lpeg.S(',;') * space
local pair = lpeg.Cg(name * '=' * space * name) * sep ^ -1
local list = lpeg.Cf(lpeg.Ct('') * pair ^ 0, rawset)
local t = list:match('a=b, c = hi; next = pi')
assert(t.a == 'b')
assert(t.c == 'hi')
assert(t.next == 'pi')
local locale = lpeg.locale()
assert(type(locale.digit) == 'userdata')
參數
{tab} (table?)
傳回
(vim.lpeg.Locale)
vim.lpeg.match({pattern}, {subject}, {init}, {...}) vim.lpeg.match()
根據 subject 字串比對給定的 pattern。如果比對成功,則會返回 subject 中比對後第一個字元的索引,或返回擷取的值(如果模式擷取了任何值)。可選的數值引數 init 會使比對從 subject 字串中的該位置開始。如同 Lua 程式庫中常見的情況,負值會從結尾開始計算。與典型的模式比對函式不同,match 僅在錨定模式下運作;也就是說,它會嘗試將模式與給定 subject 字串的字首(在位置 init)進行比對,而不是與 subject 的任意子字串進行比對。因此,如果我們想要在字串中的任何位置尋找模式,我們必須在 Lua 中編寫迴圈,或編寫一個在任何位置比對的模式。
範例
local pattern = lpeg.R('az') ^ 1 * -1
assert(pattern:match('hello') == 6)
assert(lpeg.match(pattern, 'hello') == 6)
assert(pattern:match('1 hello') == nil)
參數
{pattern} (vim.lpeg.Pattern|string|integer|boolean|table|function)
{subject} (string)
{init} (integer?)
{...} (any)
傳回
(any) ...
vim.lpeg.P({value}) vim.lpeg.P()
將給定值轉換為適當的模式。會套用下列規則
如果引數是一個模式,則會不經修改地傳回它。
如果引數是一個字串,則會將它轉換為一個完全匹配該字串的模式。
如果引數是一個非負數 n,則結果是一個完全匹配 n 個字元的模式。
如果引數是一個負數 -n,則結果是一個只有在輸入字串剩下少於 n 個字元時才會成功的模式:lpeg.P(-n) 等同於 -lpeg.P(n) (請參閱一元減號運算)。
如果引數是一個布林值,則結果是一個永遠成功或永遠失敗(根據布林值)且不消耗任何輸入的模式。
如果引數是一個表格,則會將它解譯為文法(請參閱文法)。
如果引數是一個函式,則會傳回一個等同於對空字串進行匹配時捕獲的模式。
參數
{value} (vim.lpeg.Pattern|string|integer|boolean|table|function)
傳回
(vim.lpeg.Pattern)
vim.lpeg.R({...}) vim.lpeg.R()
傳回一個匹配屬於給定範圍之一的任何單一字元的模式。每個 range 都是一個長度為 2 的字串 xy,表示所有代碼介於 xy 的代碼之間的字元(包括兩者)。例如,模式 lpeg.R('09') 會匹配任何數字,而 lpeg.R('az', 'AZ') 會匹配任何 ASCII 字母。
範例
local pattern = lpeg.R('az') ^ 1 * -1
assert(pattern:match('hello') == 6)
參數
{...} (string)
傳回
(vim.lpeg.Pattern)
vim.lpeg.S({string}) vim.lpeg.S()
傳回一個匹配出現在給定字串中任何單一字元的模式(S 代表集合)。例如,模式 lpeg.S('+-*/') 會匹配任何算術運算子。請注意,如果 s 是一個字元(即長度為 1 的字串),則 lpeg.P(s) 等同於 lpeg.S(s),而 lpeg.S(s) 又等同於 lpeg.R(s..s)。另請注意,lpeg.S('')lpeg.R() 都是永遠會失敗的模式。
參數
{string} (string)
傳回
(vim.lpeg.Pattern)
vim.lpeg.setmaxstack({max}) vim.lpeg.setmaxstack()
設定 LPeg 用來追蹤呼叫和選項的回溯堆疊大小限制。預設限制為 400。大多數寫得好的模式只需要少量回溯層級,因此您很少需要變更此限制;在變更此限制之前,您應嘗試重寫模式以避免需要額外的空間。儘管如此,少數有用的模式可能會溢位。此外,對於遞迴文法,具有深度遞迴的主題也可能需要更大的限制。
參數
{max} (integer)
vim.lpeg.type({value}) vim.lpeg.type()
如果給定值是一個模式,則傳回字串 "pattern",否則傳回 nil
參數
{value} (vim.lpeg.Pattern|string|integer|boolean|table|function)
傳回
("pattern"?)
vim.lpeg.V({v}) vim.lpeg.V()
為文法建立一個非終端符號(變數)。此運算會為文法建立一個非終端符號(變數)。建立的非終端符號會參考封閉文法中由 v 索引的規則。
範例
local b = lpeg.P({'(' * ((1 - lpeg.S '()') + lpeg.V(1)) ^ 0 * ')'})
assert(b:match('((string))') == 11)
assert(b:match('(') == nil)
參數
{v} (boolean|string|number|function|table|thread|userdata|lightuserdata)
傳回
(vim.lpeg.Pattern)
vim.lpeg.version() vim.lpeg.version()
傳回一個包含 LPeg 執行版本的字串。
傳回
(string)

VIM.RE vim.re

vim.re 模組為 LPeg vim.lpeg 中的模式使用提供了一種傳統的類正規表示式語法。(與 vim.regex 無關,後者提供來自 Lua 的 Vim regexp。)
請參閱 https://www.inf.puc-rio.br/~roberto/lpeg/re.html 以取得包含正規表示式語法和範例的原始文件。
vim.re.compile({string}, {defs}) vim.re.compile()
編譯給定的 {string} 並傳回等效的 LPeg 模式。給定的字串可以定義一個運算式或一個文法。選用的 {defs} 表格提供額外的 Lua 值供模式使用。
參數
{string} (string)
{defs} (table?)
傳回
(vim.lpeg.Pattern)
vim.re.find({subject}, {pattern}, {init}) vim.re.find()
在給定的 {subject} 中搜尋給定的 {pattern}。如果找到匹配,則傳回此出現開始的索引和結束的索引。否則,傳回 nil。
選用的數值引數 {init} 會讓搜尋從主題字串中的該位置開始。如同 Lua 程式庫中常見的情況,負值會從結尾開始計算。
參數
{subject} (string)
{pattern} (vim.lpeg.Pattern|string)
{init} (integer?)
返回(多個)
(integer?) 出現開始的索引,如果沒有匹配則為 nil (integer?) 出現結束的索引,如果沒有匹配則為 nil
vim.re.gsub({subject}, {pattern}, {replacement}) vim.re.gsub()
執行全域替換,將給定 {subject} 中所有出現的 {pattern} 替換為 {replacement}
參數
{subject} (string)
{pattern} (vim.lpeg.Pattern|string)
{replacement} (string)
傳回
(string)
vim.re.match({subject}, {pattern}, {init}) vim.re.match()
根據給定的 {subject} 匹配給定的 {pattern},並傳回所有捕獲。
參數
{subject} (string)
{pattern} (vim.lpeg.Pattern|string)
{init} (integer?)
傳回
(integer|vim.lpeg.Capture?)
另請參閱
vim.lpeg.match()
vim.re.updatelocale() vim.re.updatelocale()
將預先定義的字元類別更新為目前的地區設定。

VIM.REGEX vim.regex

可以直接從 Lua 使用 Vim 正規表示式。目前它們只允許在單行內進行匹配。
regex:match_line()
regex:match_line({bufnr}, {line_idx}, {start}, {end_}) 匹配緩衝區 bufnr 中位於 line_idx (從零開始) 的行。如果給定,匹配會限制在位元組索引範圍 startend_,否則請參閱 regex:match_str()。傳回的位元組索引相對於如果給定的 start
參數
{bufnr} (integer)
{line_idx} (integer)
{start} (integer?)
{end_} (integer?)
返回(多個)
(integer?) 相對於 start 的匹配開始(位元組索引),如果沒有匹配則為 nil (integer?) 相對於 start 的匹配結束(位元組索引),如果沒有匹配則為 nil
regex:match_str({str}) regex:match_str()
根據此正規表示式匹配字串 str。若要精確匹配字串,請用 "^" 和 "$" 包圍正規表示式。傳回匹配開始和結束的位元組索引,如果沒有匹配則傳回 nil。由於任何整數都是「真值」,因此 regex:match_str() 可以直接用作 if 語句中的條件。
參數
{str} (string)
返回(多個)
(integer?) 匹配開始(位元組索引),如果沒有匹配則為 nil (integer?) 匹配結束(位元組索引),如果沒有匹配則為 nil
vim.regex({re}) vim.regex()
剖析 Vim 正規表示式 re 並傳回一個正規表示式物件。正規表示式預設為「magic」且區分大小寫,無論 'magic''ignorecase' 的值為何。可以使用旗標來控制它們,請參閱 /magic/ignorecase
參數
{re} (string)
傳回
(vim.regex)

Lua 模組:vim.secure vim.secure

vim.secure.read({path}) vim.secure.read()
嘗試讀取 {path} 中的檔案,如果應該信任該檔案,則提示使用者。使用者的選擇會持久儲存在 $XDG_STATE_HOME/nvim/trust 的信任資料庫中。
屬性
自:0.9.0 起
參數
{path} (string) 要讀取的檔案路徑。
傳回
(string?) 如果給定檔案存在且受信任,則為其內容,否則為 nil。
另請參閱
vim.secure.trust({opts}) vim.secure.trust()
管理信任資料庫。
信任資料庫位於 $XDG_STATE_HOME/nvim/trust。
屬性
自:0.9.0 起
參數
{opts} (table) 包含以下欄位的表格
{action} ('allow'|'deny'|'remove') - 'allow' 將檔案加入信任資料庫並信任它,
'deny' 將檔案加入信任資料庫並拒絕它,
'remove' 從信任資料庫移除檔案
{path} (string) 要更新的檔案路徑。與 {bufnr} 互斥。當 {action} 為 "allow" 時不能使用。
{bufnr} (integer) 要更新的緩衝區編號。與 {path} 互斥。
返回(多個)
(boolean) 如果操作成功則為 true (string) 如果操作成功則為完整路徑,否則為錯誤訊息

Lua 模組:vim.version vim.version

vim.version 模組提供函數,用於比較符合 https://semver.org 規範的版本和範圍。外掛程式和外掛程式管理器可以使用它來檢查目前系統上可用的工具和相依性。
範例
local v = vim.version.parse(vim.fn.system({'tmux', '-V'}), {strict=false})
if vim.version.gt(v, {3, 2, 0}) then
  -- ...
end
vim.version() 傳回目前 Nvim 程序的版本。

版本範圍規範 version-range

版本「範圍規範」定義了語意版本範圍,可以使用 vim.version.range() 針對版本進行測試。
下表顯示支援的範圍規範。注意:不比對帶有後綴的版本 (1.2.3-rc1)。
1.2.3             is 1.2.3
=1.2.3            is 1.2.3
>1.2.3            greater than 1.2.3
<1.2.3            before 1.2.3
>=1.2.3           at least 1.2.3
~1.2.3            is >=1.2.3 <1.3.0       "reasonably close to 1.2.3"
^1.2.3            is >=1.2.3 <2.0.0       "compatible with 1.2.3"
^0.2.3            is >=0.2.3 <0.3.0       (0.x.x is special)
^0.0.1            is =0.0.1               (0.0.x is special)
^1.2              is >=1.2.0 <2.0.0       (like ^1.2.0)
~1.2              is >=1.2.0 <1.3.0       (like ~1.2.0)
^1                is >=1.0.0 <2.0.0       "compatible with 1"
~1                same                    "reasonably close to 1"
1.x               same
1.*               same
1                 same
*                 any version
x                 same
1.2.3 - 2.3.4     is >=1.2.3 <=2.3.4
Partial right: missing pieces treated as x (2.3 => 2.3.x).
1.2.3 - 2.3       is >=1.2.3 <2.4.0
1.2.3 - 2         is >=1.2.3 <3.0.0
Partial left: missing pieces treated as 0 (1.2 => 1.2.0).
1.2 - 2.3.0       is 1.2.0 - 2.3.0
vim.version.cmp({v1}, {v2}) vim.version.cmp()
解析並比較兩個版本物件(vim.version.parse() 的結果,或以 {major, minor, patch} 元組的形式直接指定,例如 {1, 0, 3})。
範例
if vim.version.cmp({1,0,3}, {0,2,1}) == 0 then
  -- ...
end
local v1 = vim.version.parse('1.0.3-pre')
local v2 = vim.version.parse('0.2.1')
if vim.version.cmp(v1, v2) == 0 then
  -- ...
end
注意
根據 semver 規範,在比較兩個其他等效的版本時,會忽略建置中繼資料。
屬性
自:0.9.0 起
參數
{v1} (vim.Version|number[]|string) 版本物件。
{v2} (vim.Version|number[]|string) 要與 v1 比較的版本。
傳回
(integer) 如果 v1 < v2 則為 -1,如果 v1 == v2 則為 0,如果 v1 > v2 則為 1。
vim.version.eq({v1}, {v2}) vim.version.eq()
如果給定的版本相等,則傳回 true。有關使用方法,請參閱 vim.version.cmp()
屬性
自:0.9.0 起
參數
{v1} (vim.Version|number[]|string)
{v2} (vim.Version|number[]|string)
傳回
(boolean)
vim.version.ge({v1}, {v2}) vim.version.ge()
如果 v1 >= v2 則傳回 true。有關使用方法,請參閱 vim.version.cmp()
屬性
起始版本: 0.10.0
參數
{v1} (vim.Version|number[]|string)
{v2} (vim.Version|number[]|string)
傳回
(boolean)
vim.version.gt({v1}, {v2}) vim.version.gt()
如果 v1 > v2 則傳回 true。有關使用方法,請參閱 vim.version.cmp()
屬性
自:0.9.0 起
參數
{v1} (vim.Version|number[]|string)
{v2} (vim.Version|number[]|string)
傳回
(boolean)
vim.version.last({versions}) vim.version.last()
TODO: 將其一般化,移至 func.lua
參數
{versions} (vim.Version[])
傳回
(vim.Version?)
vim.version.le({v1}, {v2}) vim.version.le()
如果 v1 <= v2 則傳回 true。有關使用方法,請參閱 vim.version.cmp()
屬性
起始版本: 0.10.0
參數
{v1} (vim.Version|number[]|string)
{v2} (vim.Version|number[]|string)
傳回
(boolean)
vim.version.lt({v1}, {v2}) vim.version.lt()
如果 v1 < v2 則傳回 true。有關使用方法,請參閱 vim.version.cmp()
屬性
自:0.9.0 起
參數
{v1} (vim.Version|number[]|string)
{v2} (vim.Version|number[]|string)
傳回
(boolean)
vim.version.parse({version}, {opts}) vim.version.parse()
解析語意版本字串,並傳回可用於其他 vim.version 函數的版本物件。例如,「1.0.1-rc1+build.2」傳回
{ major = 1, minor = 0, patch = 1, prerelease = "rc1", build = "build.2" }
屬性
自:0.9.0 起
參數
{version} (string) 要解析的版本字串。
{opts} (table?) 可選的關鍵字參數
strict (boolean):預設為 false。如果為 true,則不會嘗試強制轉換不符合 semver v2.0.0 的輸入。如果為 falseparse() 會嘗試將「1.0」、「0-x」、「tmux 3.2a」等輸入強制轉換為有效的版本。
傳回
(vim.Version?) parsed_version 版本物件,如果輸入無效則為 nil
vim.version.range({spec}) vim.version.range()
解析 semver version-range「規範」並傳回範圍物件
{
  from: Version
  to: Version
  has(v: string|Version)
}
:has() 檢查版本是否在範圍內 (包含 from,排除 to)。
範例
local r = vim.version.range('1.0.0 - 2.0.0')
print(r:has('1.9.9'))       -- true
print(r:has('2.0.0'))       -- false
print(r:has(vim.version())) -- check against current Nvim version
或者使用 cmp()、le()、lt()、ge()、gt() 和/或 eq() 直接比較版本與 .to.from
local r = vim.version.range('1.0.0 - 2.0.0') -- >=1.0, <2.0
print(vim.version.ge({1,0,3}, r.from) and vim.version.lt({1,0,3}, r.to))
屬性
自:0.9.0 起
參數
{spec} (string) 版本範圍「規範」
傳回
(table?) 具有以下欄位的表格
{from} (vim.Version)
{to} (vim.Version)

Lua 模組:vim.iter vim.iter

vim.iter()iterable 的介面:它將表格或函數引數包裝成 Iter 物件,並具有轉換基礎來源資料的方法(例如 Iter:filter()Iter:map())。這些方法可以串連以建立迭代器「管線」:每個管線階段的輸出都會做為下個階段的輸入。第一個階段取決於傳遞給 vim.iter() 的類型
清單或陣列 (lua-list) 只會產生每個元素的值。
允許 (但會捨棄) 空洞 (nil 值)。
使用 pairs() 將陣列/清單表格視為字典 (保留空洞和不連續的整數鍵):vim.iter(pairs(…))
使用 Iter:enumerate() 也將索引傳遞至下個階段。
或使用 ipairs() 初始化:vim.iter(ipairs(…))
非清單表格 (lua-dict) 會產生每個元素的鍵和值。
函數 iterator 會產生基礎函數傳回的所有值。
具有 __call() 元方法 (metamethod) 的表格會被視為函數迭代器。
當基礎 iterable 耗盡時,迭代器管線會終止 (對於函數迭代器,這表示它傳回 nil)。
注意:vim.iter() 會掃描表格輸入以判斷它是清單還是字典;為了避免這種成本,您可以使用迭代器包裝表格,例如 vim.iter(ipairs({…})),但這會排除使用 list-iterator 作業,例如 Iter:rev())。
範例
local it = vim.iter({ 1, 2, 3, 4, 5 })
it:map(function(v)
  return v * 3
end)
it:rev()
it:skip(2)
it:totable()
-- { 9, 6, 3 }
-- ipairs() is a function iterator which returns both the index (i) and the value (v)
vim.iter(ipairs({ 1, 2, 3, 4, 5 })):map(function(i, v)
  if i > 2 then return v end
end):totable()
-- { 3, 4, 5 }
local it = vim.iter(vim.gsplit('1,2,3,4,5', ','))
it:map(function(s) return tonumber(s) end)
for i, d in it:enumerate() do
  print(string.format("Column %d is %d", i, d))
end
-- Column 1 is 1
-- Column 2 is 2
-- Column 3 is 3
-- Column 4 is 4
-- Column 5 is 5
vim.iter({ a = 1, b = 2, c = 3, z = 26 }):any(function(k, v)
  return k == 'z'
end)
-- true
local rb = vim.ringbuf(3)
rb:push("a")
rb:push("b")
vim.iter(rb):totable()
-- { "a", "b" }
Iter:all({pred}) Iter:all()
如果迭代器中的所有項目都符合給定的述詞,則傳回 true。
參數
{pred} (fun(...):boolean) 述詞函數。會將管線中前一個階段傳回的所有值做為引數,如果述詞符合則傳回 true。
Iter:any({pred}) Iter:any()
如果迭代器中有任何項目符合給定的述詞,則傳回 true。
參數
{pred} (fun(...):boolean) 述詞函數。會將管線中前一個階段傳回的所有值做為引數,如果述詞符合則傳回 true。
Iter:each({f}) Iter:each()
針對管線中的每個項目呼叫一次函數,排空迭代器。
適用於具有副作用的函數。若要修改迭代器中的值,請使用 Iter:map()
參數
{f} (fun(...)) 要針對管線中的每個項目執行的函數。會將管線中前一個階段傳回的所有值做為引數。
Iter:enumerate() Iter:enumerate()
產生迭代器管線的每個項目的項目索引 (計數) 和值。
對於清單表格,這樣效率更高
vim.iter(ipairs(t))
而不是
vim.iter(t):enumerate()
範例
local it = vim.iter(vim.gsplit('abc', '')):enumerate()
it:next()
-- 1        'a'
it:next()
-- 2        'b'
it:next()
-- 3        'c'
傳回
(Iter)
Iter:filter({f}) Iter:filter()
篩選迭代器管線。
範例
local bufs = vim.iter(vim.api.nvim_list_bufs()):filter(vim.api.nvim_buf_is_loaded)
參數
{f} (fun(...):boolean) 會將管線中前一個階段傳回的所有值做為引數,如果應該移除目前的迭代器元素,則傳回 false 或 nil。
傳回
(Iter)
Iter:find({f}) Iter:find()
尋找迭代器中第一個滿足給定述詞的值。
推進迭代器。如果找不到值,則傳回 nil 並排空迭代器。
範例
local it = vim.iter({ 3, 6, 9, 12 })
it:find(12)
-- 12
local it = vim.iter({ 3, 6, 9, 12 })
it:find(20)
-- nil
local it = vim.iter({ 3, 6, 9, 12 })
it:find(function(v) return v % 4 == 0 end)
-- 12
參數
{f} (any)
傳回
(any)
Iter:flatten({depth}) Iter:flatten()
list-iterator 平面化,最多依據給定的 {depth} 取消巢狀值。如果嘗試將類似字典的值平面化,則會產生錯誤。
範例
vim.iter({ 1, { 2 }, { { 3 } } }):flatten():totable()
-- { 1, 2, { 3 } }
vim.iter({1, { { a = 2 } }, { 3 } }):flatten():totable()
-- { 1, { a = 2 }, 3 }
vim.iter({ 1, { { a = 2 } }, { 3 } }):flatten(math.huge):totable()
-- error: attempt to flatten a dict-like table
參數
{depth} (number?) list-iterator 應平面化的深度 (預設為 1)
傳回
(Iter)
Iter:fold({init}, {f}) Iter:fold()
將迭代器折疊 (「縮減」) 為單一值。 Iter:reduce()
範例
-- Create a new table with only even values
vim.iter({ a = 1, b = 2, c = 3, d = 4 })
  :filter(function(k, v) return v % 2 == 0 end)
  :fold({}, function(acc, k, v)
    acc[k] = v
    return acc
  end) --> { b = 2, d = 4 }
-- Get the "maximum" item of an iterable.
vim.iter({ -99, -4, 3, 42, 0, 0, 7 })
  :fold({}, function(acc, v)
    acc.max = math.max(v, acc.max or v)
    return acc
  end) --> { max = 42 }
參數
{init} (any) 累加器的初始值。
{f} (fun(acc:A, ...):A) 累加函數。
傳回
(any)
Iter:join({delim}) Iter:join()
將迭代器收集到分隔字串中。
迭代器中的每個元素都會加入字串中,並以 {delim} 分隔。
耗用迭代器。
參數
{delim} (string) 分隔符
傳回
(string)
Iter:last() Iter:last()
排空迭代器並傳回最後一個項目。
範例
local it = vim.iter(vim.gsplit('abcdefg', ''))
it:last()
-- 'g'
local it = vim.iter({ 3, 6, 9, 12, 15 })
it:last()
-- 15
傳回
(any)
另請參閱
Iter.rpeek
Iter:map({f}) Iter:map()
將迭代器管線的項目對應到 f 傳回的值。
如果 map 函數傳回 nil,則會從迭代器中篩選掉該值。
範例
local it = vim.iter({ 1, 2, 3, 4 }):map(function(v)
  if v % 2 == 0 then
    return v * 3
  end
end)
it:totable()
-- { 6, 12 }
參數
{f} (fun(...):...:any) 對應函數。會將管線中前一個階段傳回的所有值做為引數,並傳回一或多個新值,這些新值會用於下個管線階段。nil 傳回值會從輸出中篩選掉。
傳回
(Iter)
Iter:next() Iter:next()
從迭代器取得下一個值。
範例
local it = vim.iter(string.gmatch('1 2 3', '%d+')):map(tonumber)
it:next()
-- 1
it:next()
-- 2
it:next()
-- 3
傳回
(any)
Iter:nth({n}) Iter:nth()
取得迭代器的第 n 個值 (並推進到該值)。
如果 n 是負數,則會從 list-iterator 的結尾偏移。
範例
local it = vim.iter({ 3, 6, 9, 12 })
it:nth(2)
-- 6
it:nth(2)
-- 12
local it2 = vim.iter({ 3, 6, 9, 12 })
it2:nth(-2)
-- 9
it2:nth(-2)
-- 3
參數
{n} (number) 要傳回的值的索引。如果來源是 list-iterator,則可能是負數。
傳回
(any)
Iter:peek() Iter:peek()
取得 list-iterator 中的下一個值,而不耗用它。
範例
local it = vim.iter({ 3, 6, 9, 12 })
it:peek()
-- 3
it:peek()
-- 3
it:next()
-- 3
傳回
(any)
Iter:pop() Iter:pop()
list-iterator 「彈出」值 (取得最後一個值並遞減尾部)。
範例
local it = vim.iter({1, 2, 3, 4})
it:pop()
-- 4
it:pop()
-- 3
傳回
(any)
Iter:rev() Iter:rev()
反轉 list-iterator 管線。
範例
local it = vim.iter({ 3, 6, 9, 12 }):rev()
it:totable()
-- { 12, 9, 6, 3 }
傳回
(Iter)
Iter:rfind({f}) Iter:rfind()
list-iterator 的結尾取得第一個滿足述詞的值。
推進迭代器。如果找不到值,則傳回 nil 並排空迭代器。
範例
local it = vim.iter({ 1, 2, 3, 2, 1 }):enumerate()
it:rfind(1)
-- 5        1
it:rfind(1)
-- 1        1
參數
{f} (any)
傳回
(any)
另請參閱
Iter.find
Iter:rpeek() Iter:rpeek()
取得 list-iterator 的最後一個值,而不耗用它。
範例
local it = vim.iter({1, 2, 3, 4})
it:rpeek()
-- 4
it:rpeek()
-- 4
it:pop()
-- 4
傳回
(any)
另請參閱
Iter.last
Iter:rskip({n}) Iter:rskip()
list-iterator 管線的結尾捨棄 n 個值。
範例
local it = vim.iter({ 1, 2, 3, 4, 5 }):rskip(2)
it:next()
-- 1
it:pop()
-- 3
參數
{n} (number) 要跳過的數值數量。
傳回
(Iter)
Iter:skip({n}) Iter:skip()
跳過迭代器管道中的 n 個數值。
範例
local it = vim.iter({ 3, 6, 9, 12 }):skip(2)
it:next()
-- 9
參數
{n} (number) 要跳過的數值數量。
傳回
(Iter)
Iter:slice({first}, {last}) Iter:slice()
設定列表迭代器管道的開始和結束位置。
等同於 :skip(first - 1):rskip(len - last + 1)
參數
{first} (number)
{last} (number)
傳回
(Iter)
Iter:take({n}) Iter:take()
轉換迭代器,使其僅產生前 n 個數值。
範例
local it = vim.iter({ 1, 2, 3, 4 }):take(2)
it:next()
-- 1
it:next()
-- 2
it:next()
-- nil
參數
{n} (integer)
傳回
(Iter)
Iter:totable() Iter:totable()
將迭代器收集到表格中。
產生的表格取決於迭代器管道中的初始來源。類陣列表格和函數迭代器將被收集到類陣列表格中。如果迭代器管道的最後階段返回多個數值,每個數值將被包含在表格中。
範例
vim.iter(string.gmatch('100 20 50', '%d+')):map(tonumber):totable()
-- { 100, 20, 50 }
vim.iter({ 1, 2, 3 }):map(function(v) return v, 2 * v end):totable()
-- { { 1, 2 }, { 2, 4 }, { 3, 6 } }
vim.iter({ a = 1, b = 2, c = 3 }):filter(function(k, v) return v % 2 ~= 0 end):totable()
-- { { 'a', 1 }, { 'c', 3 } }
產生的表格是一個具有連續數字索引的類陣列表格。要建立具有任意鍵的類似映射的表格,請使用 Iter:fold()
傳回
(table)

Lua 模組:vim.snippet vim.snippet

欄位
{direction} (vim.snippet.Direction) 導航方向。-1 表示上一個,1 表示下一個。
vim.snippet.active({filter}) vim.snippet.active()
如果當前緩衝區中有活動的程式碼片段,則返回 true,如果提供了篩選器,則應用給定的篩選器。
您可以使用此函數導覽程式碼片段,如下所示
vim.keymap.set({ 'i', 's' }, '<Tab>', function()
   if vim.snippet.active({ direction = 1 }) then
     return '<Cmd>lua vim.snippet.jump(1)<CR>'
   else
     return '<Tab>'
   end
 end, { expr = true })
參數
{filter} (vim.snippet.ActiveFilter?) 用於限制搜尋的篩選器
direction (vim.snippet.Direction):導航方向。如果可以沿給定方向跳轉程式碼片段,將返回 true。請參閱 vim.snippet.ActiveFilter
傳回
(boolean)
vim.snippet.expand({input}) vim.snippet.expand()
展開給定的程式碼片段文字。有關有效輸入的規範,請參閱 https://microsoft.github.io/language-server-protocol/specification/#snippet_syntax
定位點會以 hl-SnippetTabstop 高亮顯示。
參數
{input} (string)
vim.snippet.jump({direction}) vim.snippet.jump()
如果可能,跳轉到當前程式碼片段中的下一個(或上一個)佔位符。
例如,將 <Tab> 對應到在程式碼片段活動時跳轉
vim.keymap.set({ 'i', 's' }, '<Tab>', function()
   if vim.snippet.active({ direction = 1 }) then
     return '<Cmd>lua vim.snippet.jump(1)<CR>'
   else
     return '<Tab>'
   end
 end, { expr = true })
參數
{direction} (vim.snippet.Direction) 導航方向。-1 表示上一個,1 表示下一個。
vim.snippet.stop() vim.snippet.stop()
退出目前的程式碼片段。

Lua 模組:vim.text vim.text

vim.text.hexdecode({enc}) vim.text.hexdecode()
十六進位解碼字串。
參數
{enc} (string) 要解碼的字串
返回(多個)
(string?) 解碼後的字串 (string?) 錯誤訊息 (若有的話)
vim.text.hexencode({str}) vim.text.hexencode()
十六進位編碼字串。
參數
{str} (string) 要編碼的字串
傳回
(string) 十六進位編碼後的字串

Lua 模組:tohtml vim.tohtml

:[range]TOhtml {file} :TOhtml
將目前視窗中顯示的緩衝區轉換為 HTML,在新分割視窗中開啟產生的 HTML,並將其內容儲存到 {file}。如果未提供 {file},則會使用暫存檔案(由 tempname() 建立)。
tohtml.tohtml({winid}, {opt}) tohtml.tohtml.tohtml()
將視窗 {winid} 中顯示的緩衝區轉換為 HTML,並將輸出結果作為字串列表傳回。
參數
{winid} (integer?) 要轉換的視窗(預設為目前視窗)
{opt} (table?) 選用參數。
{title} (string|false,預設值:緩衝區名稱) 要在產生的 HTML 程式碼中設定的標題標籤。
{number_lines} (boolean,預設值:false) 顯示行號。
{font} (string[]|string,預設值:guifont) 要使用的字型。
{width} (integer,預設值:'textwidth'(如果非零)或視窗寬度(如果為零)) 用於右對齊或無限重複字元的項目的寬度。
{range} (integer[],預設值:整個緩衝區) 要使用的列範圍。
傳回
(string[])
主要
指令索引
快速參考