_: let mk = key: action: desc: { mode = "n"; inherit key action; options = { silent = true; inherit desc; }; }; mkRaw = key: raw: desc: { mode = "n"; inherit key; action.__raw = raw; options = { silent = true; inherit desc; }; }; mkExpr = key: raw: desc: { mode = "n"; inherit key; action.__raw = raw; options = { silent = true; expr = true; inherit desc; }; }; mkSmartWindowNav = key: direction: zellijDirection: desc: { mode = "n"; inherit key; action.__raw = '' function() local current_win = vim.api.nvim_get_current_win() vim.cmd.wincmd("${direction}") local at_edge = vim.api.nvim_get_current_win() == current_win local in_zellij = vim.env.ZELLIJ ~= nil local has_zellij_cli = vim.fn.executable("zellij") == 1 if at_edge and in_zellij and has_zellij_cli then vim.system({ "zellij", "action", "move-focus-or-tab", "${zellijDirection}" }) end end ''; options = { silent = true; inherit desc; }; }; in { programs.nixvim = { opts = { # ジャンプ履歴をスタック寄りに扱う jumpoptions = "stack"; # 既に開いているバッファや直前のウィンドウを優先して再利用 switchbuf = "useopen,uselast"; }; keymaps = [ # Search (mk "" "nohlsearch" "検索ハイライトを解除") # 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" "上へ移動(画面行優先)") # 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" "現在ファイルのシンボル一覧") # 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を再開") # 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" "コードアクション") # Diagnostics (mkRaw "]d" "vim.diagnostic.goto_next" "次の診断へ移動") (mkRaw "[d" "vim.diagnostic.goto_prev" "前の診断へ移動") (mkRaw "dl" "vim.diagnostic.open_float" "診断の詳細を表示") # File tree (mk "e" "Neotree toggle left" "ファイルツリー") # Terminal (mk "tt" "ToggleTerm direction=float" "ターミナル") # 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一覧") # Quickfix / Location list navigation (mk "]q" "cnext" "次のQuickfixへ") (mk "[q" "cprev" "前のQuickfixへ") (mk "]l" "lnext" "次のLocation Listへ") (mk "[l" "lprev" "前のLocation Listへ") # Window navigation (mkSmartWindowNav "" "h" "left" "左のウィンドウへ(端ならZellijペイン/タブへ)") (mkSmartWindowNav "" "j" "down" "下のウィンドウへ(端ならZellijペインへ)") (mkSmartWindowNav "" "k" "up" "上のウィンドウへ(端ならZellijペインへ)") (mkSmartWindowNav "" "l" "right" "右のウィンドウへ(端ならZellijペイン/タブへ)") (mkSmartWindowNav "" "h" "left" "左のウィンドウへ(端ならZellijペイン/タブへ)") (mkSmartWindowNav "" "j" "down" "下のウィンドウへ(端ならZellijペインへ)") (mkSmartWindowNav "" "k" "up" "上のウィンドウへ(端ならZellijペインへ)") (mkSmartWindowNav "" "l" "right" "右のウィンドウへ(端ならZellijペイン/タブへ)") # Alternate file / previous file (mk "" "" "直前のファイルへ戻る") (mk "w-" "" "直前のファイルをsplitで開く") # Buffer Bar (mk "[b" "BufferPrevious" "前のバッファーに移動") (mk "]b" "BufferNext" "次のバッファーに移動") (mk "bc" "BufferClose" "バッファーを閉じる") # Git Conflict (mk "gco" "GitConflictChooseOurs" "現在のブランチを選択") (mk "gct" "GitConflictChooseTheirs" "相手のブランチを選択") (mk "gcb" "GitConflictChooseBoth" "両方を選択") (mk "gcx" "GitConflictListQf" "コンフリクト一覧") (mk "]x" "GitConflictNextConflict" "次のコンフリクト") (mk "[x" "GitConflictPrevConflict" "前のコンフリクト") # Git (mk "gl" "LazyGit" "LazyGitを開く") (mk "gd" "DiffviewOpen" "差分を開く") (mk "gH" "DiffviewFileHistory" "リポジトリ履歴") (mk "gh" "DiffviewFileHistory %" "現在ファイルの履歴") (mk "gq" "DiffviewClose" "差分を閉じる") # Markview (mk "mp" "Markview splitToggle" "Markdownプレビュー") # Zen Mode (mk "zz" "ZenMode" "Zen Modeを開く/閉じる") # 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を探す") ]; }; }