Lua

Nvim の :help ページは、生成されたもので、ソースtree-sitter-vimdocパーサーを使って処理しています。


Lua エンジン Lua

はじめに lua-intro

Lua 5.1 スクリプトエンジンは組み込みで、常に利用可能です。このコマンドを試して、その奥深さを体験してください。
:lua vim.print(package.loaded)
Nvim には、Lua 用の「標準ライブラリ」lua-stdlib が含まれています。これは、「エディタ標準ライブラリ」(builtin-functions および Ex-commands)と API を補完するもので、これらはすべて Lua コードから使用できます(lua-vimscript vim.api)。これらの「名前空間」が、Nvim のプログラミングインターフェースを形成しています。
Lua プラグインとユーザー設定は、Vimscript と同様に自動的に検出されロードされます。実用的なガイダンスについては、lua-guide を参照してください。
-l 引数を使用して、シェルから Lua スクリプトを実行することもできます。
nvim -l foo.lua [args...]
lua-compat
Lua 5.1 は、Nvim Lua の永続的なインターフェースです。プラグインは luaref で指定されているように Lua 5.1 をターゲットにする必要があります。後のバージョン(本質的に異なり、互換性のない方言)はサポートされていません。これには、LuaJIT などの一部の Lua 5.1 インタープリターがサポートする goto などの拡張機能も含まれます。
lua-luajit
Nvim は公式には Lua 5.1 のサポートのみを必要としますが、パフォーマンス上の理由から、サポートされているプラットフォームでは LuaJIT または互換性のあるフォークでビルドする必要があります。LuaJIT には、ffilua-profile、および強化された標準ライブラリ関数などの便利な拡張機能も付属しています。これらは利用可能であると想定することはできず、init.lua またはプラグインの Lua コードは、使用する前に jit グローバル変数を確認する必要があります。
if jit then
  -- code for luajit
else
  -- code for plain lua 5.1
end
lua-bit
例外の1つは、LuaJIT の bit 拡張機能です。これは常に利用可能です。PUC Lua でビルドされた場合、Nvim には require("bit") を提供するフォールバック実装が含まれています。
lua-profile
Nvim が LuaJIT でビルドされている場合、Lua コードは次のようにプロファイルできます。
-- Start a profiling session:
require('jit.p').start('ri1', '/tmp/profile')
-- Perform arbitrary tasks (use plugins, scripts, etc.) ...
-- Stop the session. Profile is written to /tmp/profile.
require('jit.p').stop()
詳細については、https://luajit.org/ext_profiler.html または p.lua ソースを参照してください。
:lua vim.cmd.edit(package.searchpath('jit.p', package.path))

LUA の概念とイディオム lua-concepts

Lua は非常にシンプルで、_一貫性_があります。いくつかの癖はありますが、一度それらを内部化すれば、すべてが同じように機能します。特にスコープ(クロージャ)は非常に一貫性があり、JavaScript や他のほとんどの言語とは異なります。
Lua には、3つの基本的なメカニズムがあります。「プログラミングの主要な側面」ごとに1つずつあります。テーブル、クロージャ、およびコルーチンです。https://lua.dokyumento.jp/doc/cacm2018.pdf
テーブルは「オブジェクト」またはコンテナデータ構造です。リストとマップの両方を表し、メタテーブル(Python の「データモデル」のようなもの)を使用して独自のデータ型を表すように拡張したり、その動作を変更したりできます。
Lua のすべてのスコープはクロージャです。関数はクロージャであり、モジュールはクロージャであり、do ブロック(lua-do)はクロージャです。そして、それらはすべて同じように機能します。Lua モジュールは、文字通り「パス」(モジュールが見つかる場所:package.cpath)で発見された大きなクロージャです。
スタックフルコルーチンは、Lua とそのホスト(Nvim)の両方に対して、協調的なマルチスレッディング、ジェネレーター、および汎用性の高い制御を可能にします。
lua-error-handling
Lua 関数は、lua-errors (例外的な(予期しない)エラー)をスローする可能性があり、pcall() を使用して処理できます。 lua-result-or-message
失敗が正常で予想される場合、呼び出し元に失敗が「例外的」ではなく、処理する必要があることを示す nil を返すのが慣例です。この「結果またはメッセージ」パターンは、マルチ値戻り型 any|nil,nil|string として、または LuaLS 表記で表現されます。
---@return any|nil    # result on success, nil on failure.
---@return nil|string # nil on success, error message on failure.
「結果またはメッセージ」パターンの例
呼び出し元が失敗時に続行できない場合は、結果である「結果またはメッセージ」を assert() するのが慣例です。
local value = assert(fn())
ガイダンス:「結果またはメッセージ」パターンを以下に使用します...
特に外部との通信時など、失敗が予想される関数。たとえば、HTTP リクエストや LSP リクエストは、呼び出し元がすべて正しく行ったとしても、サーバーの問題が原因で失敗することがよくあります。
値を返す関数(例:Foo:new())。
3番目の値として返すことができる既知のエラーコードのリストがある場合(luv-error-handlingのように)。
iterator
イテレーターは、コレクション(またはその他の iterable)の「次」の値を取得するために繰り返し呼び出すことができる単なる関数です。このインターフェースは、for-in ループで必要とされ、pairs() によって生成され、vim.iterなどによってサポートされています。https://lua.dokyumento.jp/pil/7.1.html
iterable
「iterable」は、vim.iter() が消費できるものです。テーブル、辞書、リスト、イテレーター関数、__call() メタメソッドを実装するテーブル、および vim.iter() オブジェクトなどです。
list-iterator
lua-list テーブルのイテレーターには「中間」と「終端」がありますが、一般的なイテレーターは論理的に無限である可能性があります。したがって、一部の vim.iter 操作(例:Iter:rev())は、リストのようなテーブル(定義により有限)でのみ意味があります。
lua-function-call
Lua 関数は、複数の方法で呼び出すことができます。次の関数について考えてみましょう。
local foo = function(a, b)
    print("A: ", a)
    print("B: ", b)
end
この関数を呼び出す最初の方法は次のとおりです。
foo(1, 2)
-- ==== Result ====
-- A: 1
-- B: 2
この関数の呼び出し方は、ほとんどのスクリプト言語で馴染みがあります。Lua では、欠落した引数は nil として渡され、余分なパラメーターは黙って破棄されます。例
foo(1)
-- ==== Result ====
-- A: 1
-- B: nil
kwargs
関数を呼び出す際、関数が厳密に1つの文字列リテラル("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" }
ここでは、括弧が暗黙的に追加されることを除いて、特別なことは何も起こっていません。しかし、視覚的には、このわずかな糖衣が「キーワード引数」インターフェースにかなり近づいています。
lua-regex
Lua は意図的に正規表現をサポートしていません。代わりに、拡張された正規表現のパフォーマンス上の落とし穴を回避する限定的な lua-patterns があります。Lua スクリプトは、vim.regex() を使用して Vim 正規表現を使用することもできます。
print(string.match("foo123bar123", "%d+"))
-- 123
print(string.match("foo123bar123", "[^%d]+"))
-- foo
print(string.match("foo123bar123", "[abc]+"))
-- ba
print(string.match("foo.bar", "%.bar"))
-- .bar

LUA モジュールのインポート lua-module-load

モジュールは、'runtimepath' で指定されたディレクトリの下で、表示される順に検索されます。モジュール名に含まれる「.」は、検索時にディレクトリセパレーターとして扱われます。モジュール foo.bar の場合、各ディレクトリで lua/foo/bar.lua、次に lua/foo/bar/init.lua が検索されます。ファイルが見つからない場合は、package.cpath の初期値から派生したサフィックスのリスト(sodll など)である ? と一致する名前を持つ共有ライブラリがディレクトリで再度検索されます。それでもファイルが見つからない場合、Nvim は Lua のデフォルト検索メカニズムにフォールバックします。最初に見つかったスクリプトが実行され、スクリプトによって返された値があれば require() がその値を返し、それ以外の場合は true を返します。
戻り値は、各モジュールに対して最初に require() を呼び出した後にキャッシュされ、後続の呼び出しでは、スクリプトの検索または実行を行わずに、キャッシュされた値を返します。詳細については、require() を参照してください。
たとえば、'runtimepath'foo,bar で、package.cpath が起動時に ./?.so;./?.dll であった場合、require('mod') は次のパスを順番に検索し、最初に見つかったモジュールをロードします(「最初が優先」)。
foo/lua/mod.lua
foo/lua/mod/init.lua
bar/lua/mod.lua
bar/lua/mod/init.lua
foo/lua/mod.so
foo/lua/mod.dll
bar/lua/mod.so
bar/lua/mod.dll
lua-package-path
Nvim は、有効な 'runtimepath' 値に従って、package.pathpackage.cpath を自動的に調整します。調整は、'runtimepath' が変更されるたびに発生します。package.path は、'runtimepath' からの各ディレクトリに /lua/?.lua および /lua/?/init.lua を追加するだけで調整されます(/ は実際には package.config の最初の文字です)。
package.path と同様に、'runtimepath' から変更されたディレクトリも package.cpath に追加されます。この場合、各ランタイムパスに /lua/?.lua および /lua/?/init.lua を追加する代わりに、既存の package.cpath のすべての固有の ? を含むサフィックスが使用されます。例
1. 以下を想定
'runtimepath' には /foo/bar,/xxx;yyy/baz,/abc が含まれています。
初期 package.cpath(コンパイル時に定義されるか、$LUA_CPATH / $LUA_INIT から派生)には ./?.so;/def/ghi/a?d/j/g.elf;/def/?.so が含まれています。
2. ? を含むサフィックス /?.so/a?d/j/g.elf、および /?.so を順番に検索します。疑問符を含む最初のパスコンポーネントから始まるパスの部分と、先行するパスセパレーターです。
3. /def/?.so のサフィックス、すなわち /?.so は、package.path の最初のパスのサフィックス(つまり、./?.so)と同じであるため、一意ではありません。これにより、/?.so/a?d/j/g.elf がこの順序で残ります。
4. 'runtimepath' には、3つのパス /foo/bar/xxx;yyy/baz、および /abc があります。2番目のパスには、パスセパレーターであるセミコロンが含まれているため、除外され、/foo/bar/abc のみが順番に残ります。
5. 4. のパスと 3. のサフィックスのデカルト積を取得すると、4つのバリアントが得られます。各バリアントでは、/lua パスセグメントがパスとサフィックスの間に挿入され、次のようになります。
/foo/bar/lua/?.so
/foo/bar/lua/a?d/j/g.elf
/abc/lua/?.so
/abc/lua/a?d/j/g.elf
6. 新しいパスが元の package.cpath の先頭に追加されます。
結果は次のようになります。
/foo/bar,/xxx;yyy/baz,/abc ('runtimepath')
× ./?.so;/def/ghi/a?d/j/g.elf;/def/?.so (package.cpath)
= /foo/bar/lua/?.so;/foo/bar/lua/a?d/j/g.elf;/abc/lua/?.so;/abc/lua/a?d/j/g.elf;./?.so;/def/ghi/a?d/j/g.elf;/def/?.so
注意
'runtimepath' の更新を追跡するために、以前の更新で追加されたパスは記憶され、次の更新で削除されます。一方、新しい 'runtimepath' から派生したすべてのパスは、上記のように先頭に追加されます。これにより、パスが 'runtimepath' から削除されたときにパスを削除し、パスが追加されたときに追加し、'runtimepath' の順序が変更された場合に package.path/|package.cpath| のコンテンツを並べ替えることができます。
調整は自動的に行われますが、Nvim は package.path または package.cpath の現在の値を追跡しません。そこからパスを削除してしまった場合は、'runtimepath' を設定して更新をトリガーできます。
let &runtimepath = &runtimepath
セミコロンを含む 'runtimepath' からのパスのスキップは、package.pathpackage.cpath の両方に適用されます。セミコロンを含むパスでは動作しないシェルを使用する、誤った記述のプラグインがあるため、'runtimepath' にはセミコロンをまったく含めない方が良いでしょう。

コマンド lua-commands

これらのコマンドは、コマンドライン (:lua, :luado) またはファイル (:luafile) から、指定された行[範囲]で Lua のチャンクを実行します。Lua では常にそうであるように、各チャンクには独自のスコープ (クロージャ) があるため、グローバル変数はコマンド呼び出し間で共有されるだけです。lua-stdlib モジュール、ユーザーモジュール、および package.path 上の他のすべてが利用可能です。
Lua の print() 関数は、出力を Nvim のメッセージ領域にリダイレクトします。引数は "\t" (タブ) ではなく " " (スペース) で区切られます。
:lua= :lua :lua {chunk} Lua チャンク {chunk} を実行します。{chunk} が "=" で始まる場合、チャンクの残りの部分は式として評価され、出力されます。:lua =expr:=expr:lua vim.print(expr) と同等です。
:lua vim.api.nvim_command('echo "Hello, Nvim!"')
Lua のバージョンを確認するには
:lua print(_VERSION)
LuaJIT のバージョンを確認するには
:lua =jit.version
:{range}lua {range} 内のバッファ行を Lua コードとして実行します。:source とは異なり、これは常にそれらの行を Lua コードとして扱います。
例: 次のコードを選択し、":lua<Enter>" と入力して実行します。
print(string.format(
    'unix time: %s', os.time()))
:lua-heredoc
:lua << [trim] [{endmarker}] {script} {endmarker} Vimscript 内から Lua スクリプト {script} を実行します。 "<<" の後に [endmarker] を省略して、{script} の後にドット "." を使用できます (:append, :insert と同様)。詳細については、:let-heredoc を参照してください。
function! CurrentLineInfo()
lua << EOF
local linenr = vim.api.nvim_win_get_cursor(0)[1]
local curline = vim.api.nvim_buf_get_lines(0, linenr - 1, linenr, false)[1]
print(string.format('Line [%d] has %d bytes', linenr, #curline))
EOF
endfunction
local 変数はブロックの終了時に消滅することに注意してください。ただし、グローバル変数は消滅しません。
:luado
:[range]luado {body} [range] 内の各バッファ行に対して、Lua チャンク "function(line, linenr) {body} end" を実行します。ここで、line は現在の行テキスト (<EOL> なし) であり、linenr は現在の行番号です。関数が文字列を返した場合、それが対応するバッファ行のテキストになります。デフォルトの [range] はファイル全体: "1,$" です。
:luado return string.format("%s\t%d", line:reverse(), #line)
:lua require"lpeg"
:lua -- balanced parenthesis grammar:
:lua bp = lpeg.P{ "(" * ((1 - lpeg.S"()") + lpeg.V(1))^0 * ")" }
:luado if bp:match(line) then return "=>\t" .. line end
:luafile
:luafile {file} {file} 内の Lua スクリプトを実行します。引数全体がファイル名として使用され (:edit と同様)、スペースはエスケープする必要はありません。または、Lua ファイルを :source することもできます。
:luafile script.lua
:luafile %

luaeval() lua-eval

Nvim に Lua の値を渡すための "vim.eval" の (二重の) 同等物が "luaeval" です。"luaeval" は、式文字列と、式内の _A に使用されるオプションの引数を取り、式の結果を返します。Lua では意味的に同等です。
local chunkheader = "local _A = select(1, ...) return "
function luaeval (expstr, arg)
    local chunk = assert(loadstring(chunkheader .. expstr, "luaeval"))
    return chunk(arg) -- return typval
end
Lua の nil、数値、文字列、テーブル、およびブール値は、それぞれの Vimscript 型に変換されます。Lua の文字列に NUL バイトが含まれている場合は、Blob に変換されます。他の Lua 型の変換はエラーです。
マジックグローバル "_A" には、luaeval() の 2 番目の引数が含まれています。
:echo luaeval('_A[1] + _A[2]', [40, 2])
" 42
:echo luaeval('string.match(_A, "[a-z]+")', 'XYXfoo123')
" foo
lua-table-ambiguous
Lua のテーブルは、辞書とリストの両方として使用されるため、空のテーブルがリストか辞書かを判断することは不可能です。また、Lua には整数がありません。これらのケースを明確にするために、次のように定義します: lua-list
0. 空のテーブルはリストです。空の辞書を表すには vim.empty_dict() を使用します。1. N 個の連続した (nil 値、つまり「穴」がない) 整数キー 1…N を持つテーブルはリストです。list-iterator も参照してください。 lua-dict
2. 文字列キーを持ち、そのいずれにも NUL バイトが含まれていないテーブルは辞書です。3. 文字列キーを持ち、少なくとも 1 つに NUL バイトが含まれているテーブルも辞書と見なされますが、今回は msgpack-special-map に変換されます。 lua-special-tbl
4. vim.type_idx キーを持つテーブルは、辞書、リスト、または浮動小数点値である可能性があります。
{[vim.type_idx]=vim.types.float, [vim.val_idx]=1} は浮動小数点数 1.0 に変換されます。デフォルトでは、整数の Lua 数値は Number に変換され、非整数の数値は Float に変換されることに注意してください。このバリアントでは、整数の Float が許可されます。
{[vim.type_idx]=vim.types.dictionary} は空の辞書に変換され、{[vim.type_idx]=vim.types.dictionary, [42]=1, a=2} は辞書 {'a': 42} に変換されます。文字列以外のキーは無視されます。vim.type_idx キーがない場合、1.、2.、または 3. に適合しないキーを持つテーブルはエラーです。
{[vim.type_idx]=vim.types.array} は空のリストに変換されます。また、{[vim.type_idx]=vim.types.array, [42]=1} も同様です。1 から N までの 1 ステップのシーケンスを形成しない整数のキー、およびすべての非整数のキーは無視されます。
:echo luaeval('math.pi')
:function Rand(x,y) " random uniform between x and y
:  return luaeval('(_A.y-_A.x)*math.random()+_A.x', {'x':a:x,'y':a:y})
:  endfunction
:echo Rand(1,10)
注: luaeval の 2 番目の引数は、Vimscript から Lua に変換 ("マーシャリング") されるため、Lua コンテナへの変更は Vimscript の値に影響しません。戻り値も常に変換されます。変換時に、msgpack-special-dict は特別に扱われます。

Vimscript v:lua インターフェース v:lua-call

Vimscript から、特殊な v:lua プレフィックスを使用して、グローバルまたはグローバルテーブルからアクセスできる Lua 関数を呼び出すことができます。式
call v:lua.func(arg1, arg2)
は、Lua チャンクと同等です。
return func(...)
ここで、args は Lua 値に変換されます。式
call v:lua.somemod.func(args)
は、Lua チャンクと同等です。
return somemod.func(...)
さらに、パッケージの関数は次のようにアクセスできます。
call v:lua.require'mypack'.func(arg1, arg2)
call v:lua.require'mypack.submod'.func(arg1, arg2)
注: かっこなしの単一引用符形式のみが許可されます。プレフィックスとして require"mypack" または require('mypack') を使用しても動作しません (後者は、require が役立つ値を返す場合に、それ自体の関数呼び出しとして引き続き有効です)。
v:lua プレフィックスを使用して、Lua 関数を メソッド として呼び出すことができます。たとえば
:eval arg1->v:lua.somemod.func(arg2)
'tagfunc''omnifunc' などの "func" オプションで 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

Lua 標準モジュール lua-stdlib

Nvim の Lua "標準ライブラリ" (stdlib) は、さまざまな関数とサブモジュールを公開する vim モジュールです。常にロードされるため、require("vim") は不要です。
モジュールのプロパティを覗くことができます。
:lua vim.print(vim)
結果は次のようになります。
{
  _os_proc_children = <function 1>,
  _os_proc_info = <function 2>,
  ...
  api = {
    nvim__id = <function 5>,
    nvim__id_array = <function 6>,
    ...
  },
  deepcopy = <function 106>,
  gsplit = <function 107>,
  ...
}
たとえば、"deepcopy" 関数のドキュメントを検索するには
:help vim.deepcopy()
アンダースコアプレフィックス付きの関数 (例: "_os_proc_children") は内部/プライベートであり、プラグインで使用してはならないことに注意してください。

VIM.UV lua-loop vim.uv

vim.uv は、Nvim がネットワーキング、ファイルシステム、およびプロセス管理に使用する libUV ライブラリの "luv" Lua バインディングを公開します。luvref.txt を参照してください。特に、メインの Nvim luv-event-loop との対話を可能にします。
E5560 lua-loop-callbacks vim.uv コールバックで api-fast を除く vim.api 関数を直接呼び出すとエラーになります。たとえば、これはエラーです。
local timer = vim.uv.new_timer()
timer:start(1000, 0, function()
  vim.api.nvim_command('echomsg "test"')
end)
エラーを回避するには、vim.schedule_wrap() を使用してコールバックを遅延させます。
local timer = vim.uv.new_timer()
timer:start(1000, 0, vim.schedule_wrap(function()
  vim.api.nvim_command('echomsg "test"')
end))
(ワンショットタイマーについては、vim.defer_fn() を参照してください。これは自動的にラッピングを追加します。)
例: タイマーの繰り返し 1. このコードをファイルに保存します。2. ":luafile %" で実行します。
-- Create a timer handle (implementation detail: uv_timer_t).
local timer = vim.uv.new_timer()
local i = 0
-- Waits 1000ms, then repeats every 750ms until timer:close().
timer:start(1000, 750, function()
  print('timer invoked! i='..tostring(i))
  if i > 4 then
    timer:close()  -- Always close handles to avoid leaks.
  end
  i = i + 1
end)
print('sleeping');
例: ファイル変更の検出 watch-file
1. このコードをファイルに保存します。2. ":luafile %" で実行します。3. ":Watch %" を使用して任意のファイルを監視します。4. 別のテキストエディタからファイルを編集してみます。5. ファイルが Nvim でリロードされることを確認します (on_change() が :checktime を呼び出すため)。
local w = vim.uv.new_fs_event()
local function on_change(err, fname, status)
  -- Do work...
  vim.api.nvim_command('checktime')
  -- Debounce: stop/start.
  w:stop()
  watch_file(fname)
end
function watch_file(fname)
  local fullpath = vim.api.nvim_call_function(
    'fnamemodify', {fname, ':p'})
  w:start(fullpath, {}, vim.schedule_wrap(function(...)
    on_change(...) end))
end
vim.api.nvim_command(
  "command! -nargs=1 Watch call luaeval('watch_file(_A)', expand('<args>'))")
inotify-limitations
Linux では、デフォルトの制限が低すぎる可能性があるため、inotify ウォッチとキューに入れられたイベントの最大数を増やす必要がある場合があります。制限を増やすには、次を実行します。
sysctl fs.inotify.max_user_watches=494462
これにより、制限が 494462 のウォッチとキューに入れられたイベントに増加します。これらの行を /etc/sysctl.conf に追加して、変更を永続化できます。
各ウォッチはカーネル内の構造であるため、利用可能なメモリも inotify を使用するためのボトルネックになることに注意してください。実際、ウォッチは最大 1KB の領域を占める可能性があります。これは、100 万個のウォッチは 1GB の追加 RAM 使用量になる可能性があることを意味します。
例: TCP エコーサーバー tcp-server
1. このコードをファイルに保存します。2. ":luafile %" で実行します。3. ポート番号をメモします。4. 任意の TCP クライアント (例: "nc 0.0.0.0 36795") から接続します。
local function create_server(host, port, on_connect)
  local server = vim.uv.new_tcp()
  server:bind(host, port)
  server:listen(128, function(err)
    assert(not err, err)  -- Check for errors.
    local sock = vim.uv.new_tcp()
    server:accept(sock)  -- Accept client connection.
    on_connect(sock)  -- Start reading messages.
  end)
  return server
end
local server = create_server('0.0.0.0', 0, function(sock)
  sock:read_start(function(err, chunk)
    assert(not err, err)  -- Check for errors.
    if chunk then
      sock:write(chunk)  -- Echo received messages to the channel.
    else  -- EOF (stream closed).
      sock:close()  -- Always close handles to avoid leaks.
    end
  end)
end)
print('TCP echo-server listening on port: '..server:getsockname().port)
マルチスレッド lua-loop-threading
プラグインは、luv のスレッド API (たとえば vim.uv.new_thread) を使用して、個別の (OS レベルの) スレッドで作業を実行できます。すべてのスレッドは、メインスレッドの Lua グローバル変数にアクセスできない、独自の個別の Lua インタープリター状態を取得することに注意してください。また、エディターの状態 (バッファ、ウィンドウなど) にもスレッドから直接アクセスできません。
vim.* API のサブセットがスレッドで利用できます。これには以下が含まれます。
スレッドごとに個別のイベントループがある vim.uv
vim.mpack および vim.json (スレッド間のメッセージのシリアル化に役立ちます)。
スレッド内のrequireは、グローバルのpackage.pathからLuaパッケージを使用できます。
print()vim.inspect
vim.diff
vim.splitvim.tbl_*vim.list_*など、純粋なLua値を扱うためのvim.*のほとんどのユーティリティ関数。
vim.is_thread()は、メインスレッド以外からtrueを返します。

VIM.HL vim.hl

vim.hl.on_yank({opts}) vim.hl.on_yank()
TextYankPostイベント中にヤンクされたテキストをハイライトします。
あなたのinit.vimに以下を追加してください。
autocmd TextYankPost * silent! lua vim.hl.on_yank {higroup='Visual', timeout=300}
パラメータ
{opts} (table?) オプションのパラメータ
yankされた領域のハイライトグループ(デフォルトは "IncSearch")
ハイライトがクリアされるまでの時間(ミリ秒単位)(デフォルトは150)
マクロ実行時にハイライト(デフォルトはfalse)
ビジュアル選択をヤンクするときにハイライト(デフォルトはtrue)
eventイベント構造(デフォルトはvim.v.event)
priority整数優先度(デフォルトはvim.hl.priorities.user
vim.hl.priorities vim.hl.priorities
ハイライトに使用されるデフォルトの優先度を持つテーブル
syntax: 50, 標準のシンタックスハイライトに使用
treesitter: 100, treesitterベースのハイライトに使用
semantic_tokens: 125, LSPセマンティックトークンハイライトに使用
diagnostics: 150, 診断などのコード分析に使用
user: 200, LSPドキュメントシンボルやon_yank自動コマンドなど、ユーザーがトリガーするハイライトに使用
vim.hl.range()
vim.hl.range({bufnr}, {ns}, {higroup}, {start}, {finish}, {opts}) テキストの範囲にハイライトグループを適用します。
パラメータ
{bufnr} (integer) ハイライトを適用するバッファ番号
{ns} (integer) ハイライトを追加する名前空間
{higroup} (string) ハイライトに使用するハイライトグループ
{start} (integer[]|string) getpos()で受け入れられる(行、列)タプルまたは文字列としての領域の開始
{finish} (integer[]|string) getpos()で受け入れられる(行、列)タプルまたは文字列としての領域の終了
{opts} (table?) 次のフィールドを持つテーブル
{regtype} (string, デフォルト: 'v' つまり文字単位) 範囲のタイプ。 getregtype()を参照してください。
{inclusive} (boolean, デフォルト: false) 範囲が終端を含むかどうかを示します
{priority} (integer, デフォルト: vim.hl.priorities.user) ハイライトの優先度

VIM.DIFF vim.diff

vim.diff({a}, {b}, {opts}) vim.diff()
文字列{a}{b}でdiffを実行します。この関数によって直接またはコールバック引数を通じて返されるインデックスは、1ベースです。
vim.diff('a\n', 'b\nc\n')
-- =>
-- @@ -1 +1,2 @@
-- -a
-- +b
-- +c
vim.diff('a\n', 'b\nc\n', {result_type = 'indices'})
-- =>
-- {
--   {1, 1, 1, 2}
-- }
パラメータ
{a} (string) 比較する最初の文字列
{b} (string) 比較する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

VIM.MPACK vim.mpack

このモジュールは、msgpackエンコードされた文字列との間でLuaオブジェクトのエンコードとデコードを提供します。vim.NILvim.empty_dict()をサポートします。
vim.mpack.decode({str}) vim.mpack.decode()
msgpackエンコードされた{str}をLuaオブジェクトにデコード(または「アンパック」)します。
パラメータ
{str} (string)
戻り値
(any)
vim.mpack.encode({obj}) vim.mpack.encode()
Luaオブジェクト{obj}をLua文字列でmsgpackとしてエンコード(または「パック」)します。
パラメータ
{obj} (any)
戻り値
(string)

VIM.JSON vim.json

このモジュールは、JSONエンコードされた文字列との間でLuaオブジェクトのエンコードとデコードを提供します。vim.NILvim.empty_dict()をサポートします。
vim.json.decode({str}, {opts}) vim.json.decode()
JSONエンコードされた{str}をLuaオブジェクトにデコード(または「アンパック」)します。
JSON "null"をvim.NILとしてデコードします({opts}で制御可能、下記参照)。
空のオブジェクトをvim.empty_dict()としてデコードします。
空の配列を{}(空のLuaテーブル)としてデコードします。
vim.print(vim.json.decode('{"bar":[],"foo":{},"zub":null}'))
-- { bar = {}, foo = vim.empty_dict(), zub = vim.NIL }
パラメータ
{str} (string) 文字列化されたJSONデータ。
{opts} (table<string,any>?) キーを持つオプションテーブル
luanil: (table) キーを持つテーブル
object: (boolean) trueの場合、JSONオブジェクトのnullvim.NILの代わりにLua nilに変換します。
array: (boolean) trueの場合、JSON配列のnullvim.NILの代わりにLua nilに変換します。
戻り値
(any)
vim.json.encode({obj}) vim.json.encode()
Luaオブジェクト{obj}をLua文字列でJSONとしてエンコード(または「パック」)します。
パラメータ
{obj} (any)
戻り値
(string)

VIM.BASE64 vim.base64

vim.base64.decode({str}) vim.base64.decode()
Base64エンコードされた文字列をデコードします。
パラメータ
{str} (string) Base64エンコードされた文字列
戻り値
(string) デコードされた文字列
vim.base64.encode({str}) vim.base64.encode()
Base64を使用して{str}をエンコードします。
パラメータ
{str} (string) エンコードする文字列
戻り値
(string) エンコードされた文字列

VIM.SPELL vim.spell

vim.spell.check({str}) vim.spell.check()
{str}のスペルエラーをチェックします。Vimscript関数spellbadword()と同様です。
注意: この関数の動作は、'spelllang''spellfile''spellcapcheck'、および'spelloptions'に依存します。これらはすべてバッファに対してローカルにできます。nvim_buf_call()でこれを呼び出すことを検討してください。
vim.spell.check("the quik brown fox")
-- =>
-- {
--     {'quik', 'bad', 5}
-- }
パラメータ
{str} (string)
戻り値
([string, 'bad'|'rare'|'local'|'caps', integer][]) 3つの項目を持つタプルのリスト
スペルが間違っている単語。
スペルエラーのタイプ:「bad」スペルミス「rare」まれな単語「local」別の地域でのみ有効な単語「caps」単語は大文字で始める必要があります
{str}内で単語が始まる位置。
vim.api.{func}({...}) vim.api
引数{...}を使用して、Nvim API関数{func}を呼び出します。例:「nvim_get_current_line()」API関数を呼び出す
print(tostring(vim.api.nvim_get_current_line()))
vim.NIL vim.NIL
RPCおよびVimscript変換のv:nullでNILを表す特殊な値。同様の場合。Lua nilは、ディクショナリまたは配列を表すLuaテーブルの一部として使用できません。欠落として扱われるためです。{"foo", nil}{"foo"}と同じです。
vim.type_idx vim.type_idx
lua-special-tblで使用するためのタイプインデックス。vim.typesの値のいずれかを指定すると、空のテーブルを型指定できます(空のLuaテーブルが空のリストを表すか、空の配列を表すかは不明確です)、整数をFloatに強制します。詳細については、lua-special-tblを参照してください。
vim.val_idx vim.val_idx
Floatを表すテーブルの値インデックス。浮動小数点値1.0を表すテーブルは次のようになります。
{
  [vim.type_idx] = vim.types.float,
  [vim.val_idx] = 1.0,
}
vim.type_idxおよびlua-special-tblも参照してください。
vim.types vim.types
vim.type_idxの可能な値を持つテーブル。キーと値のペアの2つのセットが含まれています。1つ目はvim.type_idxの可能な値を人間が読める文字列にマップし、2つ目は人間が読めるタイプ名をvim.type_idxの値にマップします。現在、floatarraydictionaryタイプ用のペアが含まれています。
注: 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つの型の値のみを含むことは保証されません。
log_levels vim.log.levels ログレベルは、vim.log.levels で定義された値のいずれかです。
vim.log.levels.DEBUG vim.log.levels.ERROR vim.log.levels.INFO vim.log.levels.TRACE vim.log.levels.WARN vim.log.levels.OFF
vim.empty_dict() vim.empty_dict()
特別な空のテーブル(メタテーブルでマークされている)を作成します。これは、Luaの値をVimscriptまたはAPI型に変換する際に、Nvimが空の辞書に変換します。Nvimはデフォルトでは、このメタテーブルを持たない空のテーブル {} をリスト/配列に変換します。
注: テーブルに数値キーが存在する場合、Nvimはメタテーブルマーカーを無視し、辞書をリスト/配列に変換します。
戻り値
(table)
vim.iconv({str}, {from}, {to}) vim.iconv()
結果は文字列であり、テキスト {str} をエンコーディング {from} からエンコーディング {to} に変換したものです。変換に失敗すると、nil が返されます。一部の文字を変換できなかった場合は、"?" で置き換えられます。エンコーディング名は、iconv() ライブラリ関数が受け入れることができるものであれば何でも構いません。":Man 3 iconv" を参照してください。
パラメータ
{str} (string) 変換するテキスト
{from} (string) {str} のエンコーディング
{to} (string) ターゲットエンコーディング
戻り値
(string?) 変換が成功した場合は変換された文字列、それ以外の場合は nil
vim.in_fast_event() vim.in_fast_event()
コードが「高速」イベントハンドラーの一部として実行されている場合、つまりAPIのほとんどが無効になっている場合にtrueを返します。これらは、Nvimが入力をポーリングするたびに呼び出すことができる低レベルのイベント(例:lua-loop-callbacks)です。これが false の場合、ほとんどのAPI関数は呼び出し可能ですが、textlockなどの他の制限を受ける可能性があります。
vim.rpcnotify({channel}, {method}, {...}) vim.rpcnotify()
RPC を介して {channel}{event} を送信し、すぐに返します。{channel} が0の場合、イベントはすべてのチャネルにブロードキャストされます。
この関数は、高速コールバック lua-loop-callbacks でも動作します。
パラメータ
{channel} (integer)
{method} (string)
{...} (any?)
vim.rpcrequest({channel}, {method}, {...}) vim.rpcrequest()
RPC を介して {method} を呼び出すために {channel} にリクエストを送信し、応答を受信するまでブロックします。
注: 戻り値の一部としての NIL 値は、vim.NIL 特殊値として表されます。
パラメータ
{channel} (integer)
{method} (string)
{...} (any?)
vim.schedule({fn}) vim.schedule()
{fn} をメインイベントループによってすぐに呼び出されるようにスケジュールします。textlockやその他の一時的な制限を回避するのに役立ちます。
パラメータ
{fn} (fun())
vim.str_utf_end({str}, {index}) vim.str_utf_end()
{index} が指すコードポイント(文字)の最後のバイトからの距離(バイト単位)を取得します。
-- The character 'æ' is stored as the bytes '\xc3\xa6' (using UTF-8)
-- Returns 0 because the index is pointing at the last byte of a character
vim.str_utf_end('æ', 2)
-- Returns 1 because the index is pointing at the penultimate byte of a character
vim.str_utf_end('æ', 1)
パラメータ
{str} (string)
{index} (integer)
戻り値
(integer)
vim.str_utf_pos({str}) vim.str_utf_pos()
指定された文字列内の各UTF-8コードポイントの開始バイト位置のリストを取得します。
埋め込まれたNULバイトは、文字列を終了するものとして扱われます。
パラメータ
{str} (string)
戻り値
(integer[])
vim.str_utf_start({str}, {index}) vim.str_utf_start()
{index} が指すコードポイント(文字)の開始バイトからの距離(バイト単位)を取得します。
結果を {index} に加算して、文字の開始バイトを取得できます。
-- The character 'æ' is stored as the bytes '\xc3\xa6' (using UTF-8)
-- Returns 0 because the index is pointing at the first byte of a character
vim.str_utf_start('æ', 1)
-- Returns -1 because the index is pointing at the second byte of a character
vim.str_utf_start('æ', 2)
パラメータ
{str} (string)
{index} (integer)
戻り値
(integer)
vim.stricmp({a}, {b}) vim.stricmp()
文字列を大文字と小文字を区別せずに比較します。
パラメータ
{a} (string)
{b} (string)
戻り値
(0|1|-1) 文字列が等しい場合、{a}{b} より大きい場合、または {a}{b} より小さい場合、それぞれ。
vim.ui_attach({ns}, {options}, {callback}) vim.ui_attach()
警告: この機能は実験的/不安定です。
ui-events にアタッチします。nvim_ui_attach() と同様ですが、Luaコールバックとしてイベントを受信します。Luaでポップアップメニューやメッセージ処理のような画面要素を実装するために使用できます。
{options} は辞書のようなテーブルである必要があり、ext_... オプションをtrueに設定して、それぞれの外部要素のイベントを受信する必要があります。
{callback} は、イベント名と追加のパラメータを受け取ります。各イベントのイベント形式については、ui-popupmenuと以下のセクションを参照してください。
警告: このAPIは実験的と見なされています。使いやすさは画面要素によって異なります。特に、ext_messages の動作は、今後の変更と使いやすさの改善の影響を受けます。これは、'cmdheight' をゼロに設定した場合(これも実験的です)にメッセージを処理するために使用されることが期待されます。
例 (ui-popupmenu 実装のスタブ)
ns = vim.api.nvim_create_namespace('my_fancy_pum')
vim.ui_attach(ns, {ext_popupmenu=true}, function(event, ...)
  if event == "popupmenu_show" then
    local items, selected, row, col, grid = ...
    print("display pum ", #items)
  elseif event == "popupmenu_select" then
    local selected = ...
    print("selected", selected)
  elseif event == "popupmenu_hide" then
    print("FIN")
  end
end)
パラメータ
{ns} (integer)
{options} (table<string, any>)
{callback} (fun())
vim.ui_detach({ns}) vim.ui_detach()
指定された名前空間 {ns} について、vim.ui_attach() で以前にアタッチされたコールバックをデタッチします。
パラメータ
{ns} (integer)
vim.wait({time}, {callback}, {interval}, {fast_only}) vim.wait()
{callback}true を返すまで、{time} ミリ秒待機します。
{callback} をすぐに実行し、約 {interval} ミリ秒(デフォルトは200)ごとに実行します。Nvimは、この間も他のイベントを処理します。
api-fast イベント中は呼び出すことができません。
---
-- Wait for 100 ms, allowing other events to process
vim.wait(100, function() end)
---
-- Wait for 100 ms or until global variable set.
vim.wait(100, function() return vim.g.waiting_for_var end)
---
-- Wait for 1 second or until global variable set, checking every ~500 ms
vim.wait(1000, function() return vim.g.waiting_for_var end, 500)
---
-- Schedule a function to set a value in 100ms
vim.defer_fn(function() vim.g.timer_result = true end, 100)
-- Would wait ten seconds if results blocked. Actually only waits  100 ms
if vim.wait(10000, function() return vim.g.timer_result end) then
  print('Only waiting a little bit of time!')
end
パラメータ
{time} (integer) 待機するミリ秒数
{callback} (fun(): boolean?) オプションのコールバック。{callback} が true を返すまで待機します
{interval} (integer?) ポーリングの間隔を待機する(概算)ミリ秒数
{fast_only} (boolean?) trueの場合、api-fast イベントのみが処理されます。
戻り値(複数)
(boolean) (-1|-2?)
{callback}{time} の間に true を返す場合: true, nil
{callback}{time} の間に true を返さない場合: false, -1
{callback}{time} の間に中断された場合: false, -2
{callback} がエラーになった場合、エラーが発生します。

LUA-VIMSCRIPT ブリッジ lua-vimscript

Nvim Luaは、Vimscriptの変数と関数、およびエディタコマンドとオプションへのインターフェースまたは「ブリッジ」を提供します。
このブリッジを介して渡されるオブジェクトはコピー(マーシャリング)されます。参照はありません。lua-guide-variables たとえば、Luaリストで vim.fn.remove() を使用すると、リストオブジェクトがVimscriptにコピーされ、Luaリストは変更されません。
local list = { 1, 2, 3 }
vim.fn.remove(list, 0)
vim.print(list)  --> "{ 1, 2, 3 }"
vim.call({func}, {...}) vim.call()
引数 {...} を使用して、vim-function または user-function {func} を呼び出します。vim.fnも参照してください。以下と同等です。
vim.fn[func]({...})
vim.cmd({command}) vim.cmd() を参照してください。
vim.fn.{func}({...}) vim.fn
引数 {...} を使用して、vim-function または user-function {func} を呼び出します。オートロード関数を呼び出すには、次の構文を使用します。
vim.fn['some#function']({...})
vim.api.|nvim_call_function()|とは異なり、これはVimオブジェクトとLuaオブジェクトの間で直接変換を行います。Vim関数がfloatを返す場合、Luaの数値として直接表されます。空のリストと辞書の両方が空のテーブルで表されます。
注: 戻り値の一部としての v:null 値は、vim.NIL 特殊値として表されます。
注: vim.fn キーは遅延的に生成されるため、pairs(vim.fn) は少なくとも一度呼び出された関数のみを列挙します。
注: ほとんどの関数は、許可されている文書化されていない例外を除いて、api-fast コールバックでは実行できません。
lua-vim-variables
Vimエディタのグローバル辞書 g: w: b: t: v: は、以下で説明する 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
辞書フィールドを直接設定しても、Nvimには書き戻されないことに注意してください。これは、名前空間へのインデックスが単にコピーを返すためです。代わりに、辞書全体を1つとして書き込む必要があります。これは、短命な一時的なものを作成することで実現できます。
vim.g.my_dict.field1 = 'value'  -- Does not work
local my_dict = vim.g.my_dict   --
my_dict.field1 = 'value'        -- Instead do
vim.g.my_dict = my_dict         --
vim.g vim.g
グローバル(g:)エディタ変数。値のないキーは nil を返します。
vim.b vim.b
現在のバッファのバッファスコープ(b:)変数。無効なキーまたは設定されていないキーは nil を返します。整数でインデックス付けして、特定のバッファの変数にアクセスできます。
vim.w vim.w
現在のウィンドウのウィンドウスコープ(w:)変数。無効なキーまたは設定されていないキーは nil を返します。整数でインデックス付けして、特定のウィンドウの変数にアクセスできます。
vim.t vim.t
現在のタブページのタブページスコープ(t:)変数。無効なキーまたは設定されていないキーは nil を返します。整数でインデックス付けして、特定のタブページの変数にアクセスできます。
vim.v vim.v
v: 変数。無効なキーまたは設定されていないキーは nil を返します。
Vimオプションには、Vimscriptの:setのように動作するvim.oを介してアクセスできます。
ブールトグルを設定するには: Vimscript: set number Lua: vim.o.number = true
文字列値を設定するには: Vimscript: set wildignore=*.o,*.a,__pycache__ Lua: vim.o.wildignore = '*.o,*.a,__pycache__'
同様に、バッファスコープとウィンドウスコープのオプションを設定するために、vim.bovim.woがあります。これはローカルオプション:setlocalと混同してはいけません。グローバルローカルオプションのグローバル値にのみアクセスするvim.goもあります。:setglobalを参照してください。
Luaからリスト形式およびマップ形式のオプションを便利に操作するための特別なインターフェースvim.optが存在します。これは、Luaテーブルとしてアクセスでき、エントリを追加および削除するためのオブジェクト指向メソッドを提供します。
リスト形式のオプションを設定する次の方法は同等です。Vimscriptでは
set wildignore=*.o,*.a,__pycache__
Luaではvim.oを使用
vim.o.wildignore = '*.o,*.a,__pycache__'
Luaではvim.optを使用
vim.opt.wildignore = { '*.o', '*.a', '__pycache__' }
:set+=の動作を再現するには、以下を使用します
vim.opt.wildignore:append { "*.pyc", "node_modules" }
:set^=の動作を再現するには、以下を使用します
vim.opt.wildignore:prepend { "new_first_value" }
:set-=の動作を再現するには、以下を使用します
vim.opt.wildignore:remove { "node_modules" }
マップ形式のオプションを設定する次の方法は同等です。Vimscriptでは
set listchars=space:_,tab:>~
Luaではvim.oを使用
vim.o.listchars = 'space:_,tab:>~'
Luaではvim.optを使用
vim.opt.listchars = { space = '_', tab = '>~' }
vim.optはオプションの値ではなく、Optionオブジェクトを返すことに注意してください。オプションの値にはvim.opt:get()を通してアクセスします。
リスト形式のオプションを取得する次の方法は同等です。Vimscriptでは
echo wildignore
Luaではvim.oを使用
print(vim.o.wildignore)
Luaではvim.optを使用
vim.print(vim.opt.wildignore:get())
上記のいずれの例でも、:setlocalの動作を再現するには、vim.opt_localを使用します。さらに、:setglobalの動作を再現するには、vim.opt_globalを使用します。
Option:append({value}) vim.opt:append()
文字列形式のオプションに値を追加します。:set+=を参照してください。
これらは同等です
vim.opt.formatoptions:append('j')
vim.opt.formatoptions = vim.opt.formatoptions + 'j'
パラメータ
{value} (string) 追加する値
Option:get() vim.opt:get()
オプションのLua表現を返します。ブール値、数値、および文字列値は、まったく同じ形式で返されます。
カンマ区切りのリストである値の場合、配列が返され、値が配列のエントリになります
vim.cmd [[set wildignore=*.pyc,*.o]]
vim.print(vim.opt.wildignore:get())
-- { "*.pyc", "*.o", }
for _, ignore_pattern in ipairs(vim.opt.wildignore:get()) do
    print("Will ignore:", ignore_pattern)
end
-- Will ignore: *.pyc
-- Will ignore: *.o
カンマ区切りのマップである値の場合、テーブルが返され、名前がキーになり、値がエントリになります
vim.cmd [[set listchars=space:_,tab:>~]]
vim.print(vim.opt.listchars:get())
--  { space = "_", tab = ">~", }
for char, representation in pairs(vim.opt.listchars:get()) do
    print(char, "=>", representation)
end
フラグのリストである値の場合、セットが返され、フラグがキーになり、trueがエントリになります。
vim.cmd [[set formatoptions=njtcroql]]
vim.print(vim.opt.formatoptions:get())
-- { n = true, j = true, c = true, ... }
local format_opts = vim.opt.formatoptions:get()
if format_opts.j then
    print("J is enabled!")
end
戻り値
(string|integer|boolean?) オプションの値
Option:prepend({value}) vim.opt:prepend()
文字列形式のオプションに値を先頭に追加します。:set^=を参照してください。
これらは同等です
vim.opt.wildignore:prepend('*.o')
vim.opt.wildignore = vim.opt.wildignore ^ '*.o'
パラメータ
{value} (string) 先頭に追加する値
Option:remove({value}) vim.opt:remove()
文字列形式のオプションから値を削除します。:set-=を参照してください。
これらは同等です
vim.opt.wildignore:remove('*.pyc')
vim.opt.wildignore = vim.opt.wildignore - '*.pyc'
パラメータ
{value} (string) 削除する値
vim.bo[{bufnr}] vim.bo
番号{bufnr}のバッファのバッファスコープのオプションを取得または設定します。:setlocalと同様です。{bufnr}が省略された場合、現在のバッファが使用されます。無効な{bufnr}またはキーはエラーになります。
local bufnr = vim.api.nvim_get_current_buf()
vim.bo[bufnr].buflisted = true    -- same as vim.bo.buflisted = true
print(vim.bo.comments)
print(vim.bo.baz)                 -- error: invalid key
vim.env vim.env
エディタセッションで定義された環境変数。Vimscriptの動作については、expand-envおよび:let-environmentを参照してください。無効または未設定のキーはnilを返します。
vim.env.FOO = 'bar'
print(vim.env.TERM)
vim.go vim.go
グローバルなオプションを取得または設定します。:setglobalと同様です。無効なキーはエラーになります。
注意: これはグローバルオプションの値にアクセスするため、vim.oとは異なります。そのため、グローバルローカルオプションでの使用に最も役立ちます。
vim.go.cmdheight = 4
print(vim.go.columns)
print(vim.go.bar)     -- error: invalid key
vim.o vim.o
オプションを取得または設定します。:setと同様です。無効なキーはエラーになります。
注意: これは現在のバッファとウィンドウを使用して、バッファスコープとウィンドウスコープの両方のオプションで機能します。
vim.o.cmdheight = 4
print(vim.o.columns)
print(vim.o.foo)     -- error: invalid key
vim.wo[{winid}][{bufnr}] vim.wo
ハンドル{winid}を持つウィンドウと番号{bufnr}を持つバッファのウィンドウスコープのオプションを取得または設定します。グローバルローカルオプションを設定する場合、または{bufnr}が提供されている場合は:setlocalと同様です。それ以外の場合は:setと同様です。{winid}が省略された場合、現在のウィンドウが使用されます。無効な{winid}{bufnr}、またはキーはエラーになります。
注意: 値が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'

Luaモジュール: vim lua-vim

vim.cmd({command}) vim.cmd()
Vimスクリプトコマンドを実行します。
vim.cmdは、コマンド名でインデックス化して、コマンドの呼び出し可能な関数を返すことができることに注意してください。
vim.cmd('echo 42')
vim.cmd([[
  augroup My_group
    autocmd!
    autocmd FileType c setlocal cindent
  augroup END
]])
-- Ex command :echo "foo"
-- Note string literals need to be double quoted.
vim.cmd('echo "foo"')
vim.cmd { cmd = 'echo', args = { '"foo"' } }
vim.cmd.echo({ args = { '"foo"' } })
vim.cmd.echo('"foo"')
-- Ex command :write! myfile.txt
vim.cmd('write! myfile.txt')
vim.cmd { cmd = 'write', args = { "myfile.txt" }, bang = true }
vim.cmd.write { args = { "myfile.txt" }, bang = true }
vim.cmd.write { "myfile.txt", bang = true }
-- Ex command :colorscheme blue
vim.cmd('colorscheme blue')
vim.cmd.colorscheme('blue')
パラメータ
{command} (string|table) 実行するコマンド。文字列の場合、一度に複数のVimスクリプト行を実行します。この場合、nvim_exec2()のエイリアスであり、opts.outputがfalseに設定されています。したがって、:sourceと同じように動作します。テーブルの場合、単一のコマンドを実行します。この場合、optsが空のnvim_cmd()のエイリアスです。
こちらも参照
vim.defer_fn({fn}, {timeout}) vim.defer_fn()
{timeout}ミリ秒が経過するまで、{fn}の呼び出しを遅延させます。
{fn}を呼び出すワンショットタイマーを実行するために使用します。注意: {fn}は自動的にvim.schedule_wrap()されるため、API関数は安全に呼び出すことができます。
パラメータ
{fn} (function) timeoutが期限切れになった後に呼び出すコールバック
{timeout} (integer) fnを呼び出すまでに待機するミリ秒数
戻り値
(table) タイマーluvタイマーオブジェクト
vim.deprecate()
vim.deprecate({name}, {alternative}, {version}, {plugin}, {backtrace}) 非推奨メッセージをユーザーに表示します。
パラメータ
{name} (string)非推奨の機能(関数、APIなど)。
{alternative} (string?) 推奨される代替機能。
{version} (string) 非推奨の関数が削除されるバージョン。
{plugin} (string?) 非推奨の機能を所有するプラグインの名前。デフォルトは「Nvim」です。
{backtrace} (boolean?) バックトレースを印刷します。デフォルトはtrueです。
戻り値
(string?)非推奨メッセージ。メッセージが表示されない場合はnil。
vim.inspect() vim.inspect()
指定されたオブジェクトの人間が読める表現を取得します。
戻り値
(string)
vim.keycode({str}) vim.keycode()
キーコードを変換します。
local k = vim.keycode
vim.g.mapleader = k'<bs>'
パラメータ
{str} (string) 変換する文字列。
戻り値
(string)
こちらも参照
vim.lua_omnifunc({find_start}) vim.lua_omnifunc()
:luaコマンドの組み込み補完と同様に、ランタイムLuaインタープリターからLua値を補完するためのOmnifunc。
Luaバッファでset omnifunc=v:lua.vim.lua_omnifuncを使用してアクティブ化します。
パラメータ
{find_start} (1|0)
vim.notify({msg}, {level}, {opts}) vim.notify()
ユーザーに通知を表示します。
この関数は、カスタムプロバイダー(システム通知プロバイダーなど)を使用して通知を表示するために、プラグインによってオーバーライドできます。デフォルトでは、:messagesに書き込みます。
パラメータ
{msg} (string) ユーザーに表示する通知の内容。
{level} (integer?) vim.log.levelsの値の1つ。
{opts} (table?) オプションのパラメータ。デフォルトでは使用されません。
vim.notify_once({msg}, {level}, {opts}) vim.notify_once()
通知を1回だけ表示します。
vim.notify()と同様ですが、同じメッセージで後続の呼び出しは通知を表示しません。
パラメータ
{msg} (string) ユーザーに表示する通知の内容。
{level} (integer?) vim.log.levelsの値の1つ。
{opts} (table?) オプションのパラメータ。デフォルトでは使用されません。
戻り値
(boolean) メッセージが表示された場合はtrue、それ以外の場合はfalse
vim.on_key({fn}, {ns_id}, {opts}) vim.on_key()
すべての、はい、すべての入力キーのリスナーとして、名前空間ID {ns_id}を持つLua関数{fn}を追加します。
Nvimコマンドラインオプション-wは関連していますが、コールバックをサポートしておらず、動的に切り替えることはできません。
注意
{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}に関連付けられたコールバックが削除されます。
{ns_id} (integer?) 名前空間ID。nilまたは0の場合、新しいnvim_create_namespace() IDを生成して返します。
{opts} (table?) オプションのパラメータ
戻り値
(integer) {fn}に関連付けられた名前空間ID。または、引数なしでon_key()が呼び出された場合のすべてのコールバックの数。
こちらも参照
vim.paste({lines}, {phase}) vim.paste()
nvim_paste()によって呼び出される貼り付けハンドラー。
注意: これは「フック」としてのみ提供されており、直接呼び出さないでください。代わりに、redo(ドットリピート)を配置してvim.pasteを呼び出すnvim_paste()を呼び出してください。
例:貼り付け時にANSIカラーコードを削除するには
vim.paste = (function(overridden)
  return function(lines, phase)
    for i,line in ipairs(lines) do
      -- Scrub ANSI color codes from paste input.
      lines[i] = line:gsub('\27%[[0-9;mK]+', '')
    end
    return overridden(lines, phase)
  end
end)(vim.paste)
パラメータ
{lines} (string[]) 貼り付けるreadfile()スタイルの行のリスト。channel-lines
{phase} (-1|1|2|3) -1:「非ストリーミング」貼り付け:呼び出しにはすべての行が含まれます。貼り付けが「ストリーミング」の場合、phaseはストリームの状態を示します
1:貼り付けを開始します(正確に1回)
2:貼り付けを続行します(0回以上)
3:貼り付けを終了します(正確に1回)
戻り値
(boolean) クライアントが貼り付けをキャンセルする必要がある場合はfalseを返します。
こちらも参照
vim.print({...}) vim.print()
指定された引数を「きれいに印刷」し、変更せずに返します。
local hl_normal = vim.print(vim.api.nvim_get_hl(0, { name = 'Normal' }))
パラメータ
{...} (any)
戻り値
(any) 指定された引数。
こちらも参照
:=
vim.schedule_wrap({fn}) vim.schedule_wrap()
vim.schedule()を介して{fn}を呼び出す関数を返します。
返された関数は、すべての引数を{fn}に渡します。
function notify_readable(_err, readable)
  vim.notify("readable? " .. tostring(readable))
end
vim.uv.fs_access(vim.fn.stdpath("config"), "R", vim.schedule_wrap(notify_readable))
パラメータ
{fn} (function)
戻り値
(function)
vim.str_byteindex()
vim.str_byteindex({s}, {encoding}, {index}, {strict_indexing}) UTF-32、UTF-16、または UTF-8 の {index} をバイトインデックスに変換します。{strict_indexing} が false の場合、範囲外のインデックスはエラーをスローする代わりにバイト長を返します。
無効な UTF-8 および NUL は vim.str_utfindex() と同様に扱われます。UTF-16 シーケンスの途中の {index} は、そのシーケンスの終端に切り上げられます。
パラメータ
{s} (string)
{encoding} ("utf-8"|"utf-16"|"utf-32")
{index} (integer)
{strict_indexing} (boolean?) デフォルト: true
戻り値
(integer)
vim.str_utfindex()
vim.str_utfindex({s}, {encoding}, {index}, {strict_indexing}) バイトインデックスを UTF-32、UTF-16、または UTF-8 インデックスに変換します。{index} が指定されていない場合、文字列の長さが使用されます。すべてのインデックスは 0 ベースです。
{strict_indexing} が false の場合、範囲外のインデックスはエラーをスローする代わりに文字列の長さを返します。無効な UTF-8 バイトと埋め込みサロゲートは、それぞれ 1 つのコードポイントとして数えられます。UTF-8 シーケンスの途中の {index} は、そのシーケンスの終端に切り上げられます。
パラメータ
{s} (string)
{encoding} ("utf-8"|"utf-16"|"utf-32")
{index} (integer?)
{strict_indexing} (boolean?) デフォルト: true
戻り値
(integer)
vim.system({cmd}, {opts}, {on_exit}) vim.system()
システムコマンドを実行します。{cmd} が実行できない場合はエラーをスローします。
local on_exit = function(obj)
  print(obj.code)
  print(obj.signal)
  print(obj.stdout)
  print(obj.stderr)
end
-- Runs asynchronously:
vim.system({'echo', 'hello'}, { text = true }, on_exit)
-- Runs synchronously:
local obj = vim.system({'echo', 'hello'}, { text = true }):wait()
-- { code = 0, signal = 0, stdout = 'hello', stderr = '' }
詳細は uv.spawn() を参照してください。注意: uv.spawn() とは異なり、vim.system は {cmd} が実行できない場合にエラーをスローします。
パラメータ
{cmd} (string[]) 実行するコマンド
{opts} (vim.SystemOpts?) オプション
cwd: (string) サブプロセスのカレントワーキングディレクトリを設定します。
env: table<string,string> 新しいプロセスの環境変数を設定します。現在の環境を継承し、NVIMv:servername に設定されます。
clear_env: (boolean) env は、現在の環境をマージするのではなく、ジョブ環境を正確に定義します。
stdin: (string|string[]|boolean) true の場合、stdin へのパイプが開かれ、SystemObj の write() メソッドを介して書き込むことができます。string または string[] の場合、stdin に書き込まれて閉じられます。デフォルトは false です。
stdout: (boolean|function) stdout からの出力を処理します。関数として渡される場合は、シグネチャ fun(err: string, data: string) を持つ必要があります。デフォルトは true です。
stderr: (boolean|function) stderr からの出力を処理します。関数として渡される場合は、シグネチャ fun(err: string, data: string) を持つ必要があります。デフォルトは true です。
text: (boolean) stdout と stderr をテキストとして処理します。\r\n\n に置き換えます。
timeout: (integer) 時間制限付きでコマンドを実行します。タイムアウトすると、プロセスに TERM シグナル (15) が送信され、終了コードが 124 に設定されます。
detach: (boolean) true の場合、子プロセスを分離された状態で生成します。これにより、プロセスグループリーダーになり、親が終了した後も子を実質的に実行し続けることができます。親プロセスが子のプロセスハンドルに対して uv.unref() を呼び出さない限り、子プロセスは親のイベントループを維持し続けることに注意してください。
{on_exit} (fun(out: vim.SystemCompleted)?) サブプロセスが終了したときに呼び出されます。指定された場合、コマンドは非同期で実行されます。SystemCompleted オブジェクトを受け取ります。SystemObj:wait() の戻り値を確認してください。
戻り値
(vim.SystemObj) 次のフィールドを持つオブジェクト
cmd (string[]) コマンド名と引数
pid (integer) プロセスID
wait (fun(timeout: integer|nil): SystemCompleted) プロセスの完了を待ちます。タイムアウトすると、プロセスに KILL シグナル (9) が送信され、終了コードが 124 に設定されます。api-fast では呼び出すことができません。
SystemCompleted は次のフィールドを持つオブジェクトです
code: (integer)
signal: (integer)
stdout: (string), stdout 引数が渡された場合は nil
stderr: (string), stderr 引数が渡された場合は nil
kill (fun(signal: integer|string))
write (fun(data: string|nil)) stdin=true が必要です。ストリームを閉じるには nil を渡します。
is_closing (fun(): boolean)

Lua モジュール: vim.inspector vim.inspector

vim.inspect_pos({bufnr}, {row}, {col}, {filter}) vim.inspect_pos()
指定されたバッファ位置にあるすべてのアイテムを取得します。
:Inspect! で見やすく表示することもできます。 :Inspect!
属性
Since: 0.9.0
パラメータ
{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) 次のキーと値のペアを持つテーブル。"走査順"でアイテムが格納されます。
treesitter: tree-sitter キャプチャのリスト
syntax: 構文グループのリスト
semantic_tokens: セマンティックトークンのリスト
extmarks: extmark のリスト
buffer: アイテムを取得するために使用されたバッファ
row: アイテムを取得するために使用された行
col: アイテムを取得するために使用された列
vim.show_pos({bufnr}, {row}, {col}, {filter}) vim.show_pos()
指定されたバッファ位置にあるすべてのアイテムを表示します。
:Inspect で表示することもできます。 :Inspect
属性
Since: 0.9.0
パラメータ
{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?) 最初に読み取られていないアイテムを削除せずに返します
Ringbuf:clear() Ringbuf:clear()
すべてのアイテムをクリアします
Ringbuf:peek() Ringbuf:peek()
最初に読み取られていないアイテムを削除せずに返します
戻り値
(any?)
Ringbuf:pop() Ringbuf:pop()
最初に読み取られていないアイテムを削除して返します
戻り値
(any?)
Ringbuf:push({item}) Ringbuf:push()
アイテムを追加します。バッファがいっぱいの場合は、最も古いアイテムを上書きします。
パラメータ
{item} (any)
vim.deep_equal({a}, {b}) vim.deep_equal()
値が等しいかどうかを深く比較します。
テーブルは、両方が eq メタメソッドを提供しない限り、再帰的に比較されます。他のすべての型は、等価演算子 == を使用して比較されます。
パラメータ
{a} (any) 最初の値
{b} (any) 2番目の値
戻り値
(boolean) 値が等しい場合は true、それ以外の場合は false
vim.deepcopy({orig}, {noref}) vim.deepcopy()
指定されたオブジェクトのディープコピーを返します。テーブル以外のオブジェクトは、通常の Lua 代入と同様にコピーされ、テーブルオブジェクトは再帰的にコピーされます。関数は単純にコピーされるため、コピーされたテーブル内の関数は、入力テーブル内の関数と同じ関数を指します。ユーザーデータとスレッドはコピーされず、エラーがスローされます。
注意: noref=true は一意のテーブルフィールドを持つテーブルではるかにパフォーマンスが高く、noref=false はテーブルフィールドを再利用するテーブルではるかにパフォーマンスが高くなります。
パラメータ
{orig} (table) コピーするテーブル
{noref} (boolean?) false (デフォルト) の場合、含まれるテーブルは一度だけコピーされ、すべての参照がこの単一のコピーを指します。true の場合、テーブルが発生するたびに新しいコピーが作成されます。これは、循環参照によって deepcopy() が失敗する可能性があることも意味します。
戻り値
(table) コピーされたキーと (ネストされた) 値のテーブル。
vim.defaulttable({createfn}) vim.defaulttable()
欠落しているキーが {createfn} によって提供されるテーブルを作成します (Python の "defaultdict" のように)。
{createfn}nil の場合、defaulttable() 自体がデフォルトになるため、ネストされたキーにアクセスするとネストされたテーブルが作成されます
local a = vim.defaulttable()
a.b.c = 1
パラメータ
{createfn} (fun(key:any):any?) 欠落している key の値を提供します。
戻り値
(table) __index メタメソッドを持つ空のテーブル。
vim.endswith({s}, {suffix}) vim.endswith()
ssuffix で終わるかどうかをテストします。
パラメータ
{s} (string) 文字列
{suffix} (string) マッチするサフィックス
戻り値
(boolean) suffixs のサフィックスである場合は true
vim.gsplit({s}, {sep}, {opts}) vim.gsplit()
セパレーターの各インスタンスで文字列を分割する イテレーター を「遅延」方式で取得します (「即時」である vim.split() とは対照的です)。
for s in vim.gsplit(':aa::b:', ':', {plain=true}) do
  print(s)
end
(破棄するのではなく) セパレーター自体も検査したい場合は、string.gmatch() を使用してください。例
for word, num in ('foo111bar222'):gmatch('([^0-9]*)(%d*)') do
  print(('word: %s num: %s'):format(word, num))
end
パラメータ
{s} (string) 分割する文字列
{sep} (string) セパレーターまたはパターン
{opts} (table?) キーワード引数 kwargs
{plain} (boolean) sep をリテラルとして使用します (string.find のように)。
{trimempty} (boolean) シーケンスの先頭と末尾にある空のセグメントを破棄します。
戻り値
(fun():string?) 分割されたコンポーネントに対するイテレーター
vim.is_callable({f}) vim.is_callable()
オブジェクト f を関数として呼び出すことができる場合は true を返します。
パラメータ
{f} (any) 任意のオブジェクト
戻り値
(boolean) f が呼び出し可能な場合は true、それ以外の場合は false
vim.isarray({t}) vim.isarray()
t が「配列」、つまり整数 (連続していない可能性がある) のみでインデックス付けされたテーブルであるかどうかをテストします。
インデックスが 1 から始まり連続している場合、配列はリストでもあります。 vim.islist()
空のテーブル {} は、vim.empty_dict() で作成されたか、API または Vimscript の結果として辞書のように返された場合 (たとえば、rpcrequest()vim.fn から) を除き、配列です。
パラメータ
{t} (table?)
戻り値
(boolean) 配列のようなテーブルの場合は true、それ以外の場合は false
vim.islist({t}) vim.islist()
t が「リスト」かどうかをテストします。リストとは、1 から始まる連続した整数でのみインデックスが付けられたテーブル(lua-length で「正規配列」と呼ばれるもの)のことです。
空のテーブル {} は、vim.empty_dict() で作成された場合や、API または Vimscript の結果として、例えば rpcrequest()vim.fn から辞書のように返された場合を除き、リストです。
パラメータ
{t} (table?)
戻り値
(boolean) リストのようなテーブルの場合は true、それ以外の場合は false
こちらも参照
vim.list_contains({t}, {value}) vim.list_contains()
リストのようなテーブル(ギャップのない整数キー)に value が含まれているかどうかを確認します。
パラメータ
{t} (table) チェックするテーブル (リストのようなものでなければなりません。検証はされません)
{value} (any) 比較する値
戻り値
(boolean) tvalue が含まれている場合は true
こちらも参照
一般的なテーブルの値をチェックする場合は vim.tbl_contains() を使用してください
vim.list_extend({dst}, {src}, {start}, {finish}) vim.list_extend()
リストのようなテーブルに、別のリストのようなテーブルの値を追加して拡張します。
注: これは dst を変更します!
パラメータ
{dst} (table) 変更され、追加されるリスト
{src} (table) 値が挿入されるリスト
{start} (integer?) src の開始インデックス。デフォルトは 1
{finish} (integer?) src の最後のインデックス。デフォルトは #src
戻り値
(table) dst
こちらも参照
vim.list_slice({list}, {start}, {finish}) vim.list_slice()
開始から終了 (両端を含む) までの要素のみを含むテーブルのコピーを作成します
パラメータ
{list} (any[]) テーブル
{start} (integer?) スライスの開始範囲
{finish} (integer?) スライスの終了範囲
戻り値
(any[]) 開始から終了 (両端を含む) までスライスされたテーブルのコピー
vim.pesc({s}) vim.pesc()
lua-patterns のマジック文字をエスケープします。
パラメータ
{s} (string) エスケープする文字列
戻り値
(string) % でエスケープされたパターン文字列
こちらも参照
vim.ringbuf({size}) vim.ringbuf()
最大項目数に制限されたリングバッファーを作成します。バッファーがいっぱいになると、新しいエントリを追加すると最も古いエントリが上書きされます。
local ringbuf = vim.ringbuf(4)
ringbuf:push("a")
ringbuf:push("b")
ringbuf:push("c")
ringbuf:push("d")
ringbuf:push("e")    -- overrides "a"
print(ringbuf:pop()) -- returns "b"
print(ringbuf:pop()) -- returns "c"
-- Can be used as iterator. Pops remaining items:
for val in ringbuf do
  print(val)
end
次のメソッドを持つ Ringbuf インスタンスを返します
パラメータ
{size} (integer)
戻り値
(vim.Ringbuf) ringbuf vim.Ringbuf を参照してください。
vim.spairs({t}) vim.spairs()
キーでソートされたテーブルのキーと値のペアを列挙します。
パラメータ
{t} (table) 辞書のようなテーブル
戻り値(複数)
(fun(table: table<K, V>, index?: K):K, V) ソートされたキーとその値の for-in イテレータ (table)
こちらも参照
vim.split({s}, {sep}, {opts}) vim.split()
区切り文字の各インスタンスで文字列を分割し、結果をテーブルとして返します (vim.gsplit() とは異なります)。
split(":aa::b:", ":")                   --> {'','aa','','b',''}
split("axaby", "ab?")                   --> {'','x','y'}
split("x*yz*o", "*", {plain=true})      --> {'x','yz','o'}
split("|x|y|z|", "|", {trimempty=true}) --> {'x', 'y', 'z'}
パラメータ
{s} (string) 分割する文字列
{sep} (string) セパレーターまたはパターン
{opts} (table?) キーワード引数 kwargs
{plain} (boolean) sep をリテラルとして使用します (string.find のように)。
{trimempty} (boolean) シーケンスの先頭と末尾にある空のセグメントを破棄します。
戻り値
(string[]) 分割されたコンポーネントのリスト
こちらも参照
vim.startswith({s}, {prefix}) vim.startswith()
sprefix で始まるかどうかをテストします。
パラメータ
{s} (string) 文字列
{prefix} (string) マッチするプレフィックス
戻り値
(boolean) prefixs のプレフィックスの場合は true
vim.tbl_contains({t}, {value}, {opts}) vim.tbl_contains()
テーブルに、直接指定された値または各値に対してチェックされる述語を介して指定された値が含まれているかどうかを確認します。
vim.tbl_contains({ 'a', { 'b', 'c' } }, function(v)
  return vim.deep_equal(v, { 'b', 'c' })
end, { predicate = true })
-- true
パラメータ
{t} (table) チェックするテーブル
{value} (any) 比較する値または述語関数参照
{opts} (table?) キーワード引数 kwargs
{predicate} (boolean) value はチェックされる関数参照です (デフォルトは false)
戻り値
(boolean) tvalue が含まれている場合は true
こちらも参照
リストのようなテーブルの値をチェックする場合は vim.list_contains() を使用してください
vim.tbl_count({t}) vim.tbl_count()
テーブル t 内の nil でない値の数をカウントします。
vim.tbl_count({ a=1, b=2 })  --> 2
vim.tbl_count({ 1, 2 })      --> 2
パラメータ
{t} (table) テーブル
戻り値
(integer) テーブル内の nil でない値の数
vim.tbl_deep_extend({behavior}, {...}) vim.tbl_deep_extend()
2つ以上のテーブルを再帰的にマージします。
空のテーブルまたは lua-list (1 から始まる連続した整数でインデックスが付けられている) でないテーブルの値のみが再帰的にマージされます。これは、リストをリテラルとして扱う(つまり、マージするのではなく上書きする)必要があるデフォルト設定やユーザー設定などのネストされたテーブルをマージする場合に便利です。
パラメータ
{behavior} ('error'|'keep'|'force') あるキーが複数のマップで見つかった場合の動作を決定します
"error": エラーを発生させる
"keep": 最も左側のマップの値を使用する
"force": 最も右側のマップの値を使用する
{...} (table) 2つ以上のテーブル
戻り値
(table) マージされたテーブル
こちらも参照
vim.tbl_extend({behavior}, {...}) vim.tbl_extend()
2つ以上のテーブルをマージします。
パラメータ
{behavior} ('error'|'keep'|'force') あるキーが複数のマップで見つかった場合の動作を決定します
"error": エラーを発生させる
"keep": 最も左側のマップの値を使用する
"force": 最も右側のマップの値を使用する
{...} (table) 2つ以上のテーブル
戻り値
(table) マージされたテーブル
こちらも参照
vim.tbl_filter({func}, {t}) vim.tbl_filter()
述語関数を使用してテーブルをフィルター処理します
パラメータ
{func} (function) 関数
{t} (table) テーブル
戻り値
(any[]) フィルター処理された値のテーブル
vim.tbl_get({o}, {...}) vim.tbl_get()
後続の引数として渡された文字列キーを使用して、テーブル (最初の引数) にインデックスを付けます。キーが存在しない場合は nil を返します。
vim.tbl_get({ key = { nested_key = true }}, 'key', 'nested_key') == true
vim.tbl_get({ key = {}}, 'key', 'nested_key') == nil
パラメータ
{o} (table) インデックスを付けるテーブル
{...} (any) テーブルにインデックスを付けるためのオプションのキー (0個以上、可変)
戻り値
(any) キーでインデックス付けされたネストされた値 (存在する場合)、それ以外の場合は nil
vim.tbl_isempty({t}) vim.tbl_isempty()
テーブルが空かどうかを確認します。
パラメータ
{t} (table) チェックするテーブル
戻り値
(boolean) t が空の場合は true
vim.tbl_keys({t}) vim.tbl_keys()
テーブルで使用されているすべてのキーのリストを返します。ただし、返されるキーのテーブルの順序は保証されません。
パラメータ
{t} (table) テーブル
戻り値
(any[]) キーのリスト
vim.tbl_map({func}, {t}) vim.tbl_map()
テーブルのすべての値に関数を適用します。
パラメータ
{func} (fun(value: T): any) 関数
{t} (table<any, T>) テーブル
戻り値
(table) 変換された値のテーブル
vim.tbl_values({t}) vim.tbl_values()
テーブルで使用されているすべての値のリストを返します。ただし、返される値のテーブルの順序は保証されません。
パラメータ
{t} (table) テーブル
戻り値
(any[]) 値のリスト
vim.trim({s}) vim.trim()
文字列の両側から空白 (Lua パターン "%s") を削除します。
パラメータ
{s} (string) トリムする文字列
戻り値
(string) 先頭と末尾から空白が削除された文字列
vim.validate()
vim.validate({name}, {value}, {validator}, {optional}, {message}) 関数引数を検証します。
この関数には 2 つの有効な形式があります: 1. vim.validate(name, value, validator[, optional][, message]) {value} の値を持つ引数 {name}{validator} を満たしていることを検証します。{optional} が指定されていて true の場合、{value}nil になる可能性があります。{message} が指定されている場合は、エラーメッセージに予期される型として使用されます。例
 function vim.startswith(s, prefix)
  vim.validate('s', s, 'string')
  vim.validate('prefix', prefix, 'string')
  ...
end
2. vim.validate(spec) (非推奨) ここで spectable<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')
注意
lua-type() によって返される値に設定された 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?) 検証が失敗した場合のメッセージ

Lua モジュール: vim.loader vim.loader

vim.loader.disable() vim.loader.disable()
警告: この機能は実験的/不安定です。
実験的な Lua モジュールローダーを無効にします
ローダーを削除します
デフォルトの Nvim ローダーを追加します
vim.loader.enable() vim.loader.enable()
警告: この機能は実験的/不安定です。
実験的な Lua モジュールローダーを有効にします
loadfile をオーバーライドします
バイトコンパイルキャッシュを使用して Lua ローダーを追加します
libs ローダーを追加します
デフォルトの Nvim ローダーを削除します
vim.loader.find({modname}, {opts}) vim.loader.find()
警告: この機能は実験的/不安定です。
指定されたモジュール名の Lua モジュールを検索します。
パラメータ
{modname} (string) モジュール名。または、トップレベルのモジュールを検索する場合は "*"
{opts} (table?) モジュールを検索するためのオプション
{rtp} (boolean、デフォルト: true) ランタイムパスで modname を検索します。
{paths} (string[]、デフォルト: {}) modname を検索するための追加のパス
{patterns} (string[]、デフォルト: {"/init.lua", ".lua"}) モジュールを検索するときに使用するパターンのリスト。パターンは、検索される Lua モジュールのベース名に追加される文字列です。
{all} (boolean, デフォルト: false) 全てのマッチを検索します。
戻り値
(table[]) 次のフィールドを持つオブジェクトのリスト
{modpath} (string) モジュールのパス
{modname} (string) モジュールの名前
{stat} (uv.fs_stat.result) モジュールパスの fs_stat。modname="*" の場合は返されません。
vim.loader.reset({path}) vim.loader.reset()
警告: この機能は実験的/不安定です。
パスのキャッシュをリセットします。path が nil の場合は、全てのパスのキャッシュをリセットします。
パラメータ
{path} (string?) リセットするパス

Lua モジュール: vim.uri vim.uri

vim.uri_decode({str}) vim.uri_decode()
パーセントエンコードされた文字列を URI デコードします。
パラメータ
{str} (string) デコードする文字列
戻り値
(string) デコードされた文字列
vim.uri_encode({str}, {rfc}) vim.uri_encode()
パーセントエンコードを使用して文字列を URI エンコードします。
パラメータ
{str} (string) エンコードする文字列
{rfc} ("rfc2396"|"rfc2732"|"rfc3986"?)
戻り値
(string) エンコードされた文字列
vim.uri_from_bufnr({bufnr}) vim.uri_from_bufnr()
bufnr から URI を取得します。
パラメータ
{bufnr} (integer)
戻り値
(string) URI
vim.uri_from_fname({path}) vim.uri_from_fname()
ファイルパスから URI を取得します。
パラメータ
{path} (string) ファイルへのパス
戻り値
(string) URI
vim.uri_to_bufnr({uri}) vim.uri_to_bufnr()
URI のバッファーを取得します。URI のバッファーがまだ存在しない場合は、新しいアンロードされたバッファーを作成します。
パラメータ
{uri} (string)
戻り値
(integer) bufnr
vim.uri_to_fname({uri}) vim.uri_to_fname()
URI からファイル名を取得します。
パラメータ
{uri} (string)
戻り値
(string) ファイル名。ファイル URI でない場合は、変更されない URI

Lua モジュール: vim.ui vim.ui

vim.ui.input({opts}, {on_confirm}) vim.ui.input()
ユーザーに入力を促し、on_confirm まで任意の(非同期の可能性がある)作業を許可します。
vim.ui.input({ prompt = 'Enter value for shiftwidth: ' }, function(input)
    vim.o.shiftwidth = tonumber(input)
end)
パラメータ
{opts} (table?) 追加オプション。 input() を参照してください。
prompt (string|nil) プロンプトのテキスト
default (string|nil) 入力に対するデフォルトの応答
completion (string|nil) 入力でサポートされる補完のタイプを指定します。サポートされるタイプは、"-complete=" 引数を使用してユーザー定義コマンドに指定できるものと同じです。:command-completion を参照してください。
highlight (function) ユーザー入力のハイライトに使用される関数。
{on_confirm} (function) ((input|nil) -> ()) ユーザーが入力を確定または中止したときに一度呼び出されます。input はユーザーが入力したものです(何も入力されていない場合は空の文字列になる可能性があります)。ユーザーがダイアログを中止した場合は nil になります。
vim.ui.open({path}, {opt}) vim.ui.open()
システムのデフォルトハンドラー(macOS の 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[] }?) オプション
cmd string[]|nil パスまたは URL を開くために使用されるコマンド。
戻り値(複数)
(vim.SystemObj?) コマンドオブジェクト。見つからない場合は nil。(string?) 失敗時のエラーメッセージ。成功した場合は nil。
こちらも参照
vim.ui.select({items}, {opts}, {on_choice}) vim.ui.select()
ユーザーに項目のリストから選択するように促し、on_choice まで任意の(非同期の可能性がある)作業を許可します。
vim.ui.select({ 'tabs', 'spaces' }, {
    prompt = 'Select tabs or spaces:',
    format_item = function(item)
        return "I'd like to choose " .. item
    end,
}, function(choice)
    if choice == 'spaces' then
        vim.o.expandtab = true
    else
        vim.o.expandtab = false
    end
end)
パラメータ
{items} (any[]) 任意の項目
{opts} (table) 追加オプション
prompt (string|nil) プロンプトのテキスト。デフォルトは Select one of:
format_item (function item -> text) items から個々の項目をフォーマットする関数。デフォルトは tostring
kind (string|nil) 項目の形状を示す任意のヒント文字列。vim.ui.select を再実装するプラグインは、これを使用して items の構造やセマンティクス、または select() が呼び出されたコンテキストを推測できます。
{on_choice} (fun(item: T?, idx: integer?)) ユーザーが選択を行ったときに一度呼び出されます。idxitems 内の item の 1 から始まるインデックスです。ユーザーがダイアログを中止した場合は nil

Lua モジュール: vim.filetype vim.filetype

vim.filetype.add({filetypes}) vim.filetype.add()
新しいファイルタイプマッピングを追加します。
ファイルタイプマッピングは、拡張子またはファイル名(「末尾」または完全なファイルパス)によって追加できます。最初に完全なファイルパスがチェックされ、次にファイル名がチェックされます。ファイル名を使用した一致が見つからない場合は、一致が見つかるまでファイル名が lua-patterns のリスト(優先度でソート)と照合されます。最後に、パターンマッチングでファイルタイプが見つからない場合は、ファイル拡張子が使用されます。
ファイルタイプは、文字列(この場合、ファイルタイプとして直接使用されます)または関数にすることができます。関数の場合、ファイルの完全なパスとバッファー番号を引数として取り(一致したパターンからのキャプチャも含む)、バッファーのファイルタイプとして使用される文字列を返す必要があります。オプションで、関数は2番目の関数値を返すことができ、呼び出されるとバッファーの状態を変更します。これは、たとえば、ファイルタイプ固有のバッファー変数を設定するために使用できます。この関数は、バッファーのファイルタイプを設定する前に、Nvim によって呼び出されます。
ファイル名パターンでは、ファイルパスが複数のパターンに一致する場合に解決するためのオプションの優先度を指定できます。優先度の高いものが最初に一致します。省略した場合、優先度はデフォルトで 0 になります。パターンには、自動的に展開される "${SOME_VAR}" の形式の環境変数を含めることができます。環境変数が設定されていない場合、パターンは一致しません。
より多くの例については、$VIMRUNTIME/lua/vim/filetype.lua を参照してください。
vim.filetype.add({
  extension = {
    foo = 'fooscript',
    bar = function(path, bufnr)
      if some_condition() then
        return 'barscript', function(bufnr)
          -- Set a buffer variable
          vim.b[bufnr].barscript_version = 2
        end
      end
      return 'bar'
    end,
  },
  filename = {
    ['.foorc'] = 'toml',
    ['/etc/foo/config'] = 'toml',
  },
  pattern = {
    ['.*/etc/foo/.*'] = 'fooscript',
    -- Using an optional priority
    ['.*/etc/foo/.*%.conf'] = { 'dosini', { priority = 10 } },
    -- A pattern containing an environment variable
    ['${XDG_CONFIG_HOME}/foo/git'] = 'git',
    ['.*README.(%a+)'] = function(path, bufnr, ext)
      if ext == 'md' then
        return 'markdown'
      elseif ext == 'rst' then
        return 'rst'
      end
    end,
  },
})
コンテンツのフォールバックマッチを追加するには、次を使用します。
vim.filetype.add {
  pattern = {
    ['.*'] = {
      function(path, bufnr)
        local content = vim.api.nvim_buf_get_lines(bufnr, 0, 1, false)[1] or ''
        if vim.regex([[^#!.*\\<mine\\>]]):match_str(content) ~= nil then
          return 'mine'
        elseif vim.regex([[\\<drawing\\>]]):match_str(content) ~= nil then
          return 'drawing'
        end
      end,
      { priority = -math.huge },
    },
  },
}
パラメータ
{filetypes} (table) 新しいファイルタイプマップを含むテーブル(例を参照)。
{pattern} (vim.filetype.mapping)
{extension} (vim.filetype.mapping)
{filename} (vim.filetype.mapping)
vim.filetype.get_option()
vim.filetype.get_option({filetype}, {option}) {filetype} のデフォルトのオプション値を取得します。
返される値は、'filetype' が設定された後に新しいバッファーで設定されるものであり、全ての FileType autocmd と ftplugin ファイルを尊重する必要があります。
vim.filetype.get_option('vim', 'commentstring')
注: これは nvim_get_option_value() を使用しますが、結果をキャッシュします。これは、ftpluginFileType 自動コマンドが一度しかトリガーされず、後で変更が反映されない可能性があることを意味します。
属性
Since: 0.9.0
パラメータ
{filetype} (string) ファイルタイプ
{option} (string) オプション名
戻り値
(string|boolean|integer) オプション値
vim.filetype.match({args}) vim.filetype.match()
ファイルタイプ検出を実行します。
ファイルタイプは、次の3つの方法のいずれかを使用して検出できます。1. 既存のバッファーを使用する 2. ファイル名のみを使用する 3. ファイルの内容のみを使用する
これらのうち、オプション1はバッファーのファイル名と(オプションで)バッファーの内容の両方を使用するため、最も正確な結果を提供します。オプション2と3は既存のバッファーなしで使用できますが、ファイル名(または内容)がファイルタイプを一意に特定できない場合、常に一致するとは限りません。
3つのオプションのそれぞれは、この関数の単一の引数へのキーを使用して指定されます。例
-- Using a buffer number
vim.filetype.match({ buf = 42 })
-- Override the filename of the given buffer
vim.filetype.match({ buf = 42, filename = 'foo.c' })
-- Using a filename without a buffer
vim.filetype.match({ filename = 'main.lua' })
-- Using file contents
vim.filetype.match({ contents = {'#!/usr/bin/env bash'} })
パラメータ
{args} (table) 使用するマッチング戦略を指定するテーブル。受け入れられるキーは次のとおりです。
{buf} (integer) マッチングに使用するバッファー番号。{contents} とは排他的
{filename} (string) マッチングに使用するファイル名。{buf} が指定されている場合、デフォルトは指定されたバッファー番号のファイル名になります。ファイルは実際にファイルシステムに存在する必要はありません。{buf} なしで使用すると、ファイル名の名前のみがファイルタイプマッチングに使用されます。これにより、ファイル名だけではファイルタイプを区別できない場合に、ファイルタイプを検出できない可能性があります。
{contents} (string[]) マッチングに使用するファイルの内容を表す行の配列。{filename} と一緒に使用できます。{buf} とは排他的。
戻り値(複数)
(string?) マッチが見つかった場合は、一致したファイルタイプ。(function?) 呼び出されたときにバッファーの状態を変更する関数(たとえば、いくつかのファイルタイプ固有のバッファー変数を設定するため)。この関数は、バッファー番号を唯一の引数として受け入れます。

Lua モジュール: vim.keymap vim.keymap

vim.keymap.del({modes}, {lhs}, {opts}) vim.keymap.del()
既存のマッピングを削除します。例
vim.keymap.del('n', 'lhs')
vim.keymap.del({'n', 'i', 'v'}, '<leader>w', { buffer = 5 })
パラメータ
{modes} (string|string[])
{lhs} (string)
{opts} (table?) 次のフィールドを持つテーブル
{buffer} (integer|boolean) 指定されたバッファーからマッピングを削除します。0 または true の場合、現在のバッファーを使用します。
こちらも参照
vim.keymap.set({mode}, {lhs}, {rhs}, {opts}) vim.keymap.set()
マッピングキーコードから関数またはキーコードに定義します。
-- Map "x" to a Lua function:
vim.keymap.set('n', 'x', function() print("real lua function") end)
-- Map "<leader>x" to multiple modes for the current buffer:
vim.keymap.set({'n', 'v'}, '<leader>x', vim.lsp.buf.references, { buffer = true })
-- Map <Tab> to an expression (|:map-<expr>|):
vim.keymap.set('i', '<Tab>', function()
  return vim.fn.pumvisible() == 1 and "<C-n>" or "<Tab>"
end, { expr = true })
-- Map "[%%" to a <Plug> mapping:
vim.keymap.set('n', '[%%', '<Plug>(MatchitNormalMultiBackward)')
パラメータ
{mode} (string|string[]) モードの「短い名前」(nvim_set_keymap() を参照)、またはそのリスト。
{lhs} (string) マッピングの左辺 {lhs}
{rhs} (string|function) マッピングの右辺 {rhs}。Lua 関数にすることもできます。
{opts} (table?) :map-argumentsのテーブル。 nvim_set_keymap(){opts} と同じですが、以下が異なります。
{replace_keycodes} は、"expr" が true の場合、デフォルトで true になります。
さらに以下も受け付けます。
{buffer} (integer|boolean) バッファローカルなマッピングを作成します。現在のバッファの場合は、0 または true を指定します。
{remap} (boolean, デフォルト: false) マッピングを再帰的にします。{noremap} の逆です。

Luaモジュール: vim.fs vim.fs

vim.fs.basename({file}) vim.fs.basename()
指定されたパスのベースネームを返します。
属性
Since: 0.8.0
パラメータ
{file} (string?) パス
戻り値
(string?) {file} のベースネーム
vim.fs.dir({path}, {opts}) vim.fs.dir()
{path} にある項目のイテレータを返します。
属性
Since: 0.8.0
パラメータ
{path} (string) イテレートするディレクトリへの絶対パスまたは相対パス。パスは最初に vim.fs.normalize() で正規化されます。
{opts} (table?) オプションのキーワード引数
depth: integer|nil トラバースする深さ (デフォルトは 1)
skip: (fun(dir_name: string): boolean)|nil トラバースを制御する述語。現在のディレクトリの検索を停止するには false を返します。depth > 1 の場合にのみ有用です。
戻り値
(Iterator) {path} 内の項目をイテレートします。各イテレーションでは、"name" と "type" の 2 つの値が生成されます。"name" は {path} からの相対的な項目のベースネームです。"type" は、"file"、"directory"、"link"、"fifo"、"socket"、"char"、"block"、"unknown" のいずれかです。
vim.fs.dirname({file}) vim.fs.dirname()
指定されたパスの親ディレクトリを返します。
属性
Since: 0.8.0
パラメータ
{file} (string?) パス
戻り値
(string?) {file} の親ディレクトリ
vim.fs.find({names}, {opts}) vim.fs.find()
指定されたパス内のファイルまたはディレクトリ(あるいは opts.type で指定されたその他の項目)を検索します。
{path} から開始して、{names} で指定された項目を検索します。{upward} が "true" の場合、検索は親ディレクトリを上方向にトラバースします。そうでない場合、検索は下方向にトラバースします。下方向の検索は再帰的であり、多数のディレクトリを検索する可能性があることに注意してください。{stop} が nil でない場合、{stop} で指定されたディレクトリに到達すると検索が停止します。検索は、{limit} (デフォルトは 1) の一致が見つかると終了します。{type} を "file"、"directory"、"link"、"socket"、"char"、"block"、または "fifo" に設定して、そのタイプの項目のみを検索するように絞り込むことができます。
-- list all test directories under the runtime directory
local test_dirs = vim.fs.find(
  {'test', 'tst', 'testdir'},
  {limit = math.huge, type = 'directory', path = './runtime/'}
)
-- get all files ending with .cpp or .hpp inside lib/
local cpp_hpp = vim.fs.find(function(name, path)
  return name:match('.*%.[ch]pp$') and path:match('[/\\\\]lib$')
end, {limit = math.huge, type = 'file'})
属性
Since: 0.8.0
パラメータ
{names} (string|string[]|fun(name: string, path: string): boolean) 検索する項目の名前。{names} が文字列またはテーブルの場合、ベースネームである必要があり、パスとグロブはサポートされていません。{names} が関数の場合、トラバースされた各項目に対して、以下の引数で呼び出されます。
name: 現在の項目のベースネーム
path: 現在の項目のフルパス 指定された項目が一致とみなされる場合、関数は true を返す必要があります。
{opts} (table) オプションのキーワード引数
{path} (string) 検索を開始するパス。省略した場合、現在のディレクトリが使用されます。
{upward} (boolean, デフォルト: false) 親ディレクトリを上方向に検索します。それ以外の場合は、子ディレクトリ (再帰的に) を検索します。
{stop} (string) このディレクトリに到達すると検索を停止します。ディレクトリ自体は検索されません。
{type} (string) 指定されたタイプの項目のみを検索します。省略した場合、{names} に一致するすべての項目が含まれます。
{limit} (number, デフォルト: 1) この数の一致が見つかったら検索を停止します。一致数に制限を設けない場合は、math.huge を使用してください。
戻り値
(string[]) 一致するすべての項目の正規化されたパス vim.fs.normalize()
vim.fs.joinpath({...}) vim.fs.joinpath()
ディレクトリまたはファイルパスを、正規化された単一のパスに連結します(例: "foo/""bar""foo/bar" に結合されます)。
属性
Since: 0.10.0
パラメータ
{...} (string)
戻り値
(string)
vim.fs.normalize({path}, {opts}) vim.fs.normalize()
パスを標準形式に正規化します。パスの先頭のチルダ (~) 文字はユーザーのホームディレクトリに展開され、環境変数も展開されます。「.」および「..」コンポーネントも解決されます。ただし、パスが相対パスで、それを解決しようとすると絶対パスになる場合は除きます。
相対パス内で「.」のみの場合
"." => "."
"././" => "."
現在のディレクトリの外に移動する「..」の場合
"foo/../../bar" => "../bar"
"../../foo" => "../../foo"
ルートディレクトリ内の「..」はルートディレクトリを返します。
"/../../" => "/"
Windowsでは、バックスラッシュ(\)文字はスラッシュ(/)に変換されます。
[[C:\Users\jdoe]]                         => "C:/Users/jdoe"
"~/src/neovim"                            => "/home/jdoe/src/neovim"
"$XDG_CONFIG_HOME/nvim/init.vim"          => "/Users/jdoe/.config/nvim/init.vim"
"~/src/nvim/api/../tui/./tui.c"           => "/home/jdoe/src/nvim/tui/tui.c"
"./foo/bar"                               => "foo/bar"
"foo/../../../bar"                        => "../../bar"
"/home/jdoe/../../../bar"                 => "/bar"
"C:foo/../../baz"                         => "C:../baz"
"C:/foo/../../baz"                        => "C:/baz"
[[\\?\UNC\server\share\foo\..\..\..\bar]] => "//?/UNC/server/share/bar"
属性
Since: 0.8.0
パラメータ
{path} (string) 正規化するパス
{opts} (table?) 次のフィールドを持つテーブル
{expand_env} (boolean, デフォルト: true) 環境変数を展開します。
{win} (boolean, デフォルト: Windows では true、それ以外では false) パスは Windows パスです。
戻り値
(string) 正規化されたパス
vim.fs.parents({start}) vim.fs.parents()
指定されたパスのすべての親をイテレートします。
local root_dir
for dir in vim.fs.parents(vim.api.nvim_buf_get_name(0)) do
  if vim.fn.isdirectory(dir .. "/.git") == 1 then
    root_dir = dir
    break
  end
end
if root_dir then
  print("Found git repository at", root_dir)
end
属性
Since: 0.8.0
パラメータ
{start} (string) 開始パス。
戻り値(複数)
(fun(_, dir: string): string?) イテレータ (nil) (string?)
vim.fs.rm({path}, {opts}) vim.fs.rm()
警告: この機能は実験的/不安定です。
ファイルまたはディレクトリを削除します。
パラメータ
{path} (string) 削除するパス
{opts} (table?) 次のフィールドを持つテーブル
{recursive} (boolean) ディレクトリとその内容を再帰的に削除します。
{force} (boolean) 存在しないファイルと引数を無視します。
vim.fs.root({source}, {marker}) vim.fs.root()
ファイルパスまたはバッファを基準に、特定の「マーカー」を含む最初の親ディレクトリを検索します。
バッファに名前がない(バッキングファイルがない)か、空でない 'buftype' を持っている場合、検索は Nvim の 現在のディレクトリから開始されます。
-- Find the root of a Python project, starting from file 'main.py'
vim.fs.root(vim.fs.joinpath(vim.env.PWD, 'main.py'), {'pyproject.toml', 'setup.py' })
-- Find the root of a git repository
vim.fs.root(0, '.git')
-- Find the parent directory containing any file with a .csproj extension
vim.fs.root(0, function(name, path)
  return name:match('%.csproj$') ~= nil
end)
属性
Since: 0.10.0
パラメータ
{source} (integer|string) 検索を開始するバッファ番号(現在のバッファの場合は 0)またはファイルパス(現在のディレクトリからの絶対パスまたは相対パス)。
{marker} (string|string[]|fun(name: string, path: string): boolean) 検索するマーカー、またはマーカーのリスト。関数である場合、評価された各項目に対して関数が呼び出され、{name} および {path} が一致する場合に true を返す必要があります。
戻り値
(string?) 指定されたマーカーのいずれかを含むディレクトリパス。ディレクトリが見つからない場合は nil。

Luaモジュール: vim.glob vim.glob

vim.glob.to_lpeg({pattern}) vim.glob.to_lpeg()
生のグロブを lua-lpeg パターンに解析します。
これは、LSP 3.17.0 のグロブセマンティクスを使用します: https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#pattern
グロブパターンは、次の構文を持つことができます。
* パスセグメント内の 1 つ以上の文字に一致します。
? パスセグメント内の 1 文字に一致します。
** パスセグメントの任意の数(ゼロを含む)に一致します。
{} 条件をグループ化します(例:*.{ts,js} は TypeScript ファイルと JavaScript ファイルに一致します)。
[] パスセグメント内で一致する文字の範囲を宣言します(例:example.[0-9]example.0example.1、...に一致します)。
[!...] パスセグメント内で一致する文字の範囲を否定します(例:example.[!0-9]example.aexample.b に一致しますが、example.0 には一致しません)。
パラメータ
{pattern} (string) 生のグロブパターン
戻り値
(vim.lpeg.Pattern) pattern パターンの lua-lpeg 表現

VIM.LPEG vim.lpeg

LPeg は、Parsing Expression Grammars (PEG) に基づく Lua のパターンマッチングライブラリです。https://bford.info/packrat/
lua-lpeg vim.lpeg.Pattern 解析式文法の LPeg ライブラリは vim.lpeg として含まれています(https://www.inf.puc-rio.br/~roberto/lpeg/)。
さらに、その正規表現に似たインターフェースは vim.re として利用できます (https://www.inf.puc-rio.br/~roberto/lpeg/re.html)。
Pattern:match({subject}, {init}, {...}) Pattern:match()
指定された patternsubject 文字列と照合します。一致が成功した場合、一致後の最初の文字の subject 内のインデックス、またはキャプチャされた値 (パターンが値をキャプチャした場合) を返します。オプションの数値引数 init は、照合を subject 文字列内のその位置から開始します。Lua ライブラリでは通常のように、負の値は末尾からカウントされます。一般的なパターンマッチング関数とは異なり、match はアンカーモードでのみ機能します。つまり、指定された subject 文字列のプレフィックス (位置 init) とパターンを照合しようとします。subject の任意のサブストリングとは照合しません。したがって、文字列内の任意の場所でパターンを見つけたい場合は、Lua でループを書くか、任意の場所と一致するパターンを書く必要があります。
local pattern = lpeg.R('az') ^ 1 * -1
assert(pattern:match('hello') == 6)
assert(lpeg.match(pattern, 'hello') == 6)
assert(pattern:match('1 hello') == nil)
パラメータ
{subject} (string)
{init} (integer?)
{...} (any)
戻り値
(any) ...
vim.lpeg.B({pattern}) vim.lpeg.B()
現在の位置の入力文字列がpattによって先行される場合にのみマッチするパターンを返します。パターンpattは、固定長の文字列にのみマッチする必要があり、キャプチャを含めることはできません。and述語と同様に、このパターンは成功または失敗に関係なく、入力を消費しません。
パラメータ
{pattern} (vim.lpeg.Pattern|string|integer|boolean|table)
戻り値
(vim.lpeg.Pattern)
vim.lpeg.C({patt}) vim.lpeg.C()
単純なキャプチャを作成します。これは、pattにマッチするサブジェクトのサブストリングをキャプチャします。キャプチャされた値は文字列です。pattが他のキャプチャを持っている場合、それらの値はこの値の後に返されます。
local function split (s, sep)
  sep = lpeg.P(sep)
  local elem = lpeg.C((1 - sep) ^ 0)
  local p = elem * (sep * elem) ^ 0
  return lpeg.match(p, s)
end
local a, b, c = split('a,b,c', ',')
assert(a == 'a')
assert(b == 'b')
assert(c == 'c')
パラメータ
{patt} (vim.lpeg.Pattern|string|integer|boolean|table|function)
戻り値
(vim.lpeg.Capture)
vim.lpeg.Carg({n}) vim.lpeg.Carg()
引数キャプチャを作成します。このパターンは空文字列にマッチし、lpeg.matchの呼び出しで与えられたn番目の追加引数として与えられた値を生成します。
パラメータ
{n} (integer)
戻り値
(vim.lpeg.Capture)
vim.lpeg.Cb({name}) vim.lpeg.Cb()
バックキャプチャを作成します。このパターンは空文字列にマッチし、nameという名前の最新のグループキャプチャによって生成された値を生成します(ここで、nameは任意のLua値にすることができます)。最新とは、指定された名前を持つ最後の完全な最外グループキャプチャを意味します。完全なキャプチャとは、キャプチャに対応するパターン全体がマッチしたことを意味します。最外キャプチャとは、キャプチャが別の完全なキャプチャの内側ではないことを意味します。LPegがキャプチャを評価するタイミングを指定しないのと同様に、以前にグループによって生成された値を再利用するか、再評価するかは指定しません。
パラメータ
{name} (any)
戻り値
(vim.lpeg.Capture)
vim.lpeg.Cc({...}) vim.lpeg.Cc()
定数キャプチャを作成します。このパターンは空文字列にマッチし、与えられたすべての値をキャプチャされた値として生成します。
パラメータ
{...} (any)
戻り値
(vim.lpeg.Capture)
vim.lpeg.Cf({patt}, {func}) vim.lpeg.Cf()
フォールドキャプチャを作成します。pattがキャプチャのリストC1 C2 ... Cnを生成する場合、このキャプチャは値func(...func(func(C1, C2), C3)...,Cn)を生成します。つまり、関数funcを使用してpattからのキャプチャをフォールド(または累積、または削減)します。このキャプチャは、pattが少なくとも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)
vim.lpeg.Cg({patt}, {name}) vim.lpeg.Cg()
グループキャプチャを作成します。これは、pattによって返されたすべての値を単一のキャプチャにグループ化します。グループは、匿名(名前が指定されていない場合)または指定された名前(nilでないLuaの値にすることができます)で名前付きにすることができます。
パラメータ
{patt} (vim.lpeg.Pattern|string|integer|boolean|table|function)
{name} (string?)
戻り値
(vim.lpeg.Capture)
vim.lpeg.Cmt({patt}, {fn}) vim.lpeg.Cmt()
マッチタイムキャプチャを作成します。他のすべてのキャプチャとは異なり、これはマッチが発生したときに(後で失敗する大きなパターンの一部であっても)すぐに評価されます。これは、ネストされたすべてのキャプチャの即時評価を強制し、次にfunctionを呼び出します。指定された関数は、サブジェクト全体、現在の位置(pattのマッチの後)、およびpattによって生成されたキャプチャ値を引数として取得します。functionによって返される最初の値は、マッチがどのように発生するかを定義します。呼び出しが数値を返す場合、マッチは成功し、返された数値が新しい現在の位置になります。(サブジェクトsと現在の位置iを想定すると、返される数値は範囲[i, len(s) + 1]内にある必要があります。)呼び出しがtrueを返す場合、マッチは入力を消費せずに成功します(したがって、trueを返すことはiを返すことと同等です)。呼び出しがfalsenil、または値を返さない場合、マッチは失敗します。関数によって返される追加の値は、キャプチャによって生成される値になります。
パラメータ
{patt} (vim.lpeg.Pattern|string|integer|boolean|table|function)
{fn} (fun(s: string, i: integer, ...: any)) (position: boolean|integer, ...: any)
戻り値
(vim.lpeg.Capture)
vim.lpeg.Cp() vim.lpeg.Cp()
位置キャプチャを作成します。これは空文字列にマッチし、マッチが発生したサブジェクト内の位置をキャプチャします。キャプチャされた値は数値です。
local I = lpeg.Cp()
local function anywhere(p) return lpeg.P({I * p * I + 1 * lpeg.V(1)}) end
local match_start, match_end = anywhere('world'):match('hello world!')
assert(match_start == 7)
assert(match_end == 12)
戻り値
(vim.lpeg.Capture)
vim.lpeg.Cs({patt}) vim.lpeg.Cs()
置換キャプチャを作成します。この関数は、置換を使用してpattにマッチするサブジェクトのサブストリングをキャプチャする置換キャプチャを作成します。値を持つpatt内のキャプチャの場合、キャプチャにマッチしたサブストリングはキャプチャ値(文字列である必要があります)に置き換えられます。最終的にキャプチャされた値は、すべての置換の結果の文字列です。
local function gsub (s, patt, repl)
  patt = lpeg.P(patt)
  patt = lpeg.Cs((patt / repl + 1) ^ 0)
  return lpeg.match(patt, s)
end
assert(gsub('Hello, xxx!', 'xxx', 'World') == 'Hello, World!')
パラメータ
{patt} (vim.lpeg.Pattern|string|integer|boolean|table|function)
戻り値
(vim.lpeg.Capture)
vim.lpeg.Ct({patt}) vim.lpeg.Ct()
テーブルキャプチャを作成します。このキャプチャは、pattによって作成されたすべての匿名キャプチャのすべての値を、1から始まる連続した整数キーを持つこのテーブル内のテーブルとして返します。さらに、pattによって作成された名前付きキャプチャグループごとに、グループの最初の値は、グループ名をキーとしてテーブルに入れられます。キャプチャされた値はテーブルのみです。
パラメータ
{patt} (vim.lpeg.Pattern|string|integer|boolean|table|function)
戻り値
(vim.lpeg.Capture)
vim.lpeg.locale({tab}) vim.lpeg.locale()
現在のロケールに従って、いくつかの文字クラスにマッチするためのパターンを含むテーブルを返します。テーブルには、alnumalphacntrldigitgraphlowerprintpunctspaceupper、および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)
vim.lpeg.match({pattern}, {subject}, {init}, {...}) vim.lpeg.match()
指定された patternsubject 文字列と照合します。一致が成功した場合、一致後の最初の文字の subject 内のインデックス、またはキャプチャされた値 (パターンが値をキャプチャした場合) を返します。オプションの数値引数 init は、照合を subject 文字列内のその位置から開始します。Lua ライブラリでは通常のように、負の値は末尾からカウントされます。一般的なパターンマッチング関数とは異なり、match はアンカーモードでのみ機能します。つまり、指定された subject 文字列のプレフィックス (位置 init) とパターンを照合しようとします。subject の任意のサブストリングとは照合しません。したがって、文字列内の任意の場所でパターンを見つけたい場合は、Lua でループを書くか、任意の場所と一致するパターンを書く必要があります。
local pattern = lpeg.R('az') ^ 1 * -1
assert(pattern:match('hello') == 6)
assert(lpeg.match(pattern, 'hello') == 6)
assert(pattern:match('1 hello') == nil)
パラメータ
{pattern} (vim.lpeg.Pattern|string|integer|boolean|table|function)
{subject} (string)
{init} (integer?)
{...} (any)
戻り値
(any) ...
vim.lpeg.P({value}) vim.lpeg.P()
指定された値を適切なパターンに変換します。次のルールが適用されます。
引数がパターンの場合、変更されずに返されます。
引数が文字列の場合、文字列を文字通りにマッチするパターンに変換されます。
引数が非負の数nの場合、結果は正確にn文字にマッチするパターンです。
引数が負の数-nの場合、結果は入力文字列に残っている文字数がn未満の場合にのみ成功するパターンです。lpeg.P(-n)-lpeg.P(n)と同等です(単項マイナス演算を参照)。
引数がブール値の場合、結果は、入力を消費せずに、常に成功するか、常に失敗するパターンです(ブール値に応じて)。
引数がテーブルの場合、文法として解釈されます(文法を参照)。
引数が関数の場合、空文字列に対するマッチタイムキャプチャと同等のパターンを返します。
パラメータ
{value} (vim.lpeg.Pattern|string|integer|boolean|table|function)
戻り値
(vim.lpeg.Pattern)
vim.lpeg.R({...}) vim.lpeg.R()
指定された範囲の1つに属する任意の単一文字にマッチするパターンを返します。各rangeは、xyのコード間のコードを持つすべての文字を表す長さ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)
vim.lpeg.S({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)
vim.lpeg.setmaxstack({max}) vim.lpeg.setmaxstack()
LPegが呼び出しと選択を追跡するために使用するバックトラックスタックのサイズ制限を設定します。デフォルトの制限は400です。適切に記述されたパターンのほとんどは、バックトラックレベルをほとんど必要としないため、この制限を変更する必要はめったにありません。変更する前に、追加のスペースの必要性を回避するためにパターンを書き直す必要があります。それにもかかわらず、いくつかの便利なパターンがオーバーフローする可能性があります。また、再帰的な文法では、深い再帰を持つサブジェクトもより大きな制限を必要とする可能性があります。
パラメータ
{max} (integer)
vim.lpeg.type({value}) vim.lpeg.type()
指定された値がパターンの場合、文字列"pattern"を返し、それ以外の場合はnilを返します。
パラメータ
{value} (vim.lpeg.Pattern|string|integer|boolean|table|function)
戻り値
("pattern"?)
vim.lpeg.V({v}) vim.lpeg.V()
文法の非終端記号(変数)を作成します。この操作は、文法の非終端記号(変数)を作成します。作成された非終端記号は、囲み文法内のvでインデックス付けされたルールを参照します。
local b = lpeg.P({'(' * ((1 - lpeg.S '()') + lpeg.V(1)) ^ 0 * ')'})
assert(b:match('((string))') == 11)
assert(b:match('(') == nil)
パラメータ
{v} (boolean|string|number|function|table|thread|userdata|lightuserdata)
戻り値
(vim.lpeg.Pattern)
vim.lpeg.version() vim.lpeg.version()
実行中のLPegのバージョンを含む文字列を返します。
戻り値
(string)

VIM.RE vim.re

vim.reモジュールは、LPeg vim.lpeg内でパターンを使用するための従来の正規表現のような構文を提供します。(LuaからVim regexpを提供するvim.regexとは無関係です。)
正規表現構文と例を含む元のドキュメントについては、https://www.inf.puc-rio.br/~roberto/lpeg/re.htmlを参照してください。
vim.re.compile({string}, {defs}) vim.re.compile()
与えられた{string}をコンパイルし、同等のLPegパターンを返します。与えられた文字列は、式または文法のどちらかを定義できます。オプションの{defs}テーブルは、パターンで使用される追加のLua値を提供します。
パラメータ
{string} (string)
{defs} (table?)
戻り値
(vim.lpeg.Pattern)
vim.re.find({subject}, {pattern}, {init}) vim.re.find()
与えられた{subject}内で与えられた{pattern}を検索します。一致が見つかった場合、この出現が始まるインデックスと終わるインデックスを返します。それ以外の場合は、nilを返します。
オプションの数値引数{init}を指定すると、検索は対象文字列のその位置から開始されます。Luaライブラリでは通常どおり、負の値は末尾から数えます。
パラメータ
{subject} (string)
{pattern} (vim.lpeg.Pattern|string)
{init} (integer?)
戻り値(複数)
(integer?) 一致が始まるインデックス、一致がない場合はnil (integer?) 一致が終わるインデックス、一致がない場合はnil
vim.re.gsub({subject}, {pattern}, {replacement}) vim.re.gsub()
グローバル置換を行い、与えられた{subject}内の{pattern}のすべての出現箇所を{replacement}で置換します。
パラメータ
{subject} (string)
{pattern} (vim.lpeg.Pattern|string)
{replacement} (string)
戻り値
(string)
vim.re.match({subject}, {pattern}, {init}) vim.re.match()
与えられた{subject}に対して与えられた{pattern}を照合し、すべてのキャプチャを返します。
パラメータ
{subject} (string)
{pattern} (vim.lpeg.Pattern|string)
{init} (integer?)
戻り値
(integer|vim.lpeg.Capture?)
こちらも参照
vim.lpeg.match()
vim.re.updatelocale() vim.re.updatelocale()
事前定義された文字クラスを現在のロケールに更新します。

VIM.REGEX vim.regex

Vimの正規表現は、Luaから直接使用できます。現在、それらは単一行内でのマッチングのみを許可します。
regex:match_line()
regex:match_line({bufnr}, {line_idx}, {start}, {end_}) バッファbufnrline_idx(ゼロベース)の行を照合します。マッチングは、指定された場合はバイトインデックス範囲startend_に制限されます。それ以外の場合は、regex:match_str()を参照してください。返されるバイトインデックスは、指定されている場合はstartからの相対値です。
パラメータ
{bufnr} (integer)
{line_idx} (integer)
{start} (integer?)
{end_} (integer?)
戻り値(複数)
(integer?) 一致開始(バイトインデックス)、startからの相対値。一致がない場合はnil (integer?) 一致終了(バイトインデックス)、startからの相対値。一致がない場合はnil
regex:match_str({str}) regex:match_str()
この正規表現に対して文字列strを照合します。文字列を正確に照合するには、正規表現を"^"と"$"で囲みます。一致の開始と終了のバイトインデックスを返し、一致がない場合はnilを返します。任意の整数は「真」であるため、regex:match_str()はif文の条件として直接使用できます。
パラメータ
{str} (string)
戻り値(複数)
(integer?) 一致開始(バイトインデックス)、一致がない場合はnil (integer?) 一致終了(バイトインデックス)、一致がない場合はnil
vim.regex({re}) vim.regex()
Vim正規表現reを解析し、正規表現オブジェクトを返します。正規表現は、'magic'および'ignorecase'に関係なく、デフォルトで「magic」かつ大文字と小文字を区別します。それらはフラグで制御できます。/magicおよび/ignorecaseを参照してください。
パラメータ
{re} (string)
戻り値
(vim.regex)

Luaモジュール:vim.secure vim.secure

vim.secure.read({path}) vim.secure.read()
{path}にあるファイルの読み取りを試み、ファイルが信頼できるかどうかをユーザーに尋ねます。ユーザーの選択は、$XDG_STATE_HOME/nvim/trustにある信頼データベースに永続化されます。
属性
Since: 0.9.0
パラメータ
{path} (string) 読み取るファイルのパス。
戻り値
(string?) 指定されたファイルが存在し、信頼されている場合はその内容。それ以外の場合はnil。
こちらも参照
vim.secure.trust({opts}) vim.secure.trust()
信頼データベースを管理します。
信頼データベースは、$XDG_STATE_HOME/nvim/trustにあります。
属性
Since: 0.9.0
パラメータ
{opts} (table) 次のフィールドを持つテーブル
{action} ('allow'|'deny'|'remove') - 'allow'はファイルを信頼データベースに追加し、信頼します。
'deny'はファイルを信頼データベースに追加し、拒否します。
'remove'は信頼データベースからファイルを削除します。
{path} (string) 更新するファイルのパス。{bufnr}と相互に排他的です。{action}が「allow」の場合は使用できません。
{bufnr} (integer) 更新するバッファ番号。{path}と相互に排他的です。
戻り値(複数)
(boolean) 操作が成功した場合はtrue (string) 操作が成功した場合は完全なパス、それ以外の場合はエラーメッセージ

Luaモジュール:vim.version vim.version

vim.versionモジュールは、https://semver.org仕様に準拠したバージョンと範囲を比較するための関数を提供します。プラグインおよびプラグインマネージャーは、これを使用して、現在のシステムで利用可能なツールと依存関係を確認できます。
local v = vim.version.parse(vim.fn.system({'tmux', '-V'}), {strict=false})
if vim.version.gt(v, {3, 2, 0}) then
  -- ...
end
vim.version()は、現在のNvimプロセスのバージョンを返します。

バージョン範囲仕様 version-range

バージョン「範囲仕様」は、vim.version.range()を使用してバージョンに対してテストできるセマンティックバージョン範囲を定義します。
サポートされている範囲仕様は、次の表に示されています。注:サフィックス付きバージョン(1.2.3-rc1)は一致しません。
1.2.3             is 1.2.3
=1.2.3            is 1.2.3
>1.2.3            greater than 1.2.3
<1.2.3            before 1.2.3
>=1.2.3           at least 1.2.3
~1.2.3            is >=1.2.3 <1.3.0       "reasonably close to 1.2.3"
^1.2.3            is >=1.2.3 <2.0.0       "compatible with 1.2.3"
^0.2.3            is >=0.2.3 <0.3.0       (0.x.x is special)
^0.0.1            is =0.0.1               (0.0.x is special)
^1.2              is >=1.2.0 <2.0.0       (like ^1.2.0)
~1.2              is >=1.2.0 <1.3.0       (like ~1.2.0)
^1                is >=1.0.0 <2.0.0       "compatible with 1"
~1                same                    "reasonably close to 1"
1.x               same
1.*               same
1                 same
*                 any version
x                 same
1.2.3 - 2.3.4     is >=1.2.3 <=2.3.4
Partial right: missing pieces treated as x (2.3 => 2.3.x).
1.2.3 - 2.3       is >=1.2.3 <2.4.0
1.2.3 - 2         is >=1.2.3 <3.0.0
Partial left: missing pieces treated as 0 (1.2 => 1.2.0).
1.2 - 2.3.0       is 1.2.0 - 2.3.0
vim.version.cmp({v1}, {v2}) vim.version.cmp()
2つのバージョンオブジェクト(vim.version.parse()の結果、または{major, minor, patch}タプルとしてリテラルに指定されたもの。例:{1, 0, 3})を解析して比較します。
if vim.version.cmp({1,0,3}, {0,2,1}) == 0 then
  -- ...
end
local v1 = vim.version.parse('1.0.3-pre')
local v2 = vim.version.parse('0.2.1')
if vim.version.cmp(v1, v2) == 0 then
  -- ...
end
注意
semverに従って、ビルドメタデータは、それ以外は同等の2つのバージョンを比較するときに無視されます。
属性
Since: 0.9.0
パラメータ
{v1} (vim.Version|number[]|string) バージョンオブジェクト。
{v2} (vim.Version|number[]|string) v1と比較するバージョン。
戻り値
(integer) v1 < v2の場合は-1、v1 == v2の場合は0、v1 > v2の場合は1。
vim.version.eq({v1}, {v2}) vim.version.eq()
指定されたバージョンが等しい場合はtrueを返します。使用法については、vim.version.cmp()を参照してください。
属性
Since: 0.9.0
パラメータ
{v1} (vim.Version|number[]|string)
{v2} (vim.Version|number[]|string)
戻り値
(boolean)
vim.version.ge({v1}, {v2}) vim.version.ge()
v1 >= v2の場合はtrueを返します。使用法については、vim.version.cmp()を参照してください。
属性
Since: 0.10.0
パラメータ
{v1} (vim.Version|number[]|string)
{v2} (vim.Version|number[]|string)
戻り値
(boolean)
vim.version.gt({v1}, {v2}) vim.version.gt()
v1 > v2の場合はtrueを返します。使用法については、vim.version.cmp()を参照してください。
属性
Since: 0.9.0
パラメータ
{v1} (vim.Version|number[]|string)
{v2} (vim.Version|number[]|string)
戻り値
(boolean)
vim.version.last({versions}) vim.version.last()
TODO:これを一般化し、func.luaに移動する
パラメータ
{versions} (vim.Version[])
戻り値
(vim.Version?)
vim.version.le({v1}, {v2}) vim.version.le()
v1 <= v2の場合はtrueを返します。使用法については、vim.version.cmp()を参照してください。
属性
Since: 0.10.0
パラメータ
{v1} (vim.Version|number[]|string)
{v2} (vim.Version|number[]|string)
戻り値
(boolean)
vim.version.lt({v1}, {v2}) vim.version.lt()
v1 < v2の場合はtrueを返します。使用法については、vim.version.cmp()を参照してください。
属性
Since: 0.9.0
パラメータ
{v1} (vim.Version|number[]|string)
{v2} (vim.Version|number[]|string)
戻り値
(boolean)
vim.version.parse({version}, {opts}) vim.version.parse()
セマンティックバージョン文字列を解析し、他のvim.version関数で使用できるバージョンオブジェクトを返します。たとえば、「1.0.1-rc1+build.2」は次を返します。
{ major = 1, minor = 0, patch = 1, prerelease = "rc1", build = "build.2" }
属性
Since: 0.9.0
パラメータ
{version} (string) 解析するバージョン文字列。
{opts} (table?) オプションのキーワード引数
strict(boolean):デフォルトはfalse。trueの場合、semver v2.0.0に準拠しない入力に対して強制は試行されません。falseの場合、parse()は、「1.0」、「0-x」、「tmux 3.2a」などの入力を有効なバージョンに強制しようとします。
戻り値
(vim.Version?) parsed_version バージョンオブジェクト。入力が無効な場合はnil
vim.version.range({spec}) vim.version.range()
semver version-range「spec」を解析し、範囲オブジェクトを返します
{
  from: Version
  to: Version
  has(v: string|Version)
}
:has()は、バージョンが範囲内にあるかどうかを確認します(fromは包括的、toは排他的)。
local r = vim.version.range('1.0.0 - 2.0.0')
print(r:has('1.9.9'))       -- true
print(r:has('2.0.0'))       -- false
print(r:has(vim.version())) -- check against current Nvim version
または、cmp()、le()、lt()、ge()、gt()、および/またはeq()を使用して、バージョンを.toおよび.fromに対して直接比較します
local r = vim.version.range('1.0.0 - 2.0.0') -- >=1.0, <2.0
print(vim.version.ge({1,0,3}, r.from) and vim.version.lt({1,0,3}, r.to))
属性
Since: 0.9.0
パラメータ
{spec} (string) バージョン範囲「spec」
戻り値
(table?) 次のフィールドを持つテーブル
{from} (vim.Version)
{to} (vim.Version)

Luaモジュール:vim.iter vim.iter

vim.iter()は、iterableのインターフェースです。テーブルまたは関数引数をIterオブジェクトでラップし、基になるソースデータを変換するメソッド(Iter:filter()Iter:map()など)を持ちます。これらのメソッドを連鎖させて、イテレーター「パイプライン」を作成できます。各パイプラインステージの出力は、次のステージへの入力になります。最初のステージは、vim.iter()に渡された型によって異なります。
リストまたは配列(lua-list)は、各要素の値のみを生成します。
穴(nil値)は許可されています(ただし、破棄されます)。
配列/リストテーブルを辞書として扱うには、pairs()を使用します(穴と非連続的な整数キーを保持します)。vim.iter(pairs(…))
インデックスも次のステージに渡すには、Iter:enumerate()を使用します。
または、ipairs()で初期化します:vim.iter(ipairs(…))
リスト以外のテーブル(lua-dict)は、各要素のキーと値の両方を生成します。
関数イテレーターは、基になる関数によって返されるすべての値を生成します。
__call()メタメソッドを持つテーブルは、関数イテレーターとして扱われます。
イテレーターパイプラインは、基になるiterableが使い果たされると終了します(関数イテレーターの場合、これはnilを返したことを意味します)。
注:vim.iter()は、テーブル入力がリストであるか辞書であるかを判断するためにスキャンします。このコストを回避するには、テーブルをイテレーターでラップできます。たとえば、vim.iter(ipairs({…}))ですが、これはlist-iteratorの操作(Iter:rev()など)の使用を妨げます。
local it = vim.iter({ 1, 2, 3, 4, 5 })
it:map(function(v)
  return v * 3
end)
it:rev()
it:skip(2)
it:totable()
-- { 9, 6, 3 }
-- ipairs() is a function iterator which returns both the index (i) and the value (v)
vim.iter(ipairs({ 1, 2, 3, 4, 5 })):map(function(i, v)
  if i > 2 then return v end
end):totable()
-- { 3, 4, 5 }
local it = vim.iter(vim.gsplit('1,2,3,4,5', ','))
it:map(function(s) return tonumber(s) end)
for i, d in it:enumerate() do
  print(string.format("Column %d is %d", i, d))
end
-- Column 1 is 1
-- Column 2 is 2
-- Column 3 is 3
-- Column 4 is 4
-- Column 5 is 5
vim.iter({ a = 1, b = 2, c = 3, z = 26 }):any(function(k, v)
  return k == 'z'
end)
-- true
local rb = vim.ringbuf(3)
rb:push("a")
rb:push("b")
vim.iter(rb):totable()
-- { "a", "b" }
Iter:all({pred}) Iter:all()
イテレーター内のすべてのアイテムが与えられた述語と一致する場合はtrueを返します。
パラメータ
{pred} (fun(...):boolean) 述語関数。パイプラインの前のステージから返されたすべての値を引数として受け取り、述語が一致する場合はtrueを返します。
Iter:any({pred}) Iter:any()
イテレータ内のいずれかの項目が指定された述語に一致する場合にtrueを返します。
パラメータ
{pred} (fun(...):boolean) 述語関数。パイプラインの前のステージから返されたすべての値を引数として受け取り、述語が一致する場合はtrueを返します。
Iter:each({f}) Iter:each()
パイプライン内の各項目に対して関数を一度呼び出し、イテレータを使い果たします。
副作用のある関数用です。イテレータ内の値を変更するには、Iter:map()を使用してください。
パラメータ
{f} (fun(...)) パイプライン内の各項目に対して実行する関数。パイプラインの前のステージで返されたすべての値を引数として取ります。
Iter:enumerate() Iter:enumerate()
イテレータパイプラインの各項目の項目インデックス(カウント)と値を生成します。
リストテーブルの場合、こちらの方が効率的です
vim.iter(ipairs(t))
ではなく
vim.iter(t):enumerate()
local it = vim.iter(vim.gsplit('abc', '')):enumerate()
it:next()
-- 1        'a'
it:next()
-- 2        'b'
it:next()
-- 3        'c'
戻り値
(Iter)
Iter:filter({f}) Iter:filter()
イテレータパイプラインをフィルタリングします。
local bufs = vim.iter(vim.api.nvim_list_bufs()):filter(vim.api.nvim_buf_is_loaded)
パラメータ
{f} (fun(...):boolean) パイプラインの前のステージから返されたすべての値を取り、現在のイテレータ要素を削除する必要がある場合は、falseまたはnilを返します。
戻り値
(Iter)
Iter:find({f}) Iter:find()
指定された述語を満たすイテレータ内の最初の値を見つけます。
イテレータを進めます。値が見つからない場合はnilを返し、イテレータを使い果たします。
local it = vim.iter({ 3, 6, 9, 12 })
it:find(12)
-- 12
local it = vim.iter({ 3, 6, 9, 12 })
it:find(20)
-- nil
local it = vim.iter({ 3, 6, 9, 12 })
it:find(function(v) return v % 4 == 0 end)
-- 12
パラメータ
{f} (any)
戻り値
(any)
Iter:flatten({depth}) Iter:flatten()
リストイテレータを平坦化し、与えられた{depth}までネストされた値を非ネスト化します。辞書のような値を平坦化しようとするとエラーが発生します。
vim.iter({ 1, { 2 }, { { 3 } } }):flatten():totable()
-- { 1, 2, { 3 } }
vim.iter({1, { { a = 2 } }, { 3 } }):flatten():totable()
-- { 1, { a = 2 }, 3 }
vim.iter({ 1, { { a = 2 } }, { 3 } }):flatten(math.huge):totable()
-- error: attempt to flatten a dict-like table
パラメータ
{depth} (number?) リストイテレータを平坦化する深さ(デフォルトは1)
戻り値
(Iter)
Iter:fold({init}, {f}) Iter:fold()
イテレータを単一の値に畳み込み(「縮小」)ます。Iter:reduce()
-- Create a new table with only even values
vim.iter({ a = 1, b = 2, c = 3, d = 4 })
  :filter(function(k, v) return v % 2 == 0 end)
  :fold({}, function(acc, k, v)
    acc[k] = v
    return acc
  end) --> { b = 2, d = 4 }
-- Get the "maximum" item of an iterable.
vim.iter({ -99, -4, 3, 42, 0, 0, 7 })
  :fold({}, function(acc, v)
    acc.max = math.max(v, acc.max or v)
    return acc
  end) --> { max = 42 }
パラメータ
{init} (any) アキュムレータの初期値。
{f} (fun(acc:A, ...):A) 累積関数。
戻り値
(any)
Iter:join({delim}) Iter:join()
イテレータを区切り文字で区切られた文字列に収集します。
イテレータ内の各要素は、{delim}で区切られた文字列に結合されます。
イテレータを消費します。
パラメータ
{delim} (string) 区切り文字
戻り値
(string)
Iter:last() Iter:last()
イテレータを使い果たし、最後の項目を返します。
local it = vim.iter(vim.gsplit('abcdefg', ''))
it:last()
-- 'g'
local it = vim.iter({ 3, 6, 9, 12, 15 })
it:last()
-- 15
戻り値
(any)
こちらも参照
Iter.rpeek
Iter:map({f}) Iter:map()
イテレータパイプラインの項目を、fによって返される値にマップします。
マップ関数がnilを返した場合、値はイテレータからフィルタリングされます。
local it = vim.iter({ 1, 2, 3, 4 }):map(function(v)
  if v % 2 == 0 then
    return v * 3
  end
end)
it:totable()
-- { 6, 12 }
パラメータ
{f} (fun(...):...:any) マッピング関数。パイプラインの前のステージから返されたすべての値を引数として取り、1つ以上の新しい値を返します。これは、次のパイプラインステージで使用されます。nilの戻り値は出力からフィルタリングされます。
戻り値
(Iter)
Iter:next() Iter:next()
イテレータから次の値を取得します。
local it = vim.iter(string.gmatch('1 2 3', '%d+')):map(tonumber)
it:next()
-- 1
it:next()
-- 2
it:next()
-- 3
戻り値
(any)
Iter:nth({n}) Iter:nth()
イテレータのn番目の値を取得します(そしてそれに進みます)。
nが負の場合、リストイテレータの末尾からのオフセットになります。
local it = vim.iter({ 3, 6, 9, 12 })
it:nth(2)
-- 6
it:nth(2)
-- 12
local it2 = vim.iter({ 3, 6, 9, 12 })
it2:nth(-2)
-- 9
it2:nth(-2)
-- 3
パラメータ
{n} (number) 返す値のインデックス。リストイテレータがソースの場合、負の値になる可能性があります。
戻り値
(any)
Iter:peek() Iter:peek()
消費せずに、リストイテレータ内の次の値を取得します。
local it = vim.iter({ 3, 6, 9, 12 })
it:peek()
-- 3
it:peek()
-- 3
it:next()
-- 3
戻り値
(any)
Iter:pop() Iter:pop()
リストイテレータから値を「ポップ」します(最後の値を取得し、末尾をデクリメントします)。
local it = vim.iter({1, 2, 3, 4})
it:pop()
-- 4
it:pop()
-- 3
戻り値
(any)
Iter:rev() Iter:rev()
リストイテレータパイプラインを反転します。
local it = vim.iter({ 3, 6, 9, 12 }):rev()
it:totable()
-- { 12, 9, 6, 3 }
戻り値
(Iter)
Iter:rfind({f}) Iter:rfind()
リストイテレータの末尾から、述語を満たす最初の値を取得します。
イテレータを進めます。値が見つからない場合はnilを返し、イテレータを使い果たします。
local it = vim.iter({ 1, 2, 3, 2, 1 }):enumerate()
it:rfind(1)
-- 5        1
it:rfind(1)
-- 1        1
パラメータ
{f} (any)
戻り値
(any)
こちらも参照
Iter.find
Iter:rpeek() Iter:rpeek()
消費せずに、リストイテレータの最後の値を取得します。
local it = vim.iter({1, 2, 3, 4})
it:rpeek()
-- 4
it:rpeek()
-- 4
it:pop()
-- 4
戻り値
(any)
こちらも参照
Iter.last
Iter:rskip({n}) Iter:rskip()
リストイテレータパイプラインの末尾からn個の値を破棄します。
local it = vim.iter({ 1, 2, 3, 4, 5 }):rskip(2)
it:next()
-- 1
it:pop()
-- 3
パラメータ
{n} (number) スキップする値の数。
戻り値
(Iter)
Iter:skip({n}) Iter:skip()
イテレータパイプラインのn個の値をスキップします。
local it = vim.iter({ 3, 6, 9, 12 }):skip(2)
it:next()
-- 9
パラメータ
{n} (number) スキップする値の数。
戻り値
(Iter)
Iter:slice({first}, {last}) Iter:slice()
リストイテレータパイプラインの開始と終了を設定します。
:skip(first - 1):rskip(len - last + 1)と同等です。
パラメータ
{first} (number)
{last} (number)
戻り値
(Iter)
Iter:take({n}) Iter:take()
イテレータを、最初のn個の値のみを生成するように変換します。
local it = vim.iter({ 1, 2, 3, 4 }):take(2)
it:next()
-- 1
it:next()
-- 2
it:next()
-- nil
パラメータ
{n} (integer)
戻り値
(Iter)
Iter:totable() Iter:totable()
イテレータをテーブルに収集します。
結果のテーブルは、イテレータパイプラインの最初のソースによって異なります。配列のようなテーブルと関数イテレータは、配列のようなテーブルに収集されます。イテレータパイプラインの最終ステージから複数の値が返された場合、各値がテーブルに含まれます。
vim.iter(string.gmatch('100 20 50', '%d+')):map(tonumber):totable()
-- { 100, 20, 50 }
vim.iter({ 1, 2, 3 }):map(function(v) return v, 2 * v end):totable()
-- { { 1, 2 }, { 2, 4 }, { 3, 6 } }
vim.iter({ a = 1, b = 2, c = 3 }):filter(function(k, v) return v % 2 ~= 0 end):totable()
-- { { 'a', 1 }, { 'c', 3 } }
生成されたテーブルは、連続する数値インデックスを持つ配列のようなテーブルです。任意のキーを持つマップのようなテーブルを作成するには、Iter:fold()を使用してください。
戻り値
(table)

Luaモジュール: vim.snippet vim.snippet

フィールド
{direction} (vim.snippet.Direction) ナビゲーションの方向。-1は前へ、1は次へ。
vim.snippet.active({filter}) vim.snippet.active()
現在のバッファにアクティブなスニペットがある場合はtrueを返し、指定されたフィルタが提供されている場合はそれを適用します。
この関数を使用して、次のようにスニペットをナビゲートできます
vim.keymap.set({ 'i', 's' }, '<Tab>', function()
   if vim.snippet.active({ direction = 1 }) then
     return '<Cmd>lua vim.snippet.jump(1)<CR>'
   else
     return '<Tab>'
   end
 end, { expr = true })
パラメータ
{filter} (vim.snippet.ActiveFilter?) 検索を制約するためのフィルタ
direction (vim.snippet.Direction): ナビゲーションの方向。指定された方向にスニペットをジャンプできる場合はtrueを返します。vim.snippet.ActiveFilterを参照してください。
戻り値
(boolean)
vim.snippet.expand({input}) vim.snippet.expand()
指定されたスニペットテキストを展開します。有効な入力の仕様については、https://microsoft.github.io/language-server-protocol/specification/#snippet_syntaxを参照してください。
タブストップはhl-SnippetTabstopで強調表示されます。
パラメータ
{input} (string)
vim.snippet.jump({direction}) vim.snippet.jump()
可能であれば、現在のスニペット内の次の(または前の)プレースホルダーにジャンプします。
たとえば、スニペットがアクティブな間、<Tab>をジャンプにマップします。
vim.keymap.set({ 'i', 's' }, '<Tab>', function()
   if vim.snippet.active({ direction = 1 }) then
     return '<Cmd>lua vim.snippet.jump(1)<CR>'
   else
     return '<Tab>'
   end
 end, { expr = true })
パラメータ
{direction} (vim.snippet.Direction) ナビゲーションの方向。-1は前へ、1は次へ。
vim.snippet.stop() vim.snippet.stop()
現在のスニペットを終了します。

Luaモジュール: vim.text vim.text

vim.text.hexdecode({enc}) vim.text.hexdecode()
文字列を16進数デコードします。
パラメータ
{enc} (string) デコードする文字列
戻り値(複数)
(string?) デコードされた文字列 (string?) エラーメッセージ(ある場合)
vim.text.hexencode({str}) vim.text.hexencode()
文字列を16進数エンコードします。
パラメータ
{str} (string) エンコードする文字列
戻り値
(string) 16進数エンコードされた文字列

Luaモジュール: tohtml vim.tohtml

:[範囲]TOhtml {file} :TOhtml
現在のウィンドウに表示されているバッファをHTMLに変換し、生成されたHTMLを新しい分割ウィンドウで開き、その内容を{file}に保存します。{file}が指定されていない場合は、tempname()によって作成された一時ファイルが使用されます。
tohtml.tohtml({winid}, {opt}) tohtml.tohtml.tohtml()
ウィンドウ{winid}に表示されているバッファをHTMLに変換し、出力を文字列のリストとして返します。
パラメータ
{winid} (integer?) 変換するウィンドウ(デフォルトは現在のウィンドウ)
{opt} (table?) オプションのパラメータ。
{title} (string|false, デフォルト: バッファ名) 生成されたHTMLコードに設定するタイトルタグ。
{number_lines} (boolean, デフォルト: false) 行番号を表示します。
{font} (string[]|string, デフォルト: guifont) 使用するフォント。
{width} (integer, デフォルト: 'textwidth' がゼロ以外の場合、またはそれ以外の場合はウィンドウの幅) 右揃えまたは文字を無限に繰り返す項目に使用される幅。
{range} (integer[], デフォルト: バッファ全体) 使用する行の範囲。
戻り値
(string[])
メイン
コマンドインデックス
クイックリファレンス