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.inspectvim.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 = trueset 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 の最後のインデックス。デフォルトは #srctable) 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[])