0Pricing
Lua Academy · レッスン

コマンドとキーマップ

ユーザー向けのアクションを追加します。

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

ユーザーコマンドの概要

ユーザーコマンドは、プラグインが公開する:Formatや:Telescopeのようなコロンコマンドです。名前は大文字で始める必要があります。

nvim_create_user_commandはLuaでユーザーコマンドを定義します。名前、コールバックまたは文字列、オプションテーブルを受け取ります。これはVimscriptの:commandに代わるものです。

vim.api.nvim_create_user_command('Hello', function()
  print('Hello from my plugin')
end, {})

コマンドの引数

nargsを設定すると引数を受け取れるようになります。指定できる値は'0'、'1'、'*'、'?'、'+'です。コールバックにはargs、fargs、bangを持つoptsテーブルが渡されます。

fargsは空白で分割済みの引数リストで、通常はこちらを使用します。

vim.api.nvim_create_user_command('Greet', function(opts)
  print('Hi ' .. opts.args)
end, { nargs = 1 })

範囲指定とBangコマンド

range = trueを渡すと行範囲を受け取れるようになり、コールバックからopts.line1とopts.line2を読み取れるようになります。bang = trueを追加すると:Cmd!を許可でき、opts.bangで検出できます。

これらのフラグを使うと、ビジュアル選択時や強制実行時に、1つのコマンドの動作を変えられます。

vim.api.nvim_create_user_command('Sum', function(o)
  print(o.line1 .. ' to ' .. o.line2)
end, { range = true })

コマンド補完

completeオプションを指定すると、タブ補完を提供できます。'file'や'buffer'などの組み込み補完を使うことも、カスタムLua関数を使うこともできます。

カスタム補完関数には、入力途中の引数とコマンドラインが渡され、候補となる文字列のリストを返します。

vim.api.nvim_create_user_command('Pick', function(o) print(o.args) end, {
  nargs = 1,
  complete = function() return { 'red', 'green', 'blue' } end,
})

バッファローカルコマンド

コマンドの対象を1つのバッファに限定するには、バッファハンドルとともにnvim_buf_create_user_commandを使用します。これはファイルタイププラグインでよく使われます。

たとえばMarkdownプラグインでは、Markdownバッファ内でだけ:Previewを定義し、グローバルな名前空間を汚さないようにできます。

vim.api.nvim_buf_create_user_command(0, 'Preview', function()
  print('previewing this buffer')
end, {})

vim.keymap.setの紹介

vim.keymap.setは現代的なマッピングAPIです。モード、左辺のキー、右辺の文字列またはLua関数、オプションテーブルを受け取ります。

従来のnvim_set_keymapとは異なり、右辺にLuaコールバックを直接指定できるため、<cmd>luaでラップする必要がありません。

vim.keymap.set('n', '<leader>w', function()
  vim.cmd('write')
end, { desc = 'Save file' })

モードと複数のマッピング

モード引数には'n'のような単一の文字列か、{ 'n', 'v' }のようなテーブルを指定して、複数のモードを一度にマッピングできます。

よく使うモードは、nがノーマル、iが挿入、vがビジュアル、xがビジュアル専用、tがターミナルです。空文字列''は、ノーマル、ビジュアル、オペレーター保留中を意味します。

vim.keymap.set({ 'n', 'v' }, '<leader>y', '"+y', { desc = 'Yank to clipboard' })

マッピングのオプション

optsテーブルで動作を制御します。silent = trueはコマンドのエコーを抑制し、noremapは安全のためデフォルトでtrueになっています。buffer = 0を指定すると、現在のバッファだけにマッピングを限定できます。

which-keyや:mapの出力を読みやすく保つため、必ずdescを追加してください。

vim.keymap.set('n', 'gd', vim.lsp.buf.definition, {
  buffer = 0, silent = true, desc = 'Go to definition',
})

式マッピング

expr = trueを指定すると、右辺の関数が入力するキーを返します。これにより、補完メニューが表示されているかどうかで<Tab>の動作を変えるようなスマートマッピングを実現できます。

何もしない場合は空文字列を、入力する場合はそのキーを表すリテラルを返してください。

vim.keymap.set('i', '<Tab>', function()
  return vim.fn.pumvisible() == 1 and '<C-n>' or '<Tab>'
end, { expr = true })

マッピングの削除

vim.keymap.delに同じモードとキーを渡すとマッピングを削除できます。バッファローカルだった場合は、bufferフィールドも渡してください。

これはクリーンアップ処理や、プラグインが機能を無効にしてユーザーの元のキーバインドを復元する場合に役立ちます。

vim.keymap.del('n', '<leader>w')
vim.keymap.del('n', 'gd', { buffer = 0 })

コマンドとキーマップを組み合わせる

ロジックを一度だけ定義し、それをユーザーコマンドとして公開して、そのコマンドを呼び出すキーを割り当てるのが、すっきりしたパターンです。これにより、信頼できる情報源を1つに保てます。

<cmd>Hello<cr>にマッピングするとビジュアルモードを離れずに済み、:Hello<cr>よりも予測しやすくなります。

vim.api.nvim_create_user_command('Toggle', function() end, {})
vim.keymap.set('n', '<leader>t', '<cmd>Toggle<cr>', { desc = 'Toggle' })

クイックチェック

コマンドとキーマップについての理解度を確認してください。

復習: コマンドとキーマップ

これで、nvim_create_user_commandを使ってコマンドを作成し、nargs、range、bang、completeで動作を制御し、バッファごとに対象を限定できるようになりました。

マッピングでは、vim.keymap.setがLuaコールバック、複数のモード、desc、silent、buffer、exprなどのオプションを受け付け、クリーンアップにはvim.keymap.delを使用できます。

よくある質問

「コマンドとキーマップ」レッスンは無料ですか?

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

「コマンドとキーマップ」で何を学びますか?

ユーザー向けのアクションを追加します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「コマンドとキーマップ」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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