diff --git a/.sops.yaml b/.sops.yaml new file mode 100644 index 0000000..0aefbf7 --- /dev/null +++ b/.sops.yaml @@ -0,0 +1,18 @@ +keys: + - &admin_yubikey1 age1yubikey1qvy5y8kxqc63y7fk0tfv43u499a8z8q332ff087lythry9cc6hdxxkznc6t + - &host_x1g13 age12g85cuvg4kjfr79lqf5fx2k0d82tchrgv88xgkt7ukk2cfcsw98s2rjyat + - &host_ops age18rtm2dq2r62zvnhwdq0gkm24hu85r7zyleyk3jqv22zpdtw064eq7ay7dl + - &host_internal-app-01 age1mcp5gma7y0k59equhzqfsnn0ed335ljjtn0k08ua77htlxf0x54qsravch +creation_rules: + - path_regex: ^secrets/common/[^/]+\.ya?ml$ + key_groups: + - age: + - *admin_yubikey1 + - *host_x1g13 + - *host_ops + - *host_internal-app-01 + - path_regex: ^secrets/hosts/x1g13/[^/]+\.ya?ml$ + key_groups: + - age: + - *admin_yubikey1 + - *host_x1g13 diff --git a/flake/registry.nix b/flake/registry.nix index 064836a..bf73d9c 100644 --- a/flake/registry.nix +++ b/flake/registry.nix @@ -33,10 +33,22 @@ in }; perSystem = - { pkgs, ... }: + { pkgs, system, ... }: + let + nixosChecks = + lib.mapAttrs' (name: nixos: lib.nameValuePair "nixos-${name}" nixos.config.system.build.toplevel) + ( + lib.filterAttrs ( + _: nixos: nixos.pkgs.stdenv.hostPlatform.system == system + ) configurations.nixosConfigurations + ); + in { - checks.registry = import ../tests/registry.nix { - inherit inputs lib pkgs; - }; + checks = { + registry = import ../tests/registry.nix { + inherit inputs lib pkgs; + }; + } + // nixosChecks; }; } diff --git a/modules/applications/niri/home.nix b/modules/applications/niri/home.nix index c2b145e..5d81b40 100644 --- a/modules/applications/niri/home.nix +++ b/modules/applications/niri/home.nix @@ -31,6 +31,15 @@ in }; }; + spawn-at-startup = [ + { command = [ "noctalia" ]; } + { + command = [ + "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1" + ]; + } + ]; + cursor.size = 16; layout = { diff --git a/modules/applications/vim/home.nix b/modules/applications/vim/home.nix index 50f9c0b..71b528f 100644 --- a/modules/applications/vim/home.nix +++ b/modules/applications/vim/home.nix @@ -1,4 +1,7 @@ { pkgs, ... }: +let + keymaps = import ./keymaps.nix { }; +in { home.sessionVariables = { EDITOR = "nvim"; @@ -418,261 +421,6 @@ }) ''; - keymaps = [ - { - mode = "n"; - key = ""; - action = "nohlsearch"; - options = { - silent = true; - desc = "検索ハイライトを解除"; - }; - } - { - 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 = "上へ移動"; - }; - } - { - mode = "n"; - key = "K"; - action.__raw = "vim.lsp.buf.hover"; - options = { - silent = true; - desc = "シンボル情報"; - }; - } - { - mode = "n"; - key = "gd"; - action.__raw = "vim.lsp.buf.definition"; - options = { - silent = true; - desc = "定義へジャンプ"; - }; - } - { - mode = "n"; - key = "grr"; - action.__raw = "vim.lsp.buf.references"; - options = { - silent = true; - desc = "参照一覧"; - }; - } - { - mode = "n"; - key = "gri"; - action.__raw = "vim.lsp.buf.implementation"; - options = { - silent = true; - desc = "実装一覧"; - }; - } - { - mode = "n"; - key = "grt"; - action.__raw = "vim.lsp.buf.type_definition"; - options = { - silent = true; - desc = "型定義"; - }; - } - { - mode = "n"; - key = "grn"; - action.__raw = "vim.lsp.buf.rename"; - options = { - silent = true; - desc = "名前変更"; - }; - } - { - mode = "n"; - key = "gra"; - action.__raw = "vim.lsp.buf.code_action"; - options = { - silent = true; - desc = "コードアクション"; - }; - } - { - mode = "n"; - key = "cf"; - action.__raw = "function() require('conform').format({ timeout_ms = 1000, lsp_format = 'fallback' }) end"; - options = { - silent = true; - desc = "フォーマット"; - }; - } - { - mode = "n"; - key = "e"; - action = "Neotree toggle left"; - options = { - silent = true; - desc = "ファイルツリー"; - }; - } - { - mode = "n"; - key = "tt"; - action = "ToggleTerm direction=float"; - options = { - silent = true; - desc = "ターミナル"; - }; - } - { - mode = "n"; - key = "xx"; - action = "Trouble diagnostics toggle"; - options = { - silent = true; - desc = "診断一覧"; - }; - } - { - mode = "n"; - key = "gl"; - action = "LazyGit"; - options = { - silent = true; - desc = "LazyGit"; - }; - } - { - mode = "n"; - key = "gd"; - action = "DiffviewOpen"; - options = { - silent = true; - desc = "差分"; - }; - } - { - mode = "n"; - key = "mp"; - action = "Markview splitToggle"; - options = { - silent = true; - desc = "Markdown プレビュー"; - }; - } - { - mode = "n"; - key = "zz"; - action = "ZenMode"; - options = { - silent = true; - desc = "Zen Mode"; - }; - } - { - mode = "n"; - key = "zR"; - action.__raw = "require('ufo').openAllFolds"; - options = { - silent = true; - desc = "全て展開"; - }; - } - { - mode = "n"; - key = "zM"; - action.__raw = "require('ufo').closeAllFolds"; - options = { - silent = true; - desc = "全て折りたたむ"; - }; - } - { - mode = "n"; - key = "s"; - action.__raw = "function() require('flash').jump() end"; - options = { - silent = true; - desc = "Flash ジャンプ"; - }; - } - { - mode = "n"; - key = "S"; - action.__raw = "function() require('flash').treesitter() end"; - options = { - silent = true; - desc = "Flash 選択"; - }; - } - { - mode = "n"; - key = "sr"; - action.__raw = "function() require('spectre').toggle() end"; - options = { - silent = true; - desc = "検索・置換"; - }; - } - { - mode = "n"; - key = "ff"; - action.__raw = "function() Snacks.picker.files() end"; - options = { - silent = true; - desc = "ファイルを探す"; - }; - } - { - mode = "n"; - key = "fg"; - action.__raw = "function() Snacks.picker.grep() end"; - options = { - silent = true; - desc = "全文検索"; - }; - } - { - mode = "n"; - key = "fb"; - action.__raw = "function() Snacks.picker.buffers() end"; - options = { - silent = true; - desc = "バッファを探す"; - }; - } - { - mode = "n"; - key = "fh"; - action.__raw = "function() Snacks.picker.help() end"; - options = { - silent = true; - desc = "ヘルプを探す"; - }; - } - { - mode = "n"; - key = "fs"; - action.__raw = "function() Snacks.picker.lsp_symbols() end"; - options = { - silent = true; - desc = "シンボルを探す"; - }; - } - ]; + inherit keymaps; }; } diff --git a/modules/applications/vim/keymaps.nix b/modules/applications/vim/keymaps.nix new file mode 100644 index 0000000..83faccc --- /dev/null +++ b/modules/applications/vim/keymaps.nix @@ -0,0 +1,190 @@ +_: +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 +[ + # 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を探す") +] diff --git a/modules/applications/vim/nixos.nix b/modules/applications/vim/nixos.nix new file mode 100644 index 0000000..bc0e9c5 --- /dev/null +++ b/modules/applications/vim/nixos.nix @@ -0,0 +1,5 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ pkgs.vim ]; + environment.variables.EDITOR = "nvim"; +} diff --git a/modules/applications/vscode/nixos.nix b/modules/applications/vscode/nixos.nix new file mode 100644 index 0000000..688c7a1 --- /dev/null +++ b/modules/applications/vscode/nixos.nix @@ -0,0 +1,4 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ pkgs.sqlite ]; +} diff --git a/modules/profiles/interface/gui/nixos.nix b/modules/profiles/interface/gui/nixos.nix index 8e91684..7b02952 100644 --- a/modules/profiles/interface/gui/nixos.nix +++ b/modules/profiles/interface/gui/nixos.nix @@ -1,6 +1,7 @@ { pkgs, ... }: { environment.systemPackages = with pkgs; [ + alacritty grim slurp wf-recorder diff --git a/modules/users/moons/nixos.nix b/modules/users/moons/nixos.nix index 8299ffc..d758df6 100644 --- a/modules/users/moons/nixos.nix +++ b/modules/users/moons/nixos.nix @@ -4,7 +4,7 @@ users.users.${primaryUser} = { isNormalUser = true; - description = "moons"; + description = "moons-14"; extraGroups = [ "adbusers" "docker"