diff --git a/modules/home/nixvim/keymaps.nix b/modules/home/nixvim/keymaps.nix index ed08bbe..4d550aa 100644 --- a/modules/home/nixvim/keymaps.nix +++ b/modules/home/nixvim/keymaps.nix @@ -10,118 +10,165 @@ mkRaw = key: raw: desc: { mode = "n"; - key = key; + inherit key; action.__raw = raw; options = { silent = true; - desc = desc; + inherit desc; + }; + }; + + mkExpr = key: raw: desc: { + mode = "n"; + inherit key; + action.__raw = raw; + options = { + silent = true; + expr = true; + inherit desc; }; }; in { - programs.nixvim.keymaps = [ - # Search - (mk "" "nohlsearch" "検索ハイライトを解除") + programs.nixvim = { + opts = { + # ジャンプ履歴をスタック寄りに扱う + jumpoptions = "stack"; - # Screen line movement - { - mode = "n"; - key = "j"; - action.__raw = "function() return vim.v.count == 0 and 'gj' or 'j' end"; - options = { silent = true; expr = true; desc = "下へ移動(画面行優先)"; }; - } - { - mode = "n"; - key = "k"; - action.__raw = "function() return vim.v.count == 0 and 'gk' or 'k' end"; - options = { silent = true; expr = true; desc = "上へ移動(画面行優先)"; }; - } + # 既に開いているバッファや直前のウィンドウを優先して再利用 + switchbuf = "useopen,uselast"; + }; - # LSP - (mkRaw "K" "vim.lsp.buf.hover" "LSPエラーのホバー表示") - (mk "gd" "Glance definitions" "定義へ移動") - (mk "gr" "Glance references" "参照を表示") - (mkRaw "rn" "vim.lsp.buf.rename" "シンボル名を一括変換") - (mkRaw "cf" "function() require('conform').format({ timeout_ms = 1000, lsp_format = 'fallback' }) end" "コードをフォーマット") - (mkRaw "ca" "function() vim.lsp.buf.code_action({ context = { diagnostics = vim.diagnostic.get(0, { lnum = vim.fn.line('.') - 1 }) } }) end" "コードアクション") + keymaps = [ + # Search + (mk "" "nohlsearch" "検索ハイライトを解除") - # Diagnostics - (mkRaw "]d" "vim.diagnostic.goto_next" "次のエラー") - (mkRaw "[d" "vim.diagnostic.goto_prev" "前のエラー") - (mkRaw "dl" "vim.diagnostic.open_float" "エラー詳細") + # Screen line movement + (mkExpr "j" "function() return vim.v.count == 0 and 'gj' or 'j' end" "下へ移動(画面行優先)") + (mkExpr "k" "function() return vim.v.count == 0 and 'gk' or 'k' end" "上へ移動(画面行優先)") - # File tree - (mk "e" "Neotree toggle left" "ファイルツリー") + # LSP: hover / direct jump + (mkRaw "K" "vim.lsp.buf.hover" "シンボル情報を表示") + (mkRaw "gd" "vim.lsp.buf.definition" "定義へジャンプ") + (mkRaw "grr" "vim.lsp.buf.references" "参照一覧を開く") + (mkRaw "gri" "vim.lsp.buf.implementation" "実装一覧を開く") + (mkRaw "grt" "vim.lsp.buf.type_definition" "型定義一覧を開く") + (mkRaw "grn" "vim.lsp.buf.rename" "シンボル名を一括変換") + (mkRaw "gra" "vim.lsp.buf.code_action" "コードアクション") + (mkRaw "gO" "vim.lsp.buf.document_symbol" "現在ファイルのシンボル一覧") - # Terminal - (mk "tt" "ToggleTerm direction=float" "ターミナル") + # Glance: preview / peek + (mk "gD" "Glance definitions" "定義をプレビュー") + (mk "gR" "Glance references" "参照をプレビュー") + (mk "gM" "Glance implementations" "実装をプレビュー") + (mk "gY" "Glance type_definitions" "型定義をプレビュー") + (mk "g." "Glance resume" "直前のGlanceを再開") - # Diagnostics list - (mk "xx" "Trouble diagnostics toggle" "エラー一覧") + # Convenience aliases + (mkRaw "rn" "vim.lsp.buf.rename" "シンボル名を一括変換") + (mkRaw "cf" "function() require('conform').format({ timeout_ms = 1000, lsp_format = 'fallback' }) end" "コードをフォーマット") + (mkRaw "ca" "vim.lsp.buf.code_action" "コードアクション") - # Window navigation - (mk "" "h" "左のウィンドウへ") - (mk "" "j" "下のウィンドウへ") - (mk "" "k" "上のウィンドウへ") - (mk "" "l" "右のウィンドウへ") - (mk "" "h" "左のウィンドウへ") - (mk "" "j" "下のウィンドウへ") - (mk "" "k" "上のウィンドウへ") - (mk "" "l" "右のウィンドウへ") + # Diagnostics + (mkRaw "]d" "vim.diagnostic.goto_next" "次の診断へ移動") + (mkRaw "[d" "vim.diagnostic.goto_prev" "前の診断へ移動") + (mkRaw "dl" "vim.diagnostic.open_float" "診断の詳細を表示") - # Buffer Bar - (mk "[b" "BufferPrevious" "前のバッファーに移動") - (mk "]b" "BufferNext" "後のバッファーに移動") - (mk "bc" "BufferClose" "バッファーを削除") + # File tree + (mk "e" "Neotree toggle left" "ファイルツリー") - # Git Conflict - (mk "gco" "GitConflictChooseOurs" "現在のブランチを選択") - (mk "gct" "GitConflictChooseTheirs" "相手のブランチを選択") - (mk "gcb" "GitConflictChooseBoth" "両方を選択") - (mk "gcx" "GitConflictListQf" "コンフリクト一覧") - (mk "]x" "GitConflictNextConflict" "次のコンフリクト") - (mk "[x" "GitConflictPrevConflict" "前のコンフリクト") + # Terminal + (mk "tt" "ToggleTerm direction=float" "ターミナル") - # Git - (mk "gl" "LazyGit" "LazyGitを開く") - (mk "gd" "DiffviewOpen" "差分を開く") - (mk "gH" "DiffviewFileHistory" "リポジトリ履歴") - (mk "gh" "DiffviewFileHistory %" "ファイル履歴") - (mk "gq" "DiffviewClose" "差分を閉じる") + # Trouble + (mk "xx" "Trouble diagnostics toggle" "診断一覧") + (mk "xq" "Trouble qflist toggle" "Quickfix一覧") + (mk "xl" "Trouble loclist toggle" "Location List一覧") + (mk "xs" "Trouble symbols toggle" "シンボル一覧") + (mk "xw" "Trouble lsp toggle" "LSP一覧") - # Markview - (mk "mp" "Markview splitToggle" "Markdownプレビュー") + # Quickfix / Location list navigation + (mk "]q" "cnext" "次のQuickfixへ") + (mk "[q" "cprev" "前のQuickfixへ") + (mk "]l" "lnext" "次のLocation Listへ") + (mk "[l" "lprev" "前のLocation Listへ") - # Zen Mode - (mk "zz" "ZenMode" "Zen Modeを開く/閉じる") + # Window navigation + (mk "" "h" "左のウィンドウへ") + (mk "" "j" "下のウィンドウへ") + (mk "" "k" "上のウィンドウへ") + (mk "" "l" "右のウィンドウへ") + (mk "" "h" "左のウィンドウへ") + (mk "" "j" "下のウィンドウへ") + (mk "" "k" "上のウィンドウへ") + (mk "" "l" "右のウィンドウへ") - # UFO (folding) - (mkRaw "zR" "require('ufo').openAllFolds" "全て展開") - (mkRaw "zM" "require('ufo').closeAllFolds" "全て折りたたむ") + # Alternate file / previous file + (mk "" "" "直前のファイルへ戻る") + (mk "w-" "" "直前のファイルをsplitで開く") - # Dropbar - (mkRaw "dp" "function() require('dropbar.api').pick() end" "dropbarでナビゲート") + # Buffer Bar + (mk "[b" "BufferPrevious" "前のバッファーに移動") + (mk "]b" "BufferNext" "次のバッファーに移動") + (mk "bc" "BufferClose" "バッファーを閉じる") - # Snacks - (mkRaw "sd" "function() Snacks.dim.toggle() end" "Dimモードをトグル") + # Git Conflict + (mk "gco" "GitConflictChooseOurs" "現在のブランチを選択") + (mk "gct" "GitConflictChooseTheirs" "相手のブランチを選択") + (mk "gcb" "GitConflictChooseBoth" "両方を選択") + (mk "gcx" "GitConflictListQf" "コンフリクト一覧") + (mk "]x" "GitConflictNextConflict" "次のコンフリクト") + (mk "[x" "GitConflictPrevConflict" "前のコンフリクト") - # Flash - (mkRaw "s" "function() require('flash').jump() end" "Flashジャンプ") - (mkRaw "S" "function() require('flash').treesitter() end" "Flashツリーシッタ選択") + # Git + (mk "gl" "LazyGit" "LazyGitを開く") + (mk "gd" "DiffviewOpen" "差分を開く") + (mk "gH" "DiffviewFileHistory" "リポジトリ履歴") + (mk "gh" "DiffviewFileHistory %" "現在ファイルの履歴") + (mk "gq" "DiffviewClose" "差分を閉じる") - # Todo Comments - (mk "]t" "TodoNext" "次のTODO") - (mk "[t" "TodoPrev" "前のTODO") - (mkRaw "ft" "function() Snacks.picker.todo_comments() end" "TODO一覧") + # Markview + (mk "mp" "Markview splitToggle" "Markdownプレビュー") - # Spectre - (mkRaw "sr" "function() require('spectre').toggle() end" "検索・置換") + # Zen Mode + (mk "zz" "ZenMode" "Zen Modeを開く/閉じる") - # Snacks Picker - (mkRaw "ff" "function() Snacks.picker.files() end" "ファイルを探す") - (mkRaw "fg" "function() Snacks.picker.grep() end" "文字列を全文検索") - (mkRaw "fb" "function() Snacks.picker.buffers() end" "開いているバッファを探す") - (mkRaw "fh" "function() Snacks.picker.help() end" "ヘルプ項目を探す") - (mkRaw "fk" "function() Snacks.picker.keymaps() end" "キーマップを探す") - (mkRaw "fc" "function() Snacks.picker.commands() end" "コマンドを探す") - ]; + # UFO (folding) + (mkRaw "zR" "require('ufo').openAllFolds" "全て展開") + (mkRaw "zM" "require('ufo').closeAllFolds" "全て折りたたむ") + + # Dropbar + (mkRaw "dp" "function() require('dropbar.api').pick() end" "dropbarでナビゲート") + + # Snacks + (mkRaw "sd" "function() Snacks.dim.toggle() end" "Dimモードをトグル") + + # Flash + (mkRaw "s" "function() require('flash').jump() end" "Flashジャンプ") + (mkRaw "S" "function() require('flash').treesitter() end" "Flashツリーシッタ選択") + + # Todo Comments + (mk "]t" "TodoNext" "次のTODO") + (mk "[t" "TodoPrev" "前のTODO") + (mkRaw "ft" "function() Snacks.picker.todo_comments() end" "TODO一覧") + + # Spectre + (mkRaw "sr" "function() require('spectre').toggle() end" "検索・置換") + + # Snacks Picker: generic + (mkRaw "ff" "function() Snacks.picker.files() end" "ファイルを探す") + (mkRaw "fg" "function() Snacks.picker.grep() end" "文字列を全文検索") + (mkRaw "fb" "function() Snacks.picker.buffers() end" "開いているバッファを探す") + (mkRaw "fh" "function() Snacks.picker.help() end" "ヘルプ項目を探す") + (mkRaw "fk" "function() Snacks.picker.keymaps() end" "キーマップを探す") + (mkRaw "fc" "function() Snacks.picker.commands() end" "コマンドを探す") + + # Snacks Picker: code navigation + (mkRaw "fs" "function() Snacks.picker.lsp_symbols() end" "現在ファイルのシンボルを探す") + (mkRaw "fS" "function() Snacks.picker.lsp_workspace_symbols() end" "ワークスペース全体のシンボルを探す") + (mkRaw "fr" "function() Snacks.picker.registers() end" "レジスタを探す") + (mkRaw "fj" "function() Snacks.picker.jumps() end" "ジャンプ履歴を探す") + (mkRaw "fq" "function() Snacks.picker.qflist() end" "Quickfixを探す") + (mkRaw "fl" "function() Snacks.picker.loclist() end" "Location Listを探す") + ]; + }; } diff --git a/modules/home/nixvim/plugins/editor/snacks.nix b/modules/home/nixvim/plugins/editor/snacks.nix index a218d44..4af9f49 100644 --- a/modules/home/nixvim/plugins/editor/snacks.nix +++ b/modules/home/nixvim/plugins/editor/snacks.nix @@ -1,9 +1,26 @@ -{ pkgs, ... }: { +{pkgs, ...}: { programs.nixvim = { - extraPlugins = [ pkgs.vimPlugins.snacks-nvim ]; + extraPlugins = [pkgs.vimPlugins.snacks-nvim]; + extraConfigLua = '' require("snacks").setup({ - picker = { enabled = true }, + picker = { + enabled = true, + + actions = require("trouble.sources.snacks").actions, + + win = { + input = { + keys = { + [""] = { + "trouble_open", + mode = { "n", "i" }, + }, + }, + }, + }, + }, + notifier = { enabled = true }, words = { enabled = true }, scroll = { enabled = true },