nixvim: expand keymaps and snacks picker integration

- Add mkExpr helper and use it for j/k screen-line movement
- Add native LSP keymaps (gd, grr, gri, grt, grn, gra, gO) alongside Glance previews (gD, gR, gM, gY)
- Add Trouble toggles for qflist, loclist, symbols, LSP panes
- Add quickfix/loclist navigation (]q/[q/]l/[l)
- Add alternate file shortcuts (<leader><leader>, <leader>w-)
- Add Snacks picker keymaps for LSP symbols, registers, jumps, qflist, loclist
- Add opts (jumpoptions=stack, switchbuf) to programs.nixvim
- Integrate Trouble into Snacks picker via <C-t> action
- Minor formatting cleanup in snacks.nix

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
This commit is contained in:
2026-03-29 05:02:58 +09:00
co-authored by Claude Sonnet 4.6
parent cb2f1837f3
commit 22dc4b9f74
2 changed files with 156 additions and 92 deletions
+76 -29
View File
@@ -10,44 +10,68 @@
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 = [
programs.nixvim = {
opts = {
# ジャンプ履歴をスタック寄りに扱う
jumpoptions = "stack";
# 既に開いているバッファや直前のウィンドウを優先して再利用
switchbuf = "useopen,uselast";
};
keymaps = [
# Search
(mk "<Esc>" "<cmd>nohlsearch<CR>" "検索ハイライトを解除")
# 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 = "上へ移動(画面行優先)"; };
}
(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
(mkRaw "K" "vim.lsp.buf.hover" "LSPエラーのホバー表示")
(mk "gd" "<cmd>Glance definitions<CR>" "定義へ移動")
(mk "gr" "<cmd>Glance references<CR>" "参照を表示")
# 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" "<cmd>Glance definitions<CR>" "定義をプレビュー")
(mk "gR" "<cmd>Glance references<CR>" "参照をプレビュー")
(mk "gM" "<cmd>Glance implementations<CR>" "実装をプレビュー")
(mk "gY" "<cmd>Glance type_definitions<CR>" "型定義をプレビュー")
(mk "g." "<cmd>Glance resume<CR>" "直前のGlanceを再開")
# Convenience aliases
(mkRaw "<leader>rn" "vim.lsp.buf.rename" "シンボル名を一括変換")
(mkRaw "<leader>cf" "function() require('conform').format({ timeout_ms = 1000, lsp_format = 'fallback' }) end" "コードをフォーマット")
(mkRaw "<leader>ca" "function() vim.lsp.buf.code_action({ context = { diagnostics = vim.diagnostic.get(0, { lnum = vim.fn.line('.') - 1 }) } }) end" "コードアクション")
(mkRaw "<leader>ca" "vim.lsp.buf.code_action" "コードアクション")
# Diagnostics
(mkRaw "]d" "vim.diagnostic.goto_next" "次のエラー")
(mkRaw "[d" "vim.diagnostic.goto_prev" "前のエラー")
(mkRaw "<leader>dl" "vim.diagnostic.open_float" "エラー詳細")
(mkRaw "]d" "vim.diagnostic.goto_next" "次の診断へ移動")
(mkRaw "[d" "vim.diagnostic.goto_prev" "前の診断へ移動")
(mkRaw "<leader>dl" "vim.diagnostic.open_float" "診断の詳細を表示")
# File tree
(mk "<leader>e" "<cmd>Neotree toggle left<CR>" "ファイルツリー")
@@ -55,8 +79,18 @@ in {
# Terminal
(mk "<leader>tt" "<cmd>ToggleTerm direction=float<CR>" "ターミナル")
# Diagnostics list
(mk "<leader>xx" "<cmd>Trouble diagnostics toggle<CR>" "エラー一覧")
# Trouble
(mk "<leader>xx" "<cmd>Trouble diagnostics toggle<CR>" "診断一覧")
(mk "<leader>xq" "<cmd>Trouble qflist toggle<CR>" "Quickfix一覧")
(mk "<leader>xl" "<cmd>Trouble loclist toggle<CR>" "Location List一覧")
(mk "<leader>xs" "<cmd>Trouble symbols toggle<CR>" "シンボル一覧")
(mk "<leader>xw" "<cmd>Trouble lsp toggle<CR>" "LSP一覧")
# Quickfix / Location list navigation
(mk "]q" "<cmd>cnext<CR>" "次のQuickfixへ")
(mk "[q" "<cmd>cprev<CR>" "前のQuickfixへ")
(mk "]l" "<cmd>lnext<CR>" "次のLocation Listへ")
(mk "[l" "<cmd>lprev<CR>" "前のLocation Listへ")
# Window navigation
(mk "<C-h>" "<C-w>h" "左のウィンドウへ")
@@ -68,10 +102,14 @@ in {
(mk "<C-Up>" "<C-w>k" "上のウィンドウへ")
(mk "<C-Right>" "<C-w>l" "右のウィンドウへ")
# Alternate file / previous file
(mk "<leader><leader>" "<C-^>" "直前のファイルへ戻る")
(mk "<leader>w-" "<C-w><C-^>" "直前のファイルをsplitで開く")
# Buffer Bar
(mk "[b" "<Cmd>BufferPrevious<CR>" "前のバッファーに移動")
(mk "]b" "<Cmd>BufferNext<CR>" "後のバッファーに移動")
(mk "<leader>bc" "<Cmd>BufferClose<CR>" "バッファーを削除")
(mk "]b" "<Cmd>BufferNext<CR>" "次のバッファーに移動")
(mk "<leader>bc" "<Cmd>BufferClose<CR>" "バッファーを閉じる")
# Git Conflict
(mk "<leader>gco" "<cmd>GitConflictChooseOurs<CR>" "現在のブランチを選択")
@@ -85,7 +123,7 @@ in {
(mk "<leader>gl" "<cmd>LazyGit<CR>" "LazyGitを開く")
(mk "<leader>gd" "<cmd>DiffviewOpen<CR>" "差分を開く")
(mk "<leader>gH" "<cmd>DiffviewFileHistory<CR>" "リポジトリ履歴")
(mk "<leader>gh" "<cmd>DiffviewFileHistory %<CR>" "ファイル履歴")
(mk "<leader>gh" "<cmd>DiffviewFileHistory %<CR>" "現在ファイルの履歴")
(mk "<leader>gq" "<cmd>DiffviewClose<CR>" "差分を閉じる")
# Markview
@@ -116,12 +154,21 @@ in {
# Spectre
(mkRaw "<leader>sr" "function() require('spectre').toggle() end" "検索・置換")
# Snacks Picker
# Snacks Picker: generic
(mkRaw "<leader>ff" "function() Snacks.picker.files() end" "ファイルを探す")
(mkRaw "<leader>fg" "function() Snacks.picker.grep() end" "文字列を全文検索")
(mkRaw "<leader>fb" "function() Snacks.picker.buffers() end" "開いているバッファを探す")
(mkRaw "<leader>fh" "function() Snacks.picker.help() end" "ヘルプ項目を探す")
(mkRaw "<leader>fk" "function() Snacks.picker.keymaps() end" "キーマップを探す")
(mkRaw "<leader>fc" "function() Snacks.picker.commands() end" "コマンドを探す")
# Snacks Picker: code navigation
(mkRaw "<leader>fs" "function() Snacks.picker.lsp_symbols() end" "現在ファイルのシンボルを探す")
(mkRaw "<leader>fS" "function() Snacks.picker.lsp_workspace_symbols() end" "ワークスペース全体のシンボルを探す")
(mkRaw "<leader>fr" "function() Snacks.picker.registers() end" "レジスタを探す")
(mkRaw "<leader>fj" "function() Snacks.picker.jumps() end" "ジャンプ履歴を探す")
(mkRaw "<leader>fq" "function() Snacks.picker.qflist() end" "Quickfixを探す")
(mkRaw "<leader>fl" "function() Snacks.picker.loclist() end" "Location Listを探す")
];
};
}
+20 -3
View File
@@ -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 = {
["<C-t>"] = {
"trouble_open",
mode = { "n", "i" },
},
},
},
},
},
notifier = { enabled = true },
words = { enabled = true },
scroll = { enabled = true },