0Pricing
Lua Academy · レッスン

バッファーとウィンドウ

エディターを操作します。

「バッファーとウィンドウ」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

バッファ、ウィンドウ、タブページ

Neovimでは、コンテンツと表示が分離されています。バッファはテキストをメモリ上に保持し、ウィンドウはバッファを表示するビューポートで、タブページはウィンドウのレイアウトです。

1つのバッファを複数のウィンドウに表示できます。プラグインは、整数であるこれらのハンドルを、nvim_buf_*およびnvim_win_* APIファミリーを通じて操作します。

local buf = vim.api.nvim_get_current_buf()
local win = vim.api.nvim_get_current_win()
print(buf, win)

バッファ行の読み取り

nvim_buf_get_lines(buf, start, end_, strict)は行のリストを返します。インデックスは0始まりで、終端は含みません。最後の行まで取得するには、終端に-1を渡します。

strict_indexingをfalseに設定すると、範囲外のインデックスをエラーにせず許容できます。

local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false)
print('line count: ' .. #lines)

バッファ行の書き込み

nvim_buf_set_linesは、指定した範囲を新しいテキストで置き換えます。末尾に追加するには、startとendの両方を-1に設定します。すべてを上書きするには、0, -1を使用します。

置き換える値は、行ごとに1つの文字列を含むLuaのリストで、末尾の改行文字は含めません。

vim.api.nvim_buf_set_lines(0, -1, -1, false, {
  '-- appended line',
})

スクラッチバッファ

nvim_create_buf(listed, scratch)を使うと、リストに表示されない使い捨てのバッファを作成できます。false, trueを渡すと、プラグインUIに適したスクラッチバッファになります。

bufhidden = 'wipe'を設定すると、そのウィンドウを閉じたときにバッファも消えるため、不要なバッファが残りません。

local buf = vim.api.nvim_create_buf(false, true)
vim.bo[buf].bufhidden = 'wipe'
vim.api.nvim_buf_set_lines(buf, 0, -1, false, { 'Panel' })

バッファローカルオプション

vim.bo[buf]をインデックスして、特定のハンドルのバッファローカルオプションを設定します。プラグインでよく使う設定には、modifiable = falseやbuftype = 'nofile'があります。

表示用バッファを変更不可にすると、ユーザーが生成された内容を誤って編集するのを防げます。

vim.bo[buf].modifiable = false
vim.bo[buf].buftype = 'nofile'
vim.bo[buf].filetype = 'myplugin'

フローティングウィンドウを開く

nvim_open_win(buf, enter, config)は、バッファをフローティングウィンドウに配置します。configではrelative、row、col、width、height、borderを設定します。

フロートは、ホバードキュメント、ピッカー、通知など、現代的なUIの基盤です。

local win = vim.api.nvim_open_win(buf, true, {
  relative = 'editor', row = 5, col = 10,
  width = 40, height = 10, border = 'rounded',
})

ウィンドウ設定

nvim_win_set_configを使うと、開いているフロートを調整できます。VimResized時のサイズ変更などに便利です。現在のレイアウトはnvim_win_get_configで読み取れます。

vim.wo[win]を通じてウィンドウローカルオプションを設定できます。たとえば、UIパネルでカーソル行を非表示にしたり、行番号の表示を無効にしたりできます。

vim.wo[win].number = false
vim.wo[win].cursorline = true
vim.api.nvim_win_set_config(win, { width = 50 })

カーソルと位置

nvim_win_set_cursor(win, {row, col})でカーソルを移動します。rowは1始まりですが、colは0始まりである点に注意してください。これは、頻繁にオフバイワンエラーの原因になります。

nvim_win_get_cursorで位置を読み戻せるため、操作の前後でユーザーの位置を記録して復元できます。

local pos = vim.api.nvim_win_get_cursor(0)
vim.api.nvim_win_set_cursor(0, { pos[1], 0 })

有効性の確認とクリーンアップ

ハンドルが無効になることがあります。保存したハンドルを操作する前に、nvim_buf_is_validとnvim_win_is_validで確認してください。

ウィンドウはnvim_win_close(win, force)で閉じ、バッファはnvim_buf_delete(buf, { force = true })で削除します。エラーを避けるため、必ず最初に有効性を確認してください。

if vim.api.nvim_win_is_valid(win) then
  vim.api.nvim_win_close(win, true)
end

ExtmarkとNamespace

Extmarkは、編集に応じて移動するテキストにメタデータを固定します。nvim_create_namespaceでnamespaceを作成し、仮想テキストやハイライトを関連付けます。

nvim_buf_set_extmarkは、sign列、仮想テキスト、インラインハイライトに対応しています。これはインレイヒントやgit blameプラグインの基盤となる機能です。

local ns = vim.api.nvim_create_namespace('myplugin')
vim.api.nvim_buf_set_extmark(0, ns, 0, 0, {
  virt_text = { { ' hint', 'Comment' } },
})

列挙と反復処理

nvim_list_bufsとnvim_list_winsは、現在存在するすべてのハンドルを返します。nvim_buf_is_loadedでフィルタリングしたり、オプションを確認して絞り込んだりできます。

反復処理を使うと、セッション全体に対してプラグインを動作させられます。たとえば、すべてのフローティングウィンドウを閉じたり、指定したファイルタイプの各バッファを更新したりできます。

for _, b in ipairs(vim.api.nvim_list_bufs()) do
  if vim.api.nvim_buf_is_loaded(b) then print(b) end
end

クイックチェック

バッファとウィンドウについて学んだ内容を確認しましょう。

振り返り:バッファとウィンドウ

バッファはテキストを保持し、ウィンドウはそれを表示します。ハンドルは整数なので、使用する前に有効性を確認します。行の読み書き、スクラッチバッファの作成、バッファローカルオプションの設定ができます。

nvim_open_winによるフローティングウィンドウ、カーソル制御、Extmark、列挙APIを組み合わせれば、豊富で状態を持つプラグインUIを構築するために必要な機能がそろいます。

よくある質問

「バッファーとウィンドウ」レッスンは無料ですか?

はい。「バッファーとウィンドウ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「バッファーとウィンドウ」で何を学びますか?

エディターを操作します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「バッファーとウィンドウ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Neovim Lua API
  2. コマンドとキーマップ
  3. バッファーとウィンドウ
  4. プラグインをパッケージ化する
← Lua Academyに戻る