Nvim の :help
ページは、生成されたもので、ソースをtree-sitter-vimdocパーサーを使って処理しています。
:lua vim.print(package.loaded)
Nvim には、Lua 用の「標準ライブラリ」lua-stdlib が含まれています。これは、「エディタ標準ライブラリ」(builtin-functions および Ex-commands)と API を補完するもので、これらはすべて Lua コードから使用できます(lua-vimscript vim.api)。これらの「名前空間」が、Nvim のプログラミングインターフェースを形成しています。nvim -l foo.lua [args...]
goto
などの拡張機能も含まれます。ffi
、lua-profile、および強化された標準ライブラリ関数などの便利な拡張機能も付属しています。これらは利用可能であると想定することはできず、init.lua またはプラグインの Lua コードは、使用する前に jit
グローバル変数を確認する必要があります。if jit then
-- code for luajit
else
-- code for plain lua 5.1
end
bit
拡張機能です。これは常に利用可能です。PUC Lua でビルドされた場合、Nvim には require("bit")
を提供するフォールバック実装が含まれています。-- 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.html または p.lua
ソースを参照してください。:lua vim.cmd.edit(package.searchpath('jit.p', package.path))
do
ブロック(lua-do)はクロージャです。そして、それらはすべて同じように機能します。Lua モジュールは、文字通り「パス」(モジュールが見つかる場所:package.cpath)で発見された大きなクロージャです。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())
ガイダンス:「結果またはメッセージ」パターンを以下に使用します...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
"foo"
)またはテーブルリテラル({1,2,3}
)を取る場合は、括弧を省略できます。後者は、Python や C# などの言語のように、「名前付きパラメーター」(「kwargs」または「キーワード引数」)を模倣するためによく使用されます。例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" }
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
foo.bar
の場合、各ディレクトリで lua/foo/bar.lua
、次に lua/foo/bar/init.lua
が検索されます。ファイルが見つからない場合は、package.cpath の初期値から派生したサフィックスのリスト(so
や dll
など)である ?
と一致する名前を持つ共有ライブラリがディレクトリで再度検索されます。それでもファイルが見つからない場合、Nvim は Lua のデフォルト検索メカニズムにフォールバックします。最初に見つかったスクリプトが実行され、スクリプトによって返された値があれば require()
がその値を返し、それ以外の場合は true
を返します。require()
を呼び出した後にキャッシュされ、後続の呼び出しでは、スクリプトの検索または実行を行わずに、キャッシュされた値を返します。詳細については、require() を参照してください。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
package.path
は、'runtimepath' からの各ディレクトリに /lua/?.lua
および /lua/?/init.lua
を追加するだけで調整されます(/
は実際には package.config
の最初の文字です)。/lua/?.lua
および /lua/?/init.lua
を追加する代わりに、既存の package.cpath のすべての固有の ?
を含むサフィックスが使用されます。例/foo/bar,/xxx;yyy/baz,/abc
が含まれています。$LUA_CPATH
/ $LUA_INIT
から派生)には ./?.so;/def/ghi/a?d/j/g.elf;/def/?.so
が含まれています。?
を含むサフィックス /?.so
、/a?d/j/g.elf
、および /?.so
を順番に検索します。疑問符を含む最初のパスコンポーネントから始まるパスの部分と、先行するパスセパレーターです。/def/?.so
のサフィックス、すなわち /?.so
は、package.path の最初のパスのサフィックス(つまり、./?.so
)と同じであるため、一意ではありません。これにより、/?.so
と /a?d/j/g.elf
がこの順序で残ります。/foo/bar
、/xxx;yyy/baz
、および /abc
があります。2番目のパスには、パスセパレーターであるセミコロンが含まれているため、除外され、/foo/bar
と /abc
のみが順番に残ります。/lua
パスセグメントがパスとサフィックスの間に挿入され、次のようになります。/foo/bar/lua/?.so
/foo/bar/lua/a?d/j/g.elf
/abc/lua/?.so
/abc/lua/a?d/j/g.elf
/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注意
let &runtimepath = &runtimepath
{chunk}
Lua チャンク {chunk}
を実行します。{chunk}
が "=" で始まる場合、チャンクの残りの部分は式として評価され、出力されます。:lua =expr
と :=expr
は :lua vim.print(expr)
と同等です。:lua vim.api.nvim_command('echo "Hello, Nvim!"')
:lua print(_VERSION)
:lua =jit.version
{range}
内のバッファ行を Lua コードとして実行します。:source とは異なり、これは常にそれらの行を Lua コードとして扱います。print(string.format(
'unix time: %s', os.time()))
{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
変数はブロックの終了時に消滅することに注意してください。ただし、グローバル変数は消滅しません。{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
{file}
{file}
内の Lua スクリプトを実行します。引数全体がファイル名として使用され (:edit と同様)、スペースはエスケープする必要はありません。または、Lua ファイルを :source することもできます。:luafile script.lua
:luafile %
local chunkheader = "local _A = select(1, ...) return "
function luaeval (expstr, arg)
local chunk = assert(loadstring(chunkheader .. expstr, "luaeval"))
return chunk(arg) -- return typval
end
:echo luaeval('_A[1] + _A[2]', [40, 2])
" 42
:echo luaeval('string.match(_A, "[a-z]+")', 'XYXfoo123')
" foo
nil
値、つまり「穴」がない) 整数キー 1…N を持つテーブルはリストです。list-iterator も参照してください。 lua-dictvim.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
の 2 番目の引数は、Vimscript から Lua に変換 ("マーシャリング") されるため、Lua コンテナへの変更は Vimscript の値に影響しません。戻り値も常に変換されます。変換時に、msgpack-special-dict は特別に扱われます。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 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() を使用する必要があります。v:lua
は Vimscript 式では許可されていません。Funcref は 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
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
は、Nvim がネットワーキング、ファイルシステム、およびプロセス管理に使用する libUV ライブラリの "luv" Lua バインディングを公開します。luvref.txt を参照してください。特に、メインの Nvim luv-event-loop との対話を可能にします。vim.uv
コールバックで api-fast を除く vim.api
関数を直接呼び出すとエラーになります。たとえば、これはエラーです。local timer = vim.uv.new_timer()
timer:start(1000, 0, function()
vim.api.nvim_command('echomsg "test"')
end)
local timer = vim.uv.new_timer()
timer:start(1000, 0, vim.schedule_wrap(function()
vim.api.nvim_command('echomsg "test"')
end))
-- 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');
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
ウォッチとキューに入れられたイベントの最大数を増やす必要がある場合があります。制限を増やすには、次を実行します。sysctl fs.inotify.max_user_watches=494462
/etc/sysctl.conf
に追加して、変更を永続化できます。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)
vim.uv.new_thread
) を使用して、個別の (OS レベルの) スレッドで作業を実行できます。すべてのスレッドは、メインスレッドの Lua グローバル変数にアクセスできない、独自の個別の Lua インタープリター状態を取得することに注意してください。また、エディターの状態 (バッファ、ウィンドウなど) にもスレッドから直接アクセスできません。vim.*
API のサブセットがスレッドで利用できます。これには以下が含まれます。vim.uv
。vim.mpack
および vim.json
(スレッド間のメッセージのシリアル化に役立ちます)。require
は、グローバルのpackage.pathからLuaパッケージを使用できます。print()
とvim.inspect
vim.diff
vim.split
、vim.tbl_*
、vim.list_*
など、純粋なLua値を扱うためのvim.*
のほとんどのユーティリティ関数。vim.is_thread()
は、メインスレッド以外からtrueを返します。init.vim
に以下を追加してください。autocmd TextYankPost * silent! lua vim.hl.on_yank {higroup='Visual', timeout=300}
{opts}
(table?
) オプションのパラメータ.user
)syntax
: 50
, 標準のシンタックスハイライトに使用treesitter
: 100
, treesitterベースのハイライトに使用semantic_tokens
: 125
, LSPセマンティックトークンハイライトに使用diagnostics
: 150
, 診断などのコード分析に使用user
: 200
, LSPドキュメントシンボルやon_yank
自動コマンドなど、ユーザーがトリガーするハイライトに使用{bufnr}
, {ns}
, {higroup}
, {start}
, {finish}
, {opts}
) テキストの範囲にハイライトグループを適用します。{bufnr}
(integer
) ハイライトを適用するバッファ番号{ns}
(integer
) ハイライトを追加する名前空間{higroup}
(string
) ハイライトに使用するハイライトグループ{opts}
(table?
) 次のフィールドを持つテーブル{inclusive}
(boolean
, デフォルト: false
) 範囲が終端を含むかどうかを示します{priority}
(integer
, デフォルト: vim.hl.priorities.user
) ハイライトの優先度{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
) 比較する2番目の文字列{opts}
(table?
) オプションのパラメータ{on_hunk}
(fun(start_a: integer, count_a: integer, start_b: integer, count_b: integer): integer?
) diffの各ハンクに対して呼び出されます。残りのハンクのコールバックをキャンセルするには、負の数を返します。引数start_a
(integer
): {a}
のハンクの開始行。count_a
(integer
): {a}
のハンクサイズ。start_b
(integer
): {b}
のハンクの開始行。count_b
(integer
): {b}
のハンクサイズ。{result_type}
('unified'|'indices'
, デフォルト: 'unified'
) 返されるdiffの形式unified
: unified形式の文字列。indices
: ハンクの位置の配列。注意: on_hunk
を使用している場合、このオプションは無視されます。{linematch}
(boolean|integer
) xdiffから結果として得られるハンクでlinematchを実行します。整数の場合、この行数までのサイズのハンクのみがlinematchで実行されます。result_type = indices
が必要です。それ以外の場合は無視されます。{algorithm}
('myers'|'minimal'|'patience'|'histogram'
, デフォルト: 'myers'
) 使用するdiffアルゴリズム。 値myers
: デフォルトのアルゴリズムminimal
: 可能な限り小さいdiffを生成するために余分な時間を費やしますpatience
: patience diffアルゴリズムhistogram
: histogram diffアルゴリズム{ctxlen}
(integer
) コンテキスト長{interhunkctxlen}
(integer
) ハンク間のコンテキスト長{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
。{str}
(string
)any
){obj}
(any
)string
){str}
, {opts}
) vim.json.decode(){str}
をLuaオブジェクトにデコード(または「アンパック」)します。{opts}
で制御可能、下記参照)。{}
(空の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>?
) キーを持つオプションテーブルany
){obj}
(any
)string
){str}
(string
) Base64エンコードされた文字列string
) デコードされた文字列{str}
(string
) エンコードする文字列string
) エンコードされた文字列vim.spell.check("the quik brown fox")
-- =>
-- {
-- {'quik', 'bad', 5}
-- }
{str}
(string
)[string, 'bad'|'rare'|'local'|'caps', integer][]
) 3つの項目を持つタプルのリスト{str}
内で単語が始まる位置。{...}
) vim.api{...}
を使用して、Nvim API関数{func}
を呼び出します。例:「nvim_get_current_line()」API関数を呼び出すprint(tostring(vim.api.nvim_get_current_line()))
vim.NIL vim.NILnil
は、ディクショナリまたは配列を表すLuaテーブルの一部として使用できません。欠落として扱われるためです。{"foo", nil}
は{"foo"}
と同じです。{
[vim.type_idx] = vim.types.float,
[vim.val_idx] = 1.0,
}
float
、array
、dictionary
タイプ用のペアが含まれています。vim.types.float
, vim.types.array
, vim.types.dictionary
に対応する値は、以下の2つの仮定のみに従う必要があります。 1. 値はテーブルのキーとしても値としても機能する可能性があります。Luaテーブルの特性を考えると、これは基本的に「値がnil
ではない」ことを意味します。 2. vim.types
テーブル内の各値について、vim.types[vim.types[value]]
は value
と同じです。型には他の制限はなく、vim.types.float
, vim.types.array
, vim.types.dictionary
に対応する値が変わらないことや、vim.types
テーブルがこれら3つの型の値のみを含むことは保証されません。{}
をリスト/配列に変換します。table
){str}
, {from}
, {to}
) vim.iconv(){str}
をエンコーディング {from}
からエンコーディング {to}
に変換したものです。変換に失敗すると、nil
が返されます。一部の文字を変換できなかった場合は、"?" で置き換えられます。エンコーディング名は、iconv() ライブラリ関数が受け入れることができるものであれば何でも構いません。":Man 3 iconv" を参照してください。{str}
(string
) 変換するテキスト{from}
(string
) {str}
のエンコーディング{to}
(string
) ターゲットエンコーディングstring?
) 変換が成功した場合は変換された文字列、それ以外の場合は nil
。false
の場合、ほとんどのAPI関数は呼び出し可能ですが、textlockなどの他の制限を受ける可能性があります。{channel}
, {method}
, {...}
) vim.rpcnotify(){channel}
に {event}
を送信し、すぐに返します。{channel}
が0の場合、イベントはすべてのチャネルにブロードキャストされます。{channel}
(integer
){method}
(string
){...}
(any?
){channel}
, {method}
, {...}
) vim.rpcrequest(){method}
を呼び出すために {channel}
にリクエストを送信し、応答を受信するまでブロックします。{channel}
(integer
){method}
(string
){...}
(any?
){fn}
) vim.schedule(){fn}
をメインイベントループによってすぐに呼び出されるようにスケジュールします。textlockやその他の一時的な制限を回避するのに役立ちます。{fn}
(fun()
)-- 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
){str}
(string
)integer[]
){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
){a}
(string
){b}
(string
)0|1|-1
) 文字列が等しい場合、{a}
が {b}
より大きい場合、または {a}
が {b}
より小さい場合、それぞれ。{options}
は辞書のようなテーブルである必要があり、ext_...
オプションをtrueに設定して、それぞれの外部要素のイベントを受信する必要があります。{callback}
は、イベント名と追加のパラメータを受け取ります。各イベントのイベント形式については、ui-popupmenuと以下のセクションを参照してください。ext_messages
の動作は、今後の変更と使いやすさの改善の影響を受けます。これは、'cmdheight' をゼロに設定した場合(これも実験的です)にメッセージを処理するために使用されることが期待されます。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()
){ns}
(integer
){time}
, {callback}
, {interval}
, {fast_only}
) vim.wait(){callback}
が true
を返すまで、{time}
ミリ秒待機します。{callback}
をすぐに実行し、約 {interval}
ミリ秒(デフォルトは200)ごとに実行します。Nvimは、この間も他のイベントを処理します。---
-- 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?
) ポーリングの間隔を待機する(概算)ミリ秒数boolean
) (-1|-2?
){callback}
が {time}
の間に true
を返す場合: true, nil
{callback}
が {time}
の間に true
を返さない場合: false, -1
{callback}
が {time}
の間に中断された場合: false, -2
{callback}
がエラーになった場合、エラーが発生します。vim.fn.remove()
を使用すると、リストオブジェクトがVimscriptにコピーされ、Luaリストは変更されません。local list = { 1, 2, 3 }
vim.fn.remove(list, 0)
vim.print(list) --> "{ 1, 2, 3 }"
{func}
, {...}
) vim.call(){...}
を使用して、vim-function または user-function {func}
を呼び出します。vim.fnも参照してください。以下と同等です。vim.fn[func]({...})
{command}
) vim.cmd() を参照してください。{...}
) vim.fn{...}
を使用して、vim-function または user-function {func}
を呼び出します。オートロード関数を呼び出すには、次の構文を使用します。vim.fn['some#function']({...})
pairs(vim.fn)
は少なくとも一度呼び出された関数のみを列挙します。vim.*
Luaテーブルを参照することで、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
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.gnil
を返します。nil
を返します。整数でインデックス付けして、特定のウィンドウの変数にアクセスできます。nil
を返します。整数でインデックス付けして、特定のタブページの変数にアクセスできます。set number
Lua: vim.o.number = true
set wildignore=*.o,*.a,__pycache__
Lua: vim.o.wildignore = '*.o,*.a,__pycache__'
set wildignore=*.o,*.a,__pycache__
vim.o
を使用vim.o.wildignore = '*.o,*.a,__pycache__'
vim.opt
を使用vim.opt.wildignore = { '*.o', '*.a', '__pycache__' }
vim.opt.wildignore:append { "*.pyc", "node_modules" }
vim.opt.wildignore:prepend { "new_first_value" }
vim.opt.wildignore:remove { "node_modules" }
set listchars=space:_,tab:>~
vim.o
を使用vim.o.listchars = 'space:_,tab:>~'
vim.opt
を使用vim.opt.listchars = { space = '_', tab = '>~' }
echo wildignore
vim.o
を使用print(vim.o.wildignore)
vim.opt
を使用vim.print(vim.opt.wildignore:get())
vim.opt.formatoptions:append('j')
vim.opt.formatoptions = vim.opt.formatoptions + 'j'
{value}
(string
) 追加する値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?
) オプションの値vim.opt.wildignore:prepend('*.o')
vim.opt.wildignore = vim.opt.wildignore ^ '*.o'
{value}
(string
) 先頭に追加する値vim.opt.wildignore:remove('*.pyc')
vim.opt.wildignore = vim.opt.wildignore - '*.pyc'
{value}
(string
) 削除する値{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
nil
を返します。vim.env.FOO = 'bar'
print(vim.env.TERM)
vim.go.cmdheight = 4
print(vim.go.columns)
print(vim.go.bar) -- error: invalid key
vim.o.cmdheight = 4
print(vim.o.columns)
print(vim.o.foo) -- error: invalid key
{winid}
][{bufnr}
] vim.wo{winid}
を持つウィンドウと番号{bufnr}
を持つバッファのウィンドウスコープのオプションを取得または設定します。グローバルローカルオプションを設定する場合、または{bufnr}
が提供されている場合は:setlocal
と同様です。それ以外の場合は:set
と同様です。{winid}
が省略された場合、現在のウィンドウが使用されます。無効な{winid}
、{bufnr}
、またはキーはエラーになります。0
(ウィンドウ内の現在のバッファ)の{bufnr}
のみがサポートされています。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'
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と同じように動作します。テーブルの場合、単一のコマンドを実行します。この場合、opts
が空のnvim_cmd()のエイリアスです。{fn}
(function
) timeout
が期限切れになった後に呼び出すコールバック{timeout}
(integer
) fn
を呼び出すまでに待機するミリ秒数table
) タイマーluvタイマーオブジェクト{name}
, {alternative}
, {version}
, {plugin}
, {backtrace}
) 非推奨メッセージをユーザーに表示します。{name}
(string
)非推奨の機能(関数、APIなど)。{alternative}
(string?
) 推奨される代替機能。{version}
(string
) 非推奨の関数が削除されるバージョン。{plugin}
(string?
) 非推奨の機能を所有するプラグインの名前。デフォルトは「Nvim」です。{backtrace}
(boolean?
) バックトレースを印刷します。デフォルトはtrueです。string?
)非推奨メッセージ。メッセージが表示されない場合はnil。string
)local k = vim.keycode
vim.g.mapleader = k'<bs>'
{str}
(string
) 変換する文字列。string
){find_start}
) vim.lua_omnifunc():lua
コマンドの組み込み補完と同様に、ランタイムLuaインタープリターからLua値を補完するためのOmnifunc。set omnifunc=v:lua.vim.lua_omnifunc
を使用してアクティブ化します。{find_start}
(1|0
){msg}
(string
) ユーザーに表示する通知の内容。{opts}
(table?
) オプションのパラメータ。デフォルトでは使用されません。{msg}
(string
) ユーザーに表示する通知の内容。{opts}
(table?
) オプションのパラメータ。デフォルトでは使用されません。boolean
) メッセージが表示された場合はtrue、それ以外の場合はfalse{fn}
, {ns_id}
, {opts}
) vim.on_key(){ns_id}
を持つLua関数{fn}
を追加します。{fn}
はエラー時に削除されます。{fn}
は再帰的に呼び出されません。つまり、{fn}
自体が入力を消費する場合、それらのキーに対しては呼び出されません。{fn}
はnvim_buf_clear_namespace()によってクリアされません。{fn}
(fun(key: string, typed: string): string??
) マッピングが適用された後、さらに処理する前に、すべての入力キーに対して呼び出される関数。引数{key}
と{typed}
は、マッピングが適用された後のキーである{key}
と、マッピングが適用される前のキーである{typed}
のrawキーコードです。{typed}
は、{key}
が入力されていないキーによって生成された場合、または前の{key}
を生成した同じ入力キーによって生成された場合、空になる場合があります。{fn}
が空の文字列を返す場合、{key}
は破棄/無視されます。{fn}
がnil
の場合、名前空間{ns_id}
に関連付けられたコールバックが削除されます。{opts}
(table?
) オプションのパラメータinteger
) {fn}
に関連付けられた名前空間ID。または、引数なしでon_key()が呼び出された場合のすべてのコールバックの数。vim.paste
を呼び出すnvim_paste()を呼び出してください。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)
{phase}
(-1|1|2|3
) -1:「非ストリーミング」貼り付け:呼び出しにはすべての行が含まれます。貼り付けが「ストリーミング」の場合、phase
はストリームの状態を示しますboolean
) クライアントが貼り付けをキャンセルする必要がある場合はfalseを返します。local hl_normal = vim.print(vim.api.nvim_get_hl(0, { name = 'Normal' }))
{...}
(any
)any
) 指定された引数。{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
){s}
, {encoding}
, {index}
, {strict_indexing}
) UTF-32、UTF-16、または UTF-8 の {index}
をバイトインデックスに変換します。{strict_indexing}
が false の場合、範囲外のインデックスはエラーをスローする代わりにバイト長を返します。{index}
は、そのシーケンスの終端に切り上げられます。{s}
(string
){encoding}
("utf-8"|"utf-16"|"utf-32"
){index}
(integer
){strict_indexing}
(boolean?
) デフォルト: trueinteger
){s}
, {encoding}
, {index}
, {strict_indexing}
) バイトインデックスを UTF-32、UTF-16、または UTF-8 インデックスに変換します。{index}
が指定されていない場合、文字列の長さが使用されます。すべてのインデックスは 0 ベースです。{strict_indexing}
が false の場合、範囲外のインデックスはエラーをスローする代わりに文字列の長さを返します。無効な UTF-8 バイトと埋め込みサロゲートは、それぞれ 1 つのコードポイントとして数えられます。UTF-8 シーケンスの途中の {index}
は、そのシーケンスの終端に切り上げられます。{s}
(string
){encoding}
("utf-8"|"utf-16"|"utf-32"
){index}
(integer?
){strict_indexing}
(boolean?
) デフォルト: trueinteger
)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 = '' }
{cmd}
(string[]
) 実行するコマンド{opts}
(vim.SystemOpts?
) オプションNVIM
が v:servername に設定されます。env
は、現在の環境をマージするのではなく、ジョブ環境を正確に定義します。true
の場合、stdin へのパイプが開かれ、SystemObj の write()
メソッドを介して書き込むことができます。string または string[] の場合、stdin に書き込まれて閉じられます。デフォルトは false
です。fun(err: string, data: string)
を持つ必要があります。デフォルトは true
です。fun(err: string, data: string)
を持つ必要があります。デフォルトは true
です。\r\n
を \n
に置き換えます。{on_exit}
(fun(out: vim.SystemCompleted)?
) サブプロセスが終了したときに呼び出されます。指定された場合、コマンドは非同期で実行されます。SystemCompleted オブジェクトを受け取ります。SystemObj:wait() の戻り値を確認してください。vim.SystemObj
) 次のフィールドを持つオブジェクトstdin=true
が必要です。ストリームを閉じるには nil
を渡します。{bufnr}
(integer?
) デフォルトは現在のバッファ{row}
(integer?
) 検査する行。0 ベース。デフォルトは現在のカーソルの行{col}
(integer?
) 検査する列。0 ベース。デフォルトは現在のカーソルの列{filter}
(table?
) アイテムをフィルター処理するためのキーと値のペアを持つテーブル{syntax}
(boolean
, デフォルト: true
) 構文ベースのハイライトグループを含めます。{treesitter}
(boolean
, デフォルト: true
) Tree-sitter ベースのハイライトグループを含めます。{extmarks}
(boolean|"all"
, デフォルト: true) extmark を含めます。all
の場合、hl_group
のない extmark も含まれます。{semantic_tokens}
(boolean
, デフォルト: true) セマンティックトークンのハイライトを含めます。table
) 次のキーと値のペアを持つテーブル。"走査順"でアイテムが格納されます。{bufnr}
(integer?
) デフォルトは現在のバッファ{row}
(integer?
) 検査する行。0 ベース。デフォルトは現在のカーソルの行{col}
(integer?
) 検査する列。0 ベース。デフォルトは現在のカーソルの列{filter}
(table?
) 次のフィールドを持つテーブル{syntax}
(boolean
, デフォルト: true
) 構文ベースのハイライトグループを含めます。{treesitter}
(boolean
, デフォルト: true
) Tree-sitter ベースのハイライトグループを含めます。{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?
) 最初に読み取られていないアイテムを削除せずに返しますany?
)any?
){item}
(any
)eq
メタメソッドを提供しない限り、再帰的に比較されます。他のすべての型は、等価演算子 ==
を使用して比較されます。{a}
(any
) 最初の値{b}
(any
) 2番目の値boolean
) 値が等しい場合は true
、それ以外の場合は false
{orig}
, {noref}
) vim.deepcopy()noref=true
は一意のテーブルフィールドを持つテーブルではるかにパフォーマンスが高く、noref=false
はテーブルフィールドを再利用するテーブルではるかにパフォーマンスが高くなります。{orig}
(table
) コピーするテーブル{noref}
(boolean?
) false
(デフォルト) の場合、含まれるテーブルは一度だけコピーされ、すべての参照がこの単一のコピーを指します。true
の場合、テーブルが発生するたびに新しいコピーが作成されます。これは、循環参照によって deepcopy()
が失敗する可能性があることも意味します。table
) コピーされたキーと (ネストされた) 値のテーブル。{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
メタメソッドを持つ空のテーブル。{s}
(string
) 文字列{suffix}
(string
) マッチするサフィックスboolean
) suffix
が s
のサフィックスである場合は true
{s}
, {sep}
, {opts}
) vim.gsplit()for s in vim.gsplit(':aa::b:', ':', {plain=true}) do
print(s)
end
for word, num in ('foo111bar222'):gmatch('([^0-9]*)(%d*)') do
print(('word: %s num: %s'):format(word, num))
end
{s}
(string
) 分割する文字列{sep}
(string
) セパレーターまたはパターン{plain}
(boolean
) sep
をリテラルとして使用します (string.find のように)。{trimempty}
(boolean
) シーケンスの先頭と末尾にある空のセグメントを破棄します。fun():string?
) 分割されたコンポーネントに対するイテレーター{f}
(any
) 任意のオブジェクトboolean
) f
が呼び出し可能な場合は true
、それ以外の場合は false
{}
は、vim.empty_dict() で作成されたか、API または Vimscript の結果として辞書のように返された場合 (たとえば、rpcrequest() や vim.fn から) を除き、配列です。{t}
(table?
)boolean
) 配列のようなテーブルの場合は true
、それ以外の場合は false
。{t}
) vim.islist()t
が「リスト」かどうかをテストします。リストとは、1 から始まる連続した整数でのみインデックスが付けられたテーブル(lua-length で「正規配列」と呼ばれるもの)のことです。{}
は、vim.empty_dict() で作成された場合や、API または Vimscript の結果として、例えば rpcrequest() や vim.fn から辞書のように返された場合を除き、リストです。{t}
(table?
)boolean
) リストのようなテーブルの場合は true
、それ以外の場合は false
。{t}
, {value}
) vim.list_contains()value
が含まれているかどうかを確認します。{t}
(table
) チェックするテーブル (リストのようなものでなければなりません。検証はされません){value}
(any
) 比較する値boolean
) t
に value
が含まれている場合は true
{dst}
, {src}
, {start}
, {finish}
) vim.list_extend(){dst}
(table
) 変更され、追加されるリスト{src}
(table
) 値が挿入されるリスト{start}
(integer?
) src の開始インデックス。デフォルトは 1{finish}
(integer?
) src の最後のインデックス。デフォルトは #src
table
) dst{list}
(any[]
) テーブル{start}
(integer?
) スライスの開始範囲{finish}
(integer?
) スライスの終了範囲any[]
) 開始から終了 (両端を含む) までスライスされたテーブルのコピー{s}
(string
) エスケープする文字列string
) % でエスケープされたパターン文字列{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
{size}
(integer
){t}
(table
) 辞書のようなテーブル{s}
, {sep}
, {opts}
) vim.split()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
) セパレーターまたはパターン{plain}
(boolean
) sep
をリテラルとして使用します (string.find のように)。{trimempty}
(boolean
) シーケンスの先頭と末尾にある空のセグメントを破棄します。string[]
) 分割されたコンポーネントのリスト{s}
(string
) 文字列{prefix}
(string
) マッチするプレフィックスboolean
) prefix
が s
のプレフィックスの場合は true
{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
) 比較する値または述語関数参照{predicate}
(boolean
) value
はチェックされる関数参照です (デフォルトは false)boolean
) t
に value
が含まれている場合は true
{t}
) vim.tbl_count()t
内の nil でない値の数をカウントします。vim.tbl_count({ a=1, b=2 }) --> 2
vim.tbl_count({ 1, 2 }) --> 2
{t}
(table
) テーブルinteger
) テーブル内の nil でない値の数{behavior}
('error'|'keep'|'force'
) あるキーが複数のマップで見つかった場合の動作を決定します{...}
(table
) 2つ以上のテーブルtable
) マージされたテーブル{behavior}
('error'|'keep'|'force'
) あるキーが複数のマップで見つかった場合の動作を決定します{...}
(table
) 2つ以上のテーブルtable
) マージされたテーブル{func}
(function
) 関数{t}
(table
) テーブルany[]
) フィルター処理された値のテーブル{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{t}
(table
) チェックするテーブルboolean
) t
が空の場合は true
{t}
(table
) テーブルany[]
) キーのリスト{func}
(fun(value: T): any
) 関数{t}
(table<any, T>
) テーブルtable
) 変換された値のテーブル{t}
(table
) テーブルany[]
) 値のリスト{s}
(string
) トリムする文字列string
) 先頭と末尾から空白が削除された文字列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
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
は、最高のパフォーマンスを提供します。{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?
) 検証が失敗した場合のメッセージ{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="*"
の場合は返されません。{path}
(string?
) リセットするパス{str}
(string
) デコードする文字列string
) デコードされた文字列{str}
(string
) エンコードする文字列{rfc}
("rfc2396"|"rfc2732"|"rfc3986"?
)string
) エンコードされた文字列{bufnr}
(integer
)string
) URI{path}
(string
) ファイルへのパスstring
) URI{uri}
) vim.uri_to_bufnr(){uri}
(string
)integer
) bufnr{uri}
(string
)string
) ファイル名。ファイル URI でない場合は、変更されない URIvim.ui.input({ prompt = 'Enter value for shiftwidth: ' }, function(input)
vim.o.shiftwidth = tonumber(input)
end)
{on_confirm}
(function
) ((input|nil) -> ()) ユーザーが入力を確定または中止したときに一度呼び出されます。input
はユーザーが入力したものです(何も入力されていない場合は空の文字列になる可能性があります)。ユーザーがダイアログを中止した場合は nil
になります。{path}
, {opt}
) vim.ui.open()open
、Windows の explorer.exe
、Linux の xdg-open
など)で path
を開くか、失敗した場合はエラーメッセージを返します(表示はしません)。-- Asynchronous.
vim.ui.open("https://neovim.dokyumento.jp/")
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[] }?
) オプションvim.SystemObj?
) コマンドオブジェクト。見つからない場合は nil。(string?
) 失敗時のエラーメッセージ。成功した場合は nil。{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
) 追加オプションSelect one of:
items
から個々の項目をフォーマットする関数。デフォルトは tostring
。vim.ui.select
を再実装するプラグインは、これを使用して items
の構造やセマンティクス、または select() が呼び出されたコンテキストを推測できます。{on_choice}
(fun(item: T?, idx: integer?)
) ユーザーが選択を行ったときに一度呼び出されます。idx
は items
内の item
の 1 から始まるインデックスです。ユーザーがダイアログを中止した場合は nil
。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
){filetype}
, {option}
) {filetype}
のデフォルトのオプション値を取得します。vim.filetype.get_option('vim', 'commentstring')
{filetype}
(string
) ファイルタイプ{option}
(string
) オプション名string|boolean|integer
) オプション値-- 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?
) 呼び出されたときにバッファーの状態を変更する関数(たとえば、いくつかのファイルタイプ固有のバッファー変数を設定するため)。この関数は、バッファー番号を唯一の引数として受け入れます。{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
) 指定されたバッファーからマッピングを削除します。0
または true
の場合、現在のバッファーを使用します。-- 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)')
{replace_keycodes}
は、"expr" が true
の場合、デフォルトで true
になります。{buffer}
(integer|boolean
) バッファローカルなマッピングを作成します。現在のバッファの場合は、0
または true
を指定します。{remap}
(boolean
, デフォルト: false
) マッピングを再帰的にします。{noremap}
の逆です。{file}
(string?
) パスstring?
) {file}
のベースネーム{opts}
(table?
) オプションのキーワード引数Iterator
) {path}
内の項目をイテレートします。各イテレーションでは、"name" と "type" の 2 つの値が生成されます。"name" は {path}
からの相対的な項目のベースネームです。"type" は、"file"、"directory"、"link"、"fifo"、"socket"、"char"、"block"、"unknown" のいずれかです。{file}
(string?
) パスstring?
) {file}
の親ディレクトリ{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'})
{names}
(string|string[]|fun(name: string, path: string): boolean
) 検索する項目の名前。{names}
が文字列またはテーブルの場合、ベースネームである必要があり、パスとグロブはサポートされていません。{names}
が関数の場合、トラバースされた各項目に対して、以下の引数で呼び出されます。true
を返す必要があります。{opts}
(table
) オプションのキーワード引数{upward}
(boolean
, デフォルト: false
) 親ディレクトリを上方向に検索します。それ以外の場合は、子ディレクトリ (再帰的に) を検索します。{stop}
(string
) このディレクトリに到達すると検索を停止します。ディレクトリ自体は検索されません。{type}
(string
) 指定されたタイプの項目のみを検索します。省略した場合、{names}
に一致するすべての項目が含まれます。{limit}
(number
, デフォルト: 1
) この数の一致が見つかったら検索を停止します。一致数に制限を設けない場合は、math.huge
を使用してください。{...}
) vim.fs.joinpath()"foo/"
と "bar"
は "foo/bar"
に結合されます)。{...}
(string
)string
){path}
, {opts}
) vim.fs.normalize()[[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"
{path}
(string
) 正規化するパス{opts}
(table?
) 次のフィールドを持つテーブル{expand_env}
(boolean
, デフォルト: true
) 環境変数を展開します。{win}
(boolean
, デフォルト: Windows では true
、それ以外では false
) パスは Windows パスです。string
) 正規化されたパス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
{start}
(string
) 開始パス。fun(_, dir: string): string?
) イテレータ (nil
) (string?
){path}
(string
) 削除するパス{opts}
(table?
) 次のフィールドを持つテーブル{recursive}
(boolean
) ディレクトリとその内容を再帰的に削除します。{force}
(boolean
) 存在しないファイルと引数を無視します。-- 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)
{marker}
(string|string[]|fun(name: string, path: string): boolean
) 検索するマーカー、またはマーカーのリスト。関数である場合、評価された各項目に対して関数が呼び出され、{name}
および {path}
が一致する場合に true を返す必要があります。string?
) 指定されたマーカーのいずれかを含むディレクトリパス。ディレクトリが見つからない場合は nil。*
パスセグメント内の 1 つ以上の文字に一致します。?
パスセグメント内の 1 文字に一致します。**
パスセグメントの任意の数(ゼロを含む)に一致します。{}
条件をグループ化します(例:*.{ts,js}
は TypeScript ファイルと JavaScript ファイルに一致します)。[]
パスセグメント内で一致する文字の範囲を宣言します(例:example.[0-9]
は example.0
、example.1
、...に一致します)。[!...]
パスセグメント内で一致する文字の範囲を否定します(例:example.[!0-9]
は example.a
、example.b
に一致しますが、example.0
には一致しません)。{pattern}
(string
) 生のグロブパターンvim.lpeg
として含まれています(https://www.inf.puc-rio.br/~roberto/lpeg/)。{subject}
, {init}
, {...}
) Pattern:match()pattern
を subject
文字列と照合します。一致が成功した場合、一致後の最初の文字の 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
) ...{pattern}
) vim.lpeg.B()patt
によって先行される場合にのみマッチするパターンを返します。パターンpatt
は、固定長の文字列にのみマッチする必要があり、キャプチャを含めることはできません。and
述語と同様に、このパターンは成功または失敗に関係なく、入力を消費しません。{pattern}
(vim.lpeg.Pattern|string|integer|boolean|table
)vim.lpeg.Pattern
){patt}
) vim.lpeg.C()patt
にマッチするサブジェクトのサブストリングをキャプチャします。キャプチャされた値は文字列です。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
){n}
) vim.lpeg.Carg()lpeg.match
の呼び出しで与えられたn番目の追加引数として与えられた値を生成します。{n}
(integer
)vim.lpeg.Capture
){name}
) vim.lpeg.Cb()name
という名前の最新のグループキャプチャによって生成された値を生成します(ここで、name
は任意のLua値にすることができます)。最新とは、指定された名前を持つ最後の完全な最外グループキャプチャを意味します。完全なキャプチャとは、キャプチャに対応するパターン全体がマッチしたことを意味します。最外キャプチャとは、キャプチャが別の完全なキャプチャの内側ではないことを意味します。LPegがキャプチャを評価するタイミングを指定しないのと同様に、以前にグループによって生成された値を再利用するか、再評価するかは指定しません。{name}
(any
)vim.lpeg.Capture
){...}
(any
)vim.lpeg.Capture
){patt}
, {func}
) vim.lpeg.Cf()patt
がキャプチャのリストC1 C2 ... Cnを生成する場合、このキャプチャは値func(...func(func(C1, C2), C3)...,Cn)
を生成します。つまり、関数func
を使用してpatt
からのキャプチャをフォールド(または累積、または削減)します。このキャプチャは、patt
が少なくとも1つの値(任意の型)を持つ少なくとも1つのキャプチャを生成する必要があり、それがアキュムレータの初期値になることを前提としています。(特定の初期値が必要な場合は、定数キャプチャを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
){patt}
, {name}
) vim.lpeg.Cg()patt
によって返されたすべての値を単一のキャプチャにグループ化します。グループは、匿名(名前が指定されていない場合)または指定された名前(nilでないLuaの値にすることができます)で名前付きにすることができます。{patt}
(vim.lpeg.Pattern|string|integer|boolean|table|function
){name}
(string?
)vim.lpeg.Capture
){patt}
, {fn}
) vim.lpeg.Cmt()function
を呼び出します。指定された関数は、サブジェクト全体、現在の位置(patt
のマッチの後)、およびpatt
によって生成されたキャプチャ値を引数として取得します。function
によって返される最初の値は、マッチがどのように発生するかを定義します。呼び出しが数値を返す場合、マッチは成功し、返された数値が新しい現在の位置になります。(サブジェクトsと現在の位置i
を想定すると、返される数値は範囲[i, len(s) + 1]
内にある必要があります。)呼び出しがtrue
を返す場合、マッチは入力を消費せずに成功します(したがって、trueを返すことはi
を返すことと同等です)。呼び出しがfalse
、nil
、または値を返さない場合、マッチは失敗します。関数によって返される追加の値は、キャプチャによって生成される値になります。{patt}
(vim.lpeg.Pattern|string|integer|boolean|table|function
){fn}
(fun(s: string, i: integer, ...: any)
) (position: boolean|integer, ...: any)vim.lpeg.Capture
)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
){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
){patt}
) vim.lpeg.Ct()patt
によって作成されたすべての匿名キャプチャのすべての値を、1から始まる連続した整数キーを持つこのテーブル内のテーブルとして返します。さらに、patt
によって作成された名前付きキャプチャグループごとに、グループの最初の値は、グループ名をキーとしてテーブルに入れられます。キャプチャされた値はテーブルのみです。{patt}
(vim.lpeg.Pattern|string|integer|boolean|table|function
)vim.lpeg.Capture
){tab}
) vim.lpeg.locale()alnum
、alpha
、cntrl
、digit
、graph
、lower
、print
、punct
、space
、upper
、およびxdigit
という名前のフィールドがあり、それぞれに対応するパターンが含まれています。各パターンは、そのクラスに属する任意の単一の文字にマッチします。引数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
){pattern}
, {subject}
, {init}
, {...}
) vim.lpeg.match()pattern
を subject
文字列と照合します。一致が成功した場合、一致後の最初の文字の 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
) ...{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()range
は、x
とy
のコード間のコードを持つすべての文字を表す長さ2の文字列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
){string}
) vim.lpeg.S()S
はSetを表します)。例として、パターンlpeg.S('+-*/')
は任意の算術演算子にマッチします。s
が文字(つまり、長さ1の文字列)の場合、lpeg.P(s)
はlpeg.S(s)
と同等であり、lpeg.R(s..s)
と同等であることに注意してください。また、lpeg.S('')
とlpeg.R()
の両方が常に失敗するパターンであることにも注意してください。{string}
(string
)vim.lpeg.Pattern
){max}
) vim.lpeg.setmaxstack()400
です。適切に記述されたパターンのほとんどは、バックトラックレベルをほとんど必要としないため、この制限を変更する必要はめったにありません。変更する前に、追加のスペースの必要性を回避するためにパターンを書き直す必要があります。それにもかかわらず、いくつかの便利なパターンがオーバーフローする可能性があります。また、再帰的な文法では、深い再帰を持つサブジェクトもより大きな制限を必要とする可能性があります。{max}
(integer
){value}
(vim.lpeg.Pattern|string|integer|boolean|table|function
)"pattern"?
){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
)string
){string}
, {defs}
) vim.re.compile(){string}
をコンパイルし、同等のLPegパターンを返します。与えられた文字列は、式または文法のどちらかを定義できます。オプションの{defs}
テーブルは、パターンで使用される追加のLua値を提供します。{string}
(string
){defs}
(table?
)vim.lpeg.Pattern
){subject}
, {pattern}
, {init}
) vim.re.find(){subject}
内で与えられた{pattern}
を検索します。一致が見つかった場合、この出現が始まるインデックスと終わるインデックスを返します。それ以外の場合は、nilを返します。{init}
を指定すると、検索は対象文字列のその位置から開始されます。Luaライブラリでは通常どおり、負の値は末尾から数えます。{subject}
(string
){pattern}
(vim.lpeg.Pattern|string
){init}
(integer?
)integer?
) 一致が始まるインデックス、一致がない場合はnil (integer?
) 一致が終わるインデックス、一致がない場合はnil{subject}
, {pattern}
, {replacement}
) vim.re.gsub(){subject}
内の{pattern}
のすべての出現箇所を{replacement}
で置換します。{subject}
(string
){pattern}
(vim.lpeg.Pattern|string
){replacement}
(string
)string
){subject}
, {pattern}
, {init}
) vim.re.match(){subject}
に対して与えられた{pattern}
を照合し、すべてのキャプチャを返します。{subject}
(string
){pattern}
(vim.lpeg.Pattern|string
){init}
(integer?
)integer|vim.lpeg.Capture?
){bufnr}
, {line_idx}
, {start}
, {end_}
) バッファbufnr
のline_idx
(ゼロベース)の行を照合します。マッチングは、指定された場合はバイトインデックス範囲start
とend_
に制限されます。それ以外の場合は、regex:match_str()を参照してください。返されるバイトインデックスは、指定されている場合はstart
からの相対値です。{bufnr}
(integer
){line_idx}
(integer
){start}
(integer?
){end_}
(integer?
)integer?
) 一致開始(バイトインデックス)、start
からの相対値。一致がない場合はnil
(integer?
) 一致終了(バイトインデックス)、start
からの相対値。一致がない場合はnil
{str}
) regex:match_str()str
を照合します。文字列を正確に照合するには、正規表現を"^"と"$"で囲みます。一致の開始と終了のバイトインデックスを返し、一致がない場合はnil
を返します。任意の整数は「真」であるため、regex:match_str()
はif文の条件として直接使用できます。{str}
(string
)integer?
) 一致開始(バイトインデックス)、一致がない場合はnil
(integer?
) 一致終了(バイトインデックス)、一致がない場合はnil
{re}
) vim.regex()re
を解析し、正規表現オブジェクトを返します。正規表現は、'magic'および'ignorecase'に関係なく、デフォルトで「magic」かつ大文字と小文字を区別します。それらはフラグで制御できます。/magicおよび/ignorecaseを参照してください。{re}
(string
)vim.regex
){path}
) vim.secure.read(){path}
にあるファイルの読み取りを試み、ファイルが信頼できるかどうかをユーザーに尋ねます。ユーザーの選択は、$XDG_STATE_HOME/nvim/trustにある信頼データベースに永続化されます。{path}
(string
) 読み取るファイルのパス。string?
) 指定されたファイルが存在し、信頼されている場合はその内容。それ以外の場合はnil。{opts}
(table
) 次のフィールドを持つテーブル{action}
('allow'|'deny'|'remove'
) - 'allow'
はファイルを信頼データベースに追加し、信頼します。'deny'
はファイルを信頼データベースに追加し、拒否します。'remove'
は信頼データベースからファイルを削除します。{path}
(string
) 更新するファイルのパス。{bufnr}
と相互に排他的です。{action}
が「allow」の場合は使用できません。{bufnr}
(integer
) 更新するバッファ番号。{path}
と相互に排他的です。boolean
) 操作が成功した場合はtrue (string
) 操作が成功した場合は完全なパス、それ以外の場合はエラーメッセージ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
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
{v1}
, {v2}
) vim.version.cmp(){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
{v1}
(vim.Version|number[]|string
) バージョンオブジェクト。{v2}
(vim.Version|number[]|string
) v1
と比較するバージョン。integer
) v1 < v2
の場合は-1、v1 == v2
の場合は0、v1 > v2
の場合は1。{v1}
, {v2}
) vim.version.eq()true
を返します。使用法については、vim.version.cmp()を参照してください。{v1}
(vim.Version|number[]|string
){v2}
(vim.Version|number[]|string
)boolean
){v1}
, {v2}
) vim.version.ge()v1 >= v2
の場合はtrue
を返します。使用法については、vim.version.cmp()を参照してください。{v1}
(vim.Version|number[]|string
){v2}
(vim.Version|number[]|string
)boolean
){v1}
, {v2}
) vim.version.gt()v1 > v2
の場合はtrue
を返します。使用法については、vim.version.cmp()を参照してください。{v1}
(vim.Version|number[]|string
){v2}
(vim.Version|number[]|string
)boolean
){versions}
(vim.Version[]
)vim.Version?
){v1}
, {v2}
) vim.version.le()v1 <= v2
の場合はtrue
を返します。使用法については、vim.version.cmp()を参照してください。{v1}
(vim.Version|number[]|string
){v2}
(vim.Version|number[]|string
)boolean
){v1}
, {v2}
) vim.version.lt()v1 < v2
の場合はtrue
を返します。使用法については、vim.version.cmp()を参照してください。{v1}
(vim.Version|number[]|string
){v2}
(vim.Version|number[]|string
)boolean
){version}
, {opts}
) vim.version.parse()vim.version
関数で使用できるバージョンオブジェクトを返します。たとえば、「1.0.1-rc1+build.2」は次を返します。{ major = 1, minor = 0, patch = 1, prerelease = "rc1", build = "build.2" }
{version}
(string
) 解析するバージョン文字列。{opts}
(table?
) オプションのキーワード引数true
の場合、semver v2.0.0に準拠しない入力に対して強制は試行されません。false
の場合、parse()
は、「1.0」、「0-x」、「tmux 3.2a」などの入力を有効なバージョンに強制しようとします。vim.Version?
) parsed_version バージョンオブジェクト。入力が無効な場合はnil
。{spec}
) vim.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
.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))
{spec}
(string
) バージョン範囲「spec」table?
) 次のフィールドを持つテーブル{from}
(vim.Version
){to}
(vim.Version
)vim.iter()
に渡された型によって異なります。vim.iter(pairs(…))
。vim.iter(ipairs(…))
。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" }
{pred}
(fun(...):boolean
) 述語関数。パイプラインの前のステージから返されたすべての値を引数として受け取り、述語が一致する場合はtrueを返します。{pred}
(fun(...):boolean
) 述語関数。パイプラインの前のステージから返されたすべての値を引数として受け取り、述語が一致する場合はtrueを返します。{f}
(fun(...)
) パイプライン内の各項目に対して実行する関数。パイプラインの前のステージで返されたすべての値を引数として取ります。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
)local bufs = vim.iter(vim.api.nvim_list_bufs()):filter(vim.api.nvim_buf_is_loaded)
{f}
(fun(...):boolean
) パイプラインの前のステージから返されたすべての値を取り、現在のイテレータ要素を削除する必要がある場合は、falseまたはnilを返します。Iter
)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
){depth}
) Iter:flatten(){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
Iter
)-- 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
){delim}
で区切られた文字列に結合されます。{delim}
(string
) 区切り文字string
)local it = vim.iter(vim.gsplit('abcdefg', ''))
it:last()
-- 'g'
local it = vim.iter({ 3, 6, 9, 12, 15 })
it:last()
-- 15
any
)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
) マッピング関数。パイプラインの前のステージから返されたすべての値を引数として取り、1つ以上の新しい値を返します。これは、次のパイプラインステージで使用されます。nilの戻り値は出力からフィルタリングされます。Iter
)local it = vim.iter(string.gmatch('1 2 3', '%d+')):map(tonumber)
it:next()
-- 1
it:next()
-- 2
it:next()
-- 3
any
)n
が負の場合、リストイテレータの末尾からのオフセットになります。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
any
)local it = vim.iter({ 3, 6, 9, 12 })
it:peek()
-- 3
it:peek()
-- 3
it:next()
-- 3
any
)local it = vim.iter({1, 2, 3, 4})
it:pop()
-- 4
it:pop()
-- 3
any
)local it = vim.iter({ 3, 6, 9, 12 }):rev()
it:totable()
-- { 12, 9, 6, 3 }
Iter
)local it = vim.iter({ 1, 2, 3, 2, 1 }):enumerate()
it:rfind(1)
-- 5 1
it:rfind(1)
-- 1 1
{f}
(any
)any
)local it = vim.iter({1, 2, 3, 4})
it:rpeek()
-- 4
it:rpeek()
-- 4
it:pop()
-- 4
any
)local it = vim.iter({ 1, 2, 3, 4, 5 }):rskip(2)
it:next()
-- 1
it:pop()
-- 3
{n}
(number
) スキップする値の数。Iter
)local it = vim.iter({ 3, 6, 9, 12 }):skip(2)
it:next()
-- 9
{n}
(number
) スキップする値の数。Iter
):skip(first - 1):rskip(len - last + 1)
と同等です。{first}
(number
){last}
(number
)Iter
)local it = vim.iter({ 1, 2, 3, 4 }):take(2)
it:next()
-- 1
it:next()
-- 2
it:next()
-- nil
{n}
(integer
)Iter
)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 } }
table
){direction}
(vim.snippet.Direction
) ナビゲーションの方向。-1は前へ、1は次へ。{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
){input}
) vim.snippet.expand(){input}
(string
)<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は次へ。{enc}
(string
) デコードする文字列string?
) デコードされた文字列 (string?
) エラーメッセージ(ある場合){str}
(string
) エンコードする文字列string
) 16進数エンコードされた文字列{file}
:TOhtml{file}
に保存します。{file}
が指定されていない場合は、tempname()によって作成された一時ファイルが使用されます。{winid}
, {opt}
) tohtml.tohtml.tohtml(){winid}
に表示されているバッファをHTMLに変換し、出力を文字列のリストとして返します。{winid}
(integer?
) 変換するウィンドウ(デフォルトは現在のウィンドウ){opt}
(table?
) オプションのパラメータ。{title}
(string|false
, デフォルト: バッファ名) 生成されたHTMLコードに設定するタイトルタグ。{number_lines}
(boolean
, デフォルト: false
) 行番号を表示します。{font}
(string[]|string
, デフォルト: guifont
) 使用するフォント。{range}
(integer[]
, デフォルト: バッファ全体) 使用する行の範囲。string[]
)