From 2e6d0a5c401af96d3373b7e3bdfceb94a5776032 Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Wed, 15 Jul 2026 21:50:03 +0900 Subject: [PATCH 01/35] =?UTF-8?q?=E2=9C=A8=20nixvim:=20Neovim=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=82=92Nixvim=E3=81=B8=E7=A7=BB=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flake.lock | 78 +++++- flake.nix | 4 + nix-configs/home.nix | 1 + nix-configs/home/nixvim/autocmds.nix | 54 ++++ nix-configs/home/nixvim/default.nix | 33 +++ nix-configs/home/nixvim/keymaps.nix | 102 +++++++ nix-configs/home/nixvim/lsp.nix | 70 +++++ nix-configs/home/nixvim/options.nix | 77 ++++++ nix-configs/home/nixvim/plugins.nix | 393 +++++++++++++++++++++++++++ nix-configs/home/programs.nix | 7 - nix-configs/home/xdg.nix | 3 +- 11 files changed, 811 insertions(+), 11 deletions(-) create mode 100644 nix-configs/home/nixvim/autocmds.nix create mode 100644 nix-configs/home/nixvim/default.nix create mode 100644 nix-configs/home/nixvim/keymaps.nix create mode 100644 nix-configs/home/nixvim/lsp.nix create mode 100644 nix-configs/home/nixvim/options.nix create mode 100644 nix-configs/home/nixvim/plugins.nix diff --git a/flake.lock b/flake.lock index 11fa3d7..9bdada9 100644 --- a/flake.lock +++ b/flake.lock @@ -130,6 +130,27 @@ "type": "github" } }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1778716662, + "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, "flake-utils": { "inputs": { "systems": "systems" @@ -307,6 +328,22 @@ } }, "nixpkgs_4": { + "locked": { + "lastModified": 1781216227, + "narHash": "sha256-9mUW6gNwoN2SWc/l0fW4svPNOulXLl8ijqKyeSOGgJE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a0374025a863d007d98e3297f6aa46cc3141c2f0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-26.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { "locked": { "lastModified": 1772542754, "narHash": "sha256-WGV2hy+VIeQsYXpsLjdr4GvHv5eECMISX1zKLTedhdg=", @@ -322,6 +359,27 @@ "type": "github" } }, + "nixvim": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_4", + "systems": "systems_3" + }, + "locked": { + "lastModified": 1782919967, + "narHash": "sha256-pRwjfB5HQJ3m8J8bOR43pPHtHI7VUJSqwLA3P06cOY0=", + "owner": "nix-community", + "repo": "nixvim", + "rev": "667c8471f4a0fb24d702d1a61af8609f1a5f1ba6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "nixos-26.05", + "repo": "nixvim", + "type": "github" + } + }, "pre-commit": { "inputs": { "flake-compat": "flake-compat", @@ -353,6 +411,7 @@ "llm-agents": "llm-agents", "nixos-loading-plymouth": "nixos-loading-plymouth", "nixpkgs": "nixpkgs_3", + "nixvim": "nixvim", "spotify-cli": "spotify-cli", "vial-qmk": "vial-qmk", "vicinae": "vicinae" @@ -444,6 +503,21 @@ "type": "github" } }, + "systems_4": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, "treefmt-nix": { "inputs": { "nixpkgs": [ @@ -485,8 +559,8 @@ }, "vicinae": { "inputs": { - "nixpkgs": "nixpkgs_4", - "systems": "systems_3" + "nixpkgs": "nixpkgs_5", + "systems": "systems_4" }, "locked": { "lastModified": 1783639275, diff --git a/flake.nix b/flake.nix index 7d121d3..c58c003 100644 --- a/flake.nix +++ b/flake.nix @@ -14,6 +14,8 @@ inputs.nixpkgs.follows = "nixpkgs"; }; + nixvim.url = "github:nix-community/nixvim/nixos-26.05"; + vial-qmk = { url = "git+https://github.com/vial-kb/vial-qmk?submodules=1"; flake = false; @@ -47,6 +49,7 @@ self, nixpkgs, home-manager, + nixvim, vial-qmk, vicinae, lanzaboote, @@ -115,6 +118,7 @@ inherit dotfilesDir keyboardLayout; }; sharedModules = [ + nixvim.homeModules.nixvim vicinae.homeManagerModules.default codex-desktop-linux.homeManagerModules.default ]; diff --git a/nix-configs/home.nix b/nix-configs/home.nix index 982e2a4..1529e09 100644 --- a/nix-configs/home.nix +++ b/nix-configs/home.nix @@ -14,6 +14,7 @@ ./home/vr.nix ./home/zsh.nix ./home/programs.nix + ./home/nixvim ./home/firefox.nix ./home/vicinae.nix ./home/spotify.nix diff --git a/nix-configs/home/nixvim/autocmds.nix b/nix-configs/home/nixvim/autocmds.nix new file mode 100644 index 0000000..9c8c14b --- /dev/null +++ b/nix-configs/home/nixvim/autocmds.nix @@ -0,0 +1,54 @@ +{ + extraConfigLuaPost = '' + vim.api.nvim_create_autocmd("TextYankPost", { + group = vim.api.nvim_create_augroup("yank_to_clipboard", { clear = true }), + callback = function() + if vim.v.event.operator == "y" then vim.fn.setreg("+", vim.fn.getreg('"')) end + end, + }) + + vim.api.nvim_create_autocmd("QuitPre", { + callback = function() + local current = vim.api.nvim_get_current_win() + for _, window in ipairs(vim.api.nvim_list_wins()) do + if window ~= current and vim.bo[vim.api.nvim_win_get_buf(window)].buftype == "" then return end + end + vim.cmd.only({ bang = true }) + end, + }) + + vim.api.nvim_create_user_command("InsertDatetime", function() + local row, column = unpack(vim.api.nvim_win_get_cursor(0)) + vim.api.nvim_buf_set_text(0, row - 1, column, row - 1, column, { vim.fn.strftime("%Y-%m-%d %H:%M:%S") }) + end, {}) + + vim.api.nvim_create_user_command("CountCleanTextLength", function() + local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false) + local text = table.concat(lines, "\n") + text = text:gsub("```.-```", ""):gsub("`.-`", ""):gsub("%[%^%d+%]", "") + text = text:gsub("\n%[%^%d+%]:[^\n]*", ""):gsub("]+>", "") + text = text:gsub("%[([^%]]-)%]%([^%)]+%)", "%1") + text = text:gsub("#+", ""):gsub("%*%*", ""):gsub("%*", ""):gsub("_", ""):gsub("[%[%]%(%)]", ""):gsub("-", "") + print("ファイル全体の文字数(記法除去後): " .. #text:gsub("%s+", "")) + end, {}) + + vim.api.nvim_create_user_command("CoAuthoredBy", function(command) + if command.args == "" then + vim.notify("Usage: :CoAuthoredBy ", vim.log.levels.ERROR) + return + end + vim.system({ + "gh", "api", "/users/" .. command.args, "-q", + "\"Co-Authored-By: \\(.name) <\\(.id)+\\(.login)@users.noreply.github.com>\"", + }, { text = true, timeout = 10000 }, function(result) + vim.schedule(function() + if result.code ~= 0 then + vim.notify("Failed to get GitHub user: " .. (result.stderr or ""), vim.log.levels.ERROR) + return + end + vim.api.nvim_put({ result.stdout:gsub("\n$", "") }, "l", true, true) + end) + end) + end, { nargs = 1, desc = "Insert a Co-Authored-By trailer" }) + ''; +} diff --git a/nix-configs/home/nixvim/default.nix b/nix-configs/home/nixvim/default.nix new file mode 100644 index 0000000..ac7f5a8 --- /dev/null +++ b/nix-configs/home/nixvim/default.nix @@ -0,0 +1,33 @@ +{pkgs, ...}: { + programs.nixvim = { + enable = true; + defaultEditor = true; + viAlias = true; + vimAlias = true; + withPython3 = true; + extraPython3Packages = ps: [ps.pynvim]; + + # Nixvim は独自の nixpkgs を評価するため、既存の NixOS 許可を明示的に継承する。 + nixpkgs.config.allowUnfree = true; + + # Nixvim に閉じた外部依存。Home Manager の PATH に依存しない。 + extraPackages = with pkgs; [ + fd + fzf + gh + git + lazygit + nodejs + ripgrep + yazi + ]; + + imports = [ + ./options.nix + ./keymaps.nix + ./autocmds.nix + ./lsp.nix + ./plugins.nix + ]; + }; +} diff --git a/nix-configs/home/nixvim/keymaps.nix b/nix-configs/home/nixvim/keymaps.nix new file mode 100644 index 0000000..f249768 --- /dev/null +++ b/nix-configs/home/nixvim/keymaps.nix @@ -0,0 +1,102 @@ +{ + extraConfigLuaPost = '' + local map = vim.keymap.set + local silent = { noremap = true, silent = true } + + map({ "n", "x", "o" }, ";,", ",", { desc = "Repeat f/F/t/T in reverse" }) + map({ "n", "v" }, "p", '"+p', silent) + map({ "n", "v" }, "P", '"+P', silent) + map("i", "", "", silent) + map("i", "", "", silent) + map("n", "", "", silent) + map("i", "", "", silent) + + map("n", "+", "", silent) + map("n", "-", "", silent) + map("n", "", ":tabnext", silent) + map("n", "", ":tabprevious", silent) + map("n", "ss", ":split", silent) + map("n", "sv", ":vsplit", silent) + map("n", "sh", "h", silent) + map("n", "sk", "k", silent) + map("n", "sj", "j", silent) + map("n", "sl", "l", silent) + map("n", "", "<", silent) + map("n", "", ">", silent) + map("n", "", "+", silent) + map("n", "", "-", silent) + map("n", "", vim.diagnostic.goto_next, { noremap = true, silent = true, desc = "Next diagnostic" }) + + map({ "n", "x" }, "", "10h", { desc = "Move 10 chars left" }) + map({ "n", "x" }, "", "10j", { desc = "Move 10 lines down" }) + map({ "n", "x" }, "", "10k", { desc = "Move 10 lines up" }) + map({ "n", "x" }, "", "10l", { desc = "Move 10 chars right" }) + + local function git_root() + local buffer_name = vim.api.nvim_buf_get_name(0) + local buffer_dir = buffer_name == "" and vim.fn.getcwd() or vim.fn.fnamemodify(buffer_name, ":h") + local result = vim.system({ "git", "-C", buffer_dir, "rev-parse", "--show-toplevel" }, { text = true, timeout = 3000 }):wait() + return result.code == 0 and vim.trim(result.stdout) or vim.fn.getcwd() + end + + map("n", "", function() Snacks.terminal() end, { desc = "Terminal" }) + map("n", "", function() Snacks.terminal(nil, { cwd = git_root() }) end, { desc = "Terminal (project root)" }) + map("n", "nn", function() Snacks.notifier.show_history() end, { desc = "Notification history" }) + map("n", "gg", function() Snacks.lazygit({ cwd = vim.fn.getcwd() }) end, { desc = "LazyGit (cwd)" }) + map("n", "gG", function() Snacks.lazygit({ cwd = git_root() }) end, { desc = "LazyGit (project root)" }) + map("n", "", function() Snacks.picker.files({ cwd = git_root(), hidden = git_root():match("dotfiles$") ~= nil }) end, { desc = "Find files" }) + map("n", "/", function() Snacks.picker.grep({ cwd = git_root(), hidden = git_root():match("dotfiles$") ~= nil }) end, { desc = "Grep" }) + map("n", "p", function() Snacks.picker.pickers() end, { desc = "Pickers" }) + map("n", "y", "Yazi", { desc = "Open Yazi" }) + map("n", "P", "PasteImage", { desc = "Paste image" }) + map({ "n", "i" }, "", "MarkdownPreviewToggle", { desc = "Markdown preview" }) + map("n", "gd", "DiffviewOpen", { desc = "Open diff view" }) + map("n", "gD", "DiffviewClose", { desc = "Close diff view" }) + map("n", "gl", "DiffviewFileHistory", { desc = "Git history" }) + map("n", "gL", "DiffviewFileHistory %", { desc = "File history" }) + map("n", "uC", function() require("treesitter-context").toggle() end, { desc = "Toggle Treesitter context" }) + map("n", "[c", function() require("treesitter-context").go_to_context(vim.v.count1) end, { desc = "Jump to upper context" }) + map("n", "zR", function() require("ufo").openAllFolds() end, { desc = "Open all folds" }) + map("n", "zM", function() require("ufo").closeAllFolds() end, { desc = "Close all folds" }) + map("n", "K", function() + if not require("ufo").peekFoldedLinesUnderCursor() then vim.lsp.buf.hover() end + end, { desc = "Peek fold or hover" }) + map({ "n", "v" }, "wr", "WinResizerStartResize", { desc = "Resize window" }) + map({ "n", "v" }, "r", "WinResizerStartResize", { desc = "Resize window" }) + + map("n", "gh", function() + local target = vim.fn.expand("") + if target:match("^https?://") then vim.ui.open(target) else vim.cmd("normal! gF!") end + end, { desc = "Open link or file" }) + map("n", "gx", function() + local word = vim.fn.expand("") + local arn = word:match("[\"`']?(arn:aws[a-z%-]*:[^\"`'%s]+)[\"`']?") + vim.ui.open(arn and "https://console.aws.amazon.com/go/view?arn=" .. arn or vim.fn.expand("")) + end, { desc = "Open URL or AWS ARN" }) + map("n", "gR", function() + local repository = vim.fn.expand("") + if repository:match(".+/[^/]+") then vim.ui.open("https://github.com/" .. repository) else vim.cmd("normal! gF!") end + end, { desc = "Open GitHub repository" }) + map("n", "#", function() + vim.api.nvim_feedkeys(":%s/" .. vim.fn.expand("") .. "//g", "n", false) + vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("", true, true, true), "n", false) + vim.opt.hlsearch = true + end, { desc = "Substitute word under cursor" }) + + local scroll_cycle = { position = 0, at = 0 } + map("n", "zz", function() + scroll_cycle.position, scroll_cycle.at = 1, vim.uv.now() + vim.cmd("normal! zz") + end, { desc = "Scroll center" }) + map("n", "z", function() + if scroll_cycle.position > 0 and vim.uv.now() - scroll_cycle.at < 1000 then + scroll_cycle.at = vim.uv.now() + scroll_cycle.position = scroll_cycle.position % 3 + 1 + vim.cmd("normal! " .. ({ "zz", "zt", "zb" })[scroll_cycle.position]) + else + scroll_cycle.position = 0 + vim.cmd("normal! z" .. vim.fn.getcharstr()) + end + end, { desc = "Cycle scroll position" }) + ''; +} diff --git a/nix-configs/home/nixvim/lsp.nix b/nix-configs/home/nixvim/lsp.nix new file mode 100644 index 0000000..cf00b73 --- /dev/null +++ b/nix-configs/home/nixvim/lsp.nix @@ -0,0 +1,70 @@ +{ + lsp = { + inlayHints.enable = true; + servers = { + biome.enable = true; + cssls.enable = true; + docker_compose_language_service.enable = true; + dockerls.enable = true; + eslint.enable = true; + gopls.enable = true; + jsonls.enable = true; + marksman.enable = true; + nil_ls.enable = true; + pyright.enable = true; + ruff.enable = true; + tailwindcss.enable = true; + taplo.enable = true; + vtsls.enable = true; + }; + }; + + plugins = { + blink-cmp = { + enable = true; + setupLspCapabilities = true; + settings = { + completion = { + documentation.window.border = "rounded"; + menu.border = "rounded"; + }; + keymap.preset = "default"; + sources = { + cmdline = []; + providers.lazydev = { + module = "lazydev.integrations.blink"; + name = "LazyDev"; + score_offset = 100; + }; + per_filetype.lua = ["lsp" "path" "snippets" "buffer" "lazydev"]; + }; + }; + }; + + lazydev = { + enable = true; + settings.library = [ + { + path = "\${3rd}/luv/library"; + words = ["vim%.uv"]; + } + { + path = "snacks.nvim"; + words = ["Snacks"]; + } + ]; + }; + + lsp.enable = true; + }; + + extraConfigLuaPost = '' + vim.diagnostic.config({ + virtual_text = { + format = function(diagnostic) + return string.format("%s (%s)", diagnostic.message, diagnostic.source or "Unknown") + end, + }, + }) + ''; +} diff --git a/nix-configs/home/nixvim/options.nix b/nix-configs/home/nixvim/options.nix new file mode 100644 index 0000000..1c551d8 --- /dev/null +++ b/nix-configs/home/nixvim/options.nix @@ -0,0 +1,77 @@ +{ + globals = { + mapleader = ","; + maplocalleader = "\\"; + ai_cmp = false; + loaded_ruby_provider = 0; + loaded_perl_provider = 0; + loaded_node_provider = 0; + + terminal_color_0 = "#45475a"; + terminal_color_1 = "#f38ba8"; + terminal_color_2 = "#a6e3a1"; + terminal_color_3 = "#f9e2af"; + terminal_color_4 = "#89b4fa"; + terminal_color_5 = "#f5c2e7"; + terminal_color_6 = "#94e2d5"; + terminal_color_7 = "#bac2de"; + terminal_color_8 = "#585b70"; + terminal_color_9 = "#f38ba8"; + terminal_color_10 = "#a6e3a1"; + terminal_color_11 = "#f9e2af"; + terminal_color_12 = "#89b4fa"; + terminal_color_13 = "#f5c2e7"; + terminal_color_14 = "#94e2d5"; + terminal_color_15 = "#a6adc8"; + }; + + opts = { + clipboard = ""; + helplang = ["ja"]; + pumblend = 10; + spelllang = ["en" "cjk"]; + splitbelow = true; + splitright = true; + termguicolors = true; + whichwrap = "b,s,h,l,<,>,[,],~"; + winblend = 20; + }; + + extraConfigLuaPost = '' + vim.api.nvim_set_hl(0, "ActiveWindowSeparator", { fg = "#69F5CD" }) + vim.api.nvim_set_hl(0, "InactiveWindowSeparator", { fg = "#555555" }) + vim.api.nvim_set_hl(0, "SpellCap", {}) + + vim.api.nvim_create_autocmd("ColorScheme", { + callback = function() + vim.api.nvim_set_hl(0, "SpellCap", {}) + end, + }) + + vim.api.nvim_create_autocmd("CmdlineEnter", { + callback = function() + vim.opt.winblend = 0 + end, + }) + + vim.api.nvim_create_autocmd("CmdlineLeave", { + callback = function() + vim.opt.winblend = 20 + end, + }) + + vim.api.nvim_create_autocmd({ "WinEnter", "BufWinEnter" }, { + callback = function() + vim.wo.winhighlight = "WinSeparator:ActiveWindowSeparator" + end, + }) + + vim.api.nvim_create_autocmd("WinLeave", { + callback = function() + vim.wo.winhighlight = "" + end, + }) + + vim.cmd("cabbrev H belowright vertical help") + ''; +} diff --git a/nix-configs/home/nixvim/plugins.nix b/nix-configs/home/nixvim/plugins.nix new file mode 100644 index 0000000..76aad35 --- /dev/null +++ b/nix-configs/home/nixvim/plugins.nix @@ -0,0 +1,393 @@ +{ + config, + pkgs, + ... +}: let + vimdocJa = pkgs.vimUtils.buildVimPlugin { + pname = "vimdoc-ja"; + version = "2026-07-15"; + src = pkgs.fetchFromGitHub { + owner = "vim-jp"; + repo = "vimdoc-ja"; + rev = "c8c3b339302b4e88be2859b3ba99a4f0a3a2f8bd"; + hash = "sha256-362QsKxCbqXrOru3p+ReoqtfwTLSSblNGzzxTE2DWoI="; + }; + }; + + winresizer = pkgs.vimUtils.buildVimPlugin { + pname = "winresizer"; + version = "2026-07-15"; + src = pkgs.fetchFromGitHub { + owner = "simeji"; + repo = "winresizer"; + rev = "299076f7f79e2e2f7706b2dfacbb3c074ce53257"; + hash = "sha256-rTTe6hFgEz9CFPJFDUjoD3SQr97V5E5Lg6J4c8mU+6s="; + }; + }; +in { + extraPackages = with pkgs; [ + gofumpt + gotools + markdownlint-cli2 + nixfmt + prettier + statix + stylua + ]; + + extraPlugins = with pkgs.vimPlugins; [ + bracey-vim + dracula-nvim + incline-nvim + nvim-ufo + promise-async + vimdocJa + winresizer + ]; + + extraFiles = { + "ftdetect/mdc.lua".source = ../../../.config/shared/nvim/ftdetect/mdc.lua; + "ftdetect/zsh.lua".source = ../../../.config/shared/nvim/ftdetect/zsh.lua; + "spell/tech.utf-8.add".source = ../../../.config/shared/nvim/spell/tech.utf-8.add; + }; + + plugins = { + bufferline.enable = true; + claudecode = { + enable = true; + settings = { + diff_opts = { + layout = "vertical"; + open_in_new_tab = true; + }; + terminal.provider = "snacks"; + }; + }; + compiler.enable = true; + diffview.enable = true; + emmet.enable = true; + flash.enable = true; + gitsigns.enable = true; + grug-far.enable = true; + hlchunk = { + enable = true; + settings.chunk = { + chars = { + horizontal_line = "─"; + left_bottom = "╰"; + left_top = "╭"; + right_arrow = ">"; + vertical_line = "│"; + }; + enable = true; + style = "#806d9c"; + }; + }; + img-clip = { + enable = true; + settings.default = { + dir_path = "assets"; + extension = "png"; + prompt_for_file_name = true; + relative_to_current_file = true; + show_dir_path_in_prompt = false; + use_absolute_path = false; + }; + }; + inc-rename.enable = true; + lualine = { + enable = true; + settings.options.theme = "dracula-nvim"; + }; + markdown-preview = { + enable = true; + settings = { + auto_close = 0; + browser = ""; + combine_preview = 0; + combine_preview_auto_refresh = 1; + filetypes = ["markdown"]; + open_to_the_world = 0; + theme = "dark"; + }; + }; + mini = { + enable = true; + modules = { + ai = {}; + hipatterns = {}; + pairs = {}; + surround = { + mappings = { + add = "gsa"; + delete = "gsd"; + find = "gsf"; + find_left = "gsF"; + highlight = "gsh"; + replace = "gsr"; + update_n_lines = "gsn"; + }; + }; + }; + }; + modicator = { + enable = true; + settings = { + highlights.defaults.bold = true; + integration.lualine.enabled = false; + show_warnings = false; + }; + }; + noice = { + enable = true; + settings = { + lsp = { + hover = { + enabled = true; + silent = true; + }; + signature.enabled = true; + }; + presets = { + bottom_search = true; + command_palette = true; + inc_rename = true; + long_message_to_split = true; + lsp_doc_border = true; + }; + routes = [ + { + filter = { + event = "msg_show"; + find = "written"; + kind = ""; + }; + opts.skip = true; + } + { + filter = { + event = "msg_show"; + kind = "search_count"; + }; + opts.skip = true; + } + ]; + }; + }; + notify = { + enable = true; + settings = { + background_colour = "#1e1e2e"; + render = "compact"; + stages = "fade"; + timeout = 3000; + }; + }; + persistence.enable = true; + rainbow-delimiters.enable = true; + render-markdown.enable = true; + rustaceanvim.enable = true; + smear-cursor = { + enable = true; + settings = { + distance_stop_animating = 0.5; + hide_target_hack = false; + stiffness = 0.8; + trailing_exponent = 2; + trailing_stiffness = 0.5; + }; + }; + snacks = { + enable = true; + settings = { + image = { + doc = { + enabled = true; + inline = true; + max_height = 40; + max_width = 80; + }; + enabled = true; + }; + scroll.enabled = false; + }; + }; + todo-comments.enable = true; + treesitter = { + enable = true; + grammarPackages = with config.plugins.treesitter.package.builtGrammars; [ + bash + c + css + dockerfile + go + html + javascript + json + lua + markdown + markdown_inline + nix + python + rust + scss + toml + tsx + typescript + vim + vimdoc + yaml + zsh + ]; + highlight.enable = true; + indent.enable = true; + }; + treesitter-context = { + enable = true; + settings = { + max_lines = 3; + min_window_height = 20; + mode = "cursor"; + multiline_threshold = 1; + trim_scope = "outer"; + }; + }; + trouble.enable = true; + ts-autotag.enable = true; + ts-comments.enable = true; + venv-selector.enable = true; + web-devicons.enable = true; + which-key.enable = true; + yazi = { + enable = true; + settings = { + keymaps.show_help = ""; + open_for_directories = false; + }; + }; + }; + + extraConfigLuaPost = '' + local function markdown_fold_provider(buffer) + local lines, folds, blocks, headings = vim.api.nvim_buf_get_lines(buffer, 0, -1, false), {}, {}, {} + local in_code, code_start = false, nil + local function trim_empty(last) + while last > 0 and lines[last + 1] and lines[last + 1]:match("^%s*$") do last = last - 1 end + return last + end + local function close_headings(level, last) + while #headings > 0 and headings[#headings].level >= level do + local heading = table.remove(headings) + local finish = trim_empty(last - 1) + if finish > heading.line then table.insert(folds, { startLine = heading.line, endLine = finish }) end + end + end + for index, line in ipairs(lines) do + local line_number = index - 1 + if line:match("^```") or line:match("^~~~") then + if in_code then + in_code = false + if line_number > code_start then table.insert(folds, { startLine = code_start, endLine = line_number }) end + else + in_code, code_start = true, line_number + end + end + if not in_code then + if line:match("^:::details") or line:match("^:::message") then + table.insert(blocks, line_number) + elseif line:match("^:::$") and #blocks > 0 then + table.insert(folds, { startLine = table.remove(blocks), endLine = line_number }) + end + local hashes = line:match("^(#+)%s") + if hashes then + close_headings(#hashes, line_number) + table.insert(headings, { line = line_number, level = #hashes }) + end + end + end + local last = trim_empty(#lines - 1) + for _, heading in ipairs(headings) do + if last > heading.line then table.insert(folds, { startLine = heading.line, endLine = last }) end + end + return folds + end + + local dracula = require("dracula") + dracula.setup({ + italic_comment = true, + overrides = function(colors) + return { + CursorLineNr = { fg = colors.purple, bold = true }, + LineNr = { fg = colors.white }, + LineNrAbove = { fg = colors.white }, + LineNrBelow = { fg = colors.white }, + } + end, + transparent_bg = false, + }) + vim.cmd.colorscheme("dracula") + + vim.o.cursorline = true + vim.o.number = true + vim.o.foldcolumn = "1" + vim.o.foldlevel = 99 + vim.o.foldlevelstart = 99 + vim.o.foldenable = true + require("ufo").setup({ + fold_virt_text_handler = function(virtual_text, start_line, end_line, width, truncate) + local suffix = (" 󰁂 %d "):format(end_line - start_line) + local target_width, current_width = width - vim.fn.strdisplaywidth(suffix), 0 + local result = {} + for _, chunk in ipairs(virtual_text) do + local text, highlight = chunk[1], chunk[2] + local text_width = vim.fn.strdisplaywidth(text) + if target_width > current_width + text_width then + table.insert(result, chunk) + else + text = truncate(text, target_width - current_width) + table.insert(result, { text, highlight }) + suffix = suffix .. string.rep(" ", math.max(0, target_width - current_width - vim.fn.strdisplaywidth(text))) + break + end + current_width = current_width + text_width + end + table.insert(result, { suffix, "MoreMsg" }) + return result + end, + provider_selector = function(buffer, filetype) + if filetype == "markdown" then return markdown_fold_provider end + return { "treesitter", "indent" } + end, + }) + + require("incline").setup({ + hide = { cursorline = true }, + highlight = { + groups = { + InclineNormal = { guibg = "#BD93F9", guifg = "#282A36" }, + InclineNormalNC = { guibg = "#44475A", guifg = "#6272A4" }, + }, + }, + window = { margin = { vertical = 0, horizontal = 1 } }, + }) + + vim.g.bracey_auto_start_browser = 1 + vim.g.bracey_refresh_on_save = 1 + vim.g.bracey_server_allow_remote_connections = 0 + vim.g.user_emmet_leader_key = "" + vim.g.user_emmet_settings = { + variables = { lang = "ja" }, + html = { + indentation = " ", + snippets = { + ["html:5"] = "\n\n\n\t\n\t\n\t\n\t\n\n\n\t''${child}|\n\n", + }, + }, + } + + local spellfiles = vim.fn.globpath(vim.o.runtimepath, "spell/tech.utf-8.add", false, true) + if #spellfiles > 0 then + vim.opt.spellfile = { spellfiles[1], vim.fn.stdpath("data") .. "/spell/local.utf-8.add" } + end + ''; +} diff --git a/nix-configs/home/programs.nix b/nix-configs/home/programs.nix index e068dd4..cd0f3d5 100644 --- a/nix-configs/home/programs.nix +++ b/nix-configs/home/programs.nix @@ -1,12 +1,5 @@ {config, ...}: { programs = { - neovim = { - enable = true; - sideloadInitLua = true; - withPython3 = true; - extraPython3Packages = ps: [ps.pynvim]; - }; - go = { enable = true; env.GOPATH = "${config.home.homeDirectory}/go"; diff --git a/nix-configs/home/xdg.nix b/nix-configs/home/xdg.nix index db09d76..81fdbd5 100644 --- a/nix-configs/home/xdg.nix +++ b/nix-configs/home/xdg.nix @@ -7,7 +7,7 @@ # link (out-of-store): mkOutOfStoreSymlink で store の外にある「書き込み可能な実体」を指す。 # dotfilesDir (= self.outPath) は store 内 (読み取り専用) なので、ライブの作業ツリー # (~/dotfiles) を基準に symlink を張る。プログラム自身が設定 dir/file へ書き戻すもの - # (lazygit の state.yml、nvim の lazy-lock.json、zsh の .zwc、codex/claude のランタイム状態、 + # (lazygit の state.yml、zsh の .zwc、codex/claude のランタイム状態、 # GUI 由来で再書き込みされる fcitx5 など) に使う。編集に rebuild は不要。 link = path: config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/dotfiles/${path}"; @@ -68,7 +68,6 @@ in { "yazi".source = store ".config/shared/yazi"; # out-of-store: プログラム自身が dir/file へ書き戻すもの。 "lazygit".source = link ".config/shared/lazygit"; # state.yml を書き込む - "nvim".source = link ".config/shared/nvim"; # lazy-lock.json を書き込む "zed".source = link ".config/shared/zed"; # GUI 設定変更で settings.json を書き戻す "zsh/rc".source = link ".config/nixos/zsh/rc"; # .zwc を zcompile する "fcitx5/config".source = link ".config/nixos/fcitx5/config"; # GUI 設定で再書き込み From 0dd99ed190ffb41bd3a6b6cc83fd1fbfebdcbf6f Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Thu, 23 Jul 2026 15:15:24 +0900 Subject: [PATCH 02/35] =?UTF-8?q?=E2=9C=A8=20chezmoi:=20source=E5=9F=BA?= =?UTF-8?q?=E7=9B=A4=E3=81=A8=E7=92=B0=E5=A2=83=E3=83=97=E3=83=AD=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .chezmoiroot | 1 + chezmoi/.chezmoi.toml.tmpl | 5 +++++ chezmoi/.chezmoiignore | 21 +++++++++++++++++++++ chezmoi/.chezmoiversion | 1 + nix-configs/home/packages/cli.nix | 1 + 5 files changed, 29 insertions(+) create mode 100644 .chezmoiroot create mode 100644 chezmoi/.chezmoi.toml.tmpl create mode 100644 chezmoi/.chezmoiignore create mode 100644 chezmoi/.chezmoiversion diff --git a/.chezmoiroot b/.chezmoiroot new file mode 100644 index 0000000..73d74c2 --- /dev/null +++ b/.chezmoiroot @@ -0,0 +1 @@ +chezmoi diff --git a/chezmoi/.chezmoi.toml.tmpl b/chezmoi/.chezmoi.toml.tmpl new file mode 100644 index 0000000..18eadd7 --- /dev/null +++ b/chezmoi/.chezmoi.toml.tmpl @@ -0,0 +1,5 @@ +{{- $profiles := list "windows" "nixos" "wsl" -}} +{{- $profile := promptChoiceOnce . "profile" "Environment profile" $profiles "nixos" -}} +[data] +profile = {{ $profile | quote }} +username = "t4ko" diff --git a/chezmoi/.chezmoiignore b/chezmoi/.chezmoiignore new file mode 100644 index 0000000..b35c982 --- /dev/null +++ b/chezmoi/.chezmoiignore @@ -0,0 +1,21 @@ +{{- if ne .profile "windows" }} +AppData/** +Documents/PowerShell/** +komorebi.json +komorebi.bar.json +applications.json +{{- end }} + +{{- if eq .profile "windows" }} +.config/niri/** +.config/swaync/** +.config/waybar/** +{{- end }} + +{{- if eq .profile "wsl" }} +.config/wezterm/** +{{- end }} + +# Neovim is never a shared chezmoi target. Windows uses a junction to +# mutable/windows/nvim; NixOS uses nixvim; WSL leaves it unmanaged. +.config/nvim/** diff --git a/chezmoi/.chezmoiversion b/chezmoi/.chezmoiversion new file mode 100644 index 0000000..38a7743 --- /dev/null +++ b/chezmoi/.chezmoiversion @@ -0,0 +1 @@ +2.70.0 diff --git a/nix-configs/home/packages/cli.nix b/nix-configs/home/packages/cli.nix index 9b2a414..ddce01e 100644 --- a/nix-configs/home/packages/cli.nix +++ b/nix-configs/home/packages/cli.nix @@ -2,6 +2,7 @@ home.packages = with pkgs; [ # actrun bat + chezmoi delta difftastic diffnav From 8734786376ee4ca65b2987151bc0ee03f61cfa62 Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Thu, 23 Jul 2026 15:15:39 +0900 Subject: [PATCH 03/35] =?UTF-8?q?=E2=9C=A8=20wsl:=20CLI=E5=B0=82=E7=94=A8N?= =?UTF-8?q?ixOS-WSL=E6=A7=8B=E6=88=90=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .config/windows/wsl/wsl.conf | 13 ----- .gitconfig | 2 +- flake.lock | 39 +++++++++++++++ flake.nix | 68 ++++++++++++++++---------- nix-configs/home-wsl.nix | 22 +++++++++ nix-configs/home/identity.nix | 14 ++++-- nix-configs/home/packages/core-cli.nix | 16 ++++++ nix-configs/home/packages/core.nix | 14 +----- nix-configs/home/programs-cli.nix | 29 +++++++++++ nix-configs/home/programs.nix | 42 +++------------- nix-configs/hosts/wsl/default.nix | 40 +++++++++++++++ nix-configs/modules/users.nix | 22 +++++---- 12 files changed, 219 insertions(+), 102 deletions(-) delete mode 100644 .config/windows/wsl/wsl.conf create mode 100644 nix-configs/home-wsl.nix create mode 100644 nix-configs/home/packages/core-cli.nix create mode 100644 nix-configs/home/programs-cli.nix create mode 100644 nix-configs/hosts/wsl/default.nix diff --git a/.config/windows/wsl/wsl.conf b/.config/windows/wsl/wsl.conf deleted file mode 100644 index c018f8a..0000000 --- a/.config/windows/wsl/wsl.conf +++ /dev/null @@ -1,13 +0,0 @@ -[boot] -systemd = true - -[user] -default = takow - -[automount] -enabled = true -options = "metadata,umask=22,fmask=11" - -[interop] -enabled = true -appendWindowsPath = true diff --git a/.gitconfig b/.gitconfig index 8e82323..21110cc 100644 --- a/.gitconfig +++ b/.gitconfig @@ -37,7 +37,7 @@ email = tako.renraku1@gmail.com name = T4ko0522 [safe] - directory = %(prefix)///wsl.localhost/NixOS/home/takow/dotfiles + directory = %(prefix)///wsl.localhost/NixOS/home/t4ko/dotfiles [credential "https://github.com"] helper = helper = !gh auth git-credential diff --git a/flake.lock b/flake.lock index 81ff225..a574c64 100644 --- a/flake.lock +++ b/flake.lock @@ -100,6 +100,22 @@ "type": "github" } }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1767039857, + "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": [ @@ -248,6 +264,28 @@ "type": "github" } }, + "nixos-wsl": { + "inputs": { + "flake-compat": "flake-compat_2", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1784642409, + "narHash": "sha256-hcbDqFuySAJawljt5r0sKBCJKYnbtGD0T/ZIozH1Dq0=", + "owner": "nix-community", + "repo": "NixOS-WSL", + "rev": "eaeb18da90024448a60eb1ec7132eafa4003404e", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "main", + "repo": "NixOS-WSL", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1772773019, @@ -375,6 +413,7 @@ "lanzaboote": "lanzaboote", "llm-agents": "llm-agents", "nixos-loading-plymouth": "nixos-loading-plymouth", + "nixos-wsl": "nixos-wsl", "nixpkgs": "nixpkgs_3", "spotify-cli": "spotify-cli", "vial-qmk": "vial-qmk", diff --git a/flake.nix b/flake.nix index 6858ae3..21bd40b 100644 --- a/flake.nix +++ b/flake.nix @@ -14,6 +14,11 @@ inputs.nixpkgs.follows = "nixpkgs"; }; + nixos-wsl = { + url = "github:nix-community/NixOS-WSL/main"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + vial-qmk = { url = "git+https://github.com/vial-kb/vial-qmk?submodules=1"; flake = false; @@ -52,6 +57,7 @@ self, nixpkgs, home-manager, + nixos-wsl, vial-qmk, vicinae, lanzaboote, @@ -77,53 +83,52 @@ mkNixos = { configuration, homeConfiguration, + editor ? "nvim", extraModules ? [], + homeDirectory ? "/home/${username}", + platformModules ? [ + vicinae.nixosModules.default + nixos-loading-plymouth.nixosModules.default + ], + sharedHomeModules ? [ + vicinae.homeManagerModules.default + codex-desktop-linux.homeManagerModules.default + ], + systemOverlays ? [spotify-cli.overlays.default], + userExtraGroups ? [ + "audio" + "input" + "networkmanager" + "plugdev" + "wheel" + ], + username ? "t4ko", }: nixpkgs.lib.nixosSystem { inherit system; specialArgs = { - inherit dotfilesDir keyboardLayout; + inherit dotfilesDir homeDirectory keyboardLayout userExtraGroups username; nixosLoadingPlymouth = nixos-loading-plymouth; }; modules = [ home-manager.nixosModules.home-manager - vicinae.nixosModules.default - nixos-loading-plymouth.nixosModules.default configuration ] + ++ platformModules ++ extraModules ++ [ { - nixpkgs.overlays = [ - spotify-cli.overlays.default - # actrun.inputs.moonbit-overlay.overlays.default - # actrun.overlays.default - # (final: prev: { - # actrun = prev.actrun.overrideAttrs (old: { - # nativeBuildInputs = (old.nativeBuildInputs or []) ++ [final.makeWrapper]; - # postFixup = - # (old.postFixup or "") - # + '' - # for bin in "$out"/bin/*; do - # wrapProgram "$bin" --prefix LD_LIBRARY_PATH : "${final.openssl.out}/lib" - # done - # ''; - # }); - # }) - ]; + nixpkgs.overlays = systemOverlays; home-manager = { useGlobalPkgs = true; useUserPackages = true; backupFileExtension = "hm-backup"; extraSpecialArgs = { - inherit claudex dotfilesDir keyboardLayout llm-agents; + inherit claudex dotfilesDir editor homeDirectory keyboardLayout llm-agents username; }; - sharedModules = [ - vicinae.homeManagerModules.default - codex-desktop-linux.homeManagerModules.default - ]; - users.t4ko = import homeConfiguration; + sharedModules = sharedHomeModules; + users.${username} = import homeConfiguration; }; } ]; @@ -142,9 +147,17 @@ configuration = ./nix-configs/configuration-ci.nix; homeConfiguration = ./nix-configs/home-ci.nix; }; + wsl = mkNixos { + configuration = ./nix-configs/hosts/wsl; + homeConfiguration = ./nix-configs/home-wsl.nix; + platformModules = [nixos-wsl.nixosModules.default]; + sharedHomeModules = []; + userExtraGroups = ["wheel"]; + editor = "vim"; + }; in { nixosConfigurations = { - inherit laptop desktop; + inherit laptop desktop wsl; default = laptop; nixos-ci = nixosCi; }; @@ -153,6 +166,7 @@ default = pkgs.mkShell { packages = with pkgs; [ avrdude + chezmoi dfu-util gcc-arm-embedded git diff --git a/nix-configs/home-wsl.nix b/nix-configs/home-wsl.nix new file mode 100644 index 0000000..aa91eb1 --- /dev/null +++ b/nix-configs/home-wsl.nix @@ -0,0 +1,22 @@ +{config, ...}: { + imports = [ + ./home/identity.nix + ./home/packages/core-cli.nix + ./home/packages/cli.nix + ./home/programs-cli.nix + ]; + + programs.zsh = { + enable = true; + defaultKeymap = "emacs"; + history = { + path = "${config.xdg.stateHome}/zsh/history"; + size = 100000; + save = 100000; + ignoreAllDups = true; + ignoreDups = true; + ignoreSpace = true; + share = true; + }; + }; +} diff --git a/nix-configs/home/identity.nix b/nix-configs/home/identity.nix index 2f0b3c9..7189245 100644 --- a/nix-configs/home/identity.nix +++ b/nix-configs/home/identity.nix @@ -1,12 +1,16 @@ -_: { +{ + editor ? "nvim", + homeDirectory, + username, + ... +}: { home = { - username = "t4ko"; - homeDirectory = "/home/t4ko"; + inherit homeDirectory username; stateVersion = "26.05"; sessionVariables = { - EDITOR = "nvim"; - VISUAL = "nvim"; + EDITOR = editor; + VISUAL = editor; }; }; } diff --git a/nix-configs/home/packages/core-cli.nix b/nix-configs/home/packages/core-cli.nix new file mode 100644 index 0000000..cd53600 --- /dev/null +++ b/nix-configs/home/packages/core-cli.nix @@ -0,0 +1,16 @@ +{pkgs, ...}: { + home.packages = with pkgs; [ + alejandra + fastfetch + fd + fzf + jq + lazygit + nil + peco + starship + tree-sitter + vim + yazi + ]; +} diff --git a/nix-configs/home/packages/core.nix b/nix-configs/home/packages/core.nix index 9fdea09..51ecd64 100644 --- a/nix-configs/home/packages/core.nix +++ b/nix-configs/home/packages/core.nix @@ -1,19 +1,9 @@ {pkgs, ...}: { + imports = [./core-cli.nix]; + home.packages = with pkgs; [ - alejandra - fastfetch - fd - fzf ghostty - jq - lazygit - nil - peco - starship - tree-sitter - vim wezterm - yazi zed-editor ]; } diff --git a/nix-configs/home/programs-cli.nix b/nix-configs/home/programs-cli.nix new file mode 100644 index 0000000..cd0f3d5 --- /dev/null +++ b/nix-configs/home/programs-cli.nix @@ -0,0 +1,29 @@ +{config, ...}: { + programs = { + go = { + enable = true; + env.GOPATH = "${config.home.homeDirectory}/go"; + }; + + fzf = { + enable = true; + enableZshIntegration = true; + defaultCommand = "rg --files --hidden --follow --glob '!.git/*'"; + defaultOptions = [ + "--height 40%" + "--reverse" + "--border" + ]; + }; + + starship = { + enable = true; + enableZshIntegration = true; + }; + + zoxide = { + enable = true; + enableZshIntegration = true; + }; + }; +} diff --git a/nix-configs/home/programs.nix b/nix-configs/home/programs.nix index e068dd4..8215d4d 100644 --- a/nix-configs/home/programs.nix +++ b/nix-configs/home/programs.nix @@ -1,36 +1,10 @@ -{config, ...}: { - programs = { - neovim = { - enable = true; - sideloadInitLua = true; - withPython3 = true; - extraPython3Packages = ps: [ps.pynvim]; - }; - - go = { - enable = true; - env.GOPATH = "${config.home.homeDirectory}/go"; - }; - - fzf = { - enable = true; - enableZshIntegration = true; - defaultCommand = "rg --files --hidden --follow --glob '!.git/*'"; - defaultOptions = [ - "--height 40%" - "--reverse" - "--border" - ]; - }; - - starship = { - enable = true; - enableZshIntegration = true; - }; - - zoxide = { - enable = true; - enableZshIntegration = true; - }; +{...}: { + imports = [./programs-cli.nix]; + + programs.neovim = { + enable = true; + sideloadInitLua = true; + withPython3 = true; + extraPython3Packages = ps: [ps.pynvim]; }; } diff --git a/nix-configs/hosts/wsl/default.nix b/nix-configs/hosts/wsl/default.nix new file mode 100644 index 0000000..93fd965 --- /dev/null +++ b/nix-configs/hosts/wsl/default.nix @@ -0,0 +1,40 @@ +{ + pkgs, + username, + ... +}: { + imports = [ + ../../modules/nh.nix + ../../modules/nix.nix + ../../modules/unfree.nix + ../../modules/users.nix + ]; + + networking.hostName = "nixos-wsl"; + + wsl = { + enable = true; + defaultUser = username; + interop.includePath = true; + wslConf = { + automount = { + enabled = true; + options = "metadata,umask=22,fmask=11"; + }; + boot.systemd = true; + interop = { + enabled = true; + appendWindowsPath = true; + }; + user.default = username; + }; + }; + + programs.nix-ld.enable = true; + environment.systemPackages = with pkgs; [ + git + vim + ]; + + system.stateVersion = "26.05"; +} diff --git a/nix-configs/modules/users.nix b/nix-configs/modules/users.nix index 3b55976..ae20f2f 100644 --- a/nix-configs/modules/users.nix +++ b/nix-configs/modules/users.nix @@ -1,18 +1,20 @@ -{pkgs, ...}: { - users.users."t4ko" = { +{ + lib, + pkgs, + userExtraGroups, + username, + ... +}: { + users.users.${username} = { isNormalUser = true; description = "T4ko"; - extraGroups = [ - "audio" - "input" - "networkmanager" - "plugdev" - "wheel" - ]; + extraGroups = userExtraGroups; shell = pkgs.zsh; }; - users.groups.plugdev = {}; + users.groups = lib.optionalAttrs (lib.elem "plugdev" userExtraGroups) { + plugdev = {}; + }; programs.zsh.enable = true; } From 57358b0c1bdc7a4a1ba94c18feaf100d4df2017c Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Thu, 23 Jul 2026 15:15:54 +0900 Subject: [PATCH 04/35] =?UTF-8?q?=E2=9C=85=20dotfiles:=20migration?= =?UTF-8?q?=E5=A5=91=E7=B4=84=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 32 ++++++++++++++ docs/memo/dotfiles-ownership.tsv | 24 +++++++++++ justfile | 34 +++++++++------ scripts/check_chezmoi.sh | 74 ++++++++++++++++++++++++++++++++ scripts/check_wsl.sh | 40 +++++++++++++++++ 5 files changed, 190 insertions(+), 14 deletions(-) create mode 100644 docs/memo/dotfiles-ownership.tsv create mode 100644 scripts/check_chezmoi.sh create mode 100644 scripts/check_wsl.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 328d82d..1685184 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,38 @@ on: workflow_dispatch: jobs: + chezmoi: + name: Chezmoi contract + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Nix + uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - name: Check chezmoi profiles and ownership + run: nix develop --command bash scripts/check_chezmoi.sh + + wsl: + name: NixOS-WSL + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Nix + uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - name: Check WSL configuration + run: bash scripts/check_wsl.sh + syntax: name: Nix syntax runs-on: ubuntu-latest diff --git a/docs/memo/dotfiles-ownership.tsv b/docs/memo/dotfiles-ownership.tsv new file mode 100644 index 0000000..b2b0e6a --- /dev/null +++ b/docs/memo/dotfiles-ownership.tsv @@ -0,0 +1,24 @@ +profile target owner mode source +windows AppData/Local/nvim chezmoi junction mutable/windows/nvim +nixos .config/nvim nix nixvim nix-configs/home/nixvim +wsl .config/nvim unmanaged none - +wsl /etc/wsl.conf nix generated nix-configs/hosts/wsl/default.nix +windows .config/starship.toml chezmoi copy chezmoi/dot_config/starship.toml +nixos .config/starship.toml chezmoi copy chezmoi/dot_config/starship.toml +wsl .config/starship.toml chezmoi copy chezmoi/dot_config/starship.toml +windows .config/fastfetch chezmoi copy chezmoi/dot_config/fastfetch +nixos .config/fastfetch chezmoi copy chezmoi/dot_config/fastfetch +wsl .config/fastfetch chezmoi copy chezmoi/dot_config/fastfetch +windows .config/lazygit chezmoi link mutable/shared/lazygit +nixos .config/lazygit chezmoi link mutable/shared/lazygit +wsl .config/lazygit chezmoi link mutable/shared/lazygit +windows .config/yazi chezmoi copy chezmoi/dot_config/yazi +nixos .config/yazi chezmoi copy chezmoi/dot_config/yazi +wsl .config/yazi chezmoi copy chezmoi/dot_config/yazi +windows .config/wezterm chezmoi copy chezmoi/dot_config/wezterm +nixos .config/wezterm chezmoi copy chezmoi/dot_config/wezterm +wsl .config/wezterm unmanaged none - +nixos .config/niri nix generated nix-configs/home/niri.nix +nixos .config/swaync nix generated nix-configs/home/swaync.nix +nixos .config/waybar nix generated nix-configs/home/waybar.nix +windows Documents/PowerShell chezmoi junction mutable/windows/powershell diff --git a/justfile b/justfile index 1986b7d..bd3af14 100644 --- a/justfile +++ b/justfile @@ -1,30 +1,36 @@ default: - @just --list + @just --list os-switch host="laptop": - nh os switch . -H {{host}} + nh os switch . -H {{ host }} skills-sync: - cd .config/shared/apm && apm install + cd .config/shared/apm && apm install fmt: - alejandra . - nix run nixpkgs#markdownlint-cli2 -- --fix - git ls-files '*.lua' | xargs -r nix run nixpkgs#stylua -- + git ls-files '*.nix' | xargs -r alejandra + nix run nixpkgs#markdownlint-cli2 -- --fix + git ls-files '*.lua' | xargs -r nix run nixpkgs#stylua -- syntax: - git ls-files '*.nix' | xargs -r -n1 nix-instantiate --parse --quiet >/dev/null + git ls-files '*.nix' | xargs -r -n1 nix-instantiate --parse --quiet >/dev/null fmt-check: - alejandra --check . - nix run nixpkgs#markdownlint-cli2 -- - git ls-files '*.lua' | xargs -r nix run nixpkgs#stylua -- --check + git ls-files '*.nix' | xargs -r alejandra --check + nix run nixpkgs#markdownlint-cli2 -- + git ls-files '*.lua' | xargs -r nix run nixpkgs#stylua -- --check lint: - statix check . + statix check . + +chezmoi-check: + nix develop --command bash scripts/check_chezmoi.sh + +wsl-check: + bash scripts/check_wsl.sh build host="laptop": - nix build .#nixosConfigurations.{{host}}.config.system.build.toplevel + nix build .#nixosConfigurations.{{ host }}.config.system.build.toplevel -ci: syntax fmt-check - nix build .#nixosConfigurations.nixos-ci.config.system.build.toplevel +ci: syntax fmt-check chezmoi-check wsl-check + nix build .#nixosConfigurations.nixos-ci.config.system.build.toplevel diff --git a/scripts/check_chezmoi.sh b/scripts/check_chezmoi.sh new file mode 100644 index 0000000..4126907 --- /dev/null +++ b/scripts/check_chezmoi.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash + +set -euo pipefail + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ownership_file="$repo_root/docs/memo/dotfiles-ownership.tsv" +temp_dir="$(mktemp -d)" +trap 'rm -rf "$temp_dir"' EXIT + +if [[ "$(<"$repo_root/.chezmoiroot")" != "chezmoi" ]]; then + printf '%s\n' '.chezmoiroot must point to chezmoi' >&2 + exit 1 +fi + +declare -A targets=() +while IFS=$'\t' read -r profile target owner _mode _source; do + [[ -z "$profile" || "$profile" == profile ]] && continue + + case "$profile" in + windows | nixos | wsl) ;; + *) + printf 'invalid profile: %s\n' "$profile" >&2 + exit 1 + ;; + esac + + case "$owner" in + chezmoi | nix | unmanaged) ;; + *) + printf 'invalid owner: %s\n' "$owner" >&2 + exit 1 + ;; + esac + + key="$profile:$target" + if [[ -n "${targets[$key]:-}" ]]; then + printf 'duplicate ownership: %s\n' "$key" >&2 + exit 1 + fi + targets[$key]="$owner" +done < "$ownership_file" + +for profile in windows nixos wsl; do + rendered="$temp_dir/chezmoi-$profile.toml" + chezmoi execute-template \ + --init \ + --promptChoice "Environment profile=$profile" \ + --file "$repo_root/chezmoi/.chezmoi.toml.tmpl" > "$rendered" + + if ! grep -q "profile = \"$profile\"" "$rendered"; then + printf 'profile was not rendered: %s\n' "$profile" >&2 + exit 1 + fi + + if ! grep -q 'username = "t4ko"' "$rendered"; then + printf 'username was not rendered for profile: %s\n' "$profile" >&2 + exit 1 + fi + + source_path="$(chezmoi --source "$repo_root" --config "$rendered" source-path)" + if [[ "$source_path" != "$repo_root/chezmoi" ]]; then + printf 'unexpected source root: %s\n' "$source_path" >&2 + exit 1 + fi + + mkdir -p "$temp_dir/home-$profile" + chezmoi \ + --source "$repo_root" \ + --config "$rendered" \ + --destination "$temp_dir/home-$profile" \ + --no-tty \ + --dry-run \ + apply +done diff --git a/scripts/check_wsl.sh b/scripts/check_wsl.sh new file mode 100644 index 0000000..a5a44a3 --- /dev/null +++ b/scripts/check_wsl.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +set -euo pipefail + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +flake_ref="$repo_root" + +assert_json() { + local attribute=$1 + local expected=$2 + local actual + + actual="$(nix eval "$flake_ref#nixosConfigurations.wsl.config.$attribute" --json)" + if [[ "$actual" != "$expected" ]]; then + printf '%s: expected %s, got %s\n' "$attribute" "$expected" "$actual" >&2 + exit 1 + fi +} + +assert_json wsl.enable true +assert_json wsl.defaultUser '"t4ko"' +assert_json home-manager.users.t4ko.home.username '"t4ko"' +assert_json home-manager.users.t4ko.home.homeDirectory '"/home/t4ko"' +assert_json home-manager.users.t4ko.home.sessionVariables.EDITOR '"vim"' +assert_json home-manager.users.t4ko.programs.neovim.enable false + +home_packages="$( + nix eval \ + "$flake_ref#nixosConfigurations.wsl.config.home-manager.users.t4ko.home.packages" \ + --apply 'packages: map (package: package.pname or package.name) packages' \ + --json +)" +for desktop_package in ghostty wezterm zed-editor; do + if [[ "$home_packages" == *"\"$desktop_package\""* ]]; then + printf 'desktop package is present in WSL: %s\n' "$desktop_package" >&2 + exit 1 + fi +done + +nix build "$flake_ref#nixosConfigurations.wsl.config.system.build.toplevel" From 02ef5ff043084e4fd2d0993c12b3325a440464d4 Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Thu, 23 Jul 2026 15:16:08 +0900 Subject: [PATCH 05/35] =?UTF-8?q?=F0=9F=93=9D=20dotfiles:=20chezmoi?= =?UTF-8?q?=E7=A7=BB=E8=A1=8C=E8=A8=AD=E8=A8=88=E3=81=A8WSL=E6=89=8B?= =?UTF-8?q?=E9=A0=86=E3=82=92=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 6 +- README.md | 16 +- .../windows-nixos-dotfiles-design-options.md | 2 +- docs/memo/windows-nixos-dotfiles-design.md | 283 ++++++------------ 4 files changed, 116 insertions(+), 191 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 0ea697c..6363587 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -25,7 +25,7 @@ GitHub Actions は `.github/workflows/checks.yml` で以下を実行します。 ## 構成 - `flake.nix`: flake inputs と `nixosConfigurations` を定義します。 -- `nix-configs/hosts/`: ホスト別の構成入口です。`laptop/`・`desktop/` があり、各 `default.nix` と `hardware-configuration.nix` を持ちます。自動生成由来の hardware 設定は目的なしに整理しないでください。 +- `nix-configs/hosts/`: ホスト別の構成入口です。`laptop/`・`desktop/`・`wsl/`があります。物理ホストの自動生成由来のhardware設定は目的なしに整理しないでください。 - `nix-configs/configuration-ci.nix`: CI build 用の最小構成です。 - `nix-configs/modules/`: NixOS 共通基盤モジュールです。 - `nix-configs/profiles/`: desktop、gaming、nvidia など用途別の NixOS profile です。 @@ -40,11 +40,12 @@ GitHub Actions は `.github/workflows/checks.yml` で以下を実行します。 - `nixosConfigurations.laptop`: laptop ホスト構成 - `nixosConfigurations.desktop`: desktop ホスト構成 +- `nixosConfigurations.wsl`: NixOS-WSL 用の CLI 構成 - `nixosConfigurations.default`: `laptop` の alias - `nixosConfigurations.nixos-ci`: CI 用構成 - `devShells.x86_64-linux.default`: QMK/Vial 作業用 shell -`specialArgs` と Home Manager の `extraSpecialArgs` には `dotfilesDir` と `keyboardLayout` が渡されています。これらが必要な module では、ハードコードを増やさず既存の引数を使ってください。 +`specialArgs`とHome Managerの`extraSpecialArgs`には`dotfilesDir`、`keyboardLayout`、`username`、`homeDirectory`などが渡されています。これらが必要なmoduleでは、ハードコードを増やさず既存の引数を使ってください。 ## ファイル配置ルール @@ -94,4 +95,5 @@ package 追加や NixOS module 変更では、必要に応じて以下も確認 ```sh nix eval .#nixosConfigurations.default.config.home-manager.users.t4ko.home.packages --apply 'xs: builtins.length xs' nix eval .#nixosConfigurations.default.config.boot.kernelPackages.kernel.version --raw +just wsl-check ``` diff --git a/README.md b/README.md index 9547bb8..78ba536 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Dotfiles -NixOSとWindowsの環境を管理しているdotfiles. +NixOS、NixOS-WSL、Windowsの環境を管理しているdotfiles. ## Nix @@ -28,3 +28,17 @@ NixOSとWindowsの環境を管理しているdotfiles. ``` Inspired by [akazdayo/nix-configs](https://github.com/akazdayo/nix-configs), [moons-14/dotfiles](https://github.com/moons-14/dotfiles), [mozumasu/dotfiles](https://github.com/mozumasu/dotfiles). + +## NixOS-WSL + +NixOS-WSLの初期イメージ内でこのリポジトリをcloneし、次の構成を適用する。 + +```sh +sudo nixos-rebuild switch --flake .#wsl +``` + +WSL構成は`t4ko`ユーザー、Windows interop、CLI用Home Manager profileを有効にする。desktop packageとNeovim設定は含まない。 + +```sh +just wsl-check +``` diff --git a/docs/memo/windows-nixos-dotfiles-design-options.md b/docs/memo/windows-nixos-dotfiles-design-options.md index c925c25..670df0b 100644 --- a/docs/memo/windows-nixos-dotfiles-design-options.md +++ b/docs/memo/windows-nixos-dotfiles-design-options.md @@ -1,6 +1,6 @@ # Windows / NixOS dotfiles 設計の深掘り(選択肢) -`windows-nixos-dotfiles-design.md` の chezmoi 方針を、現リポジトリの実態に合わせて深掘りした設計選択肢メモ。ここは「決定済みの計画」ではなく「取りうる設計とトレードオフ」を並べる。 +`windows-nixos-dotfiles-design.md`の検討過程を残した資料。現在の決定事項は同文書を正とし、この文書内の`home/` source root、Maximal構成、両OS共通nvimなどの案は採用しない。 ## 現状から見えた制約・論点 diff --git a/docs/memo/windows-nixos-dotfiles-design.md b/docs/memo/windows-nixos-dotfiles-design.md index 58d372b..d525dfc 100644 --- a/docs/memo/windows-nixos-dotfiles-design.md +++ b/docs/memo/windows-nixos-dotfiles-design.md @@ -1,239 +1,148 @@ -# Windows / NixOS dotfiles 設計 +# Windows / NixOS / WSL dotfiles設計 ## 目的 -Windows と NixOS の両方で同じ dotfiles を運用する。OS 差分は chezmoi の template と ignore で吸収し、「どちらか片方だけ設定が増える」「リンク先がズレる」「存在しない設定を参照する」といった不整合を `chezmoi diff` / `chezmoi verify` で機械的に検出できる状態にする。 +chezmoiとNixの責務を分離し、Windows、NixOS、Windows上のNixOS-WSLを同じリポジトリから管理する。1つのtarget pathを複数の仕組みで所有しないことを最優先の不変条件とする。 -最終形では、dotfiles の配置を chezmoi が単一の applier として担い、NixOS の Home Manager は package / service / desktop profile など Nix でしか表現できない領域に専念する。 +## 決定事項 -## 採用方針 +- chezmoiはHybrid方式で採用する。 +- chezmoi source rootはリポジトリ直下の`chezmoi/`とする。 +- 静的なcopy・templateは`chezmoi/`に置く。 +- アプリが書き戻す設定や直接参照する実体は`mutable/`に置く。 +- NixOSのsystem、package、service、desktop生成設定、nixvimはNixが所有する。 +- WindowsはLazyVim、NixOSはnixvimを使用する。 +- NixOS-WSLではnixvimおよびchezmoi管理のNeovim設定を使用しない。 +- Linuxのユーザー名はNixOS、NixOS-WSLともに`t4ko`へ統一する。 +- chezmoiはHome Manager activationから実行せず、明示的に`chezmoi apply`する。 -- dotfiles の適用は chezmoi に一本化する(Windows / NixOS 共通) -- 独自の契約 TOML + PowerShell executor は採用しない(chezmoi が肩代わりする) -- OS 差分は物理ディレクトリ分割ではなく chezmoi の template (`.tmpl`) と `.chezmoiignore` で表現する -- machine 固有値は `.chezmoidata` / `.chezmoi.toml.tmpl` に集約する -- Python は採用しない -- NixOS では Home Manager の dotfiles リンクを撤退し、最低限(package / service / profile)に絞る -- repository をそのまま chezmoi の source directory として使う -- **最終形は Maximal(NixOS 撤退)だが、移行は Hybrid 起点で漸進する**(Windows + Claude settings + cross-platform 静的 → live-edit 系 → Maximal) - -## 責務分担 - -### chezmoi(配置) - -repo を chezmoi の source とし、`chezmoi apply` で home 配下へ配置する。OS 差分は template と ignore で解決する。Windows / NixOS の両方でこの applier を共有する。 - -### NixOS(最低限) - -Home Manager は以下だけを管理する。 - -- package -- service / systemd user unit -- desktop profile(niri など Nix 生成が必要なもの) -- system 設定 - -dotfiles のシンボリックリンク定義は Home Manager から削除し、chezmoi に委譲する。niri のように Nix で生成する必要がある設定は引き続き Nix が持ち、chezmoi の管理対象外にする。 - -### Windows - -`scripts/setup_windows.ps1` は chezmoi の bootstrap(install + `chezmoi init --apply`)だけを担う。リンク対象の個別列挙は廃止する。 - -## ソース構成(chezmoi source) - -`.chezmoiroot` で `home/` を source root に指定し、chezmoi の naming convention で配置する。 +## ディレクトリ構成 ```text dotfiles/ - .chezmoiroot # "home" を指す - home/ - .chezmoi.toml.tmpl # chezmoi config 生成(data / OS 判定) - .chezmoidata.toml # 静的データ(editor 名など) - .chezmoiignore # OS ごとの除外 + .chezmoiroot # chezmoiを指す + chezmoi/ # chezmoi source root + .chezmoi.toml.tmpl + .chezmoiignore dot_config/ - nvim/... - starship.toml - ... - ... - nix-configs/ # NixOS: package / service / profile のみ + mutable/ # chezmoi変換対象外の書き込み可能な実体 + shared/ + windows/ + nvim/ # LazyVim + powershell/ + nixos/ + nix-configs/ # NixOS、Home Manager、nixvim scripts/ - setup_windows.ps1 # chezmoi bootstrap のみ docs/ ``` -naming convention: - -- `dot_foo` → `~/.foo` -- `private_foo` → permission 0600 -- `executable_foo` → 実行ビット付与 -- `foo.tmpl` → Go template として評価 -- `symlink_foo` → symlink(ファイル内容が link 先 path) -- `run_onchange_foo` → 内容変化時に実行する script - -## OS 差分の扱い +`mutable/`はchezmoi source rootの外に置く。これにより`mutable/`自体が誤ってホームディレクトリへ配置されることを防ぐ。 -旧設計の `shared` / `windows` / `nixos` 物理分割は廃止し、chezmoi の仕組みへ置き換える。 +## 所有権 -- 共有設定: そのまま source に置く(両 OS に適用される) -- 内容が OS で異なる: `foo.tmpl` 内で `{{ if eq .chezmoi.os "windows" }}` 分岐 -- 片方だけに置く: `.chezmoiignore` で対象外の OS を除外 +機械可読な目標状態は`docs/memo/dotfiles-ownership.tsv`で管理する。 ```text -# .chezmoiignore -{{ if ne .chezmoi.os "windows" }} -AppData/** -{{ end }} -{{ if ne .chezmoi.os "linux" }} -dot_config/niri/** -{{ end }} -``` - -## 配置先が OS で違う場合 - -nvim のように、Linux では `~/.config/nvim`、Windows では `%LOCALAPPDATA%\nvim` と配置先が異なるものは次のように扱う。 - -- 正準の内容は `dot_config/nvim` に一度だけ置く -- Windows 向けは `AppData/Local/nvim` を `symlink_`、もしくは `run_onchange_` の junction 作成で `dot_config/nvim` の実体へ向ける -- `.chezmoiignore` で OS ごとに不要な側を除外する - -これで内容の二重管理を避けつつ、OS ごとの配置先差分を吸収する。 - -## 実行時に書き戻される設定 - -Claude / Codex のように tool が runtime で書き戻す設定は、chezmoi の managed copy にすると drift する。これらは次のいずれかで扱う。 - -- `symlink_` で repo 作業ツリーの実体へ link する(旧 `outOfStoreSymlink` 相当) -- `modify_` script で既存内容を尊重してマージする - -推奨は symlink。tool の書き込みが直接 repo に届き、`chezmoi apply` と競合しない。 - -## machine データ - -`.chezmoi.toml.tmpl` で OS と machine を判定し、`.chezmoidata.toml` の静的値と合わせて template に渡す。 - -```toml -# .chezmoidata.toml -editor = "nvim" -``` - -```toml -# .chezmoi.toml.tmpl -[data] -hostname = {{ .chezmoi.hostname | quote }} -os = {{ .chezmoi.os | quote }} -``` - -template 側ではこれらを `{{ .editor }}` / `{{ .hostname }}` として参照する。 - -## 整合性チェック - -独自の PowerShell checker は廃止し、chezmoi 標準を使う。 - -- `chezmoi doctor`: 環境の健全性 -- `chezmoi verify`: 適用済み状態と source の一致 -- `chezmoi diff`: 差分(CI で空であることを確認) -- `chezmoi execute-template`: template が両 OS で評価できるか - -## CI - -`just ci` の例: - -```sh -chezmoi doctor -chezmoi diff --source home # diff が無いこと -just check-ownership # HM target と chezmoi target が素であること -just check-claude-settings # 生成 settings.json が fixture と一致すること -alejandra --check . -nix build .#nixosConfigurations.nixos-ci.config.system.build.toplevel +(profile, target path) -> exactly one owner ``` -- `check-ownership`: Home Manager が生成する target path 集合と chezmoi が管理する target path 集合の**交差が空**であることを検査する(二重所有の事故防止)。不変条件の明記だけでは不足なので CI で機械検出する。 -- `check-claude-settings`: `mergeOverwrite` で生成した `settings.json` が、固定した JSON fixture(=旧 Nix `recursiveUpdate` / 旧 PowerShell マージと一致する期待値)と一致することを検査する。配列・深いキーの扱いの差異を回帰検出する。 +ownerは次のいずれかとする。 -Windows 側の差分は GitHub Actions の windows runner で `chezmoi apply --dry-run` を回して検証する。 +- `chezmoi`: copy、template、symlink、Windows junction +- `nix`: NixOSまたはHome Managerによる生成・配置 +- `unmanaged`: 意図的に配置しない -## bootstrap +移行時は必ず既存ownerからtargetを削除してから新ownerへ追加する。同じコミット内でも、この順序でactivationとapplyを確認する。 -両 OS 共通: +## 環境別の責務 -```sh -chezmoi init --apply -``` +| 対象 | Windows | NixOS | NixOS-WSL | +|---|---|---|---| +| system / service | Windows | NixOS | NixOS-WSL | +| package | winget / Scoop / mise | Nix / Home Manager | Nix / Home Manager | +| Neovim | chezmoi + LazyVim | Nix + nixvim | 管理しない | +| shell | chezmoi + PowerShell | Home Manager + zsh | Home Manager + zsh | +| Git / Starship / Yazi / Lazygit | chezmoi | chezmoi | chezmoi | +| WezTerm | chezmoi | chezmoi | 管理しない | +| komorebi / YASB / whkd | chezmoi | 対象外 | 対象外 | +| niri / waybar / swaync | 対象外 | Nix | 対象外 | +| `/etc/wsl.conf` | 対象外 | 対象外 | NixOS-WSL | -- Windows: `setup_windows.ps1` が chezmoi を winget で導入し、`chezmoi init --apply` を呼ぶ -- NixOS: chezmoi を package に追加し、初回のみ `chezmoi init --apply`。以降は `chezmoi apply` +## Neovim -## NixOS 連携の方針 - -Home Manager から dotfiles リンクを撤去する。`chezmoi apply` を Nix の activation に組み込むことも可能だが、Nix eval と chezmoi を密結合させないため、`chezmoi apply` は明示実行(手動 or systemd user oneshot)にとどめる。 - -niri など Nix 生成が必須の設定は Nix 側に残し、chezmoi の管理対象外(`.chezmoiignore`)にする。 +### Windows -## tools.toml(package 整合) +LazyVimの実体を`mutable/windows/nvim`へ置き、`%LOCALAPPDATA%\nvim`からjunctionで参照する。Windowsのdirectory symlink権限に依存しないよう、chezmoiの`run_onchange_` PowerShell scriptでjunctionを作成する。 -dotfiles とは別に package の整合を取りたい場合、chezmoi の `.chezmoidata` や `run_onchange_` script で扱える。Windows は winget、NixOS は Nix が package を持つため、capability 単位の管理は将来拡張とする。最初は dotfiles の chezmoi 化を優先する。 +### NixOS -## 段階移行(Hybrid 起点 → Maximal 最終形) +`feat/nixvim`は直接mergeせず、現在の`master`へモジュール単位で再移植する。Home Managerの`programs.neovim`と`~/.config/nvim` linkを撤去してからnixvimを有効にする。 -最終形は案 1 Maximal(NixOS は dotfiles 配置から撤退)。ただし一気に寄せず、リスクの低い領域から段階的に chezmoi へ移す。各 Phase は exit 条件を満たしてから次へ進む。設計の選択肢・トレードオフは `windows-nixos-dotfiles-design-options.md` を参照。 +### NixOS-WSL -### Phase 0: 先行 PoC(移行前に必須) +nixvimをimportせず、chezmoiでも`~/.config/nvim`を生成しない。将来editorが必要になった場合は、この所有権を明示的に再決定する。 -実体は動かさず、危険な前提を実機で潰す。 +## chezmoi profile -- P1. Windows link PoC: `symlink_` のディレクトリ挙動を検証し、junction は `run_onchange_` で明示作成する方式を確立(権限/開発者モード込み)。 -- P2. Claude settings fixture: `mergeOverwrite` 出力が旧 Nix `recursiveUpdate` / 旧 PowerShell マージと一致するか JSON fixture で固定。 -- P3. HM↔chezmoi path 交差 CI: 両者の target path 集合が素であることを検査する `check-ownership` を用意。 -- P4. `.chezmoiroot` × `include` PoC: source root を `home/` にした時の `include` 解決を最小再現で確認。 +初期化時に次のprofileを選択し、chezmoi configの`data.profile`へ保存する。 -exit: P1〜P4 がすべて green。Windows ディレクトリ配置と Claude settings 生成の方式が確定。 +- `windows` +- `nixos` +- `wsl` -### Phase 1: Hybrid 起点 +`.chezmoi.os`だけではNixOSとNixOS-WSLを区別できないため、OS判定の代わりにprofileをtarget選択へ使用する。ユーザー名は全Linux環境で`t4ko`とする。 -chezmoi が明確に勝つ領域だけ先に移す。NixOS の live-edit 二層はまだ触らない。 +## 移行フェーズ -- Windows: `setup_windows.ps1` を chezmoi bootstrap のみへ簡略化。Windows 専用配置(komorebi / yasb / whkd / cava / powershell / mise / ccwin)を chezmoi へ。 -- Claude `settings.json`: 両 OS とも chezmoi template(モード C)へ集約。`xdg.nix` の activation と PS マージを撤去。 -- cross-platform 静的(starship / fastfetch / vim / wezterm / yazi): chezmoi managed copy(モード A)へ。NixOS の in-store エントリは HM から削除(churn しないので低リスク)。 +### Phase 0: 契約とPoC -exit: 上記 path が HM から消え chezmoi 所有へ移行。`check-ownership` green。両 OS で `chezmoi diff` が空。 +- source root、profile、所有権表を追加する。 +- 3 profileのtemplateを非対話で評価する。 +- Windows junctionを一時ディレクトリで検証する。 +- Claude settingsのmerge結果をfixture化する。 +- Nix/Home Managerとchezmoiのtarget交差検査を追加する。 -### Phase 2: live-edit 系の移譲 +### Phase 1: NixOS-WSL -書き戻し・churn 系を chezmoi の symlink stub(モード B)へ。P1 の junction 方式が前提。 +実装済み。`nixosConfigurations.wsl`と`nix-configs/home-wsl.nix`を入口とする。 -- nvim / lazygit / zsh / fcitx5 / codex / gitconfig / claude skills を `symlink_`(実体は plain ツリー)へ。 -- NixOS の out-of-store symlink(`mkOutOfStoreSymlink`)を chezmoi 由来へ置換。live-edit・rebuild 不要の性質は維持。 -- codex config は `private_`(必要なら `encrypted_`)で権限/秘匿を再現。 +- `nixos-wsl` inputと`nixosConfigurations.wsl`を追加する。 +- usernameとhome directoryをホスト引数化する。 +- desktopを含まないHome Manager profileを作る。 +- `/etc/wsl.conf`とWindows interopをNixで管理する。 -exit: out-of-store 群が chezmoi 所有へ移行。両 OS で live-edit が rebuild なしに効くことを確認。 +### Phase 2: Windows -### Phase 3: Maximal 化(NixOS 最低限) +- `setup_windows.ps1`のリンク表をchezmoiへ段階移行する。 +- PowerShell、komorebi、YASB、whkd、cavaを`mutable/windows`へ移す。 +- Windows LazyVimを`mutable/windows/nvim`へ移す。 +- `setup_windows.ps1`をchezmoi bootstrapだけへ縮小する。 -- `xdg.nix` の dotfile-link 定義を削除し、HM は package / service / systemd / system のみへ縮小。 -- niri / waybar / swaync は **Nix 据え置き**(per-host monitor / palette / keyboard を Nix が握るため)。`.chezmoiignore` で chezmoi 対象外に。 -- 旧 contract / 暫定 checker 案を破棄。 +### Phase 3: NixOS nixvim -exit: NixOS の dotfiles 配置が chezmoi 一本化(Nix 生成必須の Linux desktop を除く)。 +- `feat/nixvim`の機能対応表を作る。 +- nixvim modulesを現行`master`へ再移植する。 +- NixOSだけでnixvimをimportする。 +- LazyVim依存のLinux側linkを撤去する。 -## ファイル別 所有 / モード対応 +### Phase 4: 共有設定 -| 対象 | OS | 現状 | 移行先所有 | モード | Phase | -|------|----|------|-----------|--------|-------| -| claude settings.json | both | activation/PS マージ | chezmoi | C template | 1 | -| starship / fastfetch / vim / wezterm / yazi | both | HM in-store | chezmoi | A copy | 1 | -| komorebi / yasb / whkd / cava / powershell / mise / ccwin | windows | PS リンク表 | chezmoi | A/B | 1 | -| nvim / lazygit / gitconfig / claude skills | both | HM out-of-store | chezmoi | B symlink | 2 | -| zsh rc / fcitx5 config | linux | HM out-of-store | chezmoi | B symlink | 2 | -| codex config.toml | both | HM out-of-store | chezmoi | B symlink + private_ | 2 | -| niri / waybar / swaync | linux | Nix template | **Nix 据え置き** | — | — | -| package / service / system | linux | Nix | **Nix 据え置き** | — | — | +- Starship、Fastfetch、Git、Yazi、Lazygit、WezTermの順にchezmoiへ移す。 +- 書き戻し対象だけを`mutable/shared`へ置く。 +- Home Managerの`xdg.configFile`と`home.file`を対象ごとに縮小する。 -## 判断 +### Phase 5: 整理 -chezmoi を採用することで、Windows / NixOS の dotfiles 配置を単一の applier に統一できる。独自契約 + PowerShell executor を実装・保守する必要がなくなり、OS 差分は chezmoi の template と ignore に集約される。NixOS は最終的に Nix にしかできない領域(package / service / profile + Nix 生成必須の Linux desktop)に専念し、dotfiles 配置からは撤退する。 +- Claude settings生成のNix/PowerShell二重実装をchezmoi templateへ統合する。 +- 存在しないsourceを参照する旧Windows設定を削除する。 +- bootstrap、README、keybinding documentationを更新する。 -ただし独立レビュー(Codex)の指摘どおり、既存 NixOS の out-of-store/in-store 二層戦略は成熟しており、一気に捨てるのはリスクが高い。よって **Maximal を最終形に据えつつ、Hybrid 起点で段階移行**する。先行 PoC(Windows link / Claude fixture / path 交差 CI / chezmoiroot×include)で危険な前提を潰してから着手する。 +## 検証 -## 設計の深掘り +```sh +just chezmoi-check +just syntax +just ci +``` -取りうる設計とトレードオフ(適用モデルの 3 分岐、Nix との責務境界、HM との衝突回避、共有データの扱いなど)は `windows-nixos-dotfiles-design-options.md` に分離して整理する。 +移行中も既存環境へ直接applyするテストは行わず、一時HOMEまたはdry-runで確認してから実機へ適用する。 From 6d2cfb477b8ea43c14eeb564e43c0b96cf42e69d Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Thu, 23 Jul 2026 22:07:21 +0900 Subject: [PATCH 06/35] =?UTF-8?q?=F0=9F=94=A5=20claudex=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .config/nixos/zsh/rc/alias.zsh | 4 - .config/nixos/zsh/rc/functions/cx | 31 --- .config/nixos/zsh/rc/functions/cx-account | 199 ------------------ .../nixos/zsh/rc/tests/cx-account.test.zsh | 76 ------- .config/shared/claudex/config.toml | 27 --- flake.lock | 18 -- flake.nix | 8 +- nix-configs/home/packages/llm.nix | 6 +- nix-configs/home/xdg.nix | 1 - .../pkgs/claudex/oauth-keyring-fallback.patch | 32 --- nix-configs/pkgs/claudex/package.nix | 32 --- .../pkgs/claudex/reasoning-effort.patch | 76 ------- 12 files changed, 2 insertions(+), 508 deletions(-) delete mode 100644 .config/nixos/zsh/rc/functions/cx delete mode 100644 .config/nixos/zsh/rc/functions/cx-account delete mode 100644 .config/nixos/zsh/rc/tests/cx-account.test.zsh delete mode 100644 .config/shared/claudex/config.toml delete mode 100644 nix-configs/pkgs/claudex/oauth-keyring-fallback.patch delete mode 100644 nix-configs/pkgs/claudex/package.nix delete mode 100644 nix-configs/pkgs/claudex/reasoning-effort.patch diff --git a/.config/nixos/zsh/rc/alias.zsh b/.config/nixos/zsh/rc/alias.zsh index 2524a7a..b88ef25 100644 --- a/.config/nixos/zsh/rc/alias.zsh +++ b/.config/nixos/zsh/rc/alias.zsh @@ -29,10 +29,6 @@ fi alias lg='lazygit' alias ff='fastfetch' alias y='yy' -# 旧 `cx` エイリアスが読み込まれたままの既存シェルでも、関数版へ移行する。 -unalias cx 2>/dev/null -alias cxa='cx-account' - function open { local target="${1:-.}" diff --git a/.config/nixos/zsh/rc/functions/cx b/.config/nixos/zsh/rc/functions/cx deleted file mode 100644 index 2195f06..0000000 --- a/.config/nixos/zsh/rc/functions/cx +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env zsh -# 登録済みのアカウント名を最初の引数にすると、切り替えてから従来の cx を実行する。 - -emulate -L zsh - -local state_dir="${CLAUDEX_ACCOUNTS_DIR:-${XDG_STATE_HOME:-$HOME/.local/state}/claudex/accounts}" -local current_file="$state_dir/current" -local profile='' - -case "${1:-}" in - school | mitou) - profile="$1" - cx-account use "$profile" || return - shift - ;; - *) - if [[ -r "$current_file" ]]; then - profile=$(<"$current_file") - fi - case "$profile" in - school | mitou) ;; - *) - print -u2 'Usage: cx [school|mitou] [Claude Code の引数...]' - print -u2 '初回は cx-account login school または cx-account login mitou を実行してください。' - return 2 - ;; - esac - ;; -esac - -claudex run "$profile" -m opus -- --dangerously-skip-permissions "$@" diff --git a/.config/nixos/zsh/rc/functions/cx-account b/.config/nixos/zsh/rc/functions/cx-account deleted file mode 100644 index 65c95ca..0000000 --- a/.config/nixos/zsh/rc/functions/cx-account +++ /dev/null @@ -1,199 +0,0 @@ -#!/usr/bin/env zsh -# ChatGPT/Codex OAuth は Claudex の profile ごとではなく ~/.codex/auth.json に -# 保存される。その認証情報をアカウント名ごとに退避して、原子的に切り替える。 - -emulate -L zsh -setopt pipefail - -local command_name='cx-account' -local action="${1:-}" -local account="${2:-}" -local state_dir="${CLAUDEX_ACCOUNTS_DIR:-${XDG_STATE_HOME:-$HOME/.local/state}/claudex/accounts}" -local auth_file="${CLAUDEX_ACCOUNT_AUTH_FILE:-${CODEX_HOME:-$HOME/.codex}/auth.json}" -local current_file="$state_dir/current" - -function _cx_account_usage { - print -u2 "Usage: $command_name {login|use|list} [account] [--headless]" - print -u2 ' login [--headless] ブラウザで認証し、認証情報を保存する' - print -u2 ' use 保存済みアカウントへ切り替える' - print -u2 ' list 保存済みアカウントを表示する' -} - -function _cx_account_valid_name { - [[ "$1" =~ '^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$' ]] -} - -function _cx_account_prepare_state_dir { - mkdir -p -- "$state_dir" && chmod 700 -- "$state_dir" -} - -function _cx_account_save_auth { - local name="$1" - local source="$2" - local target="$state_dir/$name.json" - local temporary - - [[ -s "$source" ]] || return 1 - temporary=$(mktemp "$state_dir/.${name}.json.XXXXXX") || return 1 - if ! cp -- "$source" "$temporary" || ! chmod 600 -- "$temporary" || ! mv -f -- "$temporary" "$target"; then - rm -f -- "$temporary" - return 1 - fi -} - -function _cx_account_write_current { - local name="$1" - local temporary - - temporary=$(mktemp "$state_dir/.current.XXXXXX") || return 1 - if ! print -r -- "$name" >"$temporary" || ! chmod 600 -- "$temporary" || ! mv -f -- "$temporary" "$current_file"; then - rm -f -- "$temporary" - return 1 - fi -} - -function _cx_account_backup_current { - local current='' - local recovered_name - - [[ -s "$auth_file" ]] || return 0 - if [[ -r "$current_file" ]]; then - current=$(<"$current_file") - fi - - if _cx_account_valid_name "$current"; then - _cx_account_save_auth "$current" "$auth_file" - return - fi - - recovered_name="recovered-$(date +%Y%m%d-%H%M%S)" - _cx_account_save_auth "$recovered_name" "$auth_file" || return - print -u2 "$command_name: 現在の認証情報を $recovered_name として退避しました" -} - -case "$action" in - list) - if (( $# != 1 )); then - _cx_account_usage - return 2 - fi - - local file name current='' - local found=0 - [[ -r "$current_file" ]] && current=$(<"$current_file") - for file in "$state_dir"/*.json(N); do - name="${${file:t}%.json}" - if [[ "$name" == "$current" ]]; then - print -- "* $name" - else - print -- " $name" - fi - found=1 - done - (( found )) || print '保存済みアカウントはありません。cx-account login で追加してください。' - ;; - - use) - if (( $# != 2 )) || ! _cx_account_valid_name "$account"; then - _cx_account_usage - return 2 - fi - - local saved_auth="$state_dir/$account.json" - local temporary - if [[ ! -s "$saved_auth" ]]; then - print -u2 "$command_name: $account は未登録です。cx-account login $account を実行してください" - return 1 - fi - _cx_account_prepare_state_dir || return - _cx_account_backup_current || { - print -u2 "$command_name: 現在の認証情報を退避できないため切り替えません" - return 1 - } - mkdir -p -- "${auth_file:h}" || return - temporary=$(mktemp "${auth_file:h}/.auth.json.XXXXXX") || return - if ! cp -- "$saved_auth" "$temporary" || ! chmod 600 -- "$temporary" || ! mv -f -- "$temporary" "$auth_file"; then - rm -f -- "$temporary" - print -u2 "$command_name: 認証情報の切り替えに失敗しました" - return 1 - fi - if ! _cx_account_write_current "$account"; then - print -u2 "$command_name: 認証情報は切り替わりましたが、現在アカウントの記録に失敗しました" - return 1 - fi - print "ChatGPT アカウントを $account に切り替えました" - ;; - - login) - if (( $# != 2 && $# != 3 )) || ! _cx_account_valid_name "$account" || [[ "${3:-}" != '' && "${3:-}" != '--headless' ]]; then - _cx_account_usage - return 2 - fi - if ! command -v claudex >/dev/null 2>&1; then - print -u2 "$command_name: claudex が見つかりません" - return 127 - fi - _cx_account_prepare_state_dir || return - mkdir -p -- "${auth_file:h}" || return - local before_login='' - local before_auth_inode='' - if [[ -e "$auth_file" ]]; then - before_auth_inode=$(stat -c '%i' -- "$auth_file") || return - before_login=$(mktemp "${auth_file:h}/.auth.json.before-login.XXXXXX") || return - if ! cp -- "$auth_file" "$before_login" || ! chmod 600 -- "$before_login"; then - rm -f -- "$before_login" - return 1 - fi - _cx_account_backup_current || { - rm -f -- "$before_login" - print -u2 "$command_name: 現在の認証情報を退避できないためログインを開始しません" - return 1 - } - fi - - local -a login_args=(auth login chatgpt --profile "$account" --force) - [[ "${3:-}" == '--headless' ]] && login_args+=(--headless) - local login_status=0 - local auth_updated=0 - local after_auth_inode='' - claudex "${login_args[@]}" - login_status=$? - if [[ -s "$auth_file" ]]; then - after_auth_inode=$(stat -c '%i' -- "$auth_file") || return - if [[ -z "$before_login" ]] || ! cmp -s -- "$before_login" "$auth_file" || [[ "$before_auth_inode" != "$after_auth_inode" ]]; then - auth_updated=1 - fi - fi - if (( login_status != 0 && ! auth_updated )); then - if [[ -n "$before_login" ]]; then - mv -f -- "$before_login" "$auth_file" - fi - print -u2 "$command_name: ログインに失敗したため、以前の認証情報を復元しました" - return 1 - fi - if (( login_status != 0 )); then - print -u2 "$command_name: Claudex はエラー終了しましたが、認証情報が更新されているため続行します" - fi - if [[ ! -s "$auth_file" ]]; then - [[ -n "$before_login" ]] && mv -f -- "$before_login" "$auth_file" - print -u2 "$command_name: ログイン後の認証情報を確認できなかったため、以前の認証情報を復元しました" - return 1 - fi - if ! _cx_account_save_auth "$account" "$auth_file"; then - [[ -n "$before_login" ]] && mv -f -- "$before_login" "$auth_file" - print -u2 "$command_name: 認証情報の保存に失敗したため、以前の認証情報を復元しました" - return 1 - fi - rm -f -- "$before_login" - if ! _cx_account_write_current "$account"; then - print -u2 "$command_name: 認証情報は保存されましたが、現在アカウントの記録に失敗しました" - return 1 - fi - print "ChatGPT アカウント $account を保存しました" - ;; - - *) - _cx_account_usage - return 2 - ;; -esac diff --git a/.config/nixos/zsh/rc/tests/cx-account.test.zsh b/.config/nixos/zsh/rc/tests/cx-account.test.zsh deleted file mode 100644 index 2095881..0000000 --- a/.config/nixos/zsh/rc/tests/cx-account.test.zsh +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env zsh - -emulate -L zsh -setopt errexit nounset pipefail - -local root="${0:A:h:h}" -local temporary -temporary=$(mktemp -d) || exit 1 -trap 'rm -rf -- "$temporary"' EXIT - -export HOME="$temporary/home" -export XDG_STATE_HOME="$temporary/state" -export CLAUDEX_ACCOUNT_AUTH_FILE="$temporary/codex/auth.json" -mkdir -p "${CLAUDEX_ACCOUNT_AUTH_FILE:h}" - -fpath=("$root/functions" $fpath) -autoload -Uz cx cx-account - -function assert_file_contains { - [[ $(<"$2") == "$1" ]] -} - -function claudex { - print -r -- 'school-token' >"$CLAUDEX_ACCOUNT_AUTH_FILE" -} - -cx-account login school --headless >/dev/null -assert_file_contains 'school-token' "$XDG_STATE_HOME/claudex/accounts/school.json" -[[ $(stat -c '%a' "$XDG_STATE_HOME/claudex/accounts") == 700 ]] -[[ $(stat -c '%a' "$XDG_STATE_HOME/claudex/accounts/school.json") == 600 ]] - -print -r -- 'mitou-token' >"$XDG_STATE_HOME/claudex/accounts/mitou.json" -print -r -- 'school-token-updated' >"$CLAUDEX_ACCOUNT_AUTH_FILE" -cx-account use mitou >/dev/null -assert_file_contains 'mitou-token' "$CLAUDEX_ACCOUNT_AUTH_FILE" -assert_file_contains 'school-token-updated' "$XDG_STATE_HOME/claudex/accounts/school.json" - -print -r -- 'previous-token' >"$CLAUDEX_ACCOUNT_AUTH_FILE" -function claudex { return 1 } -if cx-account login school --headless >/dev/null 2>&1; then - print -u2 'cx-account login unexpectedly succeeded without an updated auth file' - exit 1 -fi -assert_file_contains 'previous-token' "$CLAUDEX_ACCOUNT_AUTH_FILE" - -function claudex { - local replacement - replacement=$(mktemp "${CLAUDEX_ACCOUNT_AUTH_FILE:h}/.auth.json.XXXXXX") - print -r -- 'previous-token' >"$replacement" - mv -- "$replacement" "$CLAUDEX_ACCOUNT_AUTH_FILE" - return 1 -} -cx-account login school --headless >/dev/null -assert_file_contains 'previous-token' "$XDG_STATE_HOME/claudex/accounts/school.json" - -function claudex { - print -r -- 'school-token-from-failed-keyring-save' >"$CLAUDEX_ACCOUNT_AUTH_FILE" - return 1 -} -cx-account login school --headless >/dev/null -assert_file_contains 'school-token-from-failed-keyring-save' "$CLAUDEX_ACCOUNT_AUTH_FILE" -assert_file_contains 'school-token-from-failed-keyring-save' "$XDG_STATE_HOME/claudex/accounts/school.json" - -typeset -ga claudex_args -function claudex { claudex_args=("$@") } -cx school 'continue from here' >/dev/null -[[ "${claudex_args[1]} ${claudex_args[2]} ${claudex_args[3]}" == 'run school -m' ]] -[[ "${claudex_args[-1]}" == 'continue from here' ]] - -rm -- "$XDG_STATE_HOME/claudex/accounts/current" -if cx >/dev/null 2>&1; then - print -u2 'cx without a selected account unexpectedly succeeded' - exit 1 -fi - -print 'cx-account tests passed' diff --git a/.config/shared/claudex/config.toml b/.config/shared/claudex/config.toml deleted file mode 100644 index 36b39fd..0000000 --- a/.config/shared/claudex/config.toml +++ /dev/null @@ -1,27 +0,0 @@ -[[profiles]] -name = "school" -provider_type = "OpenAIResponses" -base_url = "https://chatgpt.com/backend-api/codex" -default_model = "gpt-5.6-terra" -reasoning_effort = "high" -auth_type = "oauth" -oauth_provider = "openai" - -[profiles.models] -haiku = "gpt-5.6-luna" -sonnet = "gpt-5.6-luna" -opus = "gpt-5.6-terra" - -[[profiles]] -name = "mitou" -provider_type = "OpenAIResponses" -base_url = "https://chatgpt.com/backend-api/codex" -default_model = "gpt-5.6-terra" -reasoning_effort = "high" -auth_type = "oauth" -oauth_provider = "openai" - -[profiles.models] -haiku = "gpt-5.6-luna" -sonnet = "gpt-5.6-luna" -opus = "gpt-5.6-terra" diff --git a/flake.lock b/flake.lock index a574c64..a964f0f 100644 --- a/flake.lock +++ b/flake.lock @@ -33,23 +33,6 @@ "type": "github" } }, - "claudex": { - "flake": false, - "locked": { - "lastModified": 1772183396, - "narHash": "sha256-YRsSUzrElmsBVTfUrP5iVtbCH6UA/oE+tP60juAf4zg=", - "owner": "StringKe", - "repo": "claudex", - "rev": "a1eb95957e71ab85d91aae8cdc3b7bb78bd4e9ea", - "type": "github" - }, - "original": { - "owner": "StringKe", - "ref": "v0.2.4", - "repo": "claudex", - "type": "github" - } - }, "codex-desktop-linux": { "inputs": { "flake-utils": "flake-utils", @@ -407,7 +390,6 @@ }, "root": { "inputs": { - "claudex": "claudex", "codex-desktop-linux": "codex-desktop-linux", "home-manager": "home-manager", "lanzaboote": "lanzaboote", diff --git a/flake.nix b/flake.nix index 21bd40b..3953a72 100644 --- a/flake.nix +++ b/flake.nix @@ -28,11 +28,6 @@ llm-agents.url = "github:numtide/llm-agents.nix"; - claudex = { - url = "github:StringKe/claudex/v0.2.4"; - flake = false; - }; - codex-desktop-linux.url = "github:ilysenko/codex-desktop-linux"; spotify-cli = { @@ -62,7 +57,6 @@ vicinae, lanzaboote, llm-agents, - claudex, nixos-loading-plymouth, spotify-cli, codex-desktop-linux, @@ -125,7 +119,7 @@ useUserPackages = true; backupFileExtension = "hm-backup"; extraSpecialArgs = { - inherit claudex dotfilesDir editor homeDirectory keyboardLayout llm-agents username; + inherit dotfilesDir editor homeDirectory keyboardLayout llm-agents username; }; sharedModules = sharedHomeModules; users.${username} = import homeConfiguration; diff --git a/nix-configs/home/packages/llm.nix b/nix-configs/home/packages/llm.nix index 6ca704e..ccb5ee7 100644 --- a/nix-configs/home/packages/llm.nix +++ b/nix-configs/home/packages/llm.nix @@ -1,14 +1,10 @@ { - claudex, llm-agents, pkgs, ... -}: let - claudexPackage = pkgs.callPackage ../../pkgs/claudex/package.nix {src = claudex;}; -in { +}: { home.packages = with llm-agents.packages.${pkgs.system}; [ claude-code - claudexPackage codex opencode apm diff --git a/nix-configs/home/xdg.nix b/nix-configs/home/xdg.nix index 788982c..469138d 100644 --- a/nix-configs/home/xdg.nix +++ b/nix-configs/home/xdg.nix @@ -62,7 +62,6 @@ in { "mimeapps.list".force = true; # in-store: プログラムが書き込まない静的設定。 "fastfetch".source = store ".config/shared/fastfetch"; - "claudex/config.toml".source = link ".config/shared/claudex/config.toml"; # profile の追加・更新を claudex から行う "starship.toml".source = store ".config/shared/starship.toml"; "vim".source = store ".config/shared/vim"; "wezterm".source = store ".config/shared/wezterm"; diff --git a/nix-configs/pkgs/claudex/oauth-keyring-fallback.patch b/nix-configs/pkgs/claudex/oauth-keyring-fallback.patch deleted file mode 100644 index 6258e54..0000000 --- a/nix-configs/pkgs/claudex/oauth-keyring-fallback.patch +++ /dev/null @@ -1,32 +0,0 @@ -diff --git a/src/oauth/providers.rs b/src/oauth/providers.rs -index 9611b9f..a7cad6a 100644 ---- a/src/oauth/providers.rs -+++ b/src/oauth/providers.rs -@@ -258,8 +258,12 @@ async fn login_chatgpt_browser(profile_name: &str) -> Result<()> { - .await?; - - // 存储到 keyring 并回写 ~/.codex/auth.json -- super::source::store_keyring(profile_name, &token)?; - super::source::write_codex_credentials_atomic(&token)?; -+ if let Err(err) = super::source::store_keyring(profile_name, &token) { -+ tracing::warn!( -+ "failed to store ChatGPT OAuth token in keyring for profile '{profile_name}': {err}" -+ ); -+ } - - println!("ChatGPT OAuth token stored for profile '{profile_name}'."); - Ok(()) -@@ -287,8 +291,12 @@ async fn login_chatgpt_headless(profile_name: &str) -> Result<()> { - ) - .await?; - -- super::source::store_keyring(profile_name, &token)?; - super::source::write_codex_credentials_atomic(&token)?; -+ if let Err(err) = super::source::store_keyring(profile_name, &token) { -+ tracing::warn!( -+ "failed to store ChatGPT OAuth token in keyring for profile '{profile_name}': {err}" -+ ); -+ } - - println!("ChatGPT OAuth token stored for profile '{profile_name}'."); - Ok(()) diff --git a/nix-configs/pkgs/claudex/package.nix b/nix-configs/pkgs/claudex/package.nix deleted file mode 100644 index 7b08c3f..0000000 --- a/nix-configs/pkgs/claudex/package.nix +++ /dev/null @@ -1,32 +0,0 @@ -{ - applyPatches, - cacert, - lib, - rustPlatform, - src, -}: -rustPlatform.buildRustPackage { - pname = "claudex"; - version = "0.2.4"; - - src = applyPatches { - inherit src; - name = "claudex-source"; - patches = [ - ./reasoning-effort.patch - ./oauth-keyring-fallback.patch - ]; - }; - - cargoHash = "sha256-10Mmiofblkrc7DVw6y2U+odeue0Mv1UuLNHy4ClV91o="; - - SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt"; - - meta = { - description = "Multi-instance Claude Code manager with an AI-provider translation proxy"; - homepage = "https://claudex.space"; - license = lib.licenses.mit; - mainProgram = "claudex"; - platforms = lib.platforms.linux; - }; -} diff --git a/nix-configs/pkgs/claudex/reasoning-effort.patch b/nix-configs/pkgs/claudex/reasoning-effort.patch deleted file mode 100644 index c9e2509..0000000 --- a/nix-configs/pkgs/claudex/reasoning-effort.patch +++ /dev/null @@ -1,76 +0,0 @@ -diff --git a/src/config/mod.rs b/src/config/mod.rs -index 0c01f80..d02b1d6 100644 ---- a/src/config/mod.rs -+++ b/src/config/mod.rs -@@ -119,6 +119,9 @@ pub struct ProfileConfig { - /// 最大输出 token 数上限(可选,用于限制转发给 provider 的 max_tokens) - #[serde(default)] - pub max_tokens: Option, -+ /// OpenAI Responses API の reasoning effort(例: "high") -+ #[serde(default)] -+ pub reasoning_effort: Option, - /// 从翻译后的请求体中剥离的参数名列表 - /// 用于处理上游端点不支持某些参数的情况(如 Codex ChatGPT 不支持 temperature) - /// 设为 "auto" 时根据 base_url 自动推断 -@@ -218,6 +221,7 @@ impl Default for ProfileConfig { - oauth_provider: None, - models: ProfileModels::default(), - max_tokens: None, -+ reasoning_effort: None, - strip_params: StripParams::default(), - query_params: HashMap::new(), - } -diff --git a/src/proxy/adapter/responses.rs b/src/proxy/adapter/responses.rs -index 9d71b8e..51430b5 100644 ---- a/src/proxy/adapter/responses.rs -+++ b/src/proxy/adapter/responses.rs -@@ -1,6 +1,6 @@ - use anyhow::Result; - use reqwest::RequestBuilder; --use serde_json::Value; -+use serde_json::{json, Value}; - - use super::{ByteStream, ProviderAdapter, TranslatedRequest}; - use crate::config::ProfileConfig; -@@ -18,11 +18,14 @@ impl ProviderAdapter for ResponsesAdapter { - body: &Value, - profile: &ProfileConfig, - ) -> Result { -- let (responses_body, tool_name_map) = -+ let (mut responses_body, tool_name_map) = - crate::proxy::translate::responses::anthropic_to_responses( - body, - &profile.default_model, - )?; -+ if let Some(effort) = &profile.reasoning_effort { -+ responses_body["reasoning"] = json!({ "effort": effort }); -+ } - Ok(TranslatedRequest { - body: responses_body, - tool_name_map, -@@ -57,3 +60,25 @@ impl ProviderAdapter for ResponsesAdapter { - crate::proxy::translate::responses_stream::translate_responses_stream(stream, tool_name_map) - } - } -+ -+#[cfg(test)] -+mod tests { -+ use super::*; -+ use crate::config::ProfileConfig; -+ -+ #[test] -+ fn test_reasoning_effort_is_added_to_responses_request() { -+ let profile = ProfileConfig { -+ default_model: "gpt-5.6-terra".to_string(), -+ reasoning_effort: Some("high".to_string()), -+ ..Default::default() -+ }; -+ let body = serde_json::json!({ -+ "messages": [{"role": "user", "content": "Hello"}], -+ }); -+ -+ let translated = ResponsesAdapter.translate_request(&body, &profile).unwrap(); -+ -+ assert_eq!(translated.body["reasoning"], json!({ "effort": "high" })); -+ } -+} From 751931b5aef665b6e08a8f9bd9e6fad19a2339d9 Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Thu, 23 Jul 2026 22:07:36 +0900 Subject: [PATCH 07/35] =?UTF-8?q?=F0=9F=94=A5=20=E8=A6=8B=E3=81=A6?= =?UTF-8?q?=E3=81=AA=E3=81=84docs=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/keybindings/komorebi.md | 115 ------------------------- docs/keybindings/niri.md | 159 ----------------------------------- 2 files changed, 274 deletions(-) delete mode 100644 docs/keybindings/komorebi.md delete mode 100644 docs/keybindings/niri.md diff --git a/docs/keybindings/komorebi.md b/docs/keybindings/komorebi.md deleted file mode 100644 index dfb8a2a..0000000 --- a/docs/keybindings/komorebi.md +++ /dev/null @@ -1,115 +0,0 @@ -# komorebi + whkd キーバインド - -設定ファイル: [`.config/windows/whkdrc`](../../.config/windows/whkdrc) / [`.config/windows/komorebi/komorebi.json`](../../.config/windows/komorebi/komorebi.json) - -前提: - -- シェルは `powershell` -- `Win` = Windows キー - -## ワークスペース構成 - -`Win+1/2/3` は **フォーカス中モニターのみ** を切り替える (`focus-workspace` 単数形)。 -`Win+F1/F2/F3` は **M1 へフォーカスを移しつつ** IV/V/VI に切り替える (`focus-monitor-workspace 1 N`)。 - -| Index | M0 `CMN1556` (メイン) | M1 `DELF144` (拡張) | -|---|---|---| -| 0 (`Win+1` / `Win+F1`) | **I** / BSP — WezTerm | **IV** / BSP — VSCode, Zed, Brave (プライベート) | -| 1 (`Win+2` / `Win+F2`) | **II** / Grid — Discord | **V** / BSP — Chrome (ビジネス) | -| 2 (`Win+3` / `Win+F3`) | **III** / Columns — Slack, Spotify | **VI** / BSP — Mattermost | - -> `Win+F1/F2/F3` はモニターをまたいで M1 側の作業に直接ジャンプしたい時に使う。M0 を見たまま M1 側だけ切り替えたい場合は使えない (フォーカスが M1 に移る)。 - -### 配置ポリシー - -- **M0 = コミュニケーション・開発端末** - - I: ターミナル作業 (WezTerm) - - II: 通話・チャット (Discord) - - III: ワークチャット系 + BGM (Slack, Spotify) -- **M1 = 広い作業領域** - - IV: コーディング + プライベートブラウジング (VSCode, Zed, Brave) - - V: ビジネス用ブラウジング (Chrome) - - VI: ビジネスチャット専用 (Mattermost) -- **ブラウザの役割分担** - - **Brave = プライベート**: 私用閲覧・SNS・動画・課金記事の送り込み防止 - - **Chrome = ビジネス**: Google Workspace, 業務ツール, 顧客サービス - -ワークスペース名は `I, II, III` (M0) と `IV, V, VI` (M1) で連番。`Win+3` を押した時に表示される名前 (III or VI) で、どちらのモニターを操作中か即時に判別できる。 - -### 起動スクリプト - -pwsh 起動時 ([`.config/windows/powershell/conf.d/startup.ps1`](../../.config/windows/powershell/conf.d/startup.ps1)) に komorebi が未起動なら [`.config/windows/komorebi/komorebi_start.ps1`](../../.config/windows/komorebi/komorebi_start.ps1) が走り、モニター適応 → komorebi/whkd 起動 → [`morning_setup.ps1`](../../.config/windows/komorebi/morning_setup.ps1) による常用アプリ一括起動まで一気通貫で行う (`workspace_rules` が配置を担当)。2 回目以降の pwsh タブ起動では komorebi の生存を socket 応答で確認し、何もしない。 - -## 基本 - -| キー | 動作 | -| --- | --- | -| `Win+r` | 設定の再読込 | -| `Win+/` | whkd のショートカット一覧を表示 | -| `Win+q` | ウィンドウを閉じる | -| `Win+m` | ウィンドウを最小化 | -| `Win+t` | フローティング切替 | -| `Win+Shift+f` | モノクル (最大化) 切替 | -| `Win+z` | komorebi の一時停止トグル | - -## レイアウト - -| キー | 動作 | -| --- | --- | -| `Win+x` | 水平方向にフリップ | -| `Win+y` | 垂直方向にフリップ | - -## フォーカス移動 - -ワークスペース内に閉じた方向フォーカス。 - -| キー | 動作 | -| --- | --- | -| `Win+←` / `Win+↓` / `Win+↑` / `Win+→` | 左 / 下 / 上 / 右のウィンドウにフォーカス | -| `Win+Shift+[` | 前のウィンドウへ (`cycle-focus previous`) | -| `Win+Shift+]` | 次のウィンドウへ (`cycle-focus next`) | - -> `cross_boundary_behaviour: "Workspace"` によりフォーカス移動は同一ワークスペース内に閉じる。モニター切替は `Win+,` / `Win+.` を使う。 -> -> 注: `Win+u/i/o/p` は方向フォーカスではなく `preselect-direction` (次に開くウィンドウの配置先指定)。 - -## ウィンドウ移動 - -| キー | 動作 | -| --- | --- | -| `Win+Shift+u` / `i` / `o` / `p` | 左 / 下 / 上 / 右へ移動 | -| `Win+Shift+Enter` | プロモート (マスター位置へ) | - -## スタック - -| キー | 動作 | -| --- | --- | -| `Win+;` | スタックを解除 | -| `Win+[` / `Win+]` | スタック内の前 / 次 | - -> 方向キーによるスタック作成 (`komorebic stack `) は廃止し、`Win+←/↓/↑/→` はフォーカス移動に再割り当て。スタックを組みたい場合は CLI から `komorebic stack ` を直接実行する (現状 `window_container_behaviour: "Create"` のため `move` ではスタックにならない点に注意)。 - -## リサイズ - -| キー | 動作 | -| --- | --- | -| `Win++` / `Win+-` | 水平方向に拡大 / 縮小 | -| `Win+Shift++` / `Win+Shift+-` | 垂直方向に拡大 / 縮小 | - -## ワークスペース - -| キー | 動作 | -| --- | --- | -| `Win+1`〜`Win+3` | フォーカス中モニターのワークスペース 0〜2 にフォーカス | -| `Win+F1`〜`Win+F3` | M1 へフォーカスを移しつつ M1 のワークスペース 0〜2 (IV/V/VI) に切替 | -| `Win+Alt+1`〜`Win+Alt+3` | アクティブウィンドウをフォーカス中モニターのワークスペース 0〜2 へ移動 | - -## マルチモニター - -| キー | 動作 | -| --- | --- | -| `Win+,` | モニター 0 (メイン: WezTerm / Discord / Slack+Spotify) | -| `Win+.` | モニター 1 (拡張: VSCode+Zed+Brave / Chrome / Mattermost) | -| `Win+Shift+,` / `Win+Shift+.` | ウィンドウをモニター 0 / 1 へ移動 | -| `Win+n` | 次のモニターへ | -| `Win+Shift+n` | 前のモニターへ | diff --git a/docs/keybindings/niri.md b/docs/keybindings/niri.md deleted file mode 100644 index 584cb4a..0000000 --- a/docs/keybindings/niri.md +++ /dev/null @@ -1,159 +0,0 @@ -# niri キーバインド - -設定ファイル: [`nix-configs/home/niri-keybind.nix`](../../nix-configs/home/niri-keybind.nix) - -`Win` は niri 設定上の `Mod` キーです。 - -## niri の見方 - -niri はスクロール型タイルの Wayland compositor です。画面を固定分割するのではなく、ウィンドウを横方向の列として並べ、必要に応じて左右へスクロールしながら使います。 - -| 概念 | 説明 | この設定での主な操作 | -| --- | --- | --- | -| 列 | ウィンドウを置く横方向の単位。列は左右へ並ぶ | `Win+H/L`, `Win+←/→`, `Win+Ctrl+←/→` | -| 列内のウィンドウ | 1 つの列に複数ウィンドウを上下へ積める | `Win+Ctrl+↑/↓` | -| ワークスペース | 作業単位。niri では上下方向に並ぶ | `Win+J/K`, `Win+1` - `Win+9` | -| モニター | 各モニターが独立したワークスペース群を持つ | `Win+Shift+H/L`, `Win+Ctrl+H/L` | -| レイアウト | 列幅、中央寄せ、最大化、フルスクリーンを調整する | `Win+R/F/C`, `Win+-/=`, `Win+Shift+F` | - -## niri の WM 機能 - -- **スクロール型タイル**: ウィンドウは横方向へ伸びる列として管理されます。新しいウィンドウを開いても、既存のウィンドウ全体を毎回小さく分割する使い方ではありません。 -- **列ベースの操作**: 左右は「列」の移動、上下矢印は「今のウィンドウを上下のワークスペースへ送る」操作として考えると整理しやすいです。ワークスペースの表示先は `J/K` または数字キーで選びます。 -- **動的ワークスペース**: ワークスペースは必要に応じて増減します。作業内容ごとに上下へ分けるイメージです。 -- **モニターごとの独立性**: 複数モニターでは、それぞれのモニターが独立したワークスペースを持ちます。ウィンドウを別モニターへ送る操作は明示的に行います。 -- **列幅の調整**: プリセット幅の切り替え、最大化、中央寄せ、幅の増減で、作業中の列を見やすい幅にできます。 -- **フルスクリーンとスクリーンショット**: WM 側の操作としてフルスクリーン切り替えとスクリーンショットが使えます。 -- **Overview**: ワークスペースとウィンドウを縮小表示して、全体を見渡しながら移動や整理ができます。 -- **設定の live reload**: `config.kdl` の設定変更を反映しながら調整できます。このリポジトリでは Home Manager から `config.kdl` を生成しています。 -- **タブ、floating**: niri 自体にはタブ化、floating window などの機能があります。この設定では Quick Shell 用の Ghostty だけを floating で開きます。 - -## 操作の覚え方 - -- `H/J/K/L`: フォーカスだけを移動 -- `←/↓/↑/→`: 今のウィンドウまたは列を伴って移動 -- 横方向: `H/L` は列フォーカス、`←/→` は列そのものを左右へ移動 -- 縦方向: `J/K` はワークスペースフォーカス、`↑/↓` は今のウィンドウを上下のワークスペースへ移動 -- `Ctrl` 付き: ウィンドウや列そのものを移動する操作 -- 数字: ワークスペースへ直接移動 - -## Overview - -`Win+D` で Overview を開くと、ワークスペースとウィンドウを縮小表示して全体を見渡せます。Overview 中も通常の niri キーバインドは有効です。この設定では `Win+H/J/K/L` を「ウィンドウを動かさない移動」、`Win+←/↓/↑/→` を「ウィンドウまたは列を伴う移動」として使います。 - -| キー | 操作 | -| --- | --- | -| `Win+D` | Overview を開く/閉じる | -| `Win+H` | 左の列へフォーカス | -| `Win+L` | 右の列へフォーカス | -| `Win+J` | 下のワークスペースへフォーカス | -| `Win+K` | 上のワークスペースへフォーカス | -| `Win+←` | 列を左へ移動 | -| `Win+→` | 列を右へ移動 | -| `Win+↓` | 今のウィンドウを下のワークスペースへ移動 | -| `Win+↑` | 今のウィンドウを上のワークスペースへ移動 | - -素の `H/J/K/L` を Overview 専用に割り当てる設定は niri にはありません。素の `H/J/K/L` を bind すると通常の文字入力にも影響するため、この設定では使いません。 - -## 起動・終了 - -| キー | 操作 | -| --- | --- | -| `Win+Enter` | WezTerm を起動 | -| `Win+Shift+Enter` | Quick Shell をトグル | -| `Win+T` | WezTerm を起動 | -| `Alt+Space` | Vicinae を開く | -| `Win+V` | クリップボード履歴を開く | -| `Win+E` | ウィンドウを閉じる | -| `Win+D` | Overview を開く/閉じる | -| `Win+Shift+E` | niri を終了 | -| `Win+Shift+P` | モニターの電源を切る | - -## Quick Shell - -`Win+Shift+Enter` は一時作業用の Ghostty をモーダル風に開きます。専用 app-id (`dev.t4ko.quickshell`) を付けて起動し、niri の通常タイル配置ではなく floating window として画面上部中央に表示します。 - -同じキーをもう一度押すと、Quick Shell が非フォーカスなら呼び戻し、フォーカス中なら閉じます。シェルは `quick-shell` という tmux セッションで動くため、ウィンドウを閉じても作業状態は残ります。シェル側で `exit` するとセッションも終了します。 - -Quick Shell 内で `quick-shell-wezterm` を実行すると、同じセッションを最後に操作した WezTerm ウィンドウの新しいタブへ引き継ぎ、モーダル側を閉じます。WezTerm が起動していない場合は、新しいウィンドウを開きます。プロンプトには通常のシェルとは別の、Quick Shell 専用 Starship 設定を使います。 - -Quick Shell がフォーカス中なら、`Win+F` でも同じ引き継ぎを実行します。それ以外のウィンドウでは、従来どおり現在の列を最大化します。 - -## フォーカス移動 - -| キー | 操作 | -| --- | --- | -| `Win+H` | 左の列へフォーカス | -| `Win+L` | 右の列へフォーカス | -| `Win+J` | 下のワークスペースへフォーカス | -| `Win+K` | 上のワークスペースへフォーカス | - -## ウィンドウ・列の移動 - -| キー | 操作 | -| --- | --- | -| `Win+←` | 列を左へ移動 | -| `Win+→` | 列を右へ移動 | -| `Win+Ctrl+←` | 列を左へ移動 | -| `Win+Ctrl+↓` | ウィンドウを下へ移動 | -| `Win+Ctrl+↑` | ウィンドウを上へ移動 | -| `Win+Ctrl+→` | 列を右へ移動 | -| `Win+Ctrl+J` | ウィンドウを下へ移動 | -| `Win+Ctrl+K` | ウィンドウを上へ移動 | - -## モニター間移動 - -| キー | 操作 | -| --- | --- | -| `Win+Shift+H` | 左のモニターへフォーカス | -| `Win+Shift+L` | 右のモニターへフォーカス | -| `Win+Ctrl+H` | ウィンドウを左のモニターへ移動 | -| `Win+Ctrl+L` | ウィンドウを右のモニターへ移動 | -| `Win+Ctrl+Shift+H` | 列ごと左のモニターへ移動 | -| `Win+Ctrl+Shift+L` | 列ごと右のモニターへ移動 | - -## ワークスペース - -| キー | 操作 | -| --- | --- | -| `Win+J` | 下のワークスペースへフォーカス | -| `Win+K` | 上のワークスペースへフォーカス | -| `Win+↓` | 今のウィンドウを下のワークスペースへ移動 | -| `Win+↑` | 今のウィンドウを上のワークスペースへ移動 | -| `Win+Ctrl+PageDown` | 列を下のワークスペースへ移動 | -| `Win+Ctrl+PageUp` | 列を上のワークスペースへ移動 | -| `Win+1` - `Win+9` | 指定したワークスペースへフォーカス | - -## レイアウト - -| キー | 操作 | -| --- | --- | -| `Win+R` | プリセット列幅を切り替え | -| `Win+F` | 列を最大化 | -| `Win+Shift+F` | フルスクリーン切り替え | -| `Win+C` | 列を中央へ配置 | -| `Win+-` | 列幅を 10% 縮小 | -| `Win+=` | 列幅を 10% 拡大 | - -## スクリーンショット - -| キー | 操作 | -| --- | --- | -| `Print` | スクリーンショット | -| `Ctrl+Print` | 画面のスクリーンショット | -| `Alt+Print` | ウィンドウのスクリーンショット | - -## 音量 - -| キー | 操作 | -| --- | --- | -| `XF86AudioRaiseVolume` | 音量を上げる | -| `XF86AudioLowerVolume` | 音量を下げる | -| `XF86AudioMute` | ミュート切り替え | -| `XF86AudioMicMute` | マイクミュート切り替え | - -## ヘルプ - -| キー | 操作 | -| --- | --- | -| `Win+Shift+/` | ホットキー一覧を表示 | From 9edd754c0d95b1402ee61a31ecbbce8f12e6f42c Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Thu, 23 Jul 2026 22:08:04 +0900 Subject: [PATCH 08/35] =?UTF-8?q?=F0=9F=94=A5=20ci:=20=E6=B4=BB=E7=94=A8?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84ci?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/benchmark-cache.yml | 310 ------------------ .../workflows/update-codex-desktop-linux.yml | 38 --- 2 files changed, 348 deletions(-) delete mode 100644 .github/workflows/benchmark-cache.yml delete mode 100644 .github/workflows/update-codex-desktop-linux.yml diff --git a/.github/workflows/benchmark-cache.yml b/.github/workflows/benchmark-cache.yml deleted file mode 100644 index 014d49e..0000000 --- a/.github/workflows/benchmark-cache.yml +++ /dev/null @@ -1,310 +0,0 @@ -# cf-edgeNix (nix.t4ko.pet) の有無で NixOS closure のビルド (nixos-rebuild の -# ビルド部分に相当) がどれだけ速くなるかを計測するベンチマーク。 -# -# シナリオ (すべて fresh runner・/nix/store キャッシュなし・同一 commit): -# 1. baseline — substituter は cache.nixos.org / numtide / vicinae のみ -# 2. edgenix-first — + https://nix.t4ko.pet (Workers Cache API はコールド想定) -# 3. edgenix-second — 同一構成を直後に再実行 (Cache API / KV / L0 ウォーム) -# -# コスト計測: 各フェーズの前後で /api/quota/metrics (5 分 cron が書く R2 使用量 -# snapshot) を取得し、R2 Class B operations の増分を比較する。 -# edgenix-second で増分が消えていれば、その差が Workers Cache API による -# R2 Class B 削減分。cron + GraphQL 集計遅延があるため取得前に 7 分待つ。 -# -# 注意: ビルド対象は checkout した working tree ではなく -# github:T4ko0522/dotfiles/ を直接参照する。flake が dotfilesDir = -# self.outPath を使っているため、working tree にベンチ用ファイルがあると -# store path が変わり publish 済み closure にヒットしなくなるため。 - -name: benchmark-cache - -on: - workflow_dispatch: - inputs: - rev: - description: "ビルド対象 commit SHA (空なら master HEAD)" - required: false - type: string - host: - description: "対象 host (laptop | desktop)" - required: false - default: laptop - type: string - -concurrency: - group: benchmark-cache - cancel-in-progress: false - -permissions: - contents: read - -env: - KEYS: >- - cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= - nix.t4ko.pet-1:0eRO18L1/5diWYWboKKPTejQGhGCHNITwELiUaX7Kps= - vicinae.cachix.org-1:1kDrfienkGHPYbkpNj1mWTr7Fm1+zcenzgTizIcI3oc= - niks3.numtide.com-1:DTx8wZduET09hRmMtKdQDxNNthLQETkc/yaX7M4qK0g= - SUBS_BASE: https://cache.nixos.org https://vicinae.cachix.org https://cache.numtide.com - SUBS_EDGE: https://nix.t4ko.pet https://cache.nixos.org https://vicinae.cachix.org https://cache.numtide.com - -jobs: - resolve: - runs-on: ubuntu-latest - outputs: - rev: ${{ steps.rev.outputs.rev }} - host: ${{ steps.rev.outputs.host }} - steps: - - name: Resolve target rev / host - id: rev - env: - GH_TOKEN: ${{ github.token }} - INPUT_REV: ${{ inputs.rev }} - INPUT_HOST: ${{ inputs.host }} - run: | - rev="$INPUT_REV" - if [ -z "$rev" ]; then - rev=$(gh api repos/${{ github.repository }}/commits/master --jq .sha) - fi - host="${INPUT_HOST:-laptop}" - case "$host" in - laptop|desktop) ;; - *) echo "unknown host: $host" >&2; exit 1 ;; - esac - echo "rev=$rev" >> "$GITHUB_OUTPUT" - echo "host=$host" >> "$GITHUB_OUTPUT" - echo "target: $rev / $host" - - quota-before: - runs-on: ubuntu-latest - environment: production - continue-on-error: true - outputs: - classB: ${{ steps.q.outputs.classB }} - classA: ${{ steps.q.outputs.classA }} - steps: - - name: Snapshot quota metrics - id: q - env: - ADMIN_TOKEN: ${{ secrets.ADMIN_TOKEN }} - run: | - json=$(curl -sSf -H "Authorization: Bearer $ADMIN_TOKEN" https://nix.t4ko.pet/api/quota/metrics) - echo "classB=$(jq -r '.metrics.classBOperations.value // 0' <<<"$json")" >> "$GITHUB_OUTPUT" - echo "classA=$(jq -r '.metrics.classAOperations.value // 0' <<<"$json")" >> "$GITHUB_OUTPUT" - jq . <<<"$json" - - baseline: - needs: [resolve, quota-before] - runs-on: ubuntu-latest - timeout-minutes: 120 - outputs: - duration: ${{ steps.bench.outputs.duration }} - closure_bytes: ${{ steps.bench.outputs.closure_bytes }} - copied_total: ${{ steps.bench.outputs.copied_total }} - from_edgenix: ${{ steps.bench.outputs.from_edgenix }} - from_nixos: ${{ steps.bench.outputs.from_nixos }} - built_locally: ${{ steps.bench.outputs.built_locally }} - steps: - - name: Free disk space - run: sudo rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc /usr/local/.ghcup - - - name: Checkout (bench scripts) - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - - name: Install Nix (without nix.t4ko.pet) - uses: cachix/install-nix-action@08dcb3a5e62fa31e2da3d490afc4176ef55ecd72 # v30 - with: - extra_nix_config: | - experimental-features = nix-command flakes - substituters = ${{ env.SUBS_BASE }} - trusted-public-keys = ${{ env.KEYS }} - accept-flake-config = false - - - name: Build toplevel (baseline) - id: bench - env: - FLAKE_REF: github:${{ github.repository }}/${{ needs.resolve.outputs.rev }} - HOST: ${{ needs.resolve.outputs.host }} - run: bash scripts/bench-build.sh - - edgenix-first: - needs: [resolve, baseline] - runs-on: ubuntu-latest - timeout-minutes: 120 - outputs: - duration: ${{ steps.bench.outputs.duration }} - closure_bytes: ${{ steps.bench.outputs.closure_bytes }} - copied_total: ${{ steps.bench.outputs.copied_total }} - from_edgenix: ${{ steps.bench.outputs.from_edgenix }} - from_nixos: ${{ steps.bench.outputs.from_nixos }} - built_locally: ${{ steps.bench.outputs.built_locally }} - steps: - - name: Free disk space - run: sudo rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc /usr/local/.ghcup - - - name: Checkout (bench scripts) - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - - name: Install Nix (with nix.t4ko.pet) - uses: cachix/install-nix-action@08dcb3a5e62fa31e2da3d490afc4176ef55ecd72 # v30 - with: - extra_nix_config: | - experimental-features = nix-command flakes - substituters = ${{ env.SUBS_EDGE }} - trusted-public-keys = ${{ env.KEYS }} - accept-flake-config = false - - - name: Build toplevel (edgenix cold) - id: bench - env: - FLAKE_REF: github:${{ github.repository }}/${{ needs.resolve.outputs.rev }} - HOST: ${{ needs.resolve.outputs.host }} - run: bash scripts/bench-build.sh - - quota-cold: - needs: [quota-before, edgenix-first] - runs-on: ubuntu-latest - environment: production - continue-on-error: true - outputs: - classB: ${{ steps.q.outputs.classB }} - classA: ${{ steps.q.outputs.classA }} - steps: - - name: Wait for quota cron + analytics lag - run: sleep 420 - - - name: Snapshot quota metrics - id: q - env: - ADMIN_TOKEN: ${{ secrets.ADMIN_TOKEN }} - run: | - json=$(curl -sSf -H "Authorization: Bearer $ADMIN_TOKEN" https://nix.t4ko.pet/api/quota/metrics) - echo "classB=$(jq -r '.metrics.classBOperations.value // 0' <<<"$json")" >> "$GITHUB_OUTPUT" - echo "classA=$(jq -r '.metrics.classAOperations.value // 0' <<<"$json")" >> "$GITHUB_OUTPUT" - jq . <<<"$json" - - edgenix-second: - needs: [resolve, quota-cold] - runs-on: ubuntu-latest - timeout-minutes: 120 - outputs: - duration: ${{ steps.bench.outputs.duration }} - closure_bytes: ${{ steps.bench.outputs.closure_bytes }} - copied_total: ${{ steps.bench.outputs.copied_total }} - from_edgenix: ${{ steps.bench.outputs.from_edgenix }} - from_nixos: ${{ steps.bench.outputs.from_nixos }} - built_locally: ${{ steps.bench.outputs.built_locally }} - steps: - - name: Free disk space - run: sudo rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc /usr/local/.ghcup - - - name: Checkout (bench scripts) - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - - name: Install Nix (with nix.t4ko.pet) - uses: cachix/install-nix-action@08dcb3a5e62fa31e2da3d490afc4176ef55ecd72 # v30 - with: - extra_nix_config: | - experimental-features = nix-command flakes - substituters = ${{ env.SUBS_EDGE }} - trusted-public-keys = ${{ env.KEYS }} - accept-flake-config = false - - - name: Build toplevel (edgenix warm) - id: bench - env: - FLAKE_REF: github:${{ github.repository }}/${{ needs.resolve.outputs.rev }} - HOST: ${{ needs.resolve.outputs.host }} - run: bash scripts/bench-build.sh - - quota-warm: - needs: [quota-cold, edgenix-second] - runs-on: ubuntu-latest - environment: production - continue-on-error: true - outputs: - classB: ${{ steps.q.outputs.classB }} - classA: ${{ steps.q.outputs.classA }} - steps: - - name: Wait for quota cron + analytics lag - run: sleep 420 - - - name: Snapshot quota metrics - id: q - env: - ADMIN_TOKEN: ${{ secrets.ADMIN_TOKEN }} - run: | - json=$(curl -sSf -H "Authorization: Bearer $ADMIN_TOKEN" https://nix.t4ko.pet/api/quota/metrics) - echo "classB=$(jq -r '.metrics.classBOperations.value // 0' <<<"$json")" >> "$GITHUB_OUTPUT" - echo "classA=$(jq -r '.metrics.classAOperations.value // 0' <<<"$json")" >> "$GITHUB_OUTPUT" - jq . <<<"$json" - - report: - needs: [resolve, quota-before, baseline, edgenix-first, quota-cold, edgenix-second, quota-warm] - if: always() - runs-on: ubuntu-latest - steps: - - name: Write summary - env: - REV: ${{ needs.resolve.outputs.rev }} - HOST: ${{ needs.resolve.outputs.host }} - B_DUR: ${{ needs.baseline.outputs.duration }} - B_TOTAL: ${{ needs.baseline.outputs.copied_total }} - B_NIXOS: ${{ needs.baseline.outputs.from_nixos }} - B_BUILT: ${{ needs.baseline.outputs.built_locally }} - B_SIZE: ${{ needs.baseline.outputs.closure_bytes }} - C_DUR: ${{ needs.edgenix-first.outputs.duration }} - C_TOTAL: ${{ needs.edgenix-first.outputs.copied_total }} - C_EDGE: ${{ needs.edgenix-first.outputs.from_edgenix }} - C_NIXOS: ${{ needs.edgenix-first.outputs.from_nixos }} - C_BUILT: ${{ needs.edgenix-first.outputs.built_locally }} - W_DUR: ${{ needs.edgenix-second.outputs.duration }} - W_TOTAL: ${{ needs.edgenix-second.outputs.copied_total }} - W_EDGE: ${{ needs.edgenix-second.outputs.from_edgenix }} - W_NIXOS: ${{ needs.edgenix-second.outputs.from_nixos }} - W_BUILT: ${{ needs.edgenix-second.outputs.built_locally }} - Q0_B: ${{ needs.quota-before.outputs.classB }} - Q1_B: ${{ needs.quota-cold.outputs.classB }} - Q2_B: ${{ needs.quota-warm.outputs.classB }} - Q0_A: ${{ needs.quota-before.outputs.classA }} - Q1_A: ${{ needs.quota-cold.outputs.classA }} - Q2_A: ${{ needs.quota-warm.outputs.classA }} - run: | - fmt() { # 秒 → "12m34s (754s)" - local s="$1" - [ -z "$s" ] && { echo "n/a"; return; } - printf "%dm%02ds (%ss)" $((s / 60)) $((s % 60)) "$s" - } - gib() { - local b="$1" - [ -z "$b" ] && { echo "n/a"; return; } - awk -v b="$b" 'BEGIN { printf "%.2f GiB", b / 1024 / 1024 / 1024 }' - } - delta() { - local a="$1" b="$2" - { [ -z "$a" ] || [ -z "$b" ]; } && { echo "n/a"; return; } - echo $((b - a)) - } - { - echo "# cf-edgeNix cache benchmark" - echo - echo "- target: \`github:${{ github.repository }}/$REV\` / host: \`$HOST\`" - echo "- closure size: $(gib "$B_SIZE")" - echo - echo "## ビルド時間 (nixos-rebuild のビルド相当・fresh runner)" - echo - echo "| scenario | wall time | copied paths | from nix.t4ko.pet | from cache.nixos.org | built locally |" - echo "| --- | --- | --- | --- | --- | --- |" - echo "| baseline (cache なし) | $(fmt "$B_DUR") | ${B_TOTAL:-n/a} | 0 | ${B_NIXOS:-n/a} | ${B_BUILT:-n/a} |" - echo "| nix.t4ko.pet あり (edge cold) | $(fmt "$C_DUR") | ${C_TOTAL:-n/a} | ${C_EDGE:-n/a} | ${C_NIXOS:-n/a} | ${C_BUILT:-n/a} |" - echo "| nix.t4ko.pet あり (edge warm) | $(fmt "$W_DUR") | ${W_TOTAL:-n/a} | ${W_EDGE:-n/a} | ${W_NIXOS:-n/a} | ${W_BUILT:-n/a} |" - echo - echo "## R2 コスト (quota snapshot 差分・月間累計の増分)" - echo - echo "| phase | ΔClass B (read) | ΔClass A (write) |" - echo "| --- | --- | --- |" - echo "| edge cold run | $(delta "$Q0_B" "$Q1_B") | $(delta "$Q0_A" "$Q1_A") |" - echo "| edge warm run | $(delta "$Q1_B" "$Q2_B") | $(delta "$Q1_A" "$Q2_A") |" - echo - echo "> quota snapshot は 5 分 cron + GraphQL Analytics 経由のため増分は参考値。" - echo "> warm run の ΔClass B が cold run より小さい分が Workers Cache API による削減分。" - } >> "$GITHUB_STEP_SUMMARY" diff --git a/.github/workflows/update-codex-desktop-linux.yml b/.github/workflows/update-codex-desktop-linux.yml deleted file mode 100644 index b632965..0000000 --- a/.github/workflows/update-codex-desktop-linux.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: update-codex-desktop-linux - -on: - schedule: - - cron: "15 3 * * *" - workflow_dispatch: - -permissions: - contents: write - pull-requests: write - -jobs: - update: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - - - name: Install Nix - uses: cachix/install-nix-action@b4b293eae0b79aac8a161bb32925a5508c9cca93 # v31 - with: - extra_nix_config: | - experimental-features = nix-command flakes - - - name: Update codex-desktop-linux - run: nix flake update codex-desktop-linux - - - name: Create pull request - uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8 - with: - branch: automation/update-codex-desktop-linux - delete-branch: true - commit-message: "chore: update codex-desktop-linux" - title: "chore: update codex-desktop-linux" - body: | - Updates the `codex-desktop-linux` flake input. - - This picks up upstream DMG hash refreshes and prevents publish-cache failures. From 6d1c1ff5cbe9cc6cc54307fb57c25fdefb40dd42 Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Thu, 23 Jul 2026 22:08:13 +0900 Subject: [PATCH 09/35] =?UTF-8?q?=F0=9F=94=A5=20=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E3=81=97=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84hooks=E3=82=92?= =?UTF-8?q?=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .git_template/hooks/post-merge | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 .git_template/hooks/post-merge diff --git a/.git_template/hooks/post-merge b/.git_template/hooks/post-merge deleted file mode 100644 index 7c1c6f3..0000000 --- a/.git_template/hooks/post-merge +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash -# post-merge: branch 指定された submodule をリモート先端に追従させる -# (.gitmodules で `branch = ...` が設定されたものが対象) - -set -e - -repo_root="$(git rev-parse --show-toplevel 2>/dev/null)" || exit 0 -[ -f "$repo_root/.gitmodules" ] || exit 0 - -# branch 指定がある submodule のみ更新 (それ以外は通常の pin 動作のまま) -git -C "$repo_root" config -f .gitmodules --get-regexp '^submodule\..*\.branch$' 2>/dev/null \ - | awk '{print $1}' \ - | sed -E 's/^submodule\.(.*)\.branch$/\1/' \ - | while read -r name; do - path="$(git -C "$repo_root" config -f .gitmodules --get "submodule.$name.path")" - [ -n "$path" ] || continue - git -C "$repo_root" submodule update --init --remote --merge -- "$path" 2>/dev/null || true - done From 664937037684cd2130560096966a0dd298b43968 Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Thu, 23 Jul 2026 22:08:31 +0900 Subject: [PATCH 10/35] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20ci:=20=E4=B8=8D?= =?UTF-8?q?=E8=A6=81=E3=81=AA=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=82=A2?= =?UTF-8?q?=E3=82=A6=E3=83=88=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish-cache.yml | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/.github/workflows/publish-cache.yml b/.github/workflows/publish-cache.yml index 762acfc..7035a6c 100644 --- a/.github/workflows/publish-cache.yml +++ b/.github/workflows/publish-cache.yml @@ -1,21 +1,4 @@ # T4ko0522/cf-edgeNix の binary cache へ NixOS closure を publish する。 -# -# 本 workflow は cf-edgeNix の scripts/publish.sh を再利用するため、 -# このリポジトリ (flake source) と cf-edgeNix を別 path で checkout して走らせる。 -# 元テンプレート: T4ko0522/cf-edgeNix:docs/templates/publish-cache.yml -# -# ── 事前準備 (Settings → Environments → production に登録) ───────────────── -# Secrets: -# CACHE_PRIVATE_KEY NAR 署名用秘密鍵 -# ADMIN_TOKEN cf-edgeNix Worker の write API Bearer -# CLOUDFLARE_API_TOKEN KV bulk write の最小権限トークン -# R2_ACCESS_KEY_ID R2 S3 API のアクセスキー (R2 dashboard → Manage R2 API tokens) -# R2_SECRET_ACCESS_KEY R2 S3 API のシークレットキー -# Variables: -# CLOUDFLARE_ACCOUNT_ID -# API_BASE_URL deploy 済み cf-edgeNix Worker の URL -# R2_BUCKET_NAME 例: cf-edgenix-nar -# KV_NAMESPACE_ID name: publish-cache @@ -46,9 +29,6 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 # 常に最新の publish.sh / publish.ts (bun で publish.ts を呼ぶ) を使うため main 先端を追従する。 - # 注意: これは secret を扱う job なので、cf-edgeNix 側の任意の上流 commit が - # CACHE_PRIVATE_KEY / ADMIN_TOKEN / CLOUDFLARE_API_TOKEN を持った状態で即座に実行される。 - # cf-edgeNix は自分のリポジトリである前提でこのリスクを許容している。 - name: Checkout cf-edgeNix (publish tooling) uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: From f4af3f26606874b8a814e6b1ecc4e52e4aa0ecf3 Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Thu, 23 Jul 2026 23:28:31 +0900 Subject: [PATCH 11/35] =?UTF-8?q?=F0=9F=90=9B=20wezterm:=20=E3=82=BF?= =?UTF-8?q?=E3=83=BC=E3=83=9F=E3=83=8A=E3=83=AB=E8=B2=BC=E3=82=8A=E4=BB=98?= =?UTF-8?q?=E3=81=91=E3=81=AE=E3=82=AD=E3=83=BC=E7=AB=B6=E5=90=88=E3=82=92?= =?UTF-8?q?=E8=A7=A3=E6=B6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .config/shared/nvim/lua/plugins/editor/markdown-preview.lua | 2 -- .config/shared/wezterm/keymaps.lua | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.config/shared/nvim/lua/plugins/editor/markdown-preview.lua b/.config/shared/nvim/lua/plugins/editor/markdown-preview.lua index a047548..3ffa9fa 100644 --- a/.config/shared/nvim/lua/plugins/editor/markdown-preview.lua +++ b/.config/shared/nvim/lua/plugins/editor/markdown-preview.lua @@ -17,8 +17,6 @@ return { local function toggle() vim.cmd("MarkdownPreviewToggle") end - -- WezTerm から Ctrl+Shift+V を F24 として受け取ってトグル - vim.keymap.set({ "n", "i" }, "", toggle, { desc = "Markdown Preview (browser)" }) -- leader 経由のフォールバック vim.keymap.set("n", "mp", toggle, { desc = "Markdown Preview (browser)" }) end, diff --git a/.config/shared/wezterm/keymaps.lua b/.config/shared/wezterm/keymaps.lua index cc582a3..1f9d0cc 100644 --- a/.config/shared/wezterm/keymaps.lua +++ b/.config/shared/wezterm/keymaps.lua @@ -58,8 +58,7 @@ return { { key = "c", mods = "CTRL", action = act.CopyTo("Clipboard") }, -- 貼り付け { key = "v", mods = "CTRL", action = act.PasteFrom("Clipboard") }, - -- Ctrl+Shift+V を F24 として Neovim に送る(Markdown プレビュー トグル用、衝突回避) - { key = "v", mods = "CTRL|SHIFT", action = act.SendKey({ key = "F24" }) }, + { key = "v", mods = "CTRL|SHIFT", action = act.PasteFrom("Clipboard") }, -- Pane操作: Alt+q を押してモードに入り、hjkl 等を連続で押せる(Esc またはタイムアウトで抜ける) { From b2d8d40bbc5afa0bd4ed513109c32183e16afe84 Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Thu, 23 Jul 2026 23:28:44 +0900 Subject: [PATCH 12/35] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20nix:=20=E5=85=B1?= =?UTF-8?q?=E9=80=9A=E5=9F=BA=E7=9B=A4=E3=81=A8Git=E3=81=AE=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E3=82=92=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nix-configs/home/packages/cli.nix | 1 + nix-configs/hosts/desktop/default.nix | 1 + nix-configs/hosts/laptop/default.nix | 1 + nix-configs/hosts/wsl/default.nix | 10 +--------- nix-configs/modules/base.nix | 11 ----------- nix-configs/modules/default.nix | 3 ++- nix-configs/modules/networkmanager.nix | 3 +++ nix-configs/modules/nix-ld.nix | 3 +++ 8 files changed, 12 insertions(+), 21 deletions(-) delete mode 100644 nix-configs/modules/base.nix create mode 100644 nix-configs/modules/networkmanager.nix create mode 100644 nix-configs/modules/nix-ld.nix diff --git a/nix-configs/home/packages/cli.nix b/nix-configs/home/packages/cli.nix index ddce01e..012536b 100644 --- a/nix-configs/home/packages/cli.nix +++ b/nix-configs/home/packages/cli.nix @@ -15,6 +15,7 @@ gping gtop gh-dash + git just lsd ripgrep diff --git a/nix-configs/hosts/desktop/default.nix b/nix-configs/hosts/desktop/default.nix index 2ff3487..2b42c93 100644 --- a/nix-configs/hosts/desktop/default.nix +++ b/nix-configs/hosts/desktop/default.nix @@ -12,6 +12,7 @@ ]; networking.hostName = "desktop"; + system.stateVersion = "26.05"; t4ko.regreet.mainOutput = "DP-2"; diff --git a/nix-configs/hosts/laptop/default.nix b/nix-configs/hosts/laptop/default.nix index 46d9256..af8c76f 100644 --- a/nix-configs/hosts/laptop/default.nix +++ b/nix-configs/hosts/laptop/default.nix @@ -11,6 +11,7 @@ ]; networking.hostName = "laptop"; + system.stateVersion = "26.05"; t4ko.regreet.mainOutput = "HDMI-A-1"; diff --git a/nix-configs/hosts/wsl/default.nix b/nix-configs/hosts/wsl/default.nix index 93fd965..60784bd 100644 --- a/nix-configs/hosts/wsl/default.nix +++ b/nix-configs/hosts/wsl/default.nix @@ -1,8 +1,4 @@ -{ - pkgs, - username, - ... -}: { +{username, ...}: { imports = [ ../../modules/nh.nix ../../modules/nix.nix @@ -31,10 +27,6 @@ }; programs.nix-ld.enable = true; - environment.systemPackages = with pkgs; [ - git - vim - ]; system.stateVersion = "26.05"; } diff --git a/nix-configs/modules/base.nix b/nix-configs/modules/base.nix deleted file mode 100644 index b045e82..0000000 --- a/nix-configs/modules/base.nix +++ /dev/null @@ -1,11 +0,0 @@ -{pkgs, ...}: { - networking.networkmanager.enable = true; - programs.nix-ld.enable = true; - - environment.systemPackages = with pkgs; [ - git - vim - ]; - - system.stateVersion = "26.05"; -} diff --git a/nix-configs/modules/default.nix b/nix-configs/modules/default.nix index 45ecaca..3fd89ec 100644 --- a/nix-configs/modules/default.nix +++ b/nix-configs/modules/default.nix @@ -1,12 +1,13 @@ { imports = [ - ./base.nix ./bluetooth.nix ./docker.nix ./kernel.nix ./locale.nix ./nh.nix ./nix.nix + ./networkmanager.nix + ./nix-ld.nix ./qmk.nix ./tailscale.nix ./unfree.nix diff --git a/nix-configs/modules/networkmanager.nix b/nix-configs/modules/networkmanager.nix new file mode 100644 index 0000000..e1e9450 --- /dev/null +++ b/nix-configs/modules/networkmanager.nix @@ -0,0 +1,3 @@ +{...}: { + networking.networkmanager.enable = true; +} diff --git a/nix-configs/modules/nix-ld.nix b/nix-configs/modules/nix-ld.nix new file mode 100644 index 0000000..7720e1b --- /dev/null +++ b/nix-configs/modules/nix-ld.nix @@ -0,0 +1,3 @@ +{...}: { + programs.nix-ld.enable = true; +} From 17e6e2b589c8fc4451942ee673b84ceaa02deb88 Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Fri, 24 Jul 2026 00:24:11 +0900 Subject: [PATCH 13/35] =?UTF-8?q?=E2=9C=A8=20dotfiles:=20chezmoi=E3=81=A7O?= =?UTF-8?q?S=E5=88=A5=E8=A8=AD=E5=AE=9A=E3=82=92=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit WindowsのLazyVimとcavaをmutableツリーへ分離し、junctionで配置する。 NixOSはnixvim、WSLはvimのみとし、設定ソースをdot_configへ統一する。 --- .config/windows/komorebi/applications.json | 3272 ----------------- .config/windows/komorebi/komorebi.bar.json | 1 - .config/windows/komorebi/komorebi.json | 110 - .../komorebi/komorebi_resolve_config.ps1 | 91 - .config/windows/komorebi/komorebi_start.ps1 | 61 - .config/windows/komorebi/morning_setup.ps1 | 85 - .config/windows/whkdrc | 78 - .config/windows/yasb/config.yaml | 486 --- .config/windows/yasb/greeting.ps1 | 11 - .config/windows/yasb/styles.css | 754 ---- .github/workflows/ci.yml | 34 + .gitignore | 126 +- .markdownlint-cli2.jsonc | 2 +- AGENTS.md | 4 +- chezmoi/.chezmoiignore | 3 - ...un_after_create-windows-junctions.ps1.tmpl | 45 + docs/keybindings/nvim/README.md | 8 +- docs/keybindings/wezterm/README.md | 8 +- docs/keybindings/wezterm/copy-mode.md | 2 +- docs/keybindings/wezterm/global.md | 4 +- docs/keybindings/wezterm/panes.md | 2 +- docs/keybindings/wezterm/setting-mode.md | 6 +- docs/keybindings/wezterm/tabs.md | 2 +- docs/keybindings/wezterm/workspace.md | 2 +- docs/memo/dotfiles-ownership.tsv | 1 + .../windows-nixos-dotfiles-design-options.md | 16 +- docs/memo/windows-nixos-dotfiles-design.md | 18 +- .../nixos/claude/claude-notify-hook.sh | 0 .../nixos/claude/settings.hooks.json | 0 {.config => dot_config}/nixos/fcitx5/config | 0 .../nixos/ghostty-quick-shell.conf | 0 .../nixos/starship-nix.toml | 0 .../nixos/starship-quick-shell.toml | 0 .../nixos/swaync/style.css | 0 .../nixos/waybar/style.css | 0 .../nixos/zsh/rc/alias.zsh | 0 .../nixos/zsh/rc/bindkey.zsh | 0 .../nixos/zsh/rc/functions/fancy-ctrl-z | 0 .../nixos/zsh/rc/functions/ghq-fzf | 0 .../nixos/zsh/rc/functions/nix | 2 +- .../nixos/zsh/rc/functions/nix-shell | 2 +- .../nixos/zsh/rc/functions/yy | 0 .../nixos/zsh/rc/option.zsh | 0 {.config => dot_config}/shared/apm/.gitignore | 0 .../shared/apm/apm.lock.yaml | 0 {.config => dot_config}/shared/apm/apm.yml | 0 .../agent-llm/.apm/skills/team/SKILL.md | 0 .../.apm/skills/tool-pipeline/SKILL.md | 0 .../references/artifact-templates.md | 0 .../references/tui-guidelines.md | 0 .../shared/apm/packages/agent-llm/apm.yml | 0 .../skills/markdown-session-format/SKILL.md | 0 .../shared/apm/packages/docs/apm.yml | 0 .../git-ops/.apm/skills/git-commit/SKILL.md | 0 .../skills/github-thread-fetcher/SKILL.md | 0 .../.apm/skills/pr-summarizer/SKILL.md | 0 .../shared/apm/packages/git-ops/apm.yml | 0 .../shared/claude/CLAUDE.md | 0 .../shared/claude/agents/README.md | 0 .../shared/claude/agents/at-analyzer.md | 0 .../shared/claude/agents/at-doc-auditor.md | 0 .../claude/agents/at-doc-reviewer-codex.md | 0 .../claude/agents/at-doc-reviewer-opus.md | 0 .../shared/claude/agents/at-doc-writer.md | 0 .../shared/claude/agents/at-explorer.md | 0 .../claude/agents/at-impl-reviewer-codex.md | 0 .../claude/agents/at-impl-reviewer-opus.md | 0 .../shared/claude/agents/at-implementer.md | 0 .../shared/claude/agents/at-performance.md | 0 .../shared/claude/agents/at-plan-reviewer.md | 0 .../shared/claude/agents/at-planner.md | 0 .../shared/claude/agents/at-security-codex.md | 0 .../shared/claude/agents/at-security-opus.md | 0 .../claude/agents/at-test-reviewer-codex.md | 0 .../claude/agents/at-test-reviewer-opus.md | 0 .../shared/claude/agents/at-tester.md | 0 .../shared/claude/agents/tp-qa-architect.md | 0 .../claude/agents/tp-requirements-analyst.md | 0 .../claude/agents/tp-system-designer.md | 0 .../claude/agents/tp-task-decomposer.md | 0 .../shared/claude/claude-icon.svg | 0 .../shared/claude/settings.json | 0 .../shared/claude/sounds.mp3.bak | Bin .../shared/claude/statusline.sh | 0 .../shared/codex/AGENTS.md | 0 .../shared/codex/agents/worker.toml | 0 .../shared/codex/config.toml | 0 .../shared/codex/rules/npm.rules | 0 .../shared/codex/rules/safety.rules | 0 .../shared/fastfetch/anime.txt | 0 .../shared/fastfetch/config.jsonc | 0 .../shared/fastfetch/mclaren.txt | 0 .../shared/fastfetch/show_music.py | 0 .../shared/fastfetch/windows.txt | 0 .../shared/lazygit/LICENSE | 0 .../shared/lazygit/README.md | 0 .../shared/lazygit/config.yml | 0 .../shared/lazygit/lazygit.exe | Bin {.config => dot_config}/shared/starship.toml | 0 {.config => dot_config}/shared/vim/vimrc | 0 .../shared/wezterm/appearance.lua | 0 .../shared/wezterm/keymaps.lua | 0 .../shared/wezterm/modules/claude_status.lua | 0 .../shared/wezterm/modules/opacity.lua | 0 .../shared/wezterm/modules/wsl.lua | 0 .../shared/wezterm/statusbar.lua | 0 .../shared/wezterm/tab.lua | 0 .../shared/wezterm/wezterm.lua | 0 .../shared/wezterm/workspace.lua | 0 .../shared/yazi/keymap.toml | 0 .../shared/yazi/theme.toml | 0 {.config => dot_config}/shared/yazi/yazi.toml | 0 .../shared/zed/keymap.json | 0 .../shared/zed/settings.json | 0 .../windows/ccwin-notify/config.toml | 0 .../windows/claude/ccwin-hook.ps1 | 0 .../windows/claude/settings.hooks.json | 0 .../windows/mise/config.toml | 0 .../Microsoft.PowerShell_profile.ps1 | 0 .../windows/powershell/conf.d/aliases.ps1 | 0 .../windows/powershell/conf.d/keybindings.ps1 | 0 .../windows/powershell/conf.d/mise.ps1 | 0 .../windows/powershell/conf.d/navigation.ps1 | 0 .../windows/powershell/conf.d/startup.ps1 | 41 +- justfile | 2 +- .../windows/cava/shaders/bar_spectrum.frag | 0 .../windows/cava/shaders/eye_of_phi.frag | 0 .../windows/cava/shaders/northern_lights.frag | 0 .../windows/cava/shaders/orion_circle.frag | 0 .../cava/shaders/orion_circle_rotate.frag | 0 .../cava/shaders/orion_saturn_core.frag | 0 .../cava/shaders/orion_saturn_subring.frag | 0 .../windows/cava/shaders/pass_through.vert | 0 .../windows/cava/shaders/spectrogram.frag | 0 .../shaders/winamp_line_style_spectrum.frag | 0 .../windows/cava/themes/solarized_dark | 2 +- .../windows/cava/themes/tricolor | 2 +- .../windows}/nvim/.gitignore | 0 .../windows}/nvim/.neoconf.json | 0 .../windows}/nvim/.typos.toml | 0 .../shared => mutable/windows}/nvim/LICENSE | 0 .../shared => mutable/windows}/nvim/README.md | 0 .../shared => mutable/windows}/nvim/init.lua | 0 .../windows}/nvim/lazy-lock.json | 0 .../windows}/nvim/lazyvim.json | 2 +- .../windows}/nvim/lua/config/autocmds.lua | 0 .../windows}/nvim/lua/config/keymaps.lua | 0 .../windows}/nvim/lua/config/lazy.lua | 0 .../windows}/nvim/lua/config/options.lua | 0 .../windows}/nvim/lua/plugins/base/snacks.lua | 0 .../windows}/nvim/lua/plugins/base/ufo.lua | 0 .../nvim/lua/plugins/base/vimdoc-ja.lua | 0 .../nvim/lua/plugins/base/winresizer.lua | 0 .../windows}/nvim/lua/plugins/base/yazi.lua | 0 .../windows}/nvim/lua/plugins/disable.lua | 0 .../nvim/lua/plugins/editor/claude-code.lua | 0 .../nvim/lua/plugins/editor/codic.lua | 0 .../nvim/lua/plugins/editor/color-picker.lua | 0 .../nvim/lua/plugins/editor/compiler.lua | 0 .../nvim/lua/plugins/editor/diffview.lua | 0 .../nvim/lua/plugins/editor/emmet.lua | 0 .../windows}/nvim/lua/plugins/editor/git.lua | 0 .../nvim/lua/plugins/editor/html-preview.lua | 0 .../lua/plugins/editor/markdown-preview.lua | 0 .../nvim/lua/plugins/editor/mini-surround.lua | 0 .../nvim/lua/plugins/editor/minty.lua | 0 .../lua/plugins/editor/rainbow-delimiters.lua | 0 .../nvim/lua/plugins/editor/supermaven.lua | 0 .../windows}/nvim/lua/plugins/editor/test.lua | 0 .../lua/plugins/editor/treesitter-context.lua | 0 .../nvim/lua/plugins/editor/treesitter.lua | 0 .../windows}/nvim/lua/plugins/img-clip.lua | 0 .../windows}/nvim/lua/plugins/lsp/init.lua | 0 .../windows}/nvim/lua/plugins/lsp/lazydev.lua | 0 .../nvim/lua/plugins/lsp/version-lsp.lua | 0 .../nvim/lua/plugins/ui/bufferline.lua | 0 .../windows}/nvim/lua/plugins/ui/dracula.lua | 0 .../windows}/nvim/lua/plugins/ui/hlchunk.lua | 0 .../windows}/nvim/lua/plugins/ui/init.lua | 0 .../windows}/nvim/lua/plugins/ui/lualine.lua | 0 .../nvim/lua/plugins/ui/modicator.lua | 0 .../windows}/nvim/lua/plugins/ui/noice.lua | 0 .../nvim/lua/plugins/ui/smear-cursor.lua | 0 .../windows}/nvim/stylua.toml | 2 +- .../home/nixvim/files}/ftdetect/mdc.lua | 0 .../home/nixvim/files}/ftdetect/zsh.lua | 0 .../home/nixvim/files}/spell/tech.utf-8.add | 0 nix-configs/home/nixvim/plugins.nix | 6 +- nix-configs/home/packages/core-cli.nix | 1 - nix-configs/home/quick-shell.nix | 4 +- nix-configs/home/swaync.nix | 2 +- nix-configs/home/waybar.nix | 2 +- nix-configs/home/xdg.nix | 50 +- scripts/bootstrap.ps1 | 4 +- scripts/check_chezmoi.sh | 23 + scripts/optim_pwsh_profile.ps1 | 2 +- scripts/setup_windows.ps1 | 75 +- 197 files changed, 284 insertions(+), 5172 deletions(-) delete mode 100644 .config/windows/komorebi/applications.json delete mode 100644 .config/windows/komorebi/komorebi.bar.json delete mode 100644 .config/windows/komorebi/komorebi.json delete mode 100644 .config/windows/komorebi/komorebi_resolve_config.ps1 delete mode 100644 .config/windows/komorebi/komorebi_start.ps1 delete mode 100644 .config/windows/komorebi/morning_setup.ps1 delete mode 100644 .config/windows/whkdrc delete mode 100644 .config/windows/yasb/config.yaml delete mode 100644 .config/windows/yasb/greeting.ps1 delete mode 100644 .config/windows/yasb/styles.css create mode 100644 chezmoi/run_after_create-windows-junctions.ps1.tmpl rename {.config => dot_config}/nixos/claude/claude-notify-hook.sh (100%) rename {.config => dot_config}/nixos/claude/settings.hooks.json (100%) rename {.config => dot_config}/nixos/fcitx5/config (100%) rename {.config => dot_config}/nixos/ghostty-quick-shell.conf (100%) rename {.config => dot_config}/nixos/starship-nix.toml (100%) rename {.config => dot_config}/nixos/starship-quick-shell.toml (100%) rename {.config => dot_config}/nixos/swaync/style.css (100%) rename {.config => dot_config}/nixos/waybar/style.css (100%) rename {.config => dot_config}/nixos/zsh/rc/alias.zsh (100%) rename {.config => dot_config}/nixos/zsh/rc/bindkey.zsh (100%) rename {.config => dot_config}/nixos/zsh/rc/functions/fancy-ctrl-z (100%) rename {.config => dot_config}/nixos/zsh/rc/functions/ghq-fzf (100%) rename {.config => dot_config}/nixos/zsh/rc/functions/nix (93%) rename {.config => dot_config}/nixos/zsh/rc/functions/nix-shell (90%) rename {.config => dot_config}/nixos/zsh/rc/functions/yy (100%) rename {.config => dot_config}/nixos/zsh/rc/option.zsh (100%) rename {.config => dot_config}/shared/apm/.gitignore (100%) rename {.config => dot_config}/shared/apm/apm.lock.yaml (100%) rename {.config => dot_config}/shared/apm/apm.yml (100%) rename {.config => dot_config}/shared/apm/packages/agent-llm/.apm/skills/team/SKILL.md (100%) rename {.config => dot_config}/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/SKILL.md (100%) rename {.config => dot_config}/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/references/artifact-templates.md (100%) rename {.config => dot_config}/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/references/tui-guidelines.md (100%) rename {.config => dot_config}/shared/apm/packages/agent-llm/apm.yml (100%) rename {.config => dot_config}/shared/apm/packages/docs/.apm/skills/markdown-session-format/SKILL.md (100%) rename {.config => dot_config}/shared/apm/packages/docs/apm.yml (100%) rename {.config => dot_config}/shared/apm/packages/git-ops/.apm/skills/git-commit/SKILL.md (100%) rename {.config => dot_config}/shared/apm/packages/git-ops/.apm/skills/github-thread-fetcher/SKILL.md (100%) rename {.config => dot_config}/shared/apm/packages/git-ops/.apm/skills/pr-summarizer/SKILL.md (100%) rename {.config => dot_config}/shared/apm/packages/git-ops/apm.yml (100%) rename {.config => dot_config}/shared/claude/CLAUDE.md (100%) rename {.config => dot_config}/shared/claude/agents/README.md (100%) rename {.config => dot_config}/shared/claude/agents/at-analyzer.md (100%) rename {.config => dot_config}/shared/claude/agents/at-doc-auditor.md (100%) rename {.config => dot_config}/shared/claude/agents/at-doc-reviewer-codex.md (100%) rename {.config => dot_config}/shared/claude/agents/at-doc-reviewer-opus.md (100%) rename {.config => dot_config}/shared/claude/agents/at-doc-writer.md (100%) rename {.config => dot_config}/shared/claude/agents/at-explorer.md (100%) rename {.config => dot_config}/shared/claude/agents/at-impl-reviewer-codex.md (100%) rename {.config => dot_config}/shared/claude/agents/at-impl-reviewer-opus.md (100%) rename {.config => dot_config}/shared/claude/agents/at-implementer.md (100%) rename {.config => dot_config}/shared/claude/agents/at-performance.md (100%) rename {.config => dot_config}/shared/claude/agents/at-plan-reviewer.md (100%) rename {.config => dot_config}/shared/claude/agents/at-planner.md (100%) rename {.config => dot_config}/shared/claude/agents/at-security-codex.md (100%) rename {.config => dot_config}/shared/claude/agents/at-security-opus.md (100%) rename {.config => dot_config}/shared/claude/agents/at-test-reviewer-codex.md (100%) rename {.config => dot_config}/shared/claude/agents/at-test-reviewer-opus.md (100%) rename {.config => dot_config}/shared/claude/agents/at-tester.md (100%) rename {.config => dot_config}/shared/claude/agents/tp-qa-architect.md (100%) rename {.config => dot_config}/shared/claude/agents/tp-requirements-analyst.md (100%) rename {.config => dot_config}/shared/claude/agents/tp-system-designer.md (100%) rename {.config => dot_config}/shared/claude/agents/tp-task-decomposer.md (100%) rename {.config => dot_config}/shared/claude/claude-icon.svg (100%) rename {.config => dot_config}/shared/claude/settings.json (100%) rename {.config => dot_config}/shared/claude/sounds.mp3.bak (100%) rename {.config => dot_config}/shared/claude/statusline.sh (100%) rename {.config => dot_config}/shared/codex/AGENTS.md (100%) rename {.config => dot_config}/shared/codex/agents/worker.toml (100%) rename {.config => dot_config}/shared/codex/config.toml (100%) rename {.config => dot_config}/shared/codex/rules/npm.rules (100%) rename {.config => dot_config}/shared/codex/rules/safety.rules (100%) rename {.config => dot_config}/shared/fastfetch/anime.txt (100%) rename {.config => dot_config}/shared/fastfetch/config.jsonc (100%) rename {.config => dot_config}/shared/fastfetch/mclaren.txt (100%) rename {.config => dot_config}/shared/fastfetch/show_music.py (100%) rename {.config => dot_config}/shared/fastfetch/windows.txt (100%) rename {.config => dot_config}/shared/lazygit/LICENSE (100%) rename {.config => dot_config}/shared/lazygit/README.md (100%) rename {.config => dot_config}/shared/lazygit/config.yml (100%) rename {.config => dot_config}/shared/lazygit/lazygit.exe (100%) rename {.config => dot_config}/shared/starship.toml (100%) rename {.config => dot_config}/shared/vim/vimrc (100%) rename {.config => dot_config}/shared/wezterm/appearance.lua (100%) rename {.config => dot_config}/shared/wezterm/keymaps.lua (100%) rename {.config => dot_config}/shared/wezterm/modules/claude_status.lua (100%) rename {.config => dot_config}/shared/wezterm/modules/opacity.lua (100%) rename {.config => dot_config}/shared/wezterm/modules/wsl.lua (100%) rename {.config => dot_config}/shared/wezterm/statusbar.lua (100%) rename {.config => dot_config}/shared/wezterm/tab.lua (100%) rename {.config => dot_config}/shared/wezterm/wezterm.lua (100%) rename {.config => dot_config}/shared/wezterm/workspace.lua (100%) rename {.config => dot_config}/shared/yazi/keymap.toml (100%) rename {.config => dot_config}/shared/yazi/theme.toml (100%) rename {.config => dot_config}/shared/yazi/yazi.toml (100%) rename {.config => dot_config}/shared/zed/keymap.json (100%) rename {.config => dot_config}/shared/zed/settings.json (100%) rename {.config => dot_config}/windows/ccwin-notify/config.toml (100%) rename {.config => dot_config}/windows/claude/ccwin-hook.ps1 (100%) rename {.config => dot_config}/windows/claude/settings.hooks.json (100%) rename {.config => dot_config}/windows/mise/config.toml (100%) rename {.config => dot_config}/windows/powershell/Microsoft.PowerShell_profile.ps1 (100%) rename {.config => dot_config}/windows/powershell/conf.d/aliases.ps1 (100%) rename {.config => dot_config}/windows/powershell/conf.d/keybindings.ps1 (100%) rename {.config => dot_config}/windows/powershell/conf.d/mise.ps1 (100%) rename {.config => dot_config}/windows/powershell/conf.d/navigation.ps1 (100%) rename {.config => dot_config}/windows/powershell/conf.d/startup.ps1 (52%) rename {.config => mutable}/windows/cava/shaders/bar_spectrum.frag (100%) rename {.config => mutable}/windows/cava/shaders/eye_of_phi.frag (100%) rename {.config => mutable}/windows/cava/shaders/northern_lights.frag (100%) rename {.config => mutable}/windows/cava/shaders/orion_circle.frag (100%) rename {.config => mutable}/windows/cava/shaders/orion_circle_rotate.frag (100%) rename {.config => mutable}/windows/cava/shaders/orion_saturn_core.frag (100%) rename {.config => mutable}/windows/cava/shaders/orion_saturn_subring.frag (100%) rename {.config => mutable}/windows/cava/shaders/pass_through.vert (100%) rename {.config => mutable}/windows/cava/shaders/spectrogram.frag (100%) rename {.config => mutable}/windows/cava/shaders/winamp_line_style_spectrum.frag (100%) rename {.config => mutable}/windows/cava/themes/solarized_dark (92%) rename {.config => mutable}/windows/cava/themes/tricolor (88%) rename {.config/shared => mutable/windows}/nvim/.gitignore (100%) rename {.config/shared => mutable/windows}/nvim/.neoconf.json (100%) rename {.config/shared => mutable/windows}/nvim/.typos.toml (100%) rename {.config/shared => mutable/windows}/nvim/LICENSE (100%) rename {.config/shared => mutable/windows}/nvim/README.md (100%) rename {.config/shared => mutable/windows}/nvim/init.lua (100%) rename {.config/shared => mutable/windows}/nvim/lazy-lock.json (100%) rename {.config/shared => mutable/windows}/nvim/lazyvim.json (98%) rename {.config/shared => mutable/windows}/nvim/lua/config/autocmds.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/config/keymaps.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/config/lazy.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/config/options.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/base/snacks.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/base/ufo.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/base/vimdoc-ja.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/base/winresizer.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/base/yazi.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/disable.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/claude-code.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/codic.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/color-picker.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/compiler.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/diffview.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/emmet.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/git.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/html-preview.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/markdown-preview.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/mini-surround.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/minty.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/rainbow-delimiters.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/supermaven.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/test.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/treesitter-context.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/editor/treesitter.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/img-clip.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/lsp/init.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/lsp/lazydev.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/lsp/version-lsp.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/ui/bufferline.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/ui/dracula.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/ui/hlchunk.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/ui/init.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/ui/lualine.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/ui/modicator.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/ui/noice.lua (100%) rename {.config/shared => mutable/windows}/nvim/lua/plugins/ui/smear-cursor.lua (100%) rename {.config/shared => mutable/windows}/nvim/stylua.toml (67%) rename {.config/shared/nvim => nix-configs/home/nixvim/files}/ftdetect/mdc.lua (100%) rename {.config/shared/nvim => nix-configs/home/nixvim/files}/ftdetect/zsh.lua (100%) rename {.config/shared/nvim => nix-configs/home/nixvim/files}/spell/tech.utf-8.add (100%) diff --git a/.config/windows/komorebi/applications.json b/.config/windows/komorebi/applications.json deleted file mode 100644 index c7168f4..0000000 --- a/.config/windows/komorebi/applications.json +++ /dev/null @@ -1,3272 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/LGUG2Z/komorebi/master/schema.asc.json", - "1Password": { - "ignore": [ - { - "kind": "Exe", - "id": "1Password.exe", - "matching_strategy": "Equals" - } - ] - }, - "Ableton Live": { - "ignore": [ - { - "kind": "Class", - "id": "AbletonVstPlugClass", - "matching_strategy": "Legacy" - }, - { - "kind": "Class", - "id": "Vst3PlugWindow", - "matching_strategy": "Legacy" - }, - [ - { - "kind": "Class", - "id": "Ableton Live Window Class", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Ableton", - "matching_strategy": "DoesNotContain" - } - ] - ] - }, - "Adobe Creative Cloud": { - "tray_and_multi_window": [ - { - "kind": "Class", - "id": "CreativeCloudDesktopWindowClass", - "matching_strategy": "Legacy" - } - ] - }, - "Adobe Photoshop": { - "ignore": [ - { - "kind": "Class", - "id": "PSDialogBox", - "matching_strategy": "Equals" - } - ] - }, - "Adobe Premiere Pro": { - "ignore": [ - { - "kind": "Class", - "id": "DroverLord - Window Class", - "matching_strategy": "Equals" - } - ] - }, - "Affinity Designer 2": { - "ignore": [ - { - "kind": "Exe", - "id": "Designer.exe", - "matching_strategy": "Equals" - } - ], - "manage": [ - { - "kind": "Title", - "id": "Affinity Designer 2", - "matching_strategy": "Equals" - } - ] - }, - "Affinity Photo 2": { - "ignore": [ - { - "kind": "Exe", - "id": "Photo.exe", - "matching_strategy": "Equals" - } - ], - "manage": [ - { - "kind": "Title", - "id": "Affinity Photo 2", - "matching_strategy": "Equals" - } - ] - }, - "Affinity Publisher 2": { - "ignore": [ - { - "kind": "Exe", - "id": "Publisher.exe", - "matching_strategy": "Equals" - } - ], - "manage": [ - { - "kind": "Title", - "id": "Affinity Publisher 2", - "matching_strategy": "Equals" - } - ] - }, - "Akiflow": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Akiflow.exe", - "matching_strategy": "Equals" - } - ] - }, - "Amazon Chime": { - "ignore": [ - { - "kind": "Title", - "id": "Meeting Controls", - "matching_strategy": "EndsWith" - } - ] - }, - "Android Studio": { - "object_name_change": [ - { - "kind": "Exe", - "id": "studio64.exe", - "matching_strategy": "Equals" - } - ] - }, - "Anki": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "anki.exe", - "matching_strategy": "Equals" - } - ] - }, - "ApplicationFrameHost": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "ApplicationFrameHost.exe", - "matching_strategy": "Equals" - } - ] - }, - "Arc Browser": { - "ignore": [ - { - "kind": "Title", - "id": "Arc picture in picture", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Arc extension popup", - "matching_strategy": "Equals" - } - ] - }, - "ArmCord": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "ArmCord.exe", - "matching_strategy": "Equals" - } - ] - }, - "AutoDesk AutoCAD Suite": { - "ignore": [ - [ - { - "kind": "Class", - "id": "Afx:", - "matching_strategy": "Contains" - }, - { - "kind": "Exe", - "id": "acad.exe", - "matching_strategy": "Equals" - } - ], - [ - { - "kind": "Class", - "id": "HwndWrapper[DefaultDomain", - "matching_strategy": "StartsWith" - }, - { - "kind": "Exe", - "id": "acad.exe", - "matching_strategy": "Equals" - } - ], - [ - { - "kind": "Class", - "id": "WindowsForms10.Window", - "matching_strategy": "StartsWith" - }, - { - "kind": "Exe", - "id": "acad.exe", - "matching_strategy": "Equals" - } - ] - ] - }, - "AutoHotkey": { - "ignore": [ - { - "kind": "Title", - "id": "Window Spy", - "matching_strategy": "StartsWith" - }, - { - "kind": "Exe", - "id": "AutoHotkeyUX.exe", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "AutoHotkeyU64.exe", - "matching_strategy": "Equals" - } - ] - }, - "Ayugram": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "ayugram.exe", - "matching_strategy": "Equals" - } - ] - }, - "Balabolka": { - "ignore": [ - [ - { - "kind": "Exe", - "id": "balabolka.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "TBalabolkaForm", - "matching_strategy": "DoesNotEqual" - } - ] - ] - }, - "Barrier": { - "floating": [ - { - "kind": "Exe", - "id": "barrier.exe", - "matching_strategy": "Equals" - } - ] - }, - "Battlestate Games Launcher": { - "floating": [ - { - "kind": "Exe", - "id": "BsgLauncher.exe", - "matching_strategy": "Equals" - } - ] - }, - "Beeper": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Beeper.exe", - "matching_strategy": "Equals" - } - ] - }, - "Bitwarden": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Bitwarden.exe", - "matching_strategy": "Equals" - } - ] - }, - "Blender": { - "floating": [ - [ - { - "kind": "Exe", - "id": "blender.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Blender", - "matching_strategy": "DoesNotContain" - } - ] - ], - "slow_application": [ - { - "kind": "Exe", - "id": "blender.exe", - "matching_strategy": "Equals" - } - ] - }, - "Blitz": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Blitz.exe", - "matching_strategy": "Equals" - } - ] - }, - "Bloxstrap": { - "ignore": [ - { - "kind": "Exe", - "id": "Bloxstrap.exe", - "matching_strategy": "Equals" - } - ] - }, - "Brave Browser": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "brave.exe", - "matching_strategy": "Equals" - } - ] - }, - "Browser Tamer": { - "ignore": [ - { - "kind": "Exe", - "id": "bt.exe", - "matching_strategy": "Equals" - } - ] - }, - "Calculator": { - "ignore": [ - { - "kind": "Title", - "id": "Calculator", - "matching_strategy": "Equals" - } - ] - }, - "Citrix Receiver": { - "ignore": [ - { - "kind": "Exe", - "id": "SelfService.exe", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "SelfService.exe", - "matching_strategy": "Equals" - } - ] - }, - "Clash Verge": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Clash Verge.exe", - "matching_strategy": "Equals" - } - ] - }, - "Clementine": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "clementine.exe", - "matching_strategy": "Equals" - } - ] - }, - "CLion": { - "ignore": [ - { - "kind": "Class", - "id": "SunAwtDialog", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "clion64.exe", - "matching_strategy": "Equals" - } - ], - "object_name_change": [ - { - "kind": "Exe", - "id": "clion64.exe", - "matching_strategy": "Equals" - } - ] - }, - "Clumsy": { - "floating": [ - { - "kind": "Exe", - "id": "clumsy.exe", - "matching_strategy": "Equals" - } - ] - }, - "CopyQ": { - "ignore": [ - { - "kind": "Exe", - "id": "copyq.exe", - "matching_strategy": "Equals" - } - ] - }, - "Core Temp": { - "ignore": [ - { - "kind": "Exe", - "id": "Core Temp.exe", - "matching_strategy": "Equals" - } - ] - }, - "Credential Manager UI Host": { - "ignore": [ - { - "kind": "Exe", - "id": "CredentialUIBroker.exe", - "matching_strategy": "Equals" - } - ] - }, - "Cron": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Cron.exe", - "matching_strategy": "Equals" - } - ] - }, - "DataGrip": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "datagrip64.exe", - "matching_strategy": "Equals" - } - ], - "object_name_change": [ - { - "kind": "Exe", - "id": "datagrip64.exe", - "matching_strategy": "Equals" - } - ] - }, - "Dell Display Manager": { - "ignore": [ - { - "kind": "Exe", - "id": "DDM.exe", - "matching_strategy": "Equals" - } - ] - }, - "Delphi applications": { - "ignore": [ - { - "kind": "Class", - "id": "TApplication", - "matching_strategy": "Legacy" - }, - { - "kind": "Class", - "id": "TWizardForm", - "matching_strategy": "Legacy" - } - ] - }, - "DesktopMate": { - "ignore": [ - { - "kind": "Exe", - "id": "DesktopMate.exe", - "matching_strategy": "Equals" - } - ] - }, - "Discord": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Discord.exe", - "matching_strategy": "Equals" - } - ], - "layered": [ - { - "kind": "Exe", - "id": "Discord.exe", - "matching_strategy": "Equals" - } - ] - }, - "DiscordCanary": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "DiscordCanary.exe", - "matching_strategy": "Equals" - } - ], - "layered": [ - { - "kind": "Exe", - "id": "DiscordCanary.exe", - "matching_strategy": "Equals" - } - ] - }, - "DiscordDevelopment": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "DiscordDevelopment.exe", - "matching_strategy": "Equals" - } - ], - "layered": [ - { - "kind": "Exe", - "id": "DiscordDevelopment.exe", - "matching_strategy": "Equals" - } - ] - }, - "DiscordPTB": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "DiscordPTB.exe", - "matching_strategy": "Equals" - } - ], - "layered": [ - { - "kind": "Exe", - "id": "DiscordPTB.exe", - "matching_strategy": "Equals" - } - ] - }, - "Dropbox": { - "ignore": [ - { - "kind": "Exe", - "id": "Dropbox.exe", - "matching_strategy": "Equals" - } - ] - }, - "DS4Windows": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "DS4Windows.exe", - "matching_strategy": "Equals" - } - ] - }, - "EA Desktop": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "EADesktop.exe", - "matching_strategy": "Equals" - } - ] - }, - "Eagle": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Eagle.exe", - "matching_strategy": "Equals" - } - ] - }, - "Eclipse SWT": { - "object_name_change": [ - { - "kind": "Class", - "id": "SWT_Window", - "matching_strategy": "StartsWith" - } - ] - }, - "ElectronMail": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "ElectronMail.exe", - "matching_strategy": "Equals" - } - ] - }, - "Electrum": { - "ignore": [ - { - "kind": "Title", - "id": "Create/Restore wallet", - "matching_strategy": "Equals" - } - ] - }, - "Element": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Element.exe", - "matching_strategy": "Equals" - } - ] - }, - "Elephicon": { - "ignore": [ - { - "kind": "Exe", - "id": "Elephicon.exe", - "matching_strategy": "Equals" - } - ] - }, - "ElevenClock": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "ElevenClock.exe", - "matching_strategy": "Equals" - } - ] - }, - "Elgato Camera Hub": { - "ignore": [ - { - "kind": "Exe", - "id": "Camera Hub.exe", - "matching_strategy": "Equals" - } - ] - }, - "Elgato Control Center": { - "ignore": [ - { - "kind": "Exe", - "id": "ControlCenter.exe", - "matching_strategy": "Equals" - } - ] - }, - "Elgato Wave Link": { - "ignore": [ - { - "kind": "Exe", - "id": "WaveLink.exe", - "matching_strategy": "Equals" - } - ] - }, - "Epic Games Launcher": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "EpicGamesLauncher.exe", - "matching_strategy": "Equals" - } - ] - }, - "Everything": { - "tray_and_multi_window": [ - { - "kind": "Class", - "id": "EVERYTHING", - "matching_strategy": "Legacy" - } - ] - }, - "Everything1.5a": { - "manage": [ - { - "kind": "Class", - "id": "EVERYTHING_(1.5a)", - "matching_strategy": "Legacy" - } - ], - "tray_and_multi_window": [ - { - "kind": "Class", - "id": "EVERYTHING_(1.5a)", - "matching_strategy": "Legacy" - } - ] - }, - "f.lux": { - "ignore": [ - { - "kind": "Exe", - "id": "flux.exe", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "flux.exe", - "matching_strategy": "Equals" - } - ] - }, - "FFMetrics": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "FFMetrics.exe", - "matching_strategy": "Equals" - } - ] - }, - "Files": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Files.exe", - "matching_strategy": "Equals" - } - ] - }, - "Fork": { - "ignore": [ - [ - { - "kind": "Exe", - "id": "Fork.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Fork -", - "matching_strategy": "DoesNotStartWith" - } - ] - ] - }, - "FreeCAD": { - "floating": [ - [ - { - "kind": "Exe", - "id": "freecad.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "Qt51515QWindowIcon", - "matching_strategy": "Equals" - } - ] - ] - }, - "FreeTube": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "FreeTube.exe", - "matching_strategy": "Equals" - } - ], - "ignore": [ - [ - { - "kind": "Exe", - "id": "FreeTube.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Picture in picture", - "matching_strategy": "Equals" - } - ] - ] - }, - "GIMP": { - "floating": [ - [ - { - "kind": "Exe", - "id": "gimp", - "matching_strategy": "StartsWith" - }, - { - "kind": "Title", - "id": "GNU", - "matching_strategy": "DoesNotContain" - }, - { - "kind": "Title", - "id": "GIMP", - "matching_strategy": "DoesNotEndWith" - } - ], - [ - { - "kind": "Exe", - "id": "gimp", - "matching_strategy": "StartsWith" - }, - { - "kind": "Title", - "id": "About GIMP", - "matching_strategy": "Equals" - } - ] - ] - }, - "GitHub Credential Manager": { - "ignore": [ - { - "kind": "Exe", - "id": "git-credential-manager.exe", - "matching_strategy": "Equals" - } - ] - }, - "Godot Engine": { - "object_name_change": [ - { - "kind": "Exe", - "id": "Godot_v", - "matching_strategy": "StartsWith" - } - ] - }, - "Godot Manager": { - "manage": [ - { - "kind": "Exe", - "id": "GodotManager.exe", - "matching_strategy": "Equals" - } - ], - "object_name_change": [ - { - "kind": "Exe", - "id": "GodotManager.exe", - "matching_strategy": "Equals" - } - ] - }, - "GOG Galaxy": { - "ignore": [ - { - "kind": "Class", - "id": "Chrome_RenderWidgetHostHWND", - "matching_strategy": "Legacy" - } - ], - "manage": [ - { - "kind": "Exe", - "id": "GalaxyClient.exe", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "GalaxyClient.exe", - "matching_strategy": "Equals" - } - ] - }, - "GoLand": { - "ignore": [ - { - "kind": "Class", - "id": "SunAwtDialog", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "goland64.exe", - "matching_strategy": "Equals" - } - ], - "object_name_change": [ - { - "kind": "Exe", - "id": "goland64.exe", - "matching_strategy": "Equals" - } - ] - }, - "Golden Dict": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "GoldenDict.exe", - "matching_strategy": "Equals" - } - ] - }, - "Google Chrome": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "chrome.exe", - "matching_strategy": "Equals" - } - ] - }, - "Google Drive": { - "ignore": [ - { - "kind": "Exe", - "id": "GoogleDriveFS.exe", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "GoogleDriveFS.exe", - "matching_strategy": "Equals" - } - ] - }, - "Google Earth Pro": { - "ignore": [ - [ - { - "kind": "Class", - "id": "Qt5QWindowToolSaveBits", - "matching_strategy": "Equals" - }, - { - "kind": "Exe", - "id": "googleearth.exe", - "matching_strategy": "Equals" - } - ], - [ - { - "kind": "Class", - "id": "Qt5QWindowIcon", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Google Earth Pro", - "matching_strategy": "DoesNotEqual" - }, - { - "kind": "Exe", - "id": "googleearth.exe", - "matching_strategy": "Equals" - } - ] - ] - }, - "GoPro Webcam": { - "tray_and_multi_window": [ - { - "kind": "Class", - "id": "GoPro Webcam", - "matching_strategy": "Legacy" - } - ] - }, - "Grayjay": { - "manage": [ - [ - { - "kind": "Exe", - "id": "dotcefnative.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Grayjay", - "matching_strategy": "Equals" - } - ], - [ - { - "kind": "Exe", - "id": "dotcefnative.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Grayjay (Sub)", - "matching_strategy": "Equals" - } - ] - ] - }, - "Guitar Rig 7": { - "ignore": [ - { - "kind": "Exe", - "id": "Guitar Rig 7.exe", - "matching_strategy": "Equals" - } - ] - }, - "Hammer": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "hammer.exe", - "matching_strategy": "Equals" - } - ], - "ignore": [ - [ - { - "kind": "Exe", - "id": "hammer.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "Afx:", - "matching_strategy": "StartsWith" - } - ] - ], - "slow_application": [ - { - "kind": "Exe", - "id": "hammer.exe", - "matching_strategy": "Equals" - } - ] - }, - "Honkai Star Rail": { - "manage": [ - { - "kind": "Exe", - "id": "StarRail.Exe", - "matching_strategy": "Equals" - } - ] - }, - "HWiNFO64": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "HWiNFO64.EXE", - "matching_strategy": "Equals" - } - ] - }, - "HxD": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "HxD.exe", - "matching_strategy": "Equals" - } - ], - "ignore": [ - [ - { - "kind": "Exe", - "id": "HxD.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "TFormHexView", - "matching_strategy": "Equals" - } - ] - ] - }, - "IDA": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "ida.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Exe", - "id": "ida64.exe", - "matching_strategy": "Equals" - } - ], - "floating": [ - [ - { - "kind": "Exe", - "id": "ida.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "IDA -", - "matching_strategy": "DoesNotStartWith" - }, - { - "kind": "Title", - "id": "IDA v", - "matching_strategy": "DoesNotStartWith" - } - ], - [ - { - "kind": "Exe", - "id": "ida64.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "IDA -", - "matching_strategy": "DoesNotStartWith" - }, - { - "kind": "Title", - "id": "IDA v", - "matching_strategy": "DoesNotStartWith" - } - ] - ] - }, - "IntelliJ IDEA": { - "ignore": [ - { - "kind": "Class", - "id": "SunAwtDialog", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "idea64.exe", - "matching_strategy": "Equals" - } - ], - "object_name_change": [ - { - "kind": "Exe", - "id": "idea64.exe", - "matching_strategy": "Equals" - } - ] - }, - "Itch.io": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "itch.exe", - "matching_strategy": "Equals" - } - ] - }, - "JavaFX": { - "object_name_change": [ - { - "kind": "Class", - "id": "GlassWndClass-GlassWindowClass", - "matching_strategy": "StartsWith" - } - ] - }, - "JetBrains Client": { - "ignore": [ - { - "kind": "Class", - "id": "SunAwtDialog", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "jetbrains_client64.exe", - "matching_strategy": "Equals" - } - ], - "object_name_change": [ - { - "kind": "Exe", - "id": "jetbrains_client64.exe", - "matching_strategy": "Equals" - } - ] - }, - "Keyviz": { - "ignore": [ - { - "kind": "Exe", - "id": "keyviz.exe", - "matching_strategy": "Equals" - } - ] - }, - "Kleopatra": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "kleopatra.exe", - "matching_strategy": "Equals" - } - ] - }, - "komorebi-bar": { - "ignore": [ - { - "kind": "Exe", - "id": "komorebi-bar.exe", - "matching_strategy": "Equals" - } - ] - }, - "komorebi-gui": { - "ignore": [ - { - "kind": "Exe", - "id": "komorebi-gui.exe", - "matching_strategy": "Equals" - } - ] - }, - "KOOK": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "KOOK.exe", - "matching_strategy": "Equals" - } - ] - }, - "Kotatogram": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Kotatogram.exe", - "matching_strategy": "Equals" - } - ] - }, - "Lens": { - "ignore": [ - [ - { - "kind": "Exe", - "id": "Lens.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Loading", - "matching_strategy": "Equals" - } - ] - ] - }, - "Libre Hardware Monitor": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "LibreHardwareMonitor.exe", - "matching_strategy": "Equals" - } - ] - }, - "LibreCAD": { - "ignore": [ - [ - { - "kind": "Title", - "id": "LibreCAD", - "matching_strategy": "DoesNotStartWith" - }, - { - "kind": "Exe", - "id": "LibreCAD.exe", - "matching_strategy": "Equals" - } - ] - ] - }, - "LibreOffice": { - "object_name_change": [ - { - "kind": "Exe", - "id": "soffice.bin", - "matching_strategy": "Equals" - } - ] - }, - "Line": { - "floating": [ - { - "kind": "Exe", - "id": "LineMediaPlayer.exe", - "matching_strategy": "Equals" - } - ] - }, - "LocalSend": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "localsend_app.exe", - "matching_strategy": "Equals" - } - ] - }, - "Logi Bolt": { - "ignore": [ - { - "kind": "Exe", - "id": "LogiBolt.exe", - "matching_strategy": "Equals" - } - ] - }, - "Logitech G HUB": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "lghub.exe", - "matching_strategy": "Equals" - } - ] - }, - "Logitech Options": { - "ignore": [ - { - "kind": "Exe", - "id": "LogiOptionsUI.exe", - "matching_strategy": "Equals" - } - ] - }, - "LogiTune": { - "ignore": [ - { - "kind": "Exe", - "id": "LogiTune.exe", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "LogiTune.exe", - "matching_strategy": "Equals" - } - ] - }, - "MacType": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "MacTray.exe", - "matching_strategy": "Equals" - } - ] - }, - "Mailspring": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "mailspring.exe", - "matching_strategy": "Equals" - } - ] - }, - "ManicTime": { - "manage": [ - { - "kind": "Exe", - "id": "ManicTimeClient.exe", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "ManicTimeClient.exe", - "matching_strategy": "Equals" - } - ], - "object_name_change": [ - { - "kind": "Exe", - "id": "ManicTimeClient.exe", - "matching_strategy": "Equals" - } - ] - }, - "ManyCam": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "ManyCam.exe", - "matching_strategy": "Equals" - } - ] - }, - "Mattermost": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Mattermost.exe", - "matching_strategy": "Equals" - } - ] - }, - "MaxxAudioPro": { - "ignore": [ - [ - { - "kind": "Exe", - "id": "ApplicationFrameHost.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "MaxxAudioPro", - "matching_strategy": "Equals" - } - ] - ] - }, - "MicMute": { - "floating": [ - { - "kind": "Exe", - "id": "MicMute.exe", - "matching_strategy": "Equals" - } - ] - }, - "Microsoft Active Accessibility": { - "ignore": [ - { - "kind": "Class", - "id": "#32770", - "matching_strategy": "Legacy" - } - ] - }, - "Microsoft Edge": { - "ignore": [ - [ - { - "kind": "Exe", - "id": "msedge.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "Chrome_WidgetWin_2", - "matching_strategy": "Equals" - } - ] - ] - }, - "Microsoft Excel": { - "ignore": [ - { - "kind": "Class", - "id": "_WwB", - "matching_strategy": "Legacy" - } - ], - "layered": [ - { - "kind": "Exe", - "id": "EXCEL.EXE", - "matching_strategy": "Equals" - } - ] - }, - "Microsoft IME Pad": { - "floating": [ - { - "kind": "Exe", - "id": "IMEPADSV.EXE", - "matching_strategy": "Equals" - } - ] - }, - "Microsoft Outlook": { - "ignore": [ - { - "kind": "Class", - "id": "_WwB", - "matching_strategy": "Legacy" - }, - { - "kind": "Class", - "id": "MsoSplash", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "OUTLOOK.EXE", - "matching_strategy": "Equals" - } - ], - "layered": [ - { - "kind": "Exe", - "id": "OUTLOOK.EXE", - "matching_strategy": "Equals" - } - ] - }, - "Microsoft PC Manager": { - "ignore": [ - { - "kind": "Exe", - "id": "MSPCManager.exe", - "matching_strategy": "Equals" - } - ] - }, - "Microsoft PowerPoint": { - "ignore": [ - { - "kind": "Class", - "id": "_WwB", - "matching_strategy": "Legacy" - } - ], - "layered": [ - { - "kind": "Exe", - "id": "POWERPNT.EXE", - "matching_strategy": "Equals" - } - ] - }, - "Microsoft SQL Server Management Studio": { - "floating": [ - [ - { - "kind": "Exe", - "id": "Ssms.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "WindowsForms10.Window.8.app", - "matching_strategy": "StartsWith" - } - ] - ] - }, - "Microsoft Teams": { - "tray_and_multi_window": [ - { - "kind": "Class", - "id": "TeamsWebView", - "matching_strategy": "Equals" - } - ] - }, - "Microsoft Teams classic": { - "ignore": [ - { - "kind": "Title", - "id": "Microsoft Teams Notification", - "matching_strategy": "Legacy" - }, - { - "kind": "Title", - "id": "Microsoft Teams Call", - "matching_strategy": "Legacy" - } - ] - }, - "Microsoft Terminal Services Client": { - "ignore": [ - { - "kind": "Class", - "id": "OPContainerClass", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "IHWindowClass", - "matching_strategy": "Equals" - } - ] - }, - "Microsoft Word": { - "ignore": [ - { - "kind": "Class", - "id": "_WwB", - "matching_strategy": "Legacy" - } - ], - "layered": [ - { - "kind": "Exe", - "id": "WINWORD.EXE", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "WINWORD.exe", - "matching_strategy": "Equals" - } - ] - }, - "MobaXterm": { - "manage": [ - [ - { - "kind": "Exe", - "id": "MobaXterm.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "TMobaXtermForm", - "matching_strategy": "Equals" - } - ] - ] - }, - "Mod Organizer 2": { - "ignore": [ - [ - { - "kind": "Exe", - "id": "ModOrganizer.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Extracting files", - "matching_strategy": "Equals" - } - ] - ] - }, - "Modern Flyouts": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "ModernFlyoutsHost.exe", - "matching_strategy": "Equals" - } - ] - }, - "MOTU M-Series": { - "floating": [ - { - "kind": "Exe", - "id": "MOTUMSeries.exe", - "matching_strategy": "Equals" - } - ] - }, - "Mozilla Firefox": { - "ignore": [ - { - "kind": "Class", - "id": "MozillaDialogClass", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "MozillaTaskbarPreviewClass", - "matching_strategy": "Legacy" - }, - [ - { - "kind": "Title", - "id": "Picture-in-Picture", - "matching_strategy": "Equals" - }, - { - "kind": "Exe", - "id": "firefox.exe", - "matching_strategy": "Equals" - } - ] - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "firefox.exe", - "matching_strategy": "Equals" - } - ], - "object_name_change": [ - { - "kind": "Exe", - "id": "firefox.exe", - "matching_strategy": "Equals" - } - ], - "slow_application": [ - { - "kind": "Exe", - "id": "firefox.exe", - "matching_strategy": "Equals" - } - ] - }, - "mpv": { - "object_name_change": [ - { - "kind": "Class", - "id": "mpv", - "matching_strategy": "Legacy" - } - ] - }, - "mpv.net": { - "object_name_change": [ - { - "kind": "Exe", - "id": "mpvnet.exe", - "matching_strategy": "Equals" - } - ] - }, - "NetEase Cloud Music": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "cloudmusic.exe", - "matching_strategy": "Equals" - } - ] - }, - "NiceHash Miner": { - "manage": [ - { - "kind": "Exe", - "id": "nhm_app.exe", - "matching_strategy": "Equals" - } - ] - }, - "NohBoard": { - "ignore": [ - { - "kind": "Exe", - "id": "NohBoard.exe", - "matching_strategy": "Equals" - } - ] - }, - "Notion": { - "ignore": [ - { - "kind": "Title", - "id": "Notion - Command Search", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Notion.exe", - "matching_strategy": "Equals" - } - ] - }, - "Notion Calendar": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Notion Calendar.exe", - "matching_strategy": "Equals" - } - ] - }, - "Notion Enhanced": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Notion Enhanced.exe", - "matching_strategy": "Equals" - } - ] - }, - "NZXT CAM": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "NZXT CAM.exe", - "matching_strategy": "Equals" - } - ] - }, - "OBS Studio (32-bit)": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "obs32.exe", - "matching_strategy": "Equals" - } - ] - }, - "OBS Studio (64-bit)": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "obs64.exe", - "matching_strategy": "Equals" - } - ] - }, - "OneDrive": { - "ignore": [ - { - "kind": "Class", - "id": "OneDriveReactNativeWin32WindowClass", - "matching_strategy": "Legacy" - } - ] - }, - "OneQuick": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "OneQuick.exe", - "matching_strategy": "Equals" - } - ] - }, - "ONLYOFFICE Editors": { - "tray_and_multi_window": [ - { - "kind": "Class", - "id": "DocEditorsWindowClass", - "matching_strategy": "Legacy" - } - ] - }, - "OpenRGB": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "OpenRGB.exe", - "matching_strategy": "Equals" - } - ] - }, - "paint.net": { - "ignore": [ - { - "kind": "Exe", - "id": "paintdotnet.exe", - "matching_strategy": "Equals" - } - ] - }, - "Paradox Launcher": { - "ignore": [ - { - "kind": "Exe", - "id": "Paradox Launcher.exe", - "matching_strategy": "Equals" - } - ] - }, - "PAYDAY 2": { - "ignore": [ - { - "kind": "Exe", - "id": "payday2_win32_release.exe", - "matching_strategy": "Equals" - } - ] - }, - "PhpStorm": { - "ignore": [ - { - "kind": "Class", - "id": "SunAwtDialog", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "phpstorm64.exe", - "matching_strategy": "Equals" - } - ], - "object_name_change": [ - { - "kind": "Exe", - "id": "phpstorm64.exe", - "matching_strategy": "Equals" - } - ] - }, - "pinentry": { - "ignore": [ - { - "kind": "Exe", - "id": "pinentry.exe", - "matching_strategy": "Equals" - } - ] - }, - "Playnite": { - "ignore": [ - { - "kind": "Exe", - "id": "Playnite.FullscreenApp.exe", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Playnite.DesktopApp.exe", - "matching_strategy": "Equals" - } - ] - }, - "PowerToys": { - "ignore": [ - { - "kind": "Exe", - "id": "PowerToys.ColorPickerUI.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Exe", - "id": "PowerToys.CropAndLock.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Exe", - "id": "PowerToys.ImageResizer.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Exe", - "id": "PowerToys.Peek.UI.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Exe", - "id": "PowerToys.PowerLauncher.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Exe", - "id": "PowerToys.PowerAccent.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Exe", - "id": "PowerToys.AdvancedPaste.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Exe", - "id": "PowerToys.FileLocksmithUI.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Exe", - "id": "Microsoft.CmdPal.UI.exe", - "matching_strategy": "Equals" - } - ] - }, - "Prime95": { - "floating": [ - { - "kind": "Exe", - "id": "prime95.exe", - "matching_strategy": "Equals" - } - ] - }, - "Prism Launcher": { - "floating": [ - [ - { - "kind": "Exe", - "id": "prismlauncher.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "- Prism Launcher", - "matching_strategy": "Contains" - } - ] - ] - }, - "Process Hacker": { - "ignore": [ - { - "kind": "Exe", - "id": "ProcessHacker.exe", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "ProcessHacker.exe", - "matching_strategy": "Equals" - } - ] - }, - "ProtonDrive": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "ProtonDrive.exe", - "matching_strategy": "Equals" - } - ] - }, - "ProtonVPN": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "ProtonVPN.exe", - "matching_strategy": "Equals" - } - ] - }, - "PyCharm": { - "ignore": [ - { - "kind": "Class", - "id": "SunAwtDialog", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "pycharm64.exe", - "matching_strategy": "Equals" - } - ], - "object_name_change": [ - { - "kind": "Exe", - "id": "pycharm64.exe", - "matching_strategy": "Equals" - } - ] - }, - "qBittorrent": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "qbittorrent.exe", - "matching_strategy": "Equals" - } - ], - "ignore": [ - [ - { - "kind": "Exe", - "id": "qbittorrent.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Exiting qBittorrent", - "matching_strategy": "Equals" - } - ] - ] - }, - "QGIS": { - "floating": [ - [ - { - "kind": "Exe", - "id": "qgis-bin.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "QGIS", - "matching_strategy": "DoesNotContain" - } - ], - [ - { - "kind": "Exe", - "id": "qgis-ltr-bin.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "QGIS", - "matching_strategy": "DoesNotContain" - } - ] - ] - }, - "QQ": { - "ignore": [ - { - "kind": "Title", - "id": "图片查看器", - "matching_strategy": "Legacy" - }, - { - "kind": "Title", - "id": "群聊的聊天记录", - "matching_strategy": "Legacy" - }, - { - "kind": "Title", - "id": "语音通话", - "matching_strategy": "Legacy" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "QQ.exe", - "matching_strategy": "Equals" - } - ] - }, - "QtScrcpy": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "QtScrcpy.exe", - "matching_strategy": "Equals" - } - ] - }, - "QuickLook": { - "ignore": [ - { - "kind": "Exe", - "id": "QuickLook.exe", - "matching_strategy": "Equals" - } - ] - }, - "RepoZ": { - "ignore": [ - { - "kind": "Exe", - "id": "RepoZ.exe", - "matching_strategy": "Equals" - } - ] - }, - "Rider": { - "ignore": [ - { - "kind": "Class", - "id": "SunAwtDialog", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "PopupMessageWindow", - "matching_strategy": "Legacy" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "rider64.exe", - "matching_strategy": "Equals" - } - ], - "object_name_change": [ - { - "kind": "Exe", - "id": "rider64.exe", - "matching_strategy": "Equals" - } - ] - }, - "Roblox FPS Unlocker": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "rbxfpsunlocker.exe", - "matching_strategy": "Equals" - } - ] - }, - "RoundedTB": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "RoundedTB.exe", - "matching_strategy": "Equals" - } - ] - }, - "RustRover": { - "ignore": [ - { - "kind": "Class", - "id": "SunAwtDialog", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "rustrover64.exe", - "matching_strategy": "Equals" - } - ], - "object_name_change": [ - { - "kind": "Exe", - "id": "rustrover64.exe", - "matching_strategy": "Equals" - } - ] - }, - "Sandboxie Plus": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "SandMan.exe", - "matching_strategy": "Equals" - } - ] - }, - "ShareX": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "ShareX.exe", - "matching_strategy": "Equals" - } - ] - }, - "Sideloadly": { - "ignore": [ - { - "kind": "Exe", - "id": "sideloadly.exe", - "matching_strategy": "Equals" - } - ] - }, - "Signal": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Signal.exe", - "matching_strategy": "Equals" - } - ] - }, - "SiriKali": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "sirikali.exe", - "matching_strategy": "Equals" - } - ] - }, - "Slack": { - "ignore": [ - { - "kind": "Class", - "id": "Chrome_RenderWidgetHostHWND", - "matching_strategy": "Legacy" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "slack.exe", - "matching_strategy": "Equals" - } - ] - }, - "Smart Install Maker": { - "ignore": [ - { - "kind": "Class", - "id": "obj_App", - "matching_strategy": "Legacy" - }, - { - "kind": "Class", - "id": "obj_Form", - "matching_strategy": "Legacy" - } - ] - }, - "SnippingTool": { - "ignore": [ - { - "kind": "Exe", - "id": "SnippingTool.exe", - "matching_strategy": "Equals" - } - ] - }, - "SoulseekQt": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "SoulseekQt.exe", - "matching_strategy": "Equals" - } - ] - }, - "Spotify": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Spotify.exe", - "matching_strategy": "Equals" - } - ] - }, - "Steam": { - "layered": [ - { - "kind": "Exe", - "id": "steam.exe", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "steam.exe", - "matching_strategy": "Equals" - } - ], - "ignore": [ - [ - { - "kind": "Exe", - "id": "steamwebhelper.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Steam", - "matching_strategy": "DoesNotEqual" - } - ] - ], - "floating": [ - [ - { - "kind": "Exe", - "id": "steam.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "BootstrapUpdateUIClass", - "matching_strategy": "Equals" - } - ] - ] - }, - "Steam Beta": { - "ignore": [ - { - "kind": "Title", - "id": "notificationtoasts_", - "matching_strategy": "Legacy" - } - ], - "tray_and_multi_window": [ - { - "kind": "Class", - "id": "SDL_app", - "matching_strategy": "Legacy" - } - ] - }, - "Stremio": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "stremio.exe", - "matching_strategy": "Equals" - } - ] - }, - "Stremio Desktop Community": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "stremio-shell-ng.exe", - "matching_strategy": "Equals" - } - ] - }, - "System Informer": { - "ignore": [ - { - "kind": "Exe", - "id": "SystemInformer.exe", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "SystemInformer.exe", - "matching_strategy": "Equals" - } - ] - }, - "SystemSettings": { - "ignore": [ - { - "kind": "Class", - "id": "Shell_Dialog", - "matching_strategy": "Legacy" - } - ] - }, - "Tabby": { - "manage": [ - [ - { - "kind": "Class", - "id": "Chrome_WidgetWin_1", - "matching_strategy": "Equals" - }, - { - "kind": "Exe", - "id": "Tabby.exe", - "matching_strategy": "Equals" - } - ] - ] - }, - "TablePlus": { - "object_name_change": [ - { - "kind": "Exe", - "id": "TablePlus.exe", - "matching_strategy": "Equals" - } - ] - }, - "Task Manager": { - "ignore": [ - { - "kind": "Class", - "id": "TaskManagerWindow", - "matching_strategy": "Legacy" - } - ] - }, - "Telegram": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Telegram.exe", - "matching_strategy": "Equals" - } - ] - }, - "TeraCopy": { - "ignore": [ - { - "kind": "Exe", - "id": "TeraCopy.exe", - "matching_strategy": "Equals" - } - ] - }, - "TickTick": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "TickTick.exe", - "matching_strategy": "Equals" - } - ] - }, - "Tobit.Team": { - "tray_and_multi_window": [ - { - "kind": "Class", - "id": "TobitTeamFrame", - "matching_strategy": "Equals" - } - ] - }, - "Total Commander": { - "ignore": [ - { - "kind": "Class", - "id": "TDLG2FILEACTIONMIN", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "TFindFile", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "TLister", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "TCHANGETREEDLG", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "TCONNECT", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "TSEARCHTEXT", - "matching_strategy": "Equals" - } - ] - }, - "TouchCursor": { - "ignore": [ - { - "kind": "Exe", - "id": "tcconfig.exe", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "tcconfig.exe", - "matching_strategy": "Equals" - } - ] - }, - "TranslucentTB": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "TranslucentTB.exe", - "matching_strategy": "Equals" - } - ] - }, - "ueli": { - "ignore": [ - { - "kind": "Exe", - "id": "ueli.exe", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "ueli.exe", - "matching_strategy": "Equals" - } - ] - }, - "UniGetUI": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "UniGetUI.exe", - "matching_strategy": "Equals" - } - ] - }, - "Unity": { - "ignore": [ - { - "kind": "Class", - "id": "UnityWndClass", - "matching_strategy": "Equals" - } - ] - }, - "Unity Editor": { - "transparency_ignore": [ - { - "kind": "Exe", - "id": "Unity.exe", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Unity.exe", - "matching_strategy": "Equals" - } - ] - }, - "Unity Hub": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "Unity Hub.exe", - "matching_strategy": "Equals" - } - ] - }, - "Unreal Editor": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "UnrealEditor.exe", - "matching_strategy": "Equals" - } - ], - "floating": [ - [ - { - "kind": "Exe", - "id": "UnrealEditor.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "- Unreal Editor", - "matching_strategy": "DoesNotEndWith" - } - ] - ] - }, - "Unreal Engine": { - "ignore": [ - { - "kind": "Class", - "id": "UnrealWindow", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "SplashScreenGuard", - "matching_strategy": "Equals" - } - ] - }, - "visio": { - "ignore": [ - { - "kind": "Class", - "id": "VISIOS", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "VISIOQ", - "matching_strategy": "Equals" - } - ], - "manage": [ - { - "kind": "Class", - "id": "VISIOA", - "matching_strategy": "Equals" - } - ] - }, - "Visual Studio": { - "object_name_change": [ - { - "kind": "Exe", - "id": "devenv.exe", - "matching_strategy": "Equals" - } - ], - "floating": [ - [ - { - "kind": "Exe", - "id": "devenv.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "QuickWatch", - "matching_strategy": "Equals" - } - ], - [ - { - "kind": "Exe", - "id": "devenv.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": " - Microsoft Visual Studio", - "matching_strategy": "DoesNotContain" - } - ] - ], - "ignore": [ - { - "kind": "Exe", - "id": "VsDebugConsole.exe", - "matching_strategy": "Equals" - }, - [ - { - "kind": "Exe", - "id": "iisexpresstray.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "WindowsForms10.Window", - "matching_strategy": "StartsWith" - } - ], - { - "kind": "Title", - "id": "WindowsFormsParkingWindow", - "matching_strategy": "Equals" - }, - [ - { - "kind": "Exe", - "id": "devenv.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Move files to a new location?", - "matching_strategy": "Equals" - } - ], - { - "kind": "Exe", - "id": "ServiceHub.ThreadedWaitDialog.exe", - "matching_strategy": "Equals" - } - ] - }, - "VLC": { - "object_name_change": [ - { - "kind": "Exe", - "id": "vlc.exe", - "matching_strategy": "Equals" - } - ], - "ignore": [ - [ - { - "kind": "Exe", - "id": "vlc.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Open URL", - "matching_strategy": "Equals" - } - ], - [ - { - "kind": "Exe", - "id": "vlc.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "About", - "matching_strategy": "Equals" - } - ], - [ - { - "kind": "Exe", - "id": "vlc.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Preferences", - "matching_strategy": "Contains" - } - ], - [ - { - "kind": "Exe", - "id": "vlc.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Adjustments and Effects", - "matching_strategy": "Equals" - } - ], - [ - { - "kind": "Exe", - "id": "vlc.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Open Media", - "matching_strategy": "Equals" - } - ], - [ - { - "kind": "Exe", - "id": "vlc.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Current Media Information", - "matching_strategy": "Equals" - } - ], - [ - { - "kind": "Exe", - "id": "vlc.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Messages", - "matching_strategy": "Equals" - } - ], - [ - { - "kind": "Exe", - "id": "vlc.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "VLC media player updates", - "matching_strategy": "Equals" - } - ], - [ - { - "kind": "Exe", - "id": "vlc.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Help", - "matching_strategy": "Equals" - } - ], - [ - { - "kind": "Exe", - "id": "vlc.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Plugins and extensions", - "matching_strategy": "Equals" - } - ], - [ - { - "kind": "Exe", - "id": "vlc.exe", - "matching_strategy": "Equals" - }, - { - "kind": "Title", - "id": "Building font cache", - "matching_strategy": "Equals" - } - ] - ] - }, - "VMware Horizon Client": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "vmware-view.exe", - "matching_strategy": "Equals" - } - ] - }, - "Voice.ai": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "VoiceAI.exe", - "matching_strategy": "Equals" - } - ] - }, - "VRCX": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "VRCX.exe", - "matching_strategy": "Equals" - } - ] - }, - "WebStorm": { - "ignore": [ - { - "kind": "Class", - "id": "SunAwtDialog", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "webstorm64.exe", - "matching_strategy": "Equals" - } - ], - "object_name_change": [ - { - "kind": "Exe", - "id": "webstorm64.exe", - "matching_strategy": "Equals" - } - ] - }, - "WebTorrent Desktop": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "WebTorrent.exe", - "matching_strategy": "Equals" - } - ] - }, - "WeChat": { - "ignore": [ - { - "kind": "Class", - "id": "WeChatLoginWndForPC", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "FileListMgrWnd", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "CWebviewControlHostWnd", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "ChatWnd", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "EmotionTipWnd", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "ChatContactMenu", - "matching_strategy": "Equals" - }, - { - "kind": "Exe", - "id": "WeChatAppEx.exe", - "matching_strategy": "Equals" - } - ], - "manage": [ - { - "kind": "Class", - "id": "WeChatMainWndForPC", - "matching_strategy": "Equals" - } - ], - "tray_and_multi_window": [ - { - "kind": "Class", - "id": "WeChatMainWndForPC", - "matching_strategy": "Equals" - } - ] - }, - "WezTerm": { - "object_name_change": [ - { - "kind": "Exe", - "id": "wezterm-gui.exe", - "matching_strategy": "Equals" - } - ] - }, - "WinCompose": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "wincompose.exe", - "matching_strategy": "Equals" - } - ] - }, - "Windows Console (conhost.exe)": { - "manage": [ - { - "kind": "Class", - "id": "ConsoleWindowClass", - "matching_strategy": "Equals" - } - ] - }, - "Windows Explorer": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "explorer.exe", - "matching_strategy": "Equals" - } - ], - "ignore": [ - { - "kind": "Class", - "id": "NativeHWNDHost", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "OperationStatusWindow", - "matching_strategy": "Legacy" - }, - { - "kind": "Title", - "id": "Control Panel", - "matching_strategy": "Legacy" - } - ] - }, - "Windows Installer": { - "ignore": [ - { - "kind": "Exe", - "id": "msiexec.exe", - "matching_strategy": "Equals" - } - ] - }, - "Windows Subsystem for Android": { - "ignore": [ - { - "kind": "Class", - "id": "android(splash)", - "matching_strategy": "Legacy" - } - ] - }, - "Windows Terminal": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "WindowsTerminal.exe", - "matching_strategy": "Equals" - } - ] - }, - "Windows Update Standalone Installer": { - "ignore": [ - { - "kind": "Exe", - "id": "wusa.exe", - "matching_strategy": "Equals" - } - ] - }, - "WingetUI": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "wingetui.exe", - "matching_strategy": "Equals" - } - ] - }, - "WinZip (32-bit)": { - "ignore": [ - { - "kind": "Exe", - "id": "winzip32.exe", - "matching_strategy": "Equals" - } - ] - }, - "WinZip (64-bit)": { - "ignore": [ - { - "kind": "Exe", - "id": "winzip64.exe", - "matching_strategy": "Equals" - } - ] - }, - "Wox": { - "ignore": [ - { - "kind": "Title", - "id": "Hotkey sink", - "matching_strategy": "Legacy" - } - ] - }, - "XAMPP Control Panel": { - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "xampp-control.exe", - "matching_strategy": "Equals" - } - ] - }, - "Zebar": { - "ignore": [ - { - "kind": "Exe", - "id": "zebar.exe", - "matching_strategy": "Equals" - } - ] - }, - "Zed": { - "layered": [ - { - "kind": "Exe", - "id": "zed.exe", - "matching_strategy": "Equals" - } - ] - }, - "Zen Browser": { - "ignore": [ - { - "kind": "Class", - "id": "MozillaDialogClass", - "matching_strategy": "Equals" - }, - { - "kind": "Class", - "id": "MozillaTaskbarPreviewClass", - "matching_strategy": "Legacy" - }, - [ - { - "kind": "Title", - "id": "Picture-in-Picture", - "matching_strategy": "Equals" - }, - { - "kind": "Exe", - "id": "zen.exe", - "matching_strategy": "Equals" - } - ] - ], - "tray_and_multi_window": [ - { - "kind": "Exe", - "id": "zen.exe", - "matching_strategy": "Equals" - } - ], - "object_name_change": [ - { - "kind": "Exe", - "id": "zen.exe", - "matching_strategy": "Equals" - } - ], - "slow_application": [ - { - "kind": "Exe", - "id": "zen.exe", - "matching_strategy": "Equals" - } - ] - }, - "Zoom": { - "ignore": [ - { - "kind": "Exe", - "id": "Zoom.exe", - "matching_strategy": "Equals" - } - ] - } -} diff --git a/.config/windows/komorebi/komorebi.bar.json b/.config/windows/komorebi/komorebi.bar.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.config/windows/komorebi/komorebi.bar.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.config/windows/komorebi/komorebi.json b/.config/windows/komorebi/komorebi.json deleted file mode 100644 index 738d9cb..0000000 --- a/.config/windows/komorebi/komorebi.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/LGUG2Z/komorebi/v0.1.40/schema.json", - "app_specific_configuration_path": "$Env:USERPROFILE/applications.json", - "window_hiding_behaviour": "Cloak", - "cross_monitor_move_behaviour": "Insert", - "cross_boundary_behaviour": "Workspace", - "window_container_behaviour": "Create", - "window_handling_behaviour": "Sync", - "unmanaged_window_operation_behaviour": "NoOp", - "default_workspace_padding": 1, - "default_container_padding": 4, - "border": true, - "border_width": 3, - "border_offset": -1, - "border_style": "Rounded", - "mouse_follows_focus": true, - "stackbar": { - "height": 30, - "mode": "OnStack", - "tabs": { - "width": 200 - } - }, - "animation": { - "enabled": true, - "style": "EaseOutCubic", - "duration": 200, - "fps": 60 - }, - "transparency": true, - "transparency_alpha": 245, - "theme": { - "palette": "Base16", - "name": "TokyoNightDark", - "single_border": "Base0E", - "stack_border": "Base08", - "monocle_border": "Base0D", - "floating_border": "Base09", - "unfocused_border": "Base03", - "bar_accent": "Base0E" - }, - "display_index_preferences": { - "0": "CMN1556-4&243a609a&0&UID8388688", - "1": "DELF144-5&26d74eb9&0&UID4354" - }, - "ignore_rules": [ - { "kind": "Exe", "id": "Nani.exe", "matching_strategy": "Equals" }, - { "kind": "Exe", "id": "Docker Desktop.exe", "matching_strategy": "Equals" }, - { "kind": "Exe", "id": "WindowsTerminal.exe", "matching_strategy": "Equals" }, - { "kind": "Exe", "id": "explorer.exe", "matching_strategy": "Equals" } - ], - "object_name_change_applications": [ - { "kind": "Exe", "id": "Mattermost.exe", "matching_strategy": "Equals" } - ], - "monitors": [ - { - "workspaces": [ - { - "name": "I", - "layout": "BSP", - "initial_workspace_rules": [ - { "kind": "Exe", "id": "wezterm-gui.exe", "matching_strategy": "Equals" } - ] - }, - { - "name": "II", - "layout": "Grid", - "workspace_rules": [ - { "kind": "Exe", "id": "Discord.exe", "matching_strategy": "Equals" } - ] - }, - { - "name": "III", - "layout": "Columns", - "workspace_rules": [ - { "kind": "Exe", "id": "Slack.exe", "matching_strategy": "Equals" }, - { "kind": "Exe", "id": "Spotify.exe", "matching_strategy": "Equals" } - ] - } - ] - }, - { - "workspaces": [ - { - "name": "IV", - "layout": "BSP", - "workspace_rules": [ - { "kind": "Exe", "id": "Code.exe", "matching_strategy": "Equals" }, - { "kind": "Exe", "id": "Zed.exe", "matching_strategy": "Equals" } - ] - }, - { - "name": "V", - "layout": "BSP", - "workspace_rules": [ - { "kind": "Exe", "id": "chrome.exe", "matching_strategy": "Equals" }, - { "kind": "Exe", "id": "brave.exe", "matching_strategy": "Equals" } - ] - }, - { - "name": "VI", - "layout": "BSP", - "workspace_rules": [ - { "kind": "Exe", "id": "Mattermost.exe", "matching_strategy": "Equals" } - ] - } - ] - } - ] -} diff --git a/.config/windows/komorebi/komorebi_resolve_config.ps1 b/.config/windows/komorebi/komorebi_resolve_config.ps1 deleted file mode 100644 index 0e49579..0000000 --- a/.config/windows/komorebi/komorebi_resolve_config.ps1 +++ /dev/null @@ -1,91 +0,0 @@ -# 接続中の外部モニターを WMI で検出して、komorebi 設定の -# display_index_preferences[1] を実機に合わせた一時ファイルを生成する。 -# 標準出力に生成済みファイルのパスを 1 行で返す(komorebi_start.ps1 から -# `komorebic start --config ` 用に渡す)。 -# -# canonical な komorebi.json は dotfiles 側 (setup_windows.ps1 で -# $HOME\komorebi.json にリンク) を読み込み、リポジトリは書き換えない。 -# 検出に失敗した場合は canonical のパスをそのまま返す(フォールバック)。 - -$ErrorActionPreference = "Continue" - -# Canonical 設定ファイル(setup_windows.ps1 が $HOME\komorebi.json をシンボリックリンク化) -$canonicalPath = Join-Path $env:USERPROFILE "komorebi.json" -if (-not (Test-Path -LiteralPath $canonicalPath)) { - # リンクが無い場合はリポジトリ直接を見る - $canonicalPath = "$env:USERPROFILE\Project\github.com\t4ko0522\dotfiles\.config\komorebi\komorebi.json" -} - -# 認識済み外部モニター(後で増やす場合はここに追加) -$knownExternals = @{ - "IOD43EE" = "home (IO-DATA)" - "DELF144" = "work (Dell)" -} - -# 内蔵モニター(除外用) -$internalManufacturers = @("CMN", "AUO", "LGD", "BOE") - -function ConvertTo-KomorebiDeviceId { - param([string]$InstanceName) - # InstanceName: "DISPLAY\IOD43EE\5&26d74eb9&0&UID4354_0" - # komorebi: "IOD43EE-5&26d74eb9&0&UID4354" - $parts = $InstanceName -split '\\' - if ($parts.Count -lt 3) { return $null } - $deviceCode = $parts[1] - $hardwareId = $parts[2] -replace '_\d+$', '' - return "$deviceCode-$hardwareId" -} - -# 外部モニター検出 -$detectedExternalId = $null -try { - $wmiMonitors = Get-CimInstance -Namespace root\WMI -ClassName WmiMonitorID -ErrorAction Stop | - Where-Object { $_.Active } - foreach ($wm in $wmiMonitors) { - $mfg = ([System.Text.Encoding]::ASCII.GetString($wm.ManufacturerName)).TrimEnd([char]0) - if ($internalManufacturers -contains $mfg) { continue } - - $prod = ([System.Text.Encoding]::ASCII.GetString($wm.ProductCodeID)).TrimEnd([char]0) - $deviceCode = "$mfg$prod" - if (-not $knownExternals.ContainsKey($deviceCode)) { - Write-Host "[?] unknown external monitor: $deviceCode (komorebi_resolve_config.ps1 の knownExternals に追加してください)" -ForegroundColor Yellow - continue - } - - $detectedExternalId = ConvertTo-KomorebiDeviceId -InstanceName $wm.InstanceName - Write-Host ("[ext] detected: {0} ({1})" -f $detectedExternalId, $knownExternals[$deviceCode]) -ForegroundColor Cyan - break - } -} catch { - Write-Host "WMI monitor lookup failed: $_" -ForegroundColor Yellow -} - -# Canonical を読み込み、必要なら display_index_preferences[1] を patch -$json = Get-Content -LiteralPath $canonicalPath -Raw -$config = $json | ConvertFrom-Json - -if ($detectedExternalId -and $config.display_index_preferences) { - $current = $config.display_index_preferences.'1' - if ($current -ne $detectedExternalId) { - Write-Host ("[patch] display_index_preferences[1]: {0} -> {1}" -f $current, $detectedExternalId) -ForegroundColor DarkCyan - $config.display_index_preferences.'1' = $detectedExternalId - } -} - -# app_specific_configuration_path は dotfiles canonical では PowerShell 風の "$Env:..." 表記だが、 -# komorebi はこの形式を展開しないので、runtime 用には絶対パスへ解決しておく。 -if ($config.app_specific_configuration_path) { - $orig = $config.app_specific_configuration_path - $resolved = $orig.Replace('$Env:USERPROFILE', $env:USERPROFILE).Replace('${Env:USERPROFILE}', $env:USERPROFILE).Replace('%USERPROFILE%', $env:USERPROFILE) - if ($resolved -ne $orig) { - Write-Host ("[patch] app_specific_configuration_path: {0} -> {1}" -f $orig, $resolved) -ForegroundColor DarkCyan - $config.app_specific_configuration_path = $resolved - } -} - -# 一時設定ファイルへ書き出し -$runtimePath = Join-Path $env:LOCALAPPDATA "komorebi-runtime.json" -$config | ConvertTo-Json -Depth 100 | Set-Content -LiteralPath $runtimePath -Encoding UTF8 - -# stdout には生成済みファイルパスのみ -Write-Output $runtimePath diff --git a/.config/windows/komorebi/komorebi_start.ps1 b/.config/windows/komorebi/komorebi_start.ps1 deleted file mode 100644 index 5ed1957..0000000 --- a/.config/windows/komorebi/komorebi_start.ps1 +++ /dev/null @@ -1,61 +0,0 @@ -# komorebi + whkd + 常用アプリ一括起動を「実機モニターに合わせた -# display_index_preferences」で行う、朝の作業環境立ち上げの唯一の経路。 -# pwsh 起動時に startup.ps1 から komorebi 未起動時のみ呼ばれる。 -# -# 注意: `komorebic start --config ` は内部で `--config="path"` の形に連結して -# komorebi.exe に渡すため clap で reject される。これを避けるために komorebi.exe を -# 直接起動し、その後 whkd を別途立ち上げる。 - -$ErrorActionPreference = "Continue" - -$komorebiPath = (Get-Command komorebi -ErrorAction SilentlyContinue)?.Source -$whkdPath = (Get-Command whkd -ErrorAction SilentlyContinue)?.Source -if (-not $komorebiPath) { - Write-Host "komorebi not found in PATH" -ForegroundColor Yellow - exit 1 -} - -# 接続モニターに合わせて patch 済みの一時設定ファイルを生成 -$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path -$resolver = Join-Path $scriptDir "komorebi_resolve_config.ps1" -$runtimeConfig = $null -if (Test-Path -LiteralPath $resolver) { - $output = & $resolver - $last = $output | Where-Object { $_ } | Select-Object -Last 1 - if ($last) { $runtimeConfig = $last.ToString().Trim() } -} - -# komorebi.exe を直接起動 (komorebic start の --config 連結バグを回避) -$komorebiArgs = @() -if ($runtimeConfig -and (Test-Path -LiteralPath $runtimeConfig)) { - $komorebiArgs = @('--config', $runtimeConfig) - Write-Host ("[start] komorebi --config {0}" -f $runtimeConfig) -ForegroundColor Cyan -} else { - Write-Host "[start] komorebi (no runtime config)" -ForegroundColor Cyan -} -Start-Process -FilePath $komorebiPath -ArgumentList $komorebiArgs -WindowStyle Hidden - -# komorebi が socket を listen し始めるまで待機 (最大 15 秒) -$deadline = (Get-Date).AddSeconds(15) -while ((Get-Date) -lt $deadline) { - Start-Sleep -Milliseconds 300 - komorebic state 2>$null | Out-Null - if ($LASTEXITCODE -eq 0) { break } -} - -# whkd を別途立ち上げ -if ($whkdPath) { - if (-not (Get-Process -Name whkd -ErrorAction SilentlyContinue)) { - Start-Process -FilePath $whkdPath -WindowStyle Hidden - Write-Host "[start] whkd" -ForegroundColor Cyan - } -} - -# 常用アプリを一括起動して両モニターを WS1 に整列 -# komorebi 未起動 → 起動の流れでだけ走るので、作業中の pwsh タブ起動では -# 二度目の WS リセットは発生しない。 -$morningSetup = Join-Path $scriptDir "morning_setup.ps1" -if (Test-Path -LiteralPath $morningSetup) { - Write-Host "[start] morning_setup" -ForegroundColor Cyan - & $morningSetup -} diff --git a/.config/windows/komorebi/morning_setup.ps1 b/.config/windows/komorebi/morning_setup.ps1 deleted file mode 100644 index 378b0bf..0000000 --- a/.config/windows/komorebi/morning_setup.ps1 +++ /dev/null @@ -1,85 +0,0 @@ -# ワークスペース配置に沿ってよく使うアプリを一括起動する。 -# 振り分けは komorebi.json の workspace_rules 側で宣言的に管理しているため、 -# このスクリプトは起動だけを担当する(timing 依存を排除)。 -# -# 仕様: -# - 既に走っているプロセスは何もしない -# - インストール先が見つからない exe はスキップ -# - 全て実体フルパスで起動(PATH 依存を排除) - -$ErrorActionPreference = "Continue" - -# モニター index の動的補正は komorebi_start.ps1 が起動時に行うのでここでは不要。 - -function Start-IfNotRunning { - param( - [Parameter(Mandatory)][string] $ProcessName, - [Parameter(Mandatory)][string] $Path, - [string[]] $ArgumentList - ) - - if (Get-Process -Name $ProcessName -ErrorAction SilentlyContinue) { - Write-Host ("[skip] already running: {0}" -f $ProcessName) -ForegroundColor DarkGray - return - } - - if (-not (Test-Path -LiteralPath $Path)) { - Write-Host ("[miss] not installed: {0}" -f $Path) -ForegroundColor Yellow - return - } - - Write-Host ("[run ] launching: {0}" -f $Path) -ForegroundColor Cyan - if ($ArgumentList) { - Start-Process -FilePath $Path -ArgumentList $ArgumentList - } else { - Start-Process -FilePath $Path - } - Start-Sleep -Milliseconds 300 -} - -# WS I / M0 — WezTerm -Start-IfNotRunning ` - -ProcessName "wezterm-gui" ` - -Path "C:\Program Files\WezTerm\wezterm-gui.exe" - -# WS II / M0 — Discord (Update.exe --processStart Discord.exe でバージョン依存を回避) -Start-IfNotRunning ` - -ProcessName "Discord" ` - -Path "$env:LOCALAPPDATA\Discord\Update.exe" ` - -ArgumentList @("--processStart", "Discord.exe") - -# WS III / M0 — Slack (Microsoft Store 版。WindowsApps 以下の App Execution Alias を使う) -Start-IfNotRunning ` - -ProcessName "slack" ` - -Path "$env:LOCALAPPDATA\Microsoft\WindowsApps\slack.exe" - -# WS III / M0 — Spotify -Start-IfNotRunning ` - -ProcessName "Spotify" ` - -Path "$env:APPDATA\Spotify\Spotify.exe" - -# WS IV / M1 — Zed -Start-IfNotRunning ` - -ProcessName "Zed" ` - -Path "$env:LOCALAPPDATA\Programs\Zed\Zed.exe" - -# WS IV / M1 — Brave (プライベート用ブラウザ) -Start-IfNotRunning ` - -ProcessName "brave" ` - -Path "C:\Program Files\BraveSoftware\Brave-Browser\Application\brave.exe" - -# WS V / M1 — Chrome (ビジネス用ブラウザ) -Start-IfNotRunning ` - -ProcessName "chrome" ` - -Path "C:\Program Files\Google\Chrome\Application\chrome.exe" - -# WS VI / M1 — Mattermost -Start-IfNotRunning ` - -ProcessName "Mattermost" ` - -Path "C:\Program Files\Mattermost\Mattermost.exe" - -# 起動完了後に両モニターを WS 1 へ -Start-Sleep -Seconds 2 -if (Get-Command komorebic -ErrorAction SilentlyContinue) { - komorebic focus-workspaces 0 | Out-Null -} diff --git a/.config/windows/whkdrc b/.config/windows/whkdrc deleted file mode 100644 index f980c8b..0000000 --- a/.config/windows/whkdrc +++ /dev/null @@ -1,78 +0,0 @@ -.shell pwsh - -# Reload komorebi configuration -win + r : komorebic reload-configuration - -# App shortcuts - these require shell to be pwsh / powershell -# The apps will be focused if open, or launched if not open -# win + f : if ($wshell.AppActivate('Firefox') -eq $False) { start firefox } -# win + b : if ($wshell.AppActivate('Chrome') -eq $False) { start chrome } - -win + q : komorebic close -win + m : komorebic minimize - -# Focus windows within workspace -win + left : komorebic focus left -win + down : komorebic focus down -win + up : komorebic focus up -win + right : komorebic focus right -win + shift + oem_4 : komorebic cycle-focus previous # oem_4 is [ -win + shift + oem_6 : komorebic cycle-focus next # oem_6 is ] - -# Preselect split direction for next window (win + uiop) — 次に開くウィンドウの配置先を指定 -win + u : komorebic preselect-direction left -win + i : komorebic preselect-direction down -win + o : komorebic preselect-direction up -win + p : komorebic preselect-direction right -win + shift + return : komorebic promote - -# Swap/move focused window with neighbor (win + shift + uiop) -win + shift + u : komorebic move left -win + shift + i : komorebic move down -win + shift + o : komorebic move up -win + shift + p : komorebic move right - -# Stack windows -win + oem_1 : komorebic unstack # oem_1 is ; -win + oem_4 : komorebic cycle-stack previous # oem_4 is [ -win + oem_6 : komorebic cycle-stack next # oem_6 is ] - -# Resize -win + oem_plus : komorebic resize-axis horizontal increase -win + oem_minus : komorebic resize-axis horizontal decrease -win + shift + oem_plus : komorebic resize-axis vertical increase -win + shift + oem_minus : komorebic resize-axis vertical decrease - -# Manipulate windows -win + t : komorebic toggle-float -win + shift + f : komorebic toggle-monocle - -# Window manager options -win + z : komorebic toggle-pause - -# Layouts -win + x : komorebic flip-layout horizontal -win + y : komorebic flip-layout vertical - -# Workspaces — グローバル番号で固定 (フォーカス中モニターに依らず常に同じ WS へ飛ぶ) -win + 1 : komorebic focus-monitor-workspace 0 0 # WS 1 (M0:I): wezterm -win + 2 : komorebic focus-monitor-workspace 0 1 # WS 2 (M0:II): discord -win + 3 : komorebic focus-monitor-workspace 0 2 # WS 3 (M0:III): slack+spotify - -# M1 のワークスペースへ直接切替 (フォーカスも M1 へ移動) -win + f1 : komorebic focus-monitor-workspace 1 0 # WS 4 (M1:IV): vscode -win + f2 : komorebic focus-monitor-workspace 1 1 # WS 5 (M1:V): chrome+brave -win + f3 : komorebic focus-monitor-workspace 1 2 # WS 6 (M1:VI): mattermost - -# Move current window to a workspace on the focused monitor -win + alt + 1 : komorebic move-to-workspace 0 -win + alt + 2 : komorebic move-to-workspace 1 -win + alt + 3 : komorebic move-to-workspace 2 - -# Monitors (multi-monitor focus/move) -win + oem_comma : komorebic focus-monitor 0 # , — M0 main (wezterm / discord / slack+spotify) -win + oem_period : komorebic focus-monitor 1 # . — M1 sub (vscode+brave / chrome / mattermost) -win + shift + oem_comma : komorebic move-to-monitor 0 -win + shift + oem_period: komorebic move-to-monitor 1 -win + n : komorebic cycle-monitor next -win + shift + n : komorebic cycle-monitor previous \ No newline at end of file diff --git a/.config/windows/yasb/config.yaml b/.config/windows/yasb/config.yaml deleted file mode 100644 index 395006c..0000000 --- a/.config/windows/yasb/config.yaml +++ /dev/null @@ -1,486 +0,0 @@ -watch_stylesheet: true -watch_config: true -debug: false -komorebi: - start_command: "komorebic start" - stop_command: "komorebic stop" - reload_command: "komorebic stop && komorebic start" -bars: - status-bar: - enabled: true - screens: ['*'] - class_name: "yasb-bar" - alignment: - position: "top" - center: false - animation: - enabled: true - duration: 800 - blur_effect: - enabled: false - acrylic: false - dark_mode: false - round_corners: true - border_color: none - window_flags: - always_on_top: false - windows_app_bar: true - dimensions: - width: "100%" - height: 40 - padding: - top: 9 - left: 9 - bottom: 9 - right: 9 - widgets: - left: - [ - "home", - "wallpaper", - "update_check", - "cpu", - "memory", - "traffic", - "battery", - "brightness", - ] - center: - [ - "greeting", - "active_window", - ] - right: - [ - "weather", - "komorebi_workspaces", - "clock", - "cava", - "media", - "volume", - "wifi", - "disk", - "power_menu" - ] -widgets: - komorebi_workspaces: - type: "komorebi.workspaces.WorkspaceWidget" - options: - label_offline: "komorebi offline" - label_workspace_btn: "{index}" - label_workspace_active_btn: "{index}" - label_workspace_populated_btn: "{index}" - label_default_name: "{index}" - label_zero_index: false - hide_empty_workspaces: false - hide_if_offline: true - animation: true - enable_scroll_switching: true - glazewm_workspaces: - type: "glazewm.workspaces.GlazewmWorkspacesWidget" - options: - offline_label: "👋 Hi there!" - hide_empty_workspaces: true - hide_if_offline: true - greeting: - type: "yasb.custom.CustomWidget" - options: - label: "👋 {data}" - label_alt: "👋 {data}" - label_placeholder: "👋 Hi there!" - class_name: "greeting-widget" - exec_options: - run_cmd: "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\\Users\\takow\\.config\\yasb\\greeting.ps1" - run_interval: 60000 - return_format: "string" - hide_empty: false - use_shell: true - wallpaper: - type: "yasb.wallpapers.WallpapersWidget" - options: - label: "\uf03e" - image_path: "C:\\Users\\HP\\Pictures\\Wallpapers" - change_automatically: false # Automatically change wallpaper - update_interval: 60 - gallery: - enabled: true - blur: true - image_width: 250 - image_per_page: 4 - show_buttons: true - orientation: "portrait" - image_spacing: 15 - lazy_load: true - lazy_load_delay: 80 - lazy_load_fadein: 400 - image_corner_radius: 8 - enable_cache: true - cava: - type: "yasb.cava.CavaWidget" - options: - bar_height: 12 - gradient: 1 - reverse: 0 - foreground: "#cba6f7" - gradient_color_1: '#cba6f7' - gradient_color_2: '#B4BEFE' - bars_number: 8 - bar_spacing: 2 - bar_width: 5 - noise_reduction: 1 - sleep_timer: 2 - hide_empty: false - container_padding: - top: 0 - left: 4 - bottom: 0 - right: 4 - home: - type: "yasb.home.HomeWidget" - options: - label: "\udb80\udf5c" - menu_list: - - { title: "Home", path: "~" } - - { title: "Downloads", path: "C:\\Users\\HP\\Downloads"} - - { title: "Documents", path: "C:\\Users\\HP\\Documents"} - - { title: "Pictures", path: "C:\\Users\\HP\\Pictures"} - - { title: "Videos", path: "C:\\Users\\HP\\Videos"} - system_menu: true - power_menu: false - blur: true - round_corners: true - round_corners_type: "normal" - border_color: "" - distance: 10 - container_padding: - top: 0 - left: 0 - bottom: 0 - right: 0 - media: - type: "yasb.media.MediaWidget" - options: - label: "\udb80\udf87 {title}" - label_alt: "\udb80\udf87 {title}" - hide_empty: true - callbacks: - on_left: "toggle_media_menu" - on_middle: "do_nothing" - on_right: "toggle_label" - max_field_size: - label: 50 - label_alt: 50 - show_thumbnail: false - controls_only: false - controls_left: true - thumbnail_alpha: 50 - thumbnail_padding: 0 - thumbnail_corner_radius: 8 - icons: - prev_track: "\ue892" - next_track: "\ue893" - play: "\ue768" - pause: "\ue769" - media_menu: - blur: true - round_corners: true - round_corners_type: "normal" - border_color: "#cba6f7" - alignment: "right" - direction: "down" - offset_top: 6 - offset_left: 0 - thumbnail_corner_radius: 8 - thumbnail_size: 120 - max_title_size: 80 - max_artist_size: 20 - show_source: true - media_menu_icons: - play: "\ue768" - pause: "\ue769" - prev_track: "\ue892" - next_track: "\ue893" - label_shadow: - enabled: true - color: "black" - radius: 3 - offset: [ 1, 1 ] - clock: - type: "yasb.clock.ClockWidget" - options: - label: "\ue769{%H:%M}" - label_alt: "{%Y年%m月%d日 %H:%M:%S}" - timezones: [] #Looking up time zone info from registry - weather: - type: "yasb.weather.WeatherWidget" - options: - label: "{icon} {temp}" - label_alt: "{location}: {conditions} / 最低 {min_temp} / 最高 {max_temp} / 湿度 {humidity}" - api_key: env - update_interval: 600 #Update interval in seconds, Min 600 - hide_decimal: true - location: "Higashiosaka, JP" - units: "metric" - callbacks: - on_left: "toggle_card" - icons: - sunnyDay: "\udb81\udd99" - clearNight: "\ue3c2" - cloudyDay: "\ue21d" - cloudyNight: "\ue226" - rainyDay: "\ue371" - rainyNight: "\ue371" - snowyDay: "\udb81\udf17" - snowyNight: "\udb81\udf17" - blizzardDay: "\udb81\udd99" - default: "\udb81\udd99" - weather_card: - blur: True - round_corners: True - round_corners_type: "normal" - border_color: "#45475a" - alignment: "right" - direction: "down" - distance: 6 - icon_size: 48 - volume: - type: "yasb.volume.VolumeWidget" - options: - label: "{icon} {level}" - label_alt: "{volume}" - volume_icons: - - "\ueee8" - - "\uf026" - - "\uf027" - - "\uf027" - - "\uf028" - audio_menu: - blur: True - round_corners: True - round_corners_type: 'normal' - border_color: '#45475a' - alignment: 'right' - direction: 'down' - distance: 6 - callbacks: - on_left: "toggle_volume_menu" - on_right: "exec cmd.exe /c start ms-settings:sound" - power_menu: - type: "yasb.power_menu.PowerMenuWidget" - options: - label: "\uf011" - uptime: True - blur: False - blur_background: True - animation_duration: 250 - button_row: 3 - buttons: - signout: ["\udb80\udf43","Sign out"] - shutdown: ["\uf011","Shut Down"] - restart: ["\uead2","Restart"] - sleep: ["\udb82\udd04","Sleep"] - lock: ["\uf023","Lock"] - cancel: ["\udb81\udf3a","Cancel"] - active_window: - type: "yasb.active_window.ActiveWindowWidget" - options: - label: "{win[title]}" - label_alt: "" - label_no_window: "" - label_icon: true - label_icon_size: 12 - max_length: 20 - max_length_ellipsis: "..." - monitor_exclusive: true - wallpapers: - type: "yasb.wallpapers.WallpapersWidget" - options: - label: "\uf03e" - image_path: "C:\\Users\\HP\\Pictures\\Wallpapers" # Example path to folder with images - change_automatically: false # Automatically change wallpaper - update_interval: 60 # If change_automatically is true, update interval in seconds - gallery: - enabled: true - blur: false - image_width: 200 - image_per_page: 8 - show_buttons: true - orientation: "portrait" - image_spacing: 8 - lazy_load: true - lazy_load_delay: 80 - lazy_load_fadein: 400 - image_corner_radius: 20 - enable_cache: true - icons: - recording: "\ueba7" - stopped: "\ueba5" - paused: "\ueba7" - hide_when_not_recording: true - blinking_icon: true - disk: - type: "yasb.disk.DiskWidget" - options: - label: "\uf473" - label_alt: "\uf473" - group_label: - volume_labels: ["C", "D", "E", "F"] - show_label_name: true - blur: True - round_corners: True - round_corners_type: "normal" - border_color: "System" - alignment: "right" - direction: "down" - distance: 6 - callbacks: - on_left: "toggle_group" - cpu: - type: "yasb.cpu.CpuWidget" - options: - label: "\uf4bc {info[percent][total]}%" - label_alt: "\uf437 {info[histograms][cpu_percent]}" - update_interval: 2000 - histogram_icons: - - '\u2581' # 0% - - '\u2581' # 10% - - '\u2582' # 20% - - '\u2583' # 30% - - '\u2584' # 40% - - '\u2585' # 50% - - '\u2586' # 60% - - '\u2587' # 70% - - '\u2588' # 80%+ - histogram_num_columns: 8 - callbacks: - on_right: "exec cmd /c Taskmgr" - container_padding: - top: 0 - left: 0 - bottom: 0 - right: 5 - memory: - type: "yasb.memory.MemoryWidget" - options: - label: "\uefc5 {virtual_mem_percent}%" - label_alt: "\uefc5 {virtual_mem_used}/{virtual_mem_total}" - update_interval: 5000 - callbacks: - on_left: "toggle_label" - on_middle: "do_nothing" - on_right: "do_nothing" - container_padding: - top: 0 - left: 8 - bottom: 0 - right: 0 - wifi: - type: "yasb.wifi.WifiWidget" - options: - label: "{wifi_icon}" - label_alt: "{wifi_name} {wifi_strength}%" - update_interval: 5000 - callbacks: - on_left: "exec cmd.exe /c start ms-settings:network" - on_middle: "do_nothing" - on_right: "toggle_label" - container_padding: - top: 0 - left: 0 - bottom: 0 - right: 0 - wifi_icons: [ - "\udb82\udd2e", # Icon for 0% strength - "\udb82\udd1f", # Icon for 1-20% strength - "\udb82\udd22", # Icon for 21-40% strength - "\udb82\udd25", # Icon for 41-80% strength - "\udb82\udd28" # Icon for 81-100% strength - ] - battery: - type: "yasb.battery.BatteryWidget" - options: - label: "{icon} {percent}%" - label_alt: "{icon} {percent}% | {time_remaining}" - update_interval: 5000 - callbacks: - on_left: "toggle_label" - on_middle: "do_nothing" - on_right: "exec cmd.exe /c start ms-settings:batterysaver" - container_padding: - top: 0 - left: 4 - bottom: 0 - right: 4 - brightness: - type: "yasb.brightness.BrightnessWidget" - options: - label: "{icon} {percent}%" - label_alt: "{icon} Brightness {percent}%" - tooltip: true - scroll_step: 1 - hide_unsupported: true - callbacks: - on_left: "toggle_label" - on_middle: "do_nothing" - on_right: "do_nothing" - container_padding: - top: 0 - left: 4 - bottom: 0 - right: 4 - update_check: - type: "yasb.update_check.UpdateCheckWidget" - options: - winget_update: - enabled: true - label: "\uf0ab{count}" - interval: 180 - exclude: - - "Unity.Unity" - windows_update: - enabled: false - label: "\uf0ab{count}" - interval: 240 - exclude: [] - traffic: - type: "yasb.traffic.TrafficWidget" - options: - label: "\udb82\udcfa \uea9a{download_speed} \ueaa1{upload_speed}" - label_alt: "\udb82\udcfa Download {download_speed} | Upload {upload_speed}" - update_interval: 1000 - callbacks: - on_left: 'toggle_label' - on_right: 'exec cmd /c Taskmgr' - notes: - type: "yasb.notes.NotesWidget" - options: - label: "\udb82\udd0c {count}" - label_alt: "{count} notes" - container_padding: - top: 0 - left: 0 - bottom: 0 - right: 0 - menu: - blur: true - round_corners: true - round_corners_type: "normal" - border_color: "System" - alignment: "right" - direction: "down" - offset_top: 6 - offset_left: 0 - max_title_size: 150 - show_date_time: true - icons: - note: "\udb82\udd0c" - delete: "\ue20d" - callbacks: - on_left: "toggle_menu" - on_middle: "do_nothing" - on_right: "toggle_label" - label_shadow: - enabled: true - color: "black" - radius: 3 - offset: [ 1, 4 ] diff --git a/.config/windows/yasb/greeting.ps1 b/.config/windows/yasb/greeting.ps1 deleted file mode 100644 index 4011ad7..0000000 --- a/.config/windows/yasb/greeting.ps1 +++ /dev/null @@ -1,11 +0,0 @@ -$hour = (Get-Date).Hour - -if ($hour -ge 5 -and $hour -lt 11) { - Write-Output "Good morning" -} elseif ($hour -ge 11 -and $hour -lt 17) { - Write-Output "Good afternoon" -} elseif ($hour -ge 17 -and $hour -lt 23) { - Write-Output "Good evening" -} else { - Write-Output "Good night" -} diff --git a/.config/windows/yasb/styles.css b/.config/windows/yasb/styles.css deleted file mode 100644 index cabcff7..0000000 --- a/.config/windows/yasb/styles.css +++ /dev/null @@ -1,754 +0,0 @@ - -/* -------------------------------------------------------------------------------------------------- */ -/* Variables */ -/* -------------------------------------------------------------------------------------------------- */ - -:root { - --rosewater: rgb(245, 224, 220); - --flamingo: rgb(242, 205, 205); - --pink: rgb(245, 194, 231); - --mauve: rgb(203, 166, 247); - --red: rgb(243, 139, 168); - --maroon: rgb(235, 160, 172); - --peach: rgb(250, 179, 135); - --yellow: rgb(249, 226, 175); - --green: rgb(166, 227, 161); - --teal: rgb(148, 226, 213); - --sky: rgb(137, 220, 235); - --sapphire: rgb(116, 199, 236); - --blue: rgb(137, 180, 250); - --lavender: rgb(180, 190, 254); - --text: rgb(205, 214, 244); - --subtext1: rgb(186, 194, 222); - --subtext0: rgb(166, 173, 200); - --overlay2: rgb(147, 153, 178); - --overlay1: rgb(127, 132, 156); - --overlay0: rgb(108, 112, 134); - --surface2: rgb(88, 91, 112); - --surface1: rgb(69, 71, 90); - --surface0: rgb(40, 41, 54); - --base: rgb(30, 30, 46); - --mantle: rgb(24, 24, 37); - --crust: rgb(17, 17, 27); -} - -/* -------------------------------------------------------------------------------------------------- */ -/* 1. Layout and Containers */ -/* -------------------------------------------------------------------------------------------------- */ - -* { - font-size: 12px; - color: #cdd6f4; - font-weight: 900; - font-family: "JetBrainsMono NFP"; - margin: 0; - padding: 0; -} -.yasb-bar { - padding: 0 8px; - margin: 0; - background-color: #1e1e2e; - border-radius: 15px; -} - -.widget { - padding: 0 10px; - margin: 0; -} - -.widget .label { - padding: 2px 2px 1px 2px; - -} - -.widget .label.alt { - padding: 1px 8px 1px 8px; -} - -/* -------------------------------------------------------------------------------------------------- */ -/* 2. Widget Containers */ -/* -------------------------------------------------------------------------------------------------- */ - -.glazewm-workspaces .widget-container { - background-color: var(--mantle); - margin: 3px 0px 3px 0px; - border-radius: 8px; -} - -/* -------------------------------------------------------------------------------------------------- */ -/* 3. Widgets */ -/* -------------------------------------------------------------------------------------------------- */ - -/***------------------------------- • Windows Desktops • --------------------------------***/ - -.glazewm-workspaces { - margin: 0; -} -.glazewm-workspaces .offline-status { - color: rgb(205, 214, 244); - font-size: 12px; - padding: 0 4px; - font-weight: 900; -} -.glazewm-greeting-widget { - margin: 0; -} -.glazewm-greeting-widget .widget-container { - background-color: var(--mantle); - margin: 3px 0px 3px 0px; - border-radius: 8px; - padding: 0 12px; -} -.glazewm-greeting-widget .label { - color: var(--text); - padding: 2px 0 1px 0; -} -.glazewm-workspaces .ws-btn { - border: none; - background-color: var(--surface2); - margin: 0px 4px; - padding: 0; - color: rgba(0, 0, 0, 0); - border-radius: 5px; - height: 10px; - width: 10px; -} -.glazewm-workspaces .ws-btn.populated { - background-color:var(--surface2); -} -.glazewm-workspaces .ws-btn.active_populated, -.glazewm-workspaces .ws-btn.active_empty { - color: rgba(0, 68, 255, 0); - background-color:var(--mauve); - width: 28px; - height: 10px; - border-radius: 5px; -} - -/***--------------------------------- • Komorebi Workspaces • ---------------------------***/ - -.komorebi-workspaces { - margin: 0; -} -.komorebi-workspaces .widget-container { - background-color: var(--mantle); - margin: 3px 0px 3px 0px; - border-radius: 8px; - padding: 0 4px; -} -.komorebi-workspaces .offline-status { - color: var(--text); - font-size: 12px; - padding: 0 8px; - font-weight: 600; -} -.komorebi-workspaces .ws-btn { - border: none; - background-color: transparent; - color: var(--overlay0); - margin: 0 2px; - padding: 0 6px; - border-radius: 4px; - font-size: 12px; - min-width: 16px; -} -.komorebi-workspaces .ws-btn.populated { - color: var(--subtext0); -} -.komorebi-workspaces .ws-btn.active { - color: var(--base); - background-color: var(--mauve); - font-weight: 700; -} - -/***--------------------------------- • Audio Widget • ----------------------------------***/ - -.audio-menu { - background-color: var(--mantle); -} -.audio-container .device { - background-color: var(--base); - border: none; - padding: 6px 8px 6px 4px; - margin: 2px 0; - font-size: 12px; - border-radius: 4px; -} -.audio-container .device.selected { - background-color: var(--crust); -} -.audio-container .device:hover { - background-color: var(--base); -} - -.volume-slider::groove { - color: transparent; -} -.volume-slider::handle { - background-color: transparent; -} -.audio-menu { - background-color: rgba(17, 17, 27, 0.4); -} - -/***------------------------------- • Power Menu Widget • --------------------------------***/ - -.power-menu-popup { - background: var(--crust); - border-radius: 8px; -} - -.power-menu-widget .label { - color: #eba0ac; - font-size: 16px; - padding: 0 -} -.power-menu-popup .button { - padding: 0px; - margin: 5px; - width: 250px; - height: 175px; - border-radius: 8px; - background-color: var(--base); - color: white; - -} -.power-menu-popup .button.hover { - background-color: var(--surface1); -} -.power-menu-popup .button .label { - margin-bottom: 0px; - font-size: 16px; - font-weight: 600; - color: var(--text); -} -.power-menu-popup .button .icon { - font-size: 55px; - padding-top: 25px; - padding-right: 10px; - color: var(--text); -} -.power-menu-popup .button.cancel .icon { - color: var(--red); -} -.power-menu-popup .button.cancel .label { - color: var(--red); -} - - -/* --------------------------------------------------------------------------------------------------- */ -/* 6. Icons & Typography */ -/* --------------------------------------------------------------------------------------------------- */ - -.icon { - font-size: 16px; -} -.volume-widget .icon { - color: var(--mauve); - margin: 1px 2px 0 0; -} -.start-menu .icon { - font-size: 18px; - color: #89b4fa -} -.clock-widget .icon { - color: #cba6f7; - font-size: 14px; - margin-right: 7px; -} - -/***--------------------------------- • Weather Icons • ----------------------------------***/ - -.weather-widget .icon { - color: var(--mauve); -} - -/***---------------------------------- • Weather Card • -----------------------------------***/ - -.weather-card { - background-color: var(--mantle); -} -.weather-card-today { - border-radius: 8px; - background-color: var(--base); - color: var(--text); -} -.weather-card-today .label { - font-size: 12px; -} -.weather-card-today .label.location { - font-size: 24px; - font-weight: 800; -} -.weather-card-today .label.alert { - font-size: 12px; - font-weight: 700; - background-color: rgba(247, 199, 42, 0.05); - border: 1px solid rgba(247, 209, 42, 0.1); - color: rgba(196, 181, 162, 0.85); - border-radius: 6px; - padding: 5px 0; -} -.weather-card-day { - border-radius: 8px; - background-color: var(--base); -} -.weather-card-day .label { - font-size: 12px; -} - -/* Media Widget */ - -.media-widget { - padding: 0; - margin-left: 0; -} -.media-widget .label { - color: var(--lavender); - padding-left: 5px; -} - -/* Hide media widget buttons */ - -.media-widget .btn { - max-width: 0; -} - -.calendar { - background-color: var(--mantle); -} -.calendar .calendar-table, -.calendar .calendar-table::item { - background-color: rgba(17, 17, 27, 0); - color: var(--overlay1); - margin: 0; - padding: 0; - border: none; - outline: none; -} - -.calendar .calendar-table::item:selected { - color: var(--base); - background: var(--mauve); - border-radius: 8px; -} -.calendar .day-label { - margin-top: 20px; -} -.calendar .day-label, -.calendar .month-label, -.calendar .date-label { - font-size: 16px; - color: var(--text); - font-weight: 700; - min-width: 180px; - max-width: 180px; -} -.calendar .month-label { - font-weight: normal; - padding-bottom: 12px; -} -.calendar .date-label { - font-size: 88px; - font-weight: 900; - color: var(--text); - margin-top: -20px; -} - -.home-menu { - background-color: var(--mantle); - border-radius: 8px; - padding: 0; - margin-left: 0px; -} -.home-menu .menu-item { - padding: 8px 48px 8px 12px; - font-size: 13px; - font-weight: 600; -} -.home-menu .menu-item:hover { - background-color: var(--mauve); - color: var(--mantle); - margin: 4px 6px; - border-radius: 4px; -} -.home-menu .separator { - max-height: 1px; - background-color: #45475a; - margin: 0 8px; -} - -.wallpapers-gallery-window { - background-color: var(--mantle); - border: 2px; - margin: 0; -} - -.volume-slider { - border: none; -} -.audio-menu { - background-color: rgba(17, 17, 27, 0.4); -} -.audio-container .device { - background-color: transparent; - border: none; - padding: 6px 8px 6px 4px; - margin: 2px 0; - font-size: 12px; - border-radius: 4px; -} -.audio-container .device.selected { - background-color: rgba(255, 255, 255, 0.085); -} -.audio-container .device:hover { - background-color: rgba(255, 255, 255, 0.06); -} - -.wallpapers-gallery-buttons { - background-color: var(--base); - color: var(--text); - border: none; - font-size: 16px; - padding: 8px 0px; - border-radius: 8px; - margin: 8px 8px 8px 8px; - width: 600px; -} - -.wallpapers-widget { - padding: 0 6px 0 6px; -} - -.wallpapers-widget .icon { - color: #cba6f7; -} - - -/***---------------------------------- • Disk • -----------------------------------***/ - -.disk-widget { - padding: 0 6px 0 6px; -} -.disk-group { - background-color:rgba(17, 17, 27, 0.4); -} -.disk-group-row { - min-width: 220px; - max-width: 220px; - max-height: 40px; - margin: 0; - padding: 0; - border-radius: 6px; - border: 1px solid rgba(128, 128, 128, 0); -} -.disk-group-row:hover { - background-color:rgba(255, 255, 255, 0.05); - border: 1px solid rgba(255, 255, 255, 0.1); -} -.disk-group-label-bar{ - max-height:8px; - border:0px solid rgba(128, 128, 128, 0); - background-color: rgba(137, 180, 250, 0.1); - border-radius: 4px; -} -.disk-group-label-bar::chunk{ - background-color: rgb(203, 166, 247); - border-radius: 4px; -} -.disk-group-label { - font-size: 10px; -} -.disk-group-label-size { - font-size: 10px; - color: rgb(203, 166, 247); -} -.disk-widget .icon { - color: var(--mauve); -} - - -.cava-widget { - padding: 0; - margin: 0; -} - -/* CPU MEMORY Setting */ -.cpu-widget { - padding-right: 0; -} -.memory-widget { - padding-left: 0; -} -.cpu-widget .widget-container { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} -.memory-widget .widget-container { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} -.memory-widget .label { - min-width: 34px; - max-width: 34px; -} -.cpu-widget .label { - min-width: 34px; - max-width: 34px; -} -.cpu-widget .icon { - color: var(--mauve); - margin-right: 4px; -} -.memory-widget .icon { - color: var(--mauve); - margin-right: 4px; -} - - -/* WIFI Setting */ -.wifi-widget .icon{ - color: var(--mauve) !important; -} - - -.update-check-widget { - padding: 0 0px 0 0px; -} -.update-check-widget .icon { - font-size: 16px; -} -.update-check-widget .widget-container.winget, -.update-check-widget .widget-container.windows { - background: var(--mauve); - margin: 0px 0px 0px 0px; - border-radius: 10px; - border: 0px solid var(--sapphire); -} -.update-check-widget .widget-container.winget .icon, -.update-check-widget .widget-container.windows .icon { - color: var(--base); - margin: 0 2px 0 6px; -} -.update-check-widget .widget-container.winget .label, -.update-check-widget .widget-container.windows .label { - margin: 0 6px 0 1px; - color: var(--base); - font-weight: 900; - font-size: 14px; -} - - - -.traffic-widget .icon { - color: rgb(203, 166, 247); - padding-right: 6px; - padding-left: 6px; -} -.traffic-widget .label { -color: rgb(203, 166, 247); -} - - -.widget { - border-radius: 8px; - margin: 8px 4px; - background-color: var(--surface0); -} - - -.notes-widget { - padding: 4; -} -.notes-widget .label { - font-size: 14px; - color: rgb(203, 166, 247); -} -.notes-widget .icon { - font-size: 16px; - color: rgb(203, 166, 247); -} -/* Notes Widget Menu */ -.notes-menu { - min-width: 400px; - max-width: 400px; - background-color: #1e1e2e; -} -.notes-menu .note-item { - background-color:transparent; - border-bottom: 1px solid rgba(255, 255, 255, 0.1); -} -.notes-menu .note-item:hover { - background-color: rgba(255, 255, 255, 0.1); -} -.notes-menu .note-item .icon { - font-size: 16px; - padding: 0 4px; - color: rgb(203, 166, 247); -} -.notes-menu .delete-button { - color: var(--red); - background: transparent; - border: none; - font-size: 8px; - padding: 7px 8px; - border-radius: 3px; -} -.notes-menu .delete-button:hover { - background-color: rgba(128, 128, 128, 0.5); -} -.notes-menu .note-item .title { - font-size: 13px; - font-family: 'Segoe UI'; -} -.notes-menu .note-item .date { - font-size: 12px; - font-family: 'Segoe UI'; - color: rgba(255, 255, 255, 0.4); -} -.notes-menu .empty-list { - font-family: 'Segoe UI'; - color: rgb(203, 166, 247); - font-size: 24px; - font-weight: 600; - padding: 10px 0 20px 0; -} -.notes-menu .add-button, -.notes-menu .cancel-button { - padding: 8px; - background-color: rgba(255, 255, 255, 0.1); - border: none; - border-radius: 4px; - color: white; - font-family: 'Segoe UI'; -} -.notes-menu .cancel-button { - margin-left: 4px; -} -.notes-menu .add-button:hover, -.notes-menu .cancel-button:hover { - background-color: rgba(255, 255, 255, 0.2); -} -.notes-menu .scroll-area { - background: transparent; - border: none; - border-radius:0; -} -.notes-menu .note-input { - background-color:rgba(17, 17, 27, 0.2); - border: 1px solid rgb(203, 166, 247); - font-family: 'Segoe UI'; - font-size: 14px; - max-height: 30px; - padding: 4px; - border-radius: 6px; -} -.note-input:focus { - border: 1px solid rgb(203, 166, 247); -} - -.media-menu { - min-width: 420px; - max-width: 420px; - background-color: #1e1e2e; - border-radius: 8px; -} -.media-menu .title, -.media-menu .artist, -.media-menu .source { - font-size: 14px; - font-weight: 600; - margin-left: 10px; - font-family: 'Segoe UI'; -} -.media-menu .artist { - font-size: 13px; - color: var(--mauve); - margin-top: 0px; - margin-bottom: 8px; -} -.media-menu .source { - font-size: 11px; - color: #000; - font-weight: normal; - border-radius: 3px; - background-color: #bac2de; - padding: 2px 4px; - -} -/* The source class name is the same as what you see in the media widget; just replace spaces with dashes and convert it to lowercase. -Example: "Windows Media" becomes "windows-media" */ -.media-menu .source.firefox { - background-color: #ff583b; - color: #ffffff; -} -.media-menu .source.spotify { - background-color: #199143; - color: #ffffff; -} -.media-menu .source.edge { - background-color: #0078d4; - color: #ffffff; -} -.media-menu .source.windows-media { - background-color: #0078d4; - color: #ffffff; -} - -.media-menu .btn { - font-family: "Segoe Fluent Icons"; - font-size: 18px; - font-weight: 400; - margin: 10px 2px 0px 2px; - min-width: 40px; - max-width: 40px; - min-height: 40px; - max-height: 40px; - border-radius: 20px; - color: var(--overlay0) ; -} -.media-menu .btn.prev { - margin-left: 10px; -} -.media-menu .btn:hover { - color: var(--overlay2); -} -.media-menu .btn.play { - font-size: 24px -} -.media-menu .btn.disabled:hover, -.media-menu .btn.disabled { - color: var(--surface2); - background-color: rgba(0, 0, 0, 0); -} - -.media-menu .playback-time { - font-size: 13px; - font-family: 'Segoe UI'; - color: var(--mauve); - margin-top: 20px; - min-width: 100px; -} -.media-menu .progress-slider { - height: 10px; - margin: 5px 4px; - border-radius: 3px; -} -.media-menu .progress-slider::groove { - background: transparent; - height: 2px; - border-radius: 3px; - background: rgba(255, 255, 255, 0.1); - -} -.media-menu .progress-slider::groove:hover { - background: transparent; - height: 6px; - border-radius: 3px; - background: rgba(255, 255, 255, 0.2); -} -.media-menu .progress-slider::sub-page { - background: var(--mauve); - border-radius: 3px; - height: 4px; -} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1685184..ee7653e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,40 @@ on: workflow_dispatch: jobs: + chezmoi-windows: + name: Chezmoi Windows junctions + runs-on: windows-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install chezmoi + shell: pwsh + run: choco install chezmoi --yes --no-progress + + - name: Apply Windows profile + shell: pwsh + run: | + $destination = Join-Path $env:RUNNER_TEMP 'chezmoi-home' + New-Item -ItemType Directory -Path $destination -Force | Out-Null + chezmoi --source $PWD --destination $destination init --apply ` + --promptChoice 'Environment profile=windows' + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + + $expected = @{ + (Join-Path $destination 'AppData\Local\nvim') = (Join-Path $PWD 'mutable\windows\nvim') + (Join-Path $destination '.config\cava') = (Join-Path $PWD 'mutable\windows\cava') + } + foreach ($target in $expected.Keys) { + $item = Get-Item -LiteralPath $target -Force + if ($item.LinkType -ne 'Junction') { + throw "Expected junction: $target" + } + if ([IO.Path]::GetFullPath([string]$item.Target) -ne [IO.Path]::GetFullPath($expected[$target])) { + throw "Unexpected junction target: $target -> $($item.Target)" + } + } + chezmoi: name: Chezmoi contract runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 367742c..7eed01a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,79 +9,75 @@ result result-* # lazygit -.config/shared/lazygit/state.yml +dot_config/shared/lazygit/state.yml # claude -.config/shared/claude/.claude.json -.config/shared/claude/.claude.json.backup* -.config/shared/claude/cache/ -.config/shared/claude/ide/ -.config/shared/claude/debug/ -.config/shared/claude/plugins/ -.config/shared/claude/projects/ -.config/shared/claude/session-env/ -.config/shared/claude/statsig/ -.config/shared/claude/sessions/ -.config/shared/claude/skills/ -.config/shared/claude/tasks/ -.config/shared/claude/todos/ -.config/shared/claude/file-history/ -.config/shared/claude/history.jsonl -.config/shared/claude/mcp-needs-auth-cache.json -.config/shared/claude/shell-snapshots/ -.config/shared/claude/plans/ -.config/shared/claude/stats-cache.json -.config/shared/claude/paste-cache/ -.config/shared/claude/image-cache/ -.config/shared/claude/telemetry/ -.config/shared/claude/backups/ -.config/shared/claude/.credentials.json -.config/shared/claude/.last-cleanup +dot_config/shared/claude/.claude.json +dot_config/shared/claude/.claude.json.backup* +dot_config/shared/claude/cache/ +dot_config/shared/claude/ide/ +dot_config/shared/claude/debug/ +dot_config/shared/claude/plugins/ +dot_config/shared/claude/projects/ +dot_config/shared/claude/session-env/ +dot_config/shared/claude/statsig/ +dot_config/shared/claude/sessions/ +dot_config/shared/claude/skills/ +dot_config/shared/claude/tasks/ +dot_config/shared/claude/todos/ +dot_config/shared/claude/file-history/ +dot_config/shared/claude/history.jsonl +dot_config/shared/claude/mcp-needs-auth-cache.json +dot_config/shared/claude/shell-snapshots/ +dot_config/shared/claude/plans/ +dot_config/shared/claude/stats-cache.json +dot_config/shared/claude/paste-cache/ +dot_config/shared/claude/image-cache/ +dot_config/shared/claude/telemetry/ +dot_config/shared/claude/backups/ +dot_config/shared/claude/.credentials.json +dot_config/shared/claude/.last-cleanup # codex -.config/shared/codex/.tmp -.config/shared/codex/.sandbox -.config/shared/codex/.sandbox* -.config/shared/codex/.codex-global-state.json -.config/shared/codex/.personality_migration -.config/shared/codex/cache/ -.config/shared/codex/log/ -.config/shared/codex/memories/ -.config/shared/codex/plugins/ -.config/shared/codex/rules/default.rules -.config/shared/codex/sessions/ -.config/shared/codex/skills/ -.config/shared/codex/sqlite/ -.config/shared/codex/tmp/ -.config/shared/codex/vendor_imports/ -.config/shared/codex/auth.json -.config/shared/codex/cap_sid -.config/shared/codex/config.toml.bak-* -.config/shared/codex/history.jsonl -.config/shared/codex/logs_1.sqlite -.config/shared/codex/goals_* -.config/shared/codex/logs_1.sqlite* -.config/shared/codex/models_cache.json -.config/shared/codex/sandbox.log -.config/shared/codex/session_index.jsonl -.config/shared/codex/state_*.sqlite -.config/shared/codex/state_*.sqlite* -.config/shared/codex/version.json -.config/shared/codex/installation_id -.config/shared/codex/logs_2.sqlite -.config/shared/codex/logs_2.sqlite-shm -.config/shared/codex/logs_2.sqlite-wal -.config/shared/codex/.codex-global-state.json.bak +dot_config/shared/codex/.tmp +dot_config/shared/codex/.sandbox +dot_config/shared/codex/.sandbox* +dot_config/shared/codex/.codex-global-state.json +dot_config/shared/codex/.personality_migration +dot_config/shared/codex/cache/ +dot_config/shared/codex/log/ +dot_config/shared/codex/memories/ +dot_config/shared/codex/plugins/ +dot_config/shared/codex/rules/default.rules +dot_config/shared/codex/sessions/ +dot_config/shared/codex/skills/ +dot_config/shared/codex/sqlite/ +dot_config/shared/codex/tmp/ +dot_config/shared/codex/vendor_imports/ +dot_config/shared/codex/auth.json +dot_config/shared/codex/cap_sid +dot_config/shared/codex/config.toml.bak-* +dot_config/shared/codex/history.jsonl +dot_config/shared/codex/logs_1.sqlite +dot_config/shared/codex/goals_* +dot_config/shared/codex/logs_1.sqlite* +dot_config/shared/codex/models_cache.json +dot_config/shared/codex/sandbox.log +dot_config/shared/codex/session_index.jsonl +dot_config/shared/codex/state_*.sqlite +dot_config/shared/codex/state_*.sqlite* +dot_config/shared/codex/version.json +dot_config/shared/codex/installation_id +dot_config/shared/codex/logs_2.sqlite +dot_config/shared/codex/logs_2.sqlite-shm +dot_config/shared/codex/logs_2.sqlite-wal +dot_config/shared/codex/.codex-global-state.json.bak # zsh -.config/nixos/zsh/**/*.zwc +dot_config/nixos/zsh/**/*.zwc # PowerShell (Install-Module で入るモジュール) -.config/windows/powershell/Modules/ - -# yasb -.config/windows/yasb/yasb.log -.config/windows/yasb/.env +dot_config/windows/powershell/Modules/ # Cloudflare Wrangler .wrangler/* diff --git a/.markdownlint-cli2.jsonc b/.markdownlint-cli2.jsonc index a0dcbae..020e7d4 100644 --- a/.markdownlint-cli2.jsonc +++ b/.markdownlint-cli2.jsonc @@ -30,7 +30,7 @@ ".config/claude/projects/**", ".config/claude/cache/**", ".config/claude/backups/**", - ".config/shared/lazygit/README.md" + "dot_config/shared/lazygit/README.md" ], // .gitignore の除外を反映 "gitignore": true diff --git a/AGENTS.md b/AGENTS.md index 6363587..d6eb64b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -58,9 +58,9 @@ GitHub Actions は `.github/workflows/checks.yml` で以下を実行します。 ## Claude Code の skill 管理 (apm) -- skill の source は `.config/shared/apm/packages//.apm/skills//` に置き、apm (Agent Package Manager) で管理します。カテゴリ (`agent-llm`・`docs`・`git-ops` など) は local apm package で、root の `apm.yml` が `dependencies.apm: [./packages/]` として参照します。 +- skill の source は `dot_config/shared/apm/packages//.apm/skills//` に置き、apm (Agent Package Manager) で管理します。カテゴリ (`agent-llm`・`docs`・`git-ops` など) は local apm package で、root の `apm.yml` が `dependencies.apm: [./packages/]` として参照します。 - 新しいカテゴリを追加する場合は `packages//apm.yml` を作成し、root の `apm.yml` の `dependencies.apm` へ追記してください。apm と Claude Code はどちらも skill のネスト配置に非対応のため、deploy 先はフラット (`.claude/skills//`) になります。skill 名はカテゴリを跨いで一意にしてください。 -- `apm install` (home-manager activation で自動実行、手動は `just skills-sync`) が各 package と外部依存を `.config/shared/apm/.claude/skills/` へ deploy します。 +- `apm install` (home-manager activation で自動実行、手動は `just skills-sync`) が各 package と外部依存を `dot_config/shared/apm/.claude/skills/` へ deploy します。 - 外部 skill も root の `apm.yml` の `dependencies.apm` に追加できます。現在は `mizchi/skills` の一部 (nix-setup・justfile・apm-usage・conventional-changelog・gh-fix-ci・cloudflare/deploy・workers-otel-utels) を取り込んでいます。HEAD が動くため必ず `#` でピンし、更新時は SHA を差し替えて `apm install` で lockfile を再生成してください。 - 生成物 (`.claude/skills/`・`apm_modules/`) は gitignore されています。`~/.claude/skills` は生成物への symlink なので、skill の追加・編集は必ず source 側で行ってください。 - `apm.lock.yaml` は外部依存のバージョン固定のため **追跡** しています (gitignore しない)。`dependencies.apm` を変更したら `apm install` を実行し、更新後の lockfile も併せてコミットしてください。 diff --git a/chezmoi/.chezmoiignore b/chezmoi/.chezmoiignore index b35c982..2eefa08 100644 --- a/chezmoi/.chezmoiignore +++ b/chezmoi/.chezmoiignore @@ -1,9 +1,6 @@ {{- if ne .profile "windows" }} AppData/** Documents/PowerShell/** -komorebi.json -komorebi.bar.json -applications.json {{- end }} {{- if eq .profile "windows" }} diff --git a/chezmoi/run_after_create-windows-junctions.ps1.tmpl b/chezmoi/run_after_create-windows-junctions.ps1.tmpl new file mode 100644 index 0000000..605d5a1 --- /dev/null +++ b/chezmoi/run_after_create-windows-junctions.ps1.tmpl @@ -0,0 +1,45 @@ +{{- if eq .profile "windows" }} +#!/usr/bin/env pwsh + +$ErrorActionPreference = 'Stop' + +$repo = {{ .chezmoi.workingTree | quote }} +$homeDir = {{ .chezmoi.destDir | quote }} +$junctions = @( + @{ + Source = Join-Path $repo 'mutable\windows\nvim' + Target = Join-Path $homeDir 'AppData\Local\nvim' + }, + @{ + Source = Join-Path $repo 'mutable\windows\cava' + Target = Join-Path $homeDir '.config\cava' + } +) + +foreach ($junction in $junctions) { + $source = [IO.Path]::GetFullPath($junction.Source) + $target = [IO.Path]::GetFullPath($junction.Target) + + if (-not (Test-Path -LiteralPath $source -PathType Container)) { + throw "Junction source does not exist: $source" + } + + $targetItem = Get-Item -LiteralPath $target -Force -ErrorAction SilentlyContinue + if ($targetItem) { + if ($targetItem.LinkType -ne 'Junction') { + throw "Refusing to replace non-junction path: $target" + } + + $currentSource = [IO.Path]::GetFullPath([string]$targetItem.Target) + if ($currentSource -eq $source) { + continue + } + + Remove-Item -LiteralPath $target -Force + } + + $targetParent = Split-Path -Parent $target + New-Item -ItemType Directory -Path $targetParent -Force | Out-Null + New-Item -ItemType Junction -Path $target -Target $source | Out-Null +} +{{- end }} diff --git a/docs/keybindings/nvim/README.md b/docs/keybindings/nvim/README.md index 26bb1bd..f56b524 100644 --- a/docs/keybindings/nvim/README.md +++ b/docs/keybindings/nvim/README.md @@ -4,10 +4,10 @@ Vim 初心者向けに、本リポジトリの Neovim 設定 ([LazyVim](https:// 設定ファイル: -- [`.config/shared/nvim/lua/config/options.lua`](../../../.config/shared/nvim/lua/config/options.lua) — オプションとリーダーキー -- [`.config/shared/nvim/lua/config/keymaps.lua`](../../../.config/shared/nvim/lua/config/keymaps.lua) — カスタムキーマップ -- [`.config/shared/nvim/lua/config/autocmds.lua`](../../../.config/shared/nvim/lua/config/autocmds.lua) — autocmd とユーザーコマンド -- [`.config/shared/nvim/lua/plugins/`](../../../.config/shared/nvim/lua/plugins/) — 各プラグインの設定 +- [`mutable/windows/nvim/lua/config/options.lua`](../../../mutable/windows/nvim/lua/config/options.lua) — Windows LazyVimのオプションとリーダーキー +- [`mutable/windows/nvim/lua/config/keymaps.lua`](../../../mutable/windows/nvim/lua/config/keymaps.lua) — Windows LazyVimのカスタムキーマップ +- [`mutable/windows/nvim/lua/config/autocmds.lua`](../../../mutable/windows/nvim/lua/config/autocmds.lua) — Windows LazyVimのautocmdとユーザーコマンド +- [`mutable/windows/nvim/lua/plugins/`](../../../mutable/windows/nvim/lua/plugins/) — Windows LazyVimの各プラグイン設定 ## 大事な前提 diff --git a/docs/keybindings/wezterm/README.md b/docs/keybindings/wezterm/README.md index be85a42..dda91d4 100644 --- a/docs/keybindings/wezterm/README.md +++ b/docs/keybindings/wezterm/README.md @@ -2,10 +2,10 @@ 設定ファイル: -- [`.config/shared/wezterm/wezterm.lua`](../../../.config/shared/wezterm/wezterm.lua) — エントリポイント -- [`.config/shared/wezterm/keymaps.lua`](../../../.config/shared/wezterm/keymaps.lua) — グローバル / `tab_ops` / `pane_ops` / `resize_pane` / `activate_pane` / `copy_mode` -- [`.config/shared/wezterm/workspace.lua`](../../../.config/shared/wezterm/workspace.lua) — ワークスペース / `workspace_mode` -- [`.config/shared/wezterm/modules/opacity.lua`](../../../.config/shared/wezterm/modules/opacity.lua) — `setting_mode` +- [`dot_config/shared/wezterm/wezterm.lua`](../../../dot_config/shared/wezterm/wezterm.lua) — エントリポイント +- [`dot_config/shared/wezterm/keymaps.lua`](../../../dot_config/shared/wezterm/keymaps.lua) — グローバル / `tab_ops` / `pane_ops` / `resize_pane` / `activate_pane` / `copy_mode` +- [`dot_config/shared/wezterm/workspace.lua`](../../../dot_config/shared/wezterm/workspace.lua) — ワークスペース / `workspace_mode` +- [`dot_config/shared/wezterm/modules/opacity.lua`](../../../dot_config/shared/wezterm/modules/opacity.lua) — `setting_mode` ## 前提 diff --git a/docs/keybindings/wezterm/copy-mode.md b/docs/keybindings/wezterm/copy-mode.md index b9b984f..d930bdd 100644 --- a/docs/keybindings/wezterm/copy-mode.md +++ b/docs/keybindings/wezterm/copy-mode.md @@ -1,6 +1,6 @@ # コピーモード — `copy_mode` key table -定義箇所: [`.config/shared/wezterm/keymaps.lua`](../../../.config/shared/wezterm/keymaps.lua) の `key_tables.copy_mode` +定義箇所: [`dot_config/shared/wezterm/keymaps.lua`](../../../dot_config/shared/wezterm/keymaps.lua) の `key_tables.copy_mode` `Leader → c` で起動。vim 風のキーバインドで移動・選択・コピー・検索を行う。 diff --git a/docs/keybindings/wezterm/global.md b/docs/keybindings/wezterm/global.md index 1697345..1c0f269 100644 --- a/docs/keybindings/wezterm/global.md +++ b/docs/keybindings/wezterm/global.md @@ -2,7 +2,7 @@ key table に入っていない通常状態で常時有効なキーバインド。 -定義箇所: [`.config/shared/wezterm/keymaps.lua`](../../../.config/shared/wezterm/keymaps.lua) の `keys` テーブル +定義箇所: [`dot_config/shared/wezterm/keymaps.lua`](../../../dot_config/shared/wezterm/keymaps.lua) の `keys` テーブル ## コマンドパレット / 設定 @@ -20,7 +20,7 @@ key table に入っていない通常状態で常時有効なキーバインド | `Ctrl+v` | クリップボードから貼り付け | | `Ctrl+Shift+Space` | QuickSelect 起動(URL / git hash / IP / path 等を 1 文字キーで選択) | -QuickSelect の追加パターンは [`wezterm.lua`](../../../.config/shared/wezterm/wezterm.lua) の `config.quick_select_patterns` で定義可能(現在は未設定で WezTerm 既定パターンのみ)。 +QuickSelect の追加パターンは [`wezterm.lua`](../../../dot_config/shared/wezterm/wezterm.lua) の `config.quick_select_patterns` で定義可能(現在は未設定で WezTerm 既定パターンのみ)。 ## フォントサイズ diff --git a/docs/keybindings/wezterm/panes.md b/docs/keybindings/wezterm/panes.md index 1d49bc9..d330688 100644 --- a/docs/keybindings/wezterm/panes.md +++ b/docs/keybindings/wezterm/panes.md @@ -1,6 +1,6 @@ # ペイン -定義箇所: [`.config/shared/wezterm/keymaps.lua`](../../../.config/shared/wezterm/keymaps.lua) の `key_tables` 配下 `pane_ops` / `resize_pane` / `activate_pane` +定義箇所: [`dot_config/shared/wezterm/keymaps.lua`](../../../dot_config/shared/wezterm/keymaps.lua) の `key_tables` 配下 `pane_ops` / `resize_pane` / `activate_pane` ## `pane_ops` — `Alt+q` で起動 diff --git a/docs/keybindings/wezterm/setting-mode.md b/docs/keybindings/wezterm/setting-mode.md index 8012578..ddf776e 100644 --- a/docs/keybindings/wezterm/setting-mode.md +++ b/docs/keybindings/wezterm/setting-mode.md @@ -1,12 +1,12 @@ # 透明度 — `setting_mode` key table -定義箇所: [`.config/shared/wezterm/modules/opacity.lua`](../../../.config/shared/wezterm/modules/opacity.lua) +定義箇所: [`dot_config/shared/wezterm/modules/opacity.lua`](../../../dot_config/shared/wezterm/modules/opacity.lua) 背景の不透明度をリアルタイム調整するモード。キーを押すたびに `setting_mode` が再アクティブ化されるため、連続操作が可能。 ## 起動 -`setting_mode` を起動するキーは現在割り当てなし。コマンドパレット (`Ctrl+j`) から `ActivateKeyTable` を選んで起動するか、必要に応じて [`keymaps.lua`](../../../.config/shared/wezterm/keymaps.lua) にエントリを追加する。 +`setting_mode` を起動するキーは現在割り当てなし。コマンドパレット (`Ctrl+j`) から `ActivateKeyTable` を選んで起動するか、必要に応じて [`keymaps.lua`](../../../dot_config/shared/wezterm/keymaps.lua) にエントリを追加する。 ## キー一覧 @@ -14,7 +14,7 @@ | --- | --- | | `;` | 不透明度を `+0.1`(上限 `1.0`) | | `-` | 不透明度を `-0.1`(下限 `0.1`) | -| `0` | [`wezterm.lua`](../../../.config/shared/wezterm/wezterm.lua) の `window_background_opacity` 初期値(現在 `0.7`)へリセット | +| `0` | [`wezterm.lua`](../../../dot_config/shared/wezterm/wezterm.lua) の `window_background_opacity` 初期値(現在 `0.7`)へリセット | ## 補足 diff --git a/docs/keybindings/wezterm/tabs.md b/docs/keybindings/wezterm/tabs.md index 74a2d7d..ce6bb2b 100644 --- a/docs/keybindings/wezterm/tabs.md +++ b/docs/keybindings/wezterm/tabs.md @@ -1,6 +1,6 @@ # タブ — `tab_ops` key table -定義箇所: [`.config/shared/wezterm/keymaps.lua`](../../../.config/shared/wezterm/keymaps.lua) の `key_tables.tab_ops` +定義箇所: [`dot_config/shared/wezterm/keymaps.lua`](../../../dot_config/shared/wezterm/keymaps.lua) の `key_tables.tab_ops` `Alt+a` でトグル起動。`one_shot = false` のため操作後も継続。再度 `Alt+a` か `Esc` で終了。 diff --git a/docs/keybindings/wezterm/workspace.md b/docs/keybindings/wezterm/workspace.md index f0e3022..4c94f62 100644 --- a/docs/keybindings/wezterm/workspace.md +++ b/docs/keybindings/wezterm/workspace.md @@ -1,6 +1,6 @@ # ワークスペース -定義箇所: [`.config/shared/wezterm/workspace.lua`](../../../.config/shared/wezterm/workspace.lua) +定義箇所: [`dot_config/shared/wezterm/workspace.lua`](../../../dot_config/shared/wezterm/workspace.lua) `scratch` ワークスペースは一時的な作業領域として扱われ、`Ctrl+Cmd+n` / `Ctrl+Cmd+p` の巡回からは除外される。`Ctrl+Cmd+s` のトグルで `scratch` へ移動した際は、移動前のワークスペースを記憶しており、再度同キーで元に戻る。 diff --git a/docs/memo/dotfiles-ownership.tsv b/docs/memo/dotfiles-ownership.tsv index b2b0e6a..e2f167c 100644 --- a/docs/memo/dotfiles-ownership.tsv +++ b/docs/memo/dotfiles-ownership.tsv @@ -1,5 +1,6 @@ profile target owner mode source windows AppData/Local/nvim chezmoi junction mutable/windows/nvim +windows .config/cava chezmoi junction mutable/windows/cava nixos .config/nvim nix nixvim nix-configs/home/nixvim wsl .config/nvim unmanaged none - wsl /etc/wsl.conf nix generated nix-configs/hosts/wsl/default.nix diff --git a/docs/memo/windows-nixos-dotfiles-design-options.md b/docs/memo/windows-nixos-dotfiles-design-options.md index 670df0b..18e990e 100644 --- a/docs/memo/windows-nixos-dotfiles-design-options.md +++ b/docs/memo/windows-nixos-dotfiles-design-options.md @@ -68,13 +68,13 @@ chezmoi source には `symlink_` エントリ(中身 = link 先 path、`.tmpl` | fcitx5 config | linux | chezmoi | B symlink | | **niri / waybar / swaync** | linux | **Nix** | Nix template(据え置き) | | package / service / systemd / system | linux | **Nix** | 据え置き | -| komorebi / yasb / whkd / powershell / cava | windows | chezmoi | A/B | +| powershell / cava | windows | chezmoi | A/B | niri 系を Nix に残すのは、per-host monitor・palette・keyboard というデータを Nix が握っているため。これらを chezmoi に移すと、そのデータを `.chezmoidata` 等へ再実装する羽目になる(次節)。Linux 専用なので Windows との共有不要= chezmoi に出す動機も薄い。 ## 共有データの扱い(palette / keyboard / per-host) -Nix 側には `specialArgs`(keyboardLayout, dotfilesDir)、per-host monitors、Catppuccin palette がある。chezmoi 側には `.chezmoidata` + `.chezmoi.hostname`。**同じ値を両 OS で使いたくなったとき**(例: Catppuccin を Windows の wezterm/yasb でも統一)にデータ源が二つになる。 +Nix 側には `specialArgs`(keyboardLayout, dotfilesDir)、per-host monitors、Catppuccin palette がある。chezmoi 側には `.chezmoidata` + `.chezmoi.hostname`。**同じ値を両 OS で使いたくなったとき**(例: Catppuccin を Windows の wezterm でも統一)にデータ源が二つになる。 - 案 1: **分離(疎結合)**。Nix の desktop データは Nix 内に閉じ、chezmoi 側 cross-platform 設定は `.chezmoidata` に独自定義。重複は許容。実装が単純で初手向き。 - 案 2: **単一ソース**。`palette.toml` / `theme.toml` を 1 つ置き、Nix は `builtins.fromTOML`、chezmoi は `.chezmoidata.toml`(または `include | fromToml`)で**両方が同じファイルを読む**。色やキーボードを一元化できる。やや構築コスト。 @@ -87,7 +87,7 @@ Nix 側には `specialArgs`(keyboardLayout, dotfilesDir)、per-host monitors ```gotmpl {{/* home/dot_claude/settings.json.tmpl */}} -{{- $base := include ".config/shared/claude/settings.json" | fromJson -}} +{{- $base := include "dot_config/shared/claude/settings.json" | fromJson -}} {{- $os := eq .chezmoi.os "windows" | ternary "windows" "nixos" -}} {{- $hooks := include (printf ".config/%s/claude/settings.hooks.json" $os) | fromJson -}} {{ mergeOverwrite $base $hooks | toPrettyJson }} @@ -97,7 +97,7 @@ Nix 側には `specialArgs`(keyboardLayout, dotfilesDir)、per-host monitors ただし注意(Codex 指摘): -- `include` は **source directory 相対**。`.chezmoiroot=home/` にするなら、上記 `.config/shared/...` は `home/` 配下に置かれている必要がある。レイアウト確定前に最小 PoC で解決を確認すること。 +- `include` は **source directory 相対**。`.chezmoiroot=home/` にするなら、上記 `dot_config/shared/...` は `home/` 配下に置かれている必要がある。レイアウト確定前に最小 PoC で解決を確認すること。 - `mergeOverwrite` は **deep merge だが deep copy ではなく右側優先、配列は連結しない**。現 PS は `hooks` を丸ごと差し替え、Nix は `recursiveUpdate`。テンプレート化前に **JSON fixture テスト**で挙動を固定し、両 OS で一致させること。 ## 書き戻し系の symlink 設計(Windows junction も統一) @@ -112,7 +112,7 @@ Nix 側には `specialArgs`(keyboardLayout, dotfilesDir)、per-host monitors - Linux: `mkOutOfStoreSymlink`(xdg.nix の out-of-store 群)を chezmoi symlink へ移譲。 - Windows: junction(setup_windows.ps1)を chezmoi symlink へ移譲。chezmoi は Windows で symlink 権限が無ければ挙動が変わるため、**ディレクトリは junction 相当が要るか**を要検証(未解決点)。 -- 実体は `live/`(仮)= chezmoi 変換外の plain ツリーに置く。現状の `.config/shared` の役割をここが引き継ぐ。 +- 実体は `live/`(仮)= chezmoi 変換外の plain ツリーに置く。現状の `dot_config/shared` の役割をここが引き継ぐ。 ## Home Manager と chezmoi の衝突回避(correctness) @@ -182,9 +182,9 @@ chezmoi は主に Windows、NixOS は現状の HM 維持。 2. **`symlink_` で Windows junction まで置換する前提は危険**。chezmoi の `symlink_` は symbolic link を作る機能で junction 互換を保証しない。現 PS の「dir=junction / file=symlink→hardlink→copy」フォールバックは Windows 権限問題を踏んだ知見。**Windows ディレクトリは `symlink_` 前提にせず `run_onchange_` で junction を明示作成**すべき。開発者モード/権限の現実も要検証。 3. **HM↔chezmoi の排他所有は「不変条件の明記」だけでは不足**。HM 生成 path と chezmoi 管理 path の**交差を CI で検出する仕組みが必須**。activation 順序では根本解決しない(同一 path を両者が持った時点で負け)。 4. **`mergeOverwrite` は deep merge だが deep copy ではない・右側優先・配列は連結されない**。現 PS は `hooks` を丸ごと差し替え、Nix は `recursiveUpdate`。**テンプレート化前に JSON fixture テストで挙動を固定**し、両 OS で一致させること。 -5. **`.chezmoiroot=home/` と `include` パスが矛盾している**(実バグ)。chezmoi の `include` は **source directory 相対**。source root を `home/` にすると、本メモの Claude 例が使う `.config/shared/...` という include パスはズレる。**最小 PoC で確認してから**実装すること。 +5. **`.chezmoiroot=home/` と `include` パスが矛盾している**(実バグ)。chezmoi の `include` は **source directory 相対**。source root を `home/` にすると、本メモの Claude 例が使う `dot_config/shared/...` という include パスはズレる。**最小 PoC で確認してから**実装すること。 6. **見落とし代替**: 「Windows だけ chezmoi、NixOS は現状 HM 維持」が技術的に最小リスク。ユーザー方針(nixos 最低限)とはズレるが、選択肢として明記すべき。次点は「Claude settings と Windows 共有対象だけ chezmoi、live-edit 系(nvim/lazygit/zsh/fcitx5)は当面 HM out-of-store のまま」。 -7. **後戻り不能点**: `.config/shared` を `live/` へ大移動 → HM リンク削除、の局面。ここで Windows junction 代替が不完全だと両 OS の足場が同時に崩れる。**先に「Windows symlink_/run_ の PoC」「Claude settings の fixture テスト」「HM/chezmoi path 交差チェック」を用意してから移行**。 +7. **後戻り不能点**: `dot_config/shared` を `live/` へ大移動 → HM リンク削除、の局面。ここで Windows junction 代替が不完全だと両 OS の足場が同時に崩れる。**先に「Windows symlink_/run_ の PoC」「Claude settings の fixture テスト」「HM/chezmoi path 交差チェック」を用意してから移行**。 Codex の自己推奨: **Hybrid**。chezmoi は Windows bootstrap / Windows 配置 / Claude settings 生成 / 真に cross-platform な静的 dotfiles から始め、NixOS の二層戦略と niri/waybar/swaync は維持。Windows dir は junction を `run_onchange_` で明示。 @@ -209,7 +209,7 @@ Codex の自己推奨: **Hybrid**。chezmoi は Windows bootstrap / Windows 配 1. **最終形(案 1 Maximal)と移行本線(案 2 Hybrid)の二段構えで進めるか**、いきなり Maximal か。 2. Codex 推奨どおり **Hybrid 起点**(Windows + Claude settings + cross-platform 静的から)にするか、ユーザー方針優先で Maximal を急ぐか。 -3. **symlink stub の実体ツリー名**(`live/`?)と `.config/shared` からの移設手順。 +3. **symlink stub の実体ツリー名**(`live/`?)と `dot_config/shared` からの移設手順。 4. **共有データを案 1(分離)で始めるか案 2(単一 toml)にするか**。 5. niri/waybar/swaync を **完全に Nix 据え置き**でよいか(Windows と見た目を揃える要求が無いか)。 6. codex config を `private_` で足りるか `encrypted_` まで要るか。 diff --git a/docs/memo/windows-nixos-dotfiles-design.md b/docs/memo/windows-nixos-dotfiles-design.md index d525dfc..be720b7 100644 --- a/docs/memo/windows-nixos-dotfiles-design.md +++ b/docs/memo/windows-nixos-dotfiles-design.md @@ -64,7 +64,6 @@ ownerは次のいずれかとする。 | shell | chezmoi + PowerShell | Home Manager + zsh | Home Manager + zsh | | Git / Starship / Yazi / Lazygit | chezmoi | chezmoi | chezmoi | | WezTerm | chezmoi | chezmoi | 管理しない | -| komorebi / YASB / whkd | chezmoi | 対象外 | 対象外 | | niri / waybar / swaync | 対象外 | Nix | 対象外 | | `/etc/wsl.conf` | 対象外 | 対象外 | NixOS-WSL | @@ -72,11 +71,11 @@ ownerは次のいずれかとする。 ### Windows -LazyVimの実体を`mutable/windows/nvim`へ置き、`%LOCALAPPDATA%\nvim`からjunctionで参照する。Windowsのdirectory symlink権限に依存しないよう、chezmoiの`run_onchange_` PowerShell scriptでjunctionを作成する。 +LazyVimの実体を`mutable/windows/nvim`へ置き、`%LOCALAPPDATA%\nvim`からjunctionで参照する。Windowsのdirectory symlink権限に依存しないよう、chezmoiの`run_after_` PowerShell scriptでjunctionを収束させる。 ### NixOS -`feat/nixvim`は直接mergeせず、現在の`master`へモジュール単位で再移植する。Home Managerの`programs.neovim`と`~/.config/nvim` linkを撤去してからnixvimを有効にする。 +`feat/nixvim`でnixvimへの移行を完了した。Home Managerの`programs.neovim`と`~/.config/nvim` linkは撤去済みで、ftdetectとspell辞書は`nix-configs/home/nixvim/files`が所有する。 ### NixOS-WSL @@ -113,17 +112,14 @@ nixvimをimportせず、chezmoiでも`~/.config/nvim`を生成しない。将来 ### Phase 2: Windows -- `setup_windows.ps1`のリンク表をchezmoiへ段階移行する。 -- PowerShell、komorebi、YASB、whkd、cavaを`mutable/windows`へ移す。 -- Windows LazyVimを`mutable/windows/nvim`へ移す。 -- `setup_windows.ps1`をchezmoi bootstrapだけへ縮小する。 +- 完了: Windows LazyVimとcavaを`mutable/windows`へ移し、chezmoiのjunction所有へ切り替えた。 +- 次: PowerShell profile生成をchezmoiへ移す。 +- 最後に`setup_windows.ps1`をchezmoi bootstrapだけへ縮小する。 ### Phase 3: NixOS nixvim -- `feat/nixvim`の機能対応表を作る。 -- nixvim modulesを現行`master`へ再移植する。 -- NixOSだけでnixvimをimportする。 -- LazyVim依存のLinux側linkを撤去する。 +- `feat/nixvim`でNixOSのnixvim移行を完了した。 +- LazyVimとの機能差分を必要に応じて追跡する。 ### Phase 4: 共有設定 diff --git a/.config/nixos/claude/claude-notify-hook.sh b/dot_config/nixos/claude/claude-notify-hook.sh similarity index 100% rename from .config/nixos/claude/claude-notify-hook.sh rename to dot_config/nixos/claude/claude-notify-hook.sh diff --git a/.config/nixos/claude/settings.hooks.json b/dot_config/nixos/claude/settings.hooks.json similarity index 100% rename from .config/nixos/claude/settings.hooks.json rename to dot_config/nixos/claude/settings.hooks.json diff --git a/.config/nixos/fcitx5/config b/dot_config/nixos/fcitx5/config similarity index 100% rename from .config/nixos/fcitx5/config rename to dot_config/nixos/fcitx5/config diff --git a/.config/nixos/ghostty-quick-shell.conf b/dot_config/nixos/ghostty-quick-shell.conf similarity index 100% rename from .config/nixos/ghostty-quick-shell.conf rename to dot_config/nixos/ghostty-quick-shell.conf diff --git a/.config/nixos/starship-nix.toml b/dot_config/nixos/starship-nix.toml similarity index 100% rename from .config/nixos/starship-nix.toml rename to dot_config/nixos/starship-nix.toml diff --git a/.config/nixos/starship-quick-shell.toml b/dot_config/nixos/starship-quick-shell.toml similarity index 100% rename from .config/nixos/starship-quick-shell.toml rename to dot_config/nixos/starship-quick-shell.toml diff --git a/.config/nixos/swaync/style.css b/dot_config/nixos/swaync/style.css similarity index 100% rename from .config/nixos/swaync/style.css rename to dot_config/nixos/swaync/style.css diff --git a/.config/nixos/waybar/style.css b/dot_config/nixos/waybar/style.css similarity index 100% rename from .config/nixos/waybar/style.css rename to dot_config/nixos/waybar/style.css diff --git a/.config/nixos/zsh/rc/alias.zsh b/dot_config/nixos/zsh/rc/alias.zsh similarity index 100% rename from .config/nixos/zsh/rc/alias.zsh rename to dot_config/nixos/zsh/rc/alias.zsh diff --git a/.config/nixos/zsh/rc/bindkey.zsh b/dot_config/nixos/zsh/rc/bindkey.zsh similarity index 100% rename from .config/nixos/zsh/rc/bindkey.zsh rename to dot_config/nixos/zsh/rc/bindkey.zsh diff --git a/.config/nixos/zsh/rc/functions/fancy-ctrl-z b/dot_config/nixos/zsh/rc/functions/fancy-ctrl-z similarity index 100% rename from .config/nixos/zsh/rc/functions/fancy-ctrl-z rename to dot_config/nixos/zsh/rc/functions/fancy-ctrl-z diff --git a/.config/nixos/zsh/rc/functions/ghq-fzf b/dot_config/nixos/zsh/rc/functions/ghq-fzf similarity index 100% rename from .config/nixos/zsh/rc/functions/ghq-fzf rename to dot_config/nixos/zsh/rc/functions/ghq-fzf diff --git a/.config/nixos/zsh/rc/functions/nix b/dot_config/nixos/zsh/rc/functions/nix similarity index 93% rename from .config/nixos/zsh/rc/functions/nix rename to dot_config/nixos/zsh/rc/functions/nix index 6dd2707..15d311a 100644 --- a/.config/nixos/zsh/rc/functions/nix +++ b/dot_config/nixos/zsh/rc/functions/nix @@ -22,7 +22,7 @@ if [[ "$1" == "develop" && -t 1 ]]; then esac done # dev shell 内では starship を Nix テーマ配色に差し替える (子 zsh の環境だけに適用)。 - local nix_starship="$HOME/dotfiles/.config/nixos/starship-nix.toml" + local nix_starship="$HOME/dotfiles/dot_config/nixos/starship-nix.toml" if [[ -r "$nix_starship" ]]; then STARSHIP_CONFIG="$nix_starship" command nix "$@" --command zsh else diff --git a/.config/nixos/zsh/rc/functions/nix-shell b/dot_config/nixos/zsh/rc/functions/nix-shell similarity index 90% rename from .config/nixos/zsh/rc/functions/nix-shell rename to dot_config/nixos/zsh/rc/functions/nix-shell index 68a1087..a45d048 100644 --- a/.config/nixos/zsh/rc/functions/nix-shell +++ b/dot_config/nixos/zsh/rc/functions/nix-shell @@ -15,7 +15,7 @@ if [[ -t 1 ]]; then esac done # nix() と同様に dev shell 内では starship を Nix テーマ配色に差し替える。 - local nix_starship="$HOME/dotfiles/.config/nixos/starship-nix.toml" + local nix_starship="$HOME/dotfiles/dot_config/nixos/starship-nix.toml" if [[ -r "$nix_starship" ]]; then STARSHIP_CONFIG="$nix_starship" command nix-shell "$@" --command zsh else diff --git a/.config/nixos/zsh/rc/functions/yy b/dot_config/nixos/zsh/rc/functions/yy similarity index 100% rename from .config/nixos/zsh/rc/functions/yy rename to dot_config/nixos/zsh/rc/functions/yy diff --git a/.config/nixos/zsh/rc/option.zsh b/dot_config/nixos/zsh/rc/option.zsh similarity index 100% rename from .config/nixos/zsh/rc/option.zsh rename to dot_config/nixos/zsh/rc/option.zsh diff --git a/.config/shared/apm/.gitignore b/dot_config/shared/apm/.gitignore similarity index 100% rename from .config/shared/apm/.gitignore rename to dot_config/shared/apm/.gitignore diff --git a/.config/shared/apm/apm.lock.yaml b/dot_config/shared/apm/apm.lock.yaml similarity index 100% rename from .config/shared/apm/apm.lock.yaml rename to dot_config/shared/apm/apm.lock.yaml diff --git a/.config/shared/apm/apm.yml b/dot_config/shared/apm/apm.yml similarity index 100% rename from .config/shared/apm/apm.yml rename to dot_config/shared/apm/apm.yml diff --git a/.config/shared/apm/packages/agent-llm/.apm/skills/team/SKILL.md b/dot_config/shared/apm/packages/agent-llm/.apm/skills/team/SKILL.md similarity index 100% rename from .config/shared/apm/packages/agent-llm/.apm/skills/team/SKILL.md rename to dot_config/shared/apm/packages/agent-llm/.apm/skills/team/SKILL.md diff --git a/.config/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/SKILL.md b/dot_config/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/SKILL.md similarity index 100% rename from .config/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/SKILL.md rename to dot_config/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/SKILL.md diff --git a/.config/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/references/artifact-templates.md b/dot_config/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/references/artifact-templates.md similarity index 100% rename from .config/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/references/artifact-templates.md rename to dot_config/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/references/artifact-templates.md diff --git a/.config/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/references/tui-guidelines.md b/dot_config/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/references/tui-guidelines.md similarity index 100% rename from .config/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/references/tui-guidelines.md rename to dot_config/shared/apm/packages/agent-llm/.apm/skills/tool-pipeline/references/tui-guidelines.md diff --git a/.config/shared/apm/packages/agent-llm/apm.yml b/dot_config/shared/apm/packages/agent-llm/apm.yml similarity index 100% rename from .config/shared/apm/packages/agent-llm/apm.yml rename to dot_config/shared/apm/packages/agent-llm/apm.yml diff --git a/.config/shared/apm/packages/docs/.apm/skills/markdown-session-format/SKILL.md b/dot_config/shared/apm/packages/docs/.apm/skills/markdown-session-format/SKILL.md similarity index 100% rename from .config/shared/apm/packages/docs/.apm/skills/markdown-session-format/SKILL.md rename to dot_config/shared/apm/packages/docs/.apm/skills/markdown-session-format/SKILL.md diff --git a/.config/shared/apm/packages/docs/apm.yml b/dot_config/shared/apm/packages/docs/apm.yml similarity index 100% rename from .config/shared/apm/packages/docs/apm.yml rename to dot_config/shared/apm/packages/docs/apm.yml diff --git a/.config/shared/apm/packages/git-ops/.apm/skills/git-commit/SKILL.md b/dot_config/shared/apm/packages/git-ops/.apm/skills/git-commit/SKILL.md similarity index 100% rename from .config/shared/apm/packages/git-ops/.apm/skills/git-commit/SKILL.md rename to dot_config/shared/apm/packages/git-ops/.apm/skills/git-commit/SKILL.md diff --git a/.config/shared/apm/packages/git-ops/.apm/skills/github-thread-fetcher/SKILL.md b/dot_config/shared/apm/packages/git-ops/.apm/skills/github-thread-fetcher/SKILL.md similarity index 100% rename from .config/shared/apm/packages/git-ops/.apm/skills/github-thread-fetcher/SKILL.md rename to dot_config/shared/apm/packages/git-ops/.apm/skills/github-thread-fetcher/SKILL.md diff --git a/.config/shared/apm/packages/git-ops/.apm/skills/pr-summarizer/SKILL.md b/dot_config/shared/apm/packages/git-ops/.apm/skills/pr-summarizer/SKILL.md similarity index 100% rename from .config/shared/apm/packages/git-ops/.apm/skills/pr-summarizer/SKILL.md rename to dot_config/shared/apm/packages/git-ops/.apm/skills/pr-summarizer/SKILL.md diff --git a/.config/shared/apm/packages/git-ops/apm.yml b/dot_config/shared/apm/packages/git-ops/apm.yml similarity index 100% rename from .config/shared/apm/packages/git-ops/apm.yml rename to dot_config/shared/apm/packages/git-ops/apm.yml diff --git a/.config/shared/claude/CLAUDE.md b/dot_config/shared/claude/CLAUDE.md similarity index 100% rename from .config/shared/claude/CLAUDE.md rename to dot_config/shared/claude/CLAUDE.md diff --git a/.config/shared/claude/agents/README.md b/dot_config/shared/claude/agents/README.md similarity index 100% rename from .config/shared/claude/agents/README.md rename to dot_config/shared/claude/agents/README.md diff --git a/.config/shared/claude/agents/at-analyzer.md b/dot_config/shared/claude/agents/at-analyzer.md similarity index 100% rename from .config/shared/claude/agents/at-analyzer.md rename to dot_config/shared/claude/agents/at-analyzer.md diff --git a/.config/shared/claude/agents/at-doc-auditor.md b/dot_config/shared/claude/agents/at-doc-auditor.md similarity index 100% rename from .config/shared/claude/agents/at-doc-auditor.md rename to dot_config/shared/claude/agents/at-doc-auditor.md diff --git a/.config/shared/claude/agents/at-doc-reviewer-codex.md b/dot_config/shared/claude/agents/at-doc-reviewer-codex.md similarity index 100% rename from .config/shared/claude/agents/at-doc-reviewer-codex.md rename to dot_config/shared/claude/agents/at-doc-reviewer-codex.md diff --git a/.config/shared/claude/agents/at-doc-reviewer-opus.md b/dot_config/shared/claude/agents/at-doc-reviewer-opus.md similarity index 100% rename from .config/shared/claude/agents/at-doc-reviewer-opus.md rename to dot_config/shared/claude/agents/at-doc-reviewer-opus.md diff --git a/.config/shared/claude/agents/at-doc-writer.md b/dot_config/shared/claude/agents/at-doc-writer.md similarity index 100% rename from .config/shared/claude/agents/at-doc-writer.md rename to dot_config/shared/claude/agents/at-doc-writer.md diff --git a/.config/shared/claude/agents/at-explorer.md b/dot_config/shared/claude/agents/at-explorer.md similarity index 100% rename from .config/shared/claude/agents/at-explorer.md rename to dot_config/shared/claude/agents/at-explorer.md diff --git a/.config/shared/claude/agents/at-impl-reviewer-codex.md b/dot_config/shared/claude/agents/at-impl-reviewer-codex.md similarity index 100% rename from .config/shared/claude/agents/at-impl-reviewer-codex.md rename to dot_config/shared/claude/agents/at-impl-reviewer-codex.md diff --git a/.config/shared/claude/agents/at-impl-reviewer-opus.md b/dot_config/shared/claude/agents/at-impl-reviewer-opus.md similarity index 100% rename from .config/shared/claude/agents/at-impl-reviewer-opus.md rename to dot_config/shared/claude/agents/at-impl-reviewer-opus.md diff --git a/.config/shared/claude/agents/at-implementer.md b/dot_config/shared/claude/agents/at-implementer.md similarity index 100% rename from .config/shared/claude/agents/at-implementer.md rename to dot_config/shared/claude/agents/at-implementer.md diff --git a/.config/shared/claude/agents/at-performance.md b/dot_config/shared/claude/agents/at-performance.md similarity index 100% rename from .config/shared/claude/agents/at-performance.md rename to dot_config/shared/claude/agents/at-performance.md diff --git a/.config/shared/claude/agents/at-plan-reviewer.md b/dot_config/shared/claude/agents/at-plan-reviewer.md similarity index 100% rename from .config/shared/claude/agents/at-plan-reviewer.md rename to dot_config/shared/claude/agents/at-plan-reviewer.md diff --git a/.config/shared/claude/agents/at-planner.md b/dot_config/shared/claude/agents/at-planner.md similarity index 100% rename from .config/shared/claude/agents/at-planner.md rename to dot_config/shared/claude/agents/at-planner.md diff --git a/.config/shared/claude/agents/at-security-codex.md b/dot_config/shared/claude/agents/at-security-codex.md similarity index 100% rename from .config/shared/claude/agents/at-security-codex.md rename to dot_config/shared/claude/agents/at-security-codex.md diff --git a/.config/shared/claude/agents/at-security-opus.md b/dot_config/shared/claude/agents/at-security-opus.md similarity index 100% rename from .config/shared/claude/agents/at-security-opus.md rename to dot_config/shared/claude/agents/at-security-opus.md diff --git a/.config/shared/claude/agents/at-test-reviewer-codex.md b/dot_config/shared/claude/agents/at-test-reviewer-codex.md similarity index 100% rename from .config/shared/claude/agents/at-test-reviewer-codex.md rename to dot_config/shared/claude/agents/at-test-reviewer-codex.md diff --git a/.config/shared/claude/agents/at-test-reviewer-opus.md b/dot_config/shared/claude/agents/at-test-reviewer-opus.md similarity index 100% rename from .config/shared/claude/agents/at-test-reviewer-opus.md rename to dot_config/shared/claude/agents/at-test-reviewer-opus.md diff --git a/.config/shared/claude/agents/at-tester.md b/dot_config/shared/claude/agents/at-tester.md similarity index 100% rename from .config/shared/claude/agents/at-tester.md rename to dot_config/shared/claude/agents/at-tester.md diff --git a/.config/shared/claude/agents/tp-qa-architect.md b/dot_config/shared/claude/agents/tp-qa-architect.md similarity index 100% rename from .config/shared/claude/agents/tp-qa-architect.md rename to dot_config/shared/claude/agents/tp-qa-architect.md diff --git a/.config/shared/claude/agents/tp-requirements-analyst.md b/dot_config/shared/claude/agents/tp-requirements-analyst.md similarity index 100% rename from .config/shared/claude/agents/tp-requirements-analyst.md rename to dot_config/shared/claude/agents/tp-requirements-analyst.md diff --git a/.config/shared/claude/agents/tp-system-designer.md b/dot_config/shared/claude/agents/tp-system-designer.md similarity index 100% rename from .config/shared/claude/agents/tp-system-designer.md rename to dot_config/shared/claude/agents/tp-system-designer.md diff --git a/.config/shared/claude/agents/tp-task-decomposer.md b/dot_config/shared/claude/agents/tp-task-decomposer.md similarity index 100% rename from .config/shared/claude/agents/tp-task-decomposer.md rename to dot_config/shared/claude/agents/tp-task-decomposer.md diff --git a/.config/shared/claude/claude-icon.svg b/dot_config/shared/claude/claude-icon.svg similarity index 100% rename from .config/shared/claude/claude-icon.svg rename to dot_config/shared/claude/claude-icon.svg diff --git a/.config/shared/claude/settings.json b/dot_config/shared/claude/settings.json similarity index 100% rename from .config/shared/claude/settings.json rename to dot_config/shared/claude/settings.json diff --git a/.config/shared/claude/sounds.mp3.bak b/dot_config/shared/claude/sounds.mp3.bak similarity index 100% rename from .config/shared/claude/sounds.mp3.bak rename to dot_config/shared/claude/sounds.mp3.bak diff --git a/.config/shared/claude/statusline.sh b/dot_config/shared/claude/statusline.sh similarity index 100% rename from .config/shared/claude/statusline.sh rename to dot_config/shared/claude/statusline.sh diff --git a/.config/shared/codex/AGENTS.md b/dot_config/shared/codex/AGENTS.md similarity index 100% rename from .config/shared/codex/AGENTS.md rename to dot_config/shared/codex/AGENTS.md diff --git a/.config/shared/codex/agents/worker.toml b/dot_config/shared/codex/agents/worker.toml similarity index 100% rename from .config/shared/codex/agents/worker.toml rename to dot_config/shared/codex/agents/worker.toml diff --git a/.config/shared/codex/config.toml b/dot_config/shared/codex/config.toml similarity index 100% rename from .config/shared/codex/config.toml rename to dot_config/shared/codex/config.toml diff --git a/.config/shared/codex/rules/npm.rules b/dot_config/shared/codex/rules/npm.rules similarity index 100% rename from .config/shared/codex/rules/npm.rules rename to dot_config/shared/codex/rules/npm.rules diff --git a/.config/shared/codex/rules/safety.rules b/dot_config/shared/codex/rules/safety.rules similarity index 100% rename from .config/shared/codex/rules/safety.rules rename to dot_config/shared/codex/rules/safety.rules diff --git a/.config/shared/fastfetch/anime.txt b/dot_config/shared/fastfetch/anime.txt similarity index 100% rename from .config/shared/fastfetch/anime.txt rename to dot_config/shared/fastfetch/anime.txt diff --git a/.config/shared/fastfetch/config.jsonc b/dot_config/shared/fastfetch/config.jsonc similarity index 100% rename from .config/shared/fastfetch/config.jsonc rename to dot_config/shared/fastfetch/config.jsonc diff --git a/.config/shared/fastfetch/mclaren.txt b/dot_config/shared/fastfetch/mclaren.txt similarity index 100% rename from .config/shared/fastfetch/mclaren.txt rename to dot_config/shared/fastfetch/mclaren.txt diff --git a/.config/shared/fastfetch/show_music.py b/dot_config/shared/fastfetch/show_music.py similarity index 100% rename from .config/shared/fastfetch/show_music.py rename to dot_config/shared/fastfetch/show_music.py diff --git a/.config/shared/fastfetch/windows.txt b/dot_config/shared/fastfetch/windows.txt similarity index 100% rename from .config/shared/fastfetch/windows.txt rename to dot_config/shared/fastfetch/windows.txt diff --git a/.config/shared/lazygit/LICENSE b/dot_config/shared/lazygit/LICENSE similarity index 100% rename from .config/shared/lazygit/LICENSE rename to dot_config/shared/lazygit/LICENSE diff --git a/.config/shared/lazygit/README.md b/dot_config/shared/lazygit/README.md similarity index 100% rename from .config/shared/lazygit/README.md rename to dot_config/shared/lazygit/README.md diff --git a/.config/shared/lazygit/config.yml b/dot_config/shared/lazygit/config.yml similarity index 100% rename from .config/shared/lazygit/config.yml rename to dot_config/shared/lazygit/config.yml diff --git a/.config/shared/lazygit/lazygit.exe b/dot_config/shared/lazygit/lazygit.exe similarity index 100% rename from .config/shared/lazygit/lazygit.exe rename to dot_config/shared/lazygit/lazygit.exe diff --git a/.config/shared/starship.toml b/dot_config/shared/starship.toml similarity index 100% rename from .config/shared/starship.toml rename to dot_config/shared/starship.toml diff --git a/.config/shared/vim/vimrc b/dot_config/shared/vim/vimrc similarity index 100% rename from .config/shared/vim/vimrc rename to dot_config/shared/vim/vimrc diff --git a/.config/shared/wezterm/appearance.lua b/dot_config/shared/wezterm/appearance.lua similarity index 100% rename from .config/shared/wezterm/appearance.lua rename to dot_config/shared/wezterm/appearance.lua diff --git a/.config/shared/wezterm/keymaps.lua b/dot_config/shared/wezterm/keymaps.lua similarity index 100% rename from .config/shared/wezterm/keymaps.lua rename to dot_config/shared/wezterm/keymaps.lua diff --git a/.config/shared/wezterm/modules/claude_status.lua b/dot_config/shared/wezterm/modules/claude_status.lua similarity index 100% rename from .config/shared/wezterm/modules/claude_status.lua rename to dot_config/shared/wezterm/modules/claude_status.lua diff --git a/.config/shared/wezterm/modules/opacity.lua b/dot_config/shared/wezterm/modules/opacity.lua similarity index 100% rename from .config/shared/wezterm/modules/opacity.lua rename to dot_config/shared/wezterm/modules/opacity.lua diff --git a/.config/shared/wezterm/modules/wsl.lua b/dot_config/shared/wezterm/modules/wsl.lua similarity index 100% rename from .config/shared/wezterm/modules/wsl.lua rename to dot_config/shared/wezterm/modules/wsl.lua diff --git a/.config/shared/wezterm/statusbar.lua b/dot_config/shared/wezterm/statusbar.lua similarity index 100% rename from .config/shared/wezterm/statusbar.lua rename to dot_config/shared/wezterm/statusbar.lua diff --git a/.config/shared/wezterm/tab.lua b/dot_config/shared/wezterm/tab.lua similarity index 100% rename from .config/shared/wezterm/tab.lua rename to dot_config/shared/wezterm/tab.lua diff --git a/.config/shared/wezterm/wezterm.lua b/dot_config/shared/wezterm/wezterm.lua similarity index 100% rename from .config/shared/wezterm/wezterm.lua rename to dot_config/shared/wezterm/wezterm.lua diff --git a/.config/shared/wezterm/workspace.lua b/dot_config/shared/wezterm/workspace.lua similarity index 100% rename from .config/shared/wezterm/workspace.lua rename to dot_config/shared/wezterm/workspace.lua diff --git a/.config/shared/yazi/keymap.toml b/dot_config/shared/yazi/keymap.toml similarity index 100% rename from .config/shared/yazi/keymap.toml rename to dot_config/shared/yazi/keymap.toml diff --git a/.config/shared/yazi/theme.toml b/dot_config/shared/yazi/theme.toml similarity index 100% rename from .config/shared/yazi/theme.toml rename to dot_config/shared/yazi/theme.toml diff --git a/.config/shared/yazi/yazi.toml b/dot_config/shared/yazi/yazi.toml similarity index 100% rename from .config/shared/yazi/yazi.toml rename to dot_config/shared/yazi/yazi.toml diff --git a/.config/shared/zed/keymap.json b/dot_config/shared/zed/keymap.json similarity index 100% rename from .config/shared/zed/keymap.json rename to dot_config/shared/zed/keymap.json diff --git a/.config/shared/zed/settings.json b/dot_config/shared/zed/settings.json similarity index 100% rename from .config/shared/zed/settings.json rename to dot_config/shared/zed/settings.json diff --git a/.config/windows/ccwin-notify/config.toml b/dot_config/windows/ccwin-notify/config.toml similarity index 100% rename from .config/windows/ccwin-notify/config.toml rename to dot_config/windows/ccwin-notify/config.toml diff --git a/.config/windows/claude/ccwin-hook.ps1 b/dot_config/windows/claude/ccwin-hook.ps1 similarity index 100% rename from .config/windows/claude/ccwin-hook.ps1 rename to dot_config/windows/claude/ccwin-hook.ps1 diff --git a/.config/windows/claude/settings.hooks.json b/dot_config/windows/claude/settings.hooks.json similarity index 100% rename from .config/windows/claude/settings.hooks.json rename to dot_config/windows/claude/settings.hooks.json diff --git a/.config/windows/mise/config.toml b/dot_config/windows/mise/config.toml similarity index 100% rename from .config/windows/mise/config.toml rename to dot_config/windows/mise/config.toml diff --git a/.config/windows/powershell/Microsoft.PowerShell_profile.ps1 b/dot_config/windows/powershell/Microsoft.PowerShell_profile.ps1 similarity index 100% rename from .config/windows/powershell/Microsoft.PowerShell_profile.ps1 rename to dot_config/windows/powershell/Microsoft.PowerShell_profile.ps1 diff --git a/.config/windows/powershell/conf.d/aliases.ps1 b/dot_config/windows/powershell/conf.d/aliases.ps1 similarity index 100% rename from .config/windows/powershell/conf.d/aliases.ps1 rename to dot_config/windows/powershell/conf.d/aliases.ps1 diff --git a/.config/windows/powershell/conf.d/keybindings.ps1 b/dot_config/windows/powershell/conf.d/keybindings.ps1 similarity index 100% rename from .config/windows/powershell/conf.d/keybindings.ps1 rename to dot_config/windows/powershell/conf.d/keybindings.ps1 diff --git a/.config/windows/powershell/conf.d/mise.ps1 b/dot_config/windows/powershell/conf.d/mise.ps1 similarity index 100% rename from .config/windows/powershell/conf.d/mise.ps1 rename to dot_config/windows/powershell/conf.d/mise.ps1 diff --git a/.config/windows/powershell/conf.d/navigation.ps1 b/dot_config/windows/powershell/conf.d/navigation.ps1 similarity index 100% rename from .config/windows/powershell/conf.d/navigation.ps1 rename to dot_config/windows/powershell/conf.d/navigation.ps1 diff --git a/.config/windows/powershell/conf.d/startup.ps1 b/dot_config/windows/powershell/conf.d/startup.ps1 similarity index 52% rename from .config/windows/powershell/conf.d/startup.ps1 rename to dot_config/windows/powershell/conf.d/startup.ps1 index 9710a78..8a606ff 100644 --- a/.config/windows/powershell/conf.d/startup.ps1 +++ b/dot_config/windows/powershell/conf.d/startup.ps1 @@ -16,45 +16,6 @@ Register-EngineEvent -SourceIdentifier PowerShell.OnIdle -MaxTriggerCount 1 -Act # https://github.com/antfu-collective/ni とNew-Itemの競合を無効化 Remove-Item Alias:ni -Force -ErrorAction Ignore -# モニター構成変更後の手動再セットアップ。 -# pwsh 起動後にモニターを抜き差ししたとき、display_index_preferences を実機に -# 合わせて patch し直すには komorebi 自体を起こし直す必要があるためのショートカット。 -function Restart-Komorebi { - $startScript = "$env:USERPROFILE\Project\github.com\t4ko0522\dotfiles\.config\komorebi\komorebi_start.ps1" - if (-not (Test-Path -LiteralPath $startScript)) { - Write-Error "komorebi_start.ps1 が見つかりません: $startScript" - return - } - Get-Process -Name komorebi, whkd -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue - & $startScript -} - -# komorebi + whkd 自動起動 (接続モニターに合わせた一時設定で起動) -# プロセス存在だけで判定するとゾンビ時に skip してしまうため、socket 応答で生死判定する。 -# 起動本体は別プロセス(pwsh -NoProfile)に投げて profile 読み込みをブロックしない。 -if (Get-Command komorebic -ErrorAction SilentlyContinue) { - $komorebiAlive = $false - if (Get-Process -Name komorebi -ErrorAction SilentlyContinue) { - komorebic state 2>$null | Out-Null - $komorebiAlive = ($LASTEXITCODE -eq 0) - } - if (-not $komorebiAlive) { - # ゾンビ komorebi/whkd を掃除してから起動 - Get-Process -Name komorebi, whkd -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue - $startScript = "$env:USERPROFILE\Project\github.com\t4ko0522\dotfiles\.config\komorebi\komorebi_start.ps1" - if (Test-Path -LiteralPath $startScript) { - Start-Process -FilePath 'pwsh' -ArgumentList '-NoLogo', '-NoProfile', '-NonInteractive', '-WindowStyle', 'Hidden', '-File', $startScript -WindowStyle Hidden - } else { - Start-Process komorebic -ArgumentList 'start', '--whkd' -WindowStyle Hidden - } - } -} - -# yasb 自動起動 -if (-not (Get-Process -Name yasb -ErrorAction SilentlyContinue)) { - Start-Process yasb -WindowStyle Hidden -} - # ccwin-notify daemon 自動起動 # daemon.port の PID 再利用で誤判定するのを避けるため、プロセス名で生死判定する。 if (-not (Get-Process -Name ccwin -ErrorAction SilentlyContinue)) { @@ -84,4 +45,4 @@ if (Get-Command starship -ErrorAction SilentlyContinue) { $initScript | Set-Content -LiteralPath $starshipCache -Encoding UTF8 Invoke-Expression $initScript } -} \ No newline at end of file +} diff --git a/justfile b/justfile index bd3af14..03fdd5e 100644 --- a/justfile +++ b/justfile @@ -5,7 +5,7 @@ os-switch host="laptop": nh os switch . -H {{ host }} skills-sync: - cd .config/shared/apm && apm install + cd dot_config/shared/apm && apm install fmt: git ls-files '*.nix' | xargs -r alejandra diff --git a/.config/windows/cava/shaders/bar_spectrum.frag b/mutable/windows/cava/shaders/bar_spectrum.frag similarity index 100% rename from .config/windows/cava/shaders/bar_spectrum.frag rename to mutable/windows/cava/shaders/bar_spectrum.frag diff --git a/.config/windows/cava/shaders/eye_of_phi.frag b/mutable/windows/cava/shaders/eye_of_phi.frag similarity index 100% rename from .config/windows/cava/shaders/eye_of_phi.frag rename to mutable/windows/cava/shaders/eye_of_phi.frag diff --git a/.config/windows/cava/shaders/northern_lights.frag b/mutable/windows/cava/shaders/northern_lights.frag similarity index 100% rename from .config/windows/cava/shaders/northern_lights.frag rename to mutable/windows/cava/shaders/northern_lights.frag diff --git a/.config/windows/cava/shaders/orion_circle.frag b/mutable/windows/cava/shaders/orion_circle.frag similarity index 100% rename from .config/windows/cava/shaders/orion_circle.frag rename to mutable/windows/cava/shaders/orion_circle.frag diff --git a/.config/windows/cava/shaders/orion_circle_rotate.frag b/mutable/windows/cava/shaders/orion_circle_rotate.frag similarity index 100% rename from .config/windows/cava/shaders/orion_circle_rotate.frag rename to mutable/windows/cava/shaders/orion_circle_rotate.frag diff --git a/.config/windows/cava/shaders/orion_saturn_core.frag b/mutable/windows/cava/shaders/orion_saturn_core.frag similarity index 100% rename from .config/windows/cava/shaders/orion_saturn_core.frag rename to mutable/windows/cava/shaders/orion_saturn_core.frag diff --git a/.config/windows/cava/shaders/orion_saturn_subring.frag b/mutable/windows/cava/shaders/orion_saturn_subring.frag similarity index 100% rename from .config/windows/cava/shaders/orion_saturn_subring.frag rename to mutable/windows/cava/shaders/orion_saturn_subring.frag diff --git a/.config/windows/cava/shaders/pass_through.vert b/mutable/windows/cava/shaders/pass_through.vert similarity index 100% rename from .config/windows/cava/shaders/pass_through.vert rename to mutable/windows/cava/shaders/pass_through.vert diff --git a/.config/windows/cava/shaders/spectrogram.frag b/mutable/windows/cava/shaders/spectrogram.frag similarity index 100% rename from .config/windows/cava/shaders/spectrogram.frag rename to mutable/windows/cava/shaders/spectrogram.frag diff --git a/.config/windows/cava/shaders/winamp_line_style_spectrum.frag b/mutable/windows/cava/shaders/winamp_line_style_spectrum.frag similarity index 100% rename from .config/windows/cava/shaders/winamp_line_style_spectrum.frag rename to mutable/windows/cava/shaders/winamp_line_style_spectrum.frag diff --git a/.config/windows/cava/themes/solarized_dark b/mutable/windows/cava/themes/solarized_dark similarity index 92% rename from .config/windows/cava/themes/solarized_dark rename to mutable/windows/cava/themes/solarized_dark index 200057c..e8ea78e 100644 --- a/.config/windows/cava/themes/solarized_dark +++ b/mutable/windows/cava/themes/solarized_dark @@ -12,4 +12,4 @@ horizontal_gradient_color_1 = '#586e75' horizontal_gradient_color_2 = '#b58900' horizontal_gradient_color_3 = '#839496' -blend_direction = 'up' \ No newline at end of file +blend_direction = 'up' diff --git a/.config/windows/cava/themes/tricolor b/mutable/windows/cava/themes/tricolor similarity index 88% rename from .config/windows/cava/themes/tricolor rename to mutable/windows/cava/themes/tricolor index b908137..0fc5c05 100644 --- a/.config/windows/cava/themes/tricolor +++ b/mutable/windows/cava/themes/tricolor @@ -7,4 +7,4 @@ horizontal_gradient_color_4 = '#f2dde1' horizontal_gradient_color_5 = '#cbc7d8' horizontal_gradient_color_6 = '#8db7d2' horizontal_gradient_color_7 = '#5e62a9' -horizontal_gradient_color_8 = '#434279' \ No newline at end of file +horizontal_gradient_color_8 = '#434279' diff --git a/.config/shared/nvim/.gitignore b/mutable/windows/nvim/.gitignore similarity index 100% rename from .config/shared/nvim/.gitignore rename to mutable/windows/nvim/.gitignore diff --git a/.config/shared/nvim/.neoconf.json b/mutable/windows/nvim/.neoconf.json similarity index 100% rename from .config/shared/nvim/.neoconf.json rename to mutable/windows/nvim/.neoconf.json diff --git a/.config/shared/nvim/.typos.toml b/mutable/windows/nvim/.typos.toml similarity index 100% rename from .config/shared/nvim/.typos.toml rename to mutable/windows/nvim/.typos.toml diff --git a/.config/shared/nvim/LICENSE b/mutable/windows/nvim/LICENSE similarity index 100% rename from .config/shared/nvim/LICENSE rename to mutable/windows/nvim/LICENSE diff --git a/.config/shared/nvim/README.md b/mutable/windows/nvim/README.md similarity index 100% rename from .config/shared/nvim/README.md rename to mutable/windows/nvim/README.md diff --git a/.config/shared/nvim/init.lua b/mutable/windows/nvim/init.lua similarity index 100% rename from .config/shared/nvim/init.lua rename to mutable/windows/nvim/init.lua diff --git a/.config/shared/nvim/lazy-lock.json b/mutable/windows/nvim/lazy-lock.json similarity index 100% rename from .config/shared/nvim/lazy-lock.json rename to mutable/windows/nvim/lazy-lock.json diff --git a/.config/shared/nvim/lazyvim.json b/mutable/windows/nvim/lazyvim.json similarity index 98% rename from .config/shared/nvim/lazyvim.json rename to mutable/windows/nvim/lazyvim.json index d8bcaf6..271ed85 100644 --- a/.config/shared/nvim/lazyvim.json +++ b/mutable/windows/nvim/lazyvim.json @@ -7,4 +7,4 @@ "NEWS.md": "11866" }, "version": 8 -} \ No newline at end of file +} diff --git a/.config/shared/nvim/lua/config/autocmds.lua b/mutable/windows/nvim/lua/config/autocmds.lua similarity index 100% rename from .config/shared/nvim/lua/config/autocmds.lua rename to mutable/windows/nvim/lua/config/autocmds.lua diff --git a/.config/shared/nvim/lua/config/keymaps.lua b/mutable/windows/nvim/lua/config/keymaps.lua similarity index 100% rename from .config/shared/nvim/lua/config/keymaps.lua rename to mutable/windows/nvim/lua/config/keymaps.lua diff --git a/.config/shared/nvim/lua/config/lazy.lua b/mutable/windows/nvim/lua/config/lazy.lua similarity index 100% rename from .config/shared/nvim/lua/config/lazy.lua rename to mutable/windows/nvim/lua/config/lazy.lua diff --git a/.config/shared/nvim/lua/config/options.lua b/mutable/windows/nvim/lua/config/options.lua similarity index 100% rename from .config/shared/nvim/lua/config/options.lua rename to mutable/windows/nvim/lua/config/options.lua diff --git a/.config/shared/nvim/lua/plugins/base/snacks.lua b/mutable/windows/nvim/lua/plugins/base/snacks.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/base/snacks.lua rename to mutable/windows/nvim/lua/plugins/base/snacks.lua diff --git a/.config/shared/nvim/lua/plugins/base/ufo.lua b/mutable/windows/nvim/lua/plugins/base/ufo.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/base/ufo.lua rename to mutable/windows/nvim/lua/plugins/base/ufo.lua diff --git a/.config/shared/nvim/lua/plugins/base/vimdoc-ja.lua b/mutable/windows/nvim/lua/plugins/base/vimdoc-ja.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/base/vimdoc-ja.lua rename to mutable/windows/nvim/lua/plugins/base/vimdoc-ja.lua diff --git a/.config/shared/nvim/lua/plugins/base/winresizer.lua b/mutable/windows/nvim/lua/plugins/base/winresizer.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/base/winresizer.lua rename to mutable/windows/nvim/lua/plugins/base/winresizer.lua diff --git a/.config/shared/nvim/lua/plugins/base/yazi.lua b/mutable/windows/nvim/lua/plugins/base/yazi.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/base/yazi.lua rename to mutable/windows/nvim/lua/plugins/base/yazi.lua diff --git a/.config/shared/nvim/lua/plugins/disable.lua b/mutable/windows/nvim/lua/plugins/disable.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/disable.lua rename to mutable/windows/nvim/lua/plugins/disable.lua diff --git a/.config/shared/nvim/lua/plugins/editor/claude-code.lua b/mutable/windows/nvim/lua/plugins/editor/claude-code.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/claude-code.lua rename to mutable/windows/nvim/lua/plugins/editor/claude-code.lua diff --git a/.config/shared/nvim/lua/plugins/editor/codic.lua b/mutable/windows/nvim/lua/plugins/editor/codic.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/codic.lua rename to mutable/windows/nvim/lua/plugins/editor/codic.lua diff --git a/.config/shared/nvim/lua/plugins/editor/color-picker.lua b/mutable/windows/nvim/lua/plugins/editor/color-picker.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/color-picker.lua rename to mutable/windows/nvim/lua/plugins/editor/color-picker.lua diff --git a/.config/shared/nvim/lua/plugins/editor/compiler.lua b/mutable/windows/nvim/lua/plugins/editor/compiler.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/compiler.lua rename to mutable/windows/nvim/lua/plugins/editor/compiler.lua diff --git a/.config/shared/nvim/lua/plugins/editor/diffview.lua b/mutable/windows/nvim/lua/plugins/editor/diffview.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/diffview.lua rename to mutable/windows/nvim/lua/plugins/editor/diffview.lua diff --git a/.config/shared/nvim/lua/plugins/editor/emmet.lua b/mutable/windows/nvim/lua/plugins/editor/emmet.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/emmet.lua rename to mutable/windows/nvim/lua/plugins/editor/emmet.lua diff --git a/.config/shared/nvim/lua/plugins/editor/git.lua b/mutable/windows/nvim/lua/plugins/editor/git.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/git.lua rename to mutable/windows/nvim/lua/plugins/editor/git.lua diff --git a/.config/shared/nvim/lua/plugins/editor/html-preview.lua b/mutable/windows/nvim/lua/plugins/editor/html-preview.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/html-preview.lua rename to mutable/windows/nvim/lua/plugins/editor/html-preview.lua diff --git a/.config/shared/nvim/lua/plugins/editor/markdown-preview.lua b/mutable/windows/nvim/lua/plugins/editor/markdown-preview.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/markdown-preview.lua rename to mutable/windows/nvim/lua/plugins/editor/markdown-preview.lua diff --git a/.config/shared/nvim/lua/plugins/editor/mini-surround.lua b/mutable/windows/nvim/lua/plugins/editor/mini-surround.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/mini-surround.lua rename to mutable/windows/nvim/lua/plugins/editor/mini-surround.lua diff --git a/.config/shared/nvim/lua/plugins/editor/minty.lua b/mutable/windows/nvim/lua/plugins/editor/minty.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/minty.lua rename to mutable/windows/nvim/lua/plugins/editor/minty.lua diff --git a/.config/shared/nvim/lua/plugins/editor/rainbow-delimiters.lua b/mutable/windows/nvim/lua/plugins/editor/rainbow-delimiters.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/rainbow-delimiters.lua rename to mutable/windows/nvim/lua/plugins/editor/rainbow-delimiters.lua diff --git a/.config/shared/nvim/lua/plugins/editor/supermaven.lua b/mutable/windows/nvim/lua/plugins/editor/supermaven.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/supermaven.lua rename to mutable/windows/nvim/lua/plugins/editor/supermaven.lua diff --git a/.config/shared/nvim/lua/plugins/editor/test.lua b/mutable/windows/nvim/lua/plugins/editor/test.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/test.lua rename to mutable/windows/nvim/lua/plugins/editor/test.lua diff --git a/.config/shared/nvim/lua/plugins/editor/treesitter-context.lua b/mutable/windows/nvim/lua/plugins/editor/treesitter-context.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/treesitter-context.lua rename to mutable/windows/nvim/lua/plugins/editor/treesitter-context.lua diff --git a/.config/shared/nvim/lua/plugins/editor/treesitter.lua b/mutable/windows/nvim/lua/plugins/editor/treesitter.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/editor/treesitter.lua rename to mutable/windows/nvim/lua/plugins/editor/treesitter.lua diff --git a/.config/shared/nvim/lua/plugins/img-clip.lua b/mutable/windows/nvim/lua/plugins/img-clip.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/img-clip.lua rename to mutable/windows/nvim/lua/plugins/img-clip.lua diff --git a/.config/shared/nvim/lua/plugins/lsp/init.lua b/mutable/windows/nvim/lua/plugins/lsp/init.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/lsp/init.lua rename to mutable/windows/nvim/lua/plugins/lsp/init.lua diff --git a/.config/shared/nvim/lua/plugins/lsp/lazydev.lua b/mutable/windows/nvim/lua/plugins/lsp/lazydev.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/lsp/lazydev.lua rename to mutable/windows/nvim/lua/plugins/lsp/lazydev.lua diff --git a/.config/shared/nvim/lua/plugins/lsp/version-lsp.lua b/mutable/windows/nvim/lua/plugins/lsp/version-lsp.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/lsp/version-lsp.lua rename to mutable/windows/nvim/lua/plugins/lsp/version-lsp.lua diff --git a/.config/shared/nvim/lua/plugins/ui/bufferline.lua b/mutable/windows/nvim/lua/plugins/ui/bufferline.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/ui/bufferline.lua rename to mutable/windows/nvim/lua/plugins/ui/bufferline.lua diff --git a/.config/shared/nvim/lua/plugins/ui/dracula.lua b/mutable/windows/nvim/lua/plugins/ui/dracula.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/ui/dracula.lua rename to mutable/windows/nvim/lua/plugins/ui/dracula.lua diff --git a/.config/shared/nvim/lua/plugins/ui/hlchunk.lua b/mutable/windows/nvim/lua/plugins/ui/hlchunk.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/ui/hlchunk.lua rename to mutable/windows/nvim/lua/plugins/ui/hlchunk.lua diff --git a/.config/shared/nvim/lua/plugins/ui/init.lua b/mutable/windows/nvim/lua/plugins/ui/init.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/ui/init.lua rename to mutable/windows/nvim/lua/plugins/ui/init.lua diff --git a/.config/shared/nvim/lua/plugins/ui/lualine.lua b/mutable/windows/nvim/lua/plugins/ui/lualine.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/ui/lualine.lua rename to mutable/windows/nvim/lua/plugins/ui/lualine.lua diff --git a/.config/shared/nvim/lua/plugins/ui/modicator.lua b/mutable/windows/nvim/lua/plugins/ui/modicator.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/ui/modicator.lua rename to mutable/windows/nvim/lua/plugins/ui/modicator.lua diff --git a/.config/shared/nvim/lua/plugins/ui/noice.lua b/mutable/windows/nvim/lua/plugins/ui/noice.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/ui/noice.lua rename to mutable/windows/nvim/lua/plugins/ui/noice.lua diff --git a/.config/shared/nvim/lua/plugins/ui/smear-cursor.lua b/mutable/windows/nvim/lua/plugins/ui/smear-cursor.lua similarity index 100% rename from .config/shared/nvim/lua/plugins/ui/smear-cursor.lua rename to mutable/windows/nvim/lua/plugins/ui/smear-cursor.lua diff --git a/.config/shared/nvim/stylua.toml b/mutable/windows/nvim/stylua.toml similarity index 67% rename from .config/shared/nvim/stylua.toml rename to mutable/windows/nvim/stylua.toml index 5d6c50d..0f90030 100644 --- a/.config/shared/nvim/stylua.toml +++ b/mutable/windows/nvim/stylua.toml @@ -1,3 +1,3 @@ indent_type = "Spaces" indent_width = 2 -column_width = 120 \ No newline at end of file +column_width = 120 diff --git a/.config/shared/nvim/ftdetect/mdc.lua b/nix-configs/home/nixvim/files/ftdetect/mdc.lua similarity index 100% rename from .config/shared/nvim/ftdetect/mdc.lua rename to nix-configs/home/nixvim/files/ftdetect/mdc.lua diff --git a/.config/shared/nvim/ftdetect/zsh.lua b/nix-configs/home/nixvim/files/ftdetect/zsh.lua similarity index 100% rename from .config/shared/nvim/ftdetect/zsh.lua rename to nix-configs/home/nixvim/files/ftdetect/zsh.lua diff --git a/.config/shared/nvim/spell/tech.utf-8.add b/nix-configs/home/nixvim/files/spell/tech.utf-8.add similarity index 100% rename from .config/shared/nvim/spell/tech.utf-8.add rename to nix-configs/home/nixvim/files/spell/tech.utf-8.add diff --git a/nix-configs/home/nixvim/plugins.nix b/nix-configs/home/nixvim/plugins.nix index 76aad35..88d9f13 100644 --- a/nix-configs/home/nixvim/plugins.nix +++ b/nix-configs/home/nixvim/plugins.nix @@ -46,9 +46,9 @@ in { ]; extraFiles = { - "ftdetect/mdc.lua".source = ../../../.config/shared/nvim/ftdetect/mdc.lua; - "ftdetect/zsh.lua".source = ../../../.config/shared/nvim/ftdetect/zsh.lua; - "spell/tech.utf-8.add".source = ../../../.config/shared/nvim/spell/tech.utf-8.add; + "ftdetect/mdc.lua".source = ./files/ftdetect/mdc.lua; + "ftdetect/zsh.lua".source = ./files/ftdetect/zsh.lua; + "spell/tech.utf-8.add".source = ./files/spell/tech.utf-8.add; }; plugins = { diff --git a/nix-configs/home/packages/core-cli.nix b/nix-configs/home/packages/core-cli.nix index cd53600..912bffc 100644 --- a/nix-configs/home/packages/core-cli.nix +++ b/nix-configs/home/packages/core-cli.nix @@ -10,7 +10,6 @@ peco starship tree-sitter - vim yazi ]; } diff --git a/nix-configs/home/quick-shell.nix b/nix-configs/home/quick-shell.nix index 2309c3a..e7ec499 100644 --- a/nix-configs/home/quick-shell.nix +++ b/nix-configs/home/quick-shell.nix @@ -5,8 +5,8 @@ }: let appId = "dev.t4ko.quickshell"; sessionName = "quick-shell"; - ghosttyConfig = ../../.config/nixos/ghostty-quick-shell.conf; - starshipConfig = ../../.config/nixos/starship-quick-shell.toml; + ghosttyConfig = ../../dot_config/nixos/ghostty-quick-shell.conf; + starshipConfig = ../../dot_config/nixos/starship-quick-shell.toml; quickShellSession = pkgs.writeShellApplication { name = "quick-shell-session"; diff --git a/nix-configs/home/swaync.nix b/nix-configs/home/swaync.nix index e36cabb..80c2bc3 100644 --- a/nix-configs/home/swaync.nix +++ b/nix-configs/home/swaync.nix @@ -51,5 +51,5 @@ in { @define-color yellow ${c.yellow}; @define-color red ${c.red}; '' - + builtins.readFile ../../.config/nixos/swaync/style.css; + + builtins.readFile ../../dot_config/nixos/swaync/style.css; } diff --git a/nix-configs/home/waybar.nix b/nix-configs/home/waybar.nix index 068b868..2c9b3a0 100644 --- a/nix-configs/home/waybar.nix +++ b/nix-configs/home/waybar.nix @@ -475,7 +475,7 @@ in { @define-color peach ${c.peach}; @define-color red ${c.red}; '' - + builtins.readFile ../../.config/nixos/waybar/style.css; + + builtins.readFile ../../dot_config/nixos/waybar/style.css; }; systemd.user.services.waybar.Service.ExecStartPre = "${pkgs.runtimeShell} -c '${pkgs.procps}/bin/pkill -u %u -f \"(^|/)waybar($|[[:space:]])\" || true'"; diff --git a/nix-configs/home/xdg.nix b/nix-configs/home/xdg.nix index caad88b..e18b68d 100644 --- a/nix-configs/home/xdg.nix +++ b/nix-configs/home/xdg.nix @@ -17,8 +17,8 @@ # 代わりに再現性が上がり、誤編集で壊れない。flake 評価で参照するため対象は Git track 必須。 store = path: ../../. + "/${path}"; - claudeSettings = lib.recursiveUpdate (builtins.fromJSON (builtins.readFile (store ".config/shared/claude/settings.json"))) ( - builtins.fromJSON (builtins.readFile (store ".config/nixos/claude/settings.hooks.json")) + claudeSettings = lib.recursiveUpdate (builtins.fromJSON (builtins.readFile (store "dot_config/shared/claude/settings.json"))) ( + builtins.fromJSON (builtins.readFile (store "dot_config/nixos/claude/settings.hooks.json")) ); in { xdg = { @@ -61,16 +61,16 @@ in { configFile = { "mimeapps.list".force = true; # in-store: プログラムが書き込まない静的設定。 - "fastfetch".source = store ".config/shared/fastfetch"; - "starship.toml".source = store ".config/shared/starship.toml"; - "vim".source = store ".config/shared/vim"; - "wezterm".source = store ".config/shared/wezterm"; - "yazi".source = store ".config/shared/yazi"; + "fastfetch".source = store "dot_config/shared/fastfetch"; + "starship.toml".source = store "dot_config/shared/starship.toml"; + "vim".source = store "dot_config/shared/vim"; + "wezterm".source = store "dot_config/shared/wezterm"; + "yazi".source = store "dot_config/shared/yazi"; # out-of-store: プログラム自身が dir/file へ書き戻すもの。 - "lazygit".source = link ".config/shared/lazygit"; # state.yml を書き込む - "zed".source = link ".config/shared/zed"; # GUI 設定変更で settings.json を書き戻す - "zsh/rc".source = link ".config/nixos/zsh/rc"; # .zwc を zcompile する - "fcitx5/config".source = link ".config/nixos/fcitx5/config"; # GUI 設定で再書き込み + "lazygit".source = link "dot_config/shared/lazygit"; # state.yml を書き込む + "zed".source = link "dot_config/shared/zed"; # GUI 設定変更で settings.json を書き戻す + "zsh/rc".source = link "dot_config/nixos/zsh/rc"; # .zwc を zcompile する + "fcitx5/config".source = link "dot_config/nixos/fcitx5/config"; # GUI 設定で再書き込み }; dataFile."applications/mimeapps.list".force = true; @@ -79,15 +79,15 @@ in { home.file = { # in-store: プログラムが書き込まない静的設定。 ".git_template/hooks".source = store ".git_template/hooks"; - ".codex/AGENTS.md".source = store ".config/shared/codex/AGENTS.md"; - ".codex/agents".source = store ".config/shared/codex/agents"; - ".codex/rules".source = store ".config/shared/codex/rules"; - ".claude/CLAUDE.md".source = store ".config/shared/claude/CLAUDE.md"; - ".claude/agents".source = store ".config/shared/claude/agents"; - ".claude/statusline.sh".source = store ".config/shared/claude/statusline.sh"; - ".claude/claude-icon.svg".source = store ".config/shared/claude/claude-icon.svg"; + ".codex/AGENTS.md".source = store "dot_config/shared/codex/AGENTS.md"; + ".codex/agents".source = store "dot_config/shared/codex/agents"; + ".codex/rules".source = store "dot_config/shared/codex/rules"; + ".claude/CLAUDE.md".source = store "dot_config/shared/claude/CLAUDE.md"; + ".claude/agents".source = store "dot_config/shared/claude/agents"; + ".claude/statusline.sh".source = store "dot_config/shared/claude/statusline.sh"; + ".claude/claude-icon.svg".source = store "dot_config/shared/claude/claude-icon.svg"; ".claude/claude-notify-hook.sh" = { - source = store ".config/nixos/claude/claude-notify-hook.sh"; + source = store "dot_config/nixos/claude/claude-notify-hook.sh"; executable = true; }; @@ -97,7 +97,7 @@ in { # out-of-store symlink にすると codex が marketplaces/plugins/mcp_servers 等の実行時状態を # dotfiles の git 追跡ファイルへ書き戻し汚染するため、静的テンプレートから初回シードした # 「実ファイル」を codex に所有させ、git ツリーから切り離す。 - ".claude/skills".source = link ".config/shared/apm/.claude/skills"; # apm install の生成物 (source は .config/shared/apm/packages//.apm/skills/) + ".claude/skills".source = link "dot_config/shared/apm/.claude/skills"; # apm install の生成物 }; # Claude settings.json: 共通 base に NixOS 固有 hooks をマージして生成する。 @@ -119,7 +119,7 @@ in { # 既存が symlink (旧構成の名残) または未作成の場合のみテンプレートで初期化し、実ファイルは温存する。 home.activation.seedCodexConfig = lib.hm.dag.entryAfter ["writeBoundary"] '' codex_cfg="${config.home.homeDirectory}/.codex/config.toml" - codex_tmpl="${config.home.homeDirectory}/dotfiles/.config/shared/codex/config.toml" + codex_tmpl="${config.home.homeDirectory}/dotfiles/dot_config/shared/codex/config.toml" mkdir -p "${config.home.homeDirectory}/.codex" if [ -L "$codex_cfg" ] || [ ! -e "$codex_cfg" ]; then rm -f "$codex_cfg" @@ -171,10 +171,10 @@ in { done ''; - # apm install: .config/shared/apm/packages//.apm/skills/ (source) から各targetのskills dirへdeployする。 + # apm install: dot_config/shared/apm/packages//.apm/skills/から各targetのskills dirへdeployする。 # APMはCodex向けskillを`.agents/skills`に生成する。Codexは~/.codex/skills/.systemを保持する必要があるため、skillごとのリンクを後段で作る。 home.activation.apmInstallSkills = lib.hm.dag.entryAfter ["writeBoundary"] '' - cd "${config.home.homeDirectory}/dotfiles/.config/shared/apm" + cd "${config.home.homeDirectory}/dotfiles/dot_config/shared/apm" # activation は systemd 環境で走るため ~/.zshenv は読まれない。gh CLI の keyring からトークンを渡し、 # apm install が mizchi/skills などを clone する際に GitHub 認証が通るようにする。 export GITHUB_TOKEN="$(${pkgs.gh}/bin/gh auth token 2>/dev/null || true)" @@ -182,7 +182,7 @@ in { ''; home.activation.linkCodexSkills = lib.hm.dag.entryAfter ["apmInstallSkills"] '' - source_dir="${config.home.homeDirectory}/dotfiles/.config/shared/apm/.agents/skills" + source_dir="${config.home.homeDirectory}/dotfiles/dot_config/shared/apm/.agents/skills" target_dir="${config.home.homeDirectory}/.codex/skills" mkdir -p "$target_dir" find "$target_dir" -maxdepth 1 -type l -lname "$source_dir/*" -delete @@ -194,7 +194,7 @@ in { # opencode 向け skill: apm 生成物 (.agents/skills) を ~/.config/opencode/skills/ へ張る。 home.activation.linkOpencodeSkills = lib.hm.dag.entryAfter ["apmInstallSkills"] '' - source_dir="${config.home.homeDirectory}/dotfiles/.config/shared/apm/.agents/skills" + source_dir="${config.home.homeDirectory}/dotfiles/dot_config/shared/apm/.agents/skills" target_dir="${config.home.homeDirectory}/.config/opencode/skills" mkdir -p "$target_dir" find "$target_dir" -maxdepth 1 -type l -lname "$source_dir/*" -delete diff --git a/scripts/bootstrap.ps1 b/scripts/bootstrap.ps1 index 5281f2b..fc03e95 100644 --- a/scripts/bootstrap.ps1 +++ b/scripts/bootstrap.ps1 @@ -47,7 +47,6 @@ $wingetPackages = @( @{ Id = 'wez.wezterm.nightly'; Name = 'WezTerm Nightly' } @{ Id = 'Rustlang.Rustup'; Name = 'Rustup' } @{ Id = 'karlstav.cava'; Name = 'cava' } - @{ Id = 'AmN.yasb'; Name = 'YASB' } @{ Id = 'mpv.net'; Name = 'mpv.net' } ) @@ -127,12 +126,11 @@ foreach ($b in $scoopBuckets) { # --------------------------------------------------------------------------- $scoopPackages = @( 'main/7zip', + 'main/chezmoi', 'main/ffmpeg', 'main/gcc', 'main/starship', 'main/mise', - 'extras/komorebi', - 'extras/whkd', 'extras/lazygit', 'extras/yazi', 'extras/fastfetch', diff --git a/scripts/check_chezmoi.sh b/scripts/check_chezmoi.sh index 4126907..ac625e0 100644 --- a/scripts/check_chezmoi.sh +++ b/scripts/check_chezmoi.sh @@ -12,6 +12,13 @@ if [[ "$(<"$repo_root/.chezmoiroot")" != "chezmoi" ]]; then exit 1 fi +for mutable_dir in mutable/windows/nvim mutable/windows/cava; do + if [[ ! -d "$repo_root/$mutable_dir" ]]; then + printf 'mutable source does not exist: %s\n' "$mutable_dir" >&2 + exit 1 + fi +done + declare -A targets=() while IFS=$'\t' read -r profile target owner _mode _source; do [[ -z "$profile" || "$profile" == profile ]] && continue @@ -57,6 +64,22 @@ for profile in windows nixos wsl; do exit 1 fi + rendered_script="$temp_dir/create-windows-junctions-$profile.ps1" + chezmoi \ + --config "$rendered" \ + execute-template \ + --file "$repo_root/chezmoi/run_after_create-windows-junctions.ps1.tmpl" > "$rendered_script" + if [[ "$profile" == windows ]]; then + if ! grep -q 'mutable\\windows\\nvim' "$rendered_script" \ + || ! grep -q 'mutable\\windows\\cava' "$rendered_script"; then + printf '%s\n' 'Windows junction script is incomplete' >&2 + exit 1 + fi + elif grep -q '[^[:space:]]' "$rendered_script"; then + printf 'Windows junction script rendered for profile: %s\n' "$profile" >&2 + exit 1 + fi + source_path="$(chezmoi --source "$repo_root" --config "$rendered" source-path)" if [[ "$source_path" != "$repo_root/chezmoi" ]]; then printf 'unexpected source root: %s\n' "$source_path" >&2 diff --git a/scripts/optim_pwsh_profile.ps1 b/scripts/optim_pwsh_profile.ps1 index 2ec4a0a..ccd07cb 100644 --- a/scripts/optim_pwsh_profile.ps1 +++ b/scripts/optim_pwsh_profile.ps1 @@ -13,7 +13,7 @@ $ErrorActionPreference = "Stop" if (-not $SourcePath) { $repo = Split-Path -Parent $PSScriptRoot - $SourcePath = Join-Path $repo ".config/windows/powershell/Microsoft.PowerShell_profile.ps1" + $SourcePath = Join-Path $repo "dot_config/windows/powershell/Microsoft.PowerShell_profile.ps1" } if (-not $OutputPath) { $OutputPath = $PROFILE diff --git a/scripts/setup_windows.ps1 b/scripts/setup_windows.ps1 index a3c86d7..41a036b 100644 --- a/scripts/setup_windows.ps1 +++ b/scripts/setup_windows.ps1 @@ -2,43 +2,54 @@ $ErrorActionPreference = "Stop" $repo = Split-Path -Parent $PSScriptRoot $homeDir = [Environment]::GetFolderPath("UserProfile") -$localDir = [Environment]::GetFolderPath("LocalApplicationData") $roamingDir = [Environment]::GetFolderPath("ApplicationData") $scriptsDir = Join-Path $repo "scripts" +if (-not (Get-Command chezmoi -ErrorAction SilentlyContinue)) { + throw "chezmoi が見つかりません。bootstrap.ps1 を先に実行してください。" +} + +& chezmoi --source $repo init --promptChoice "Environment profile=windows" +if ($LASTEXITCODE -ne 0) { + throw "chezmoi init failed (exit=$LASTEXITCODE)" +} + +$chezmoiProfile = (& chezmoi --source $repo execute-template "{{ .profile }}").Trim() +if ($chezmoiProfile -ne "windows") { + throw "chezmoi profile must be windows (actual=$chezmoiProfile)" +} + +& chezmoi --source $repo apply +if ($LASTEXITCODE -ne 0) { + throw "chezmoi apply failed (exit=$LASTEXITCODE)" +} + # Src: repo からの相対パス # Dst: 相対パス → $homeDir 基準、絶対パス → そのまま使用 $targets = @( @{ Src = ".gitconfig"; Dst = ".gitconfig" }, # Claude: 共通ファイルは個別リンク。settings.json は base+hooks を後段でマージ生成する。 - @{ Src = ".config/shared/claude/CLAUDE.md"; Dst = ".claude/CLAUDE.md" }, - @{ Src = ".config/shared/claude/agents"; Dst = ".claude/agents" }, - @{ Src = ".config/shared/claude/skills"; Dst = ".claude/skills" }, - @{ Src = ".config/shared/claude/statusline.sh"; Dst = ".claude/statusline.sh" }, - @{ Src = ".config/shared/claude/claude-icon.svg"; Dst = ".claude/claude-icon.svg" }, - @{ Src = ".config/windows/claude/ccwin-hook.ps1"; Dst = ".claude/ccwin-hook.ps1" }, - @{ Src = ".config/shared/codex"; Dst = ".codex" }, - @{ Src = ".config/shared/lazygit"; Dst = ".config/lazygit" }, - @{ Src = ".config/shared/mise"; Dst = ".config/mise" }, - @{ Src = ".config/shared/nvim"; Dst = (Join-Path $localDir "nvim") }, - @{ Src = ".config/shared/vim"; Dst = ".config/vim" }, - @{ Src = ".config/shared/wezterm"; Dst = ".config/wezterm" }, - @{ Src = ".config/shared/yazi"; Dst = (Join-Path $roamingDir "yazi\config") }, - @{ Src = ".config/shared/starship.toml"; Dst = ".config/starship.toml" }, - @{ Src = ".config/shared/fastfetch"; Dst = ".config/fastfetch" }, - @{ Src = ".config/windows/ccwin-notify"; Dst = ".config/ccwin-notify" }, - @{ Src = ".config/windows/yasb"; Dst = ".config/yasb" }, - @{ Src = ".config/windows/cava"; Dst = ".config/cava" }, - @{ Src = ".config/windows/komorebi/komorebi.json"; Dst = "komorebi.json" }, - @{ Src = ".config/windows/komorebi/komorebi.bar.json"; Dst = "komorebi.bar.json" }, - @{ Src = ".config/windows/komorebi/applications.json"; Dst = "applications.json" }, - @{ Src = ".config/windows/whkdrc"; Dst = ".config/whkdrc" }, - @{ Src = ".config/shared/vscode/settings.json"; Dst = (Join-Path $roamingDir "Code\User\settings.json") }, - @{ Src = ".config/shared/vscode/keybindings.json"; Dst = (Join-Path $roamingDir "Code\User\keybindings.json") }, - @{ Src = ".config/shared/vscode/snippets"; Dst = (Join-Path $roamingDir "Code\User\snippets") }, - @{ Src = ".config/shared/zed/settings.json"; Dst = (Join-Path $roamingDir "Zed\settings.json") }, - @{ Src = ".config/shared/zed/keymap.json"; Dst = (Join-Path $roamingDir "Zed\keymap.json") }, - @{ Src = ".config/shared/zed/tasks.json"; Dst = (Join-Path $roamingDir "Zed\tasks.json") } + @{ Src = "dot_config/shared/claude/CLAUDE.md"; Dst = ".claude/CLAUDE.md" }, + @{ Src = "dot_config/shared/claude/agents"; Dst = ".claude/agents" }, + @{ Src = "dot_config/shared/claude/skills"; Dst = ".claude/skills" }, + @{ Src = "dot_config/shared/claude/statusline.sh"; Dst = ".claude/statusline.sh" }, + @{ Src = "dot_config/shared/claude/claude-icon.svg"; Dst = ".claude/claude-icon.svg" }, + @{ Src = "dot_config/windows/claude/ccwin-hook.ps1"; Dst = ".claude/ccwin-hook.ps1" }, + @{ Src = "dot_config/shared/codex"; Dst = ".codex" }, + @{ Src = "dot_config/shared/lazygit"; Dst = ".config/lazygit" }, + @{ Src = "dot_config/shared/mise"; Dst = ".config/mise" }, + @{ Src = "dot_config/shared/vim"; Dst = ".config/vim" }, + @{ Src = "dot_config/shared/wezterm"; Dst = ".config/wezterm" }, + @{ Src = "dot_config/shared/yazi"; Dst = (Join-Path $roamingDir "yazi\config") }, + @{ Src = "dot_config/shared/starship.toml"; Dst = ".config/starship.toml" }, + @{ Src = "dot_config/shared/fastfetch"; Dst = ".config/fastfetch" }, + @{ Src = "dot_config/windows/ccwin-notify"; Dst = ".config/ccwin-notify" }, + @{ Src = "dot_config/shared/vscode/settings.json"; Dst = (Join-Path $roamingDir "Code\User\settings.json") }, + @{ Src = "dot_config/shared/vscode/keybindings.json"; Dst = (Join-Path $roamingDir "Code\User\keybindings.json") }, + @{ Src = "dot_config/shared/vscode/snippets"; Dst = (Join-Path $roamingDir "Code\User\snippets") }, + @{ Src = "dot_config/shared/zed/settings.json"; Dst = (Join-Path $roamingDir "Zed\settings.json") }, + @{ Src = "dot_config/shared/zed/keymap.json"; Dst = (Join-Path $roamingDir "Zed\keymap.json") }, + @{ Src = "dot_config/shared/zed/tasks.json"; Dst = (Join-Path $roamingDir "Zed\tasks.json") } ) function Remove-ExistingPath($path) { @@ -143,8 +154,8 @@ foreach ($entry in $targets) { # Claude settings.json: 共通 base に Windows 固有 hooks をマージして生成する。 # (Linux/Nix 側は base をそのまま生成。hooks は Windows 専用のため setup でのみ合成) -$claudeBase = Join-Path $repo ".config/shared/claude/settings.json" -$claudeHooks = Join-Path $repo ".config/windows/claude/settings.hooks.json" +$claudeBase = Join-Path $repo "dot_config/shared/claude/settings.json" +$claudeHooks = Join-Path $repo "dot_config/windows/claude/settings.hooks.json" $claudeDst = Join-Path $homeDir ".claude/settings.json" if ((Test-Path $claudeBase) -and (Test-Path $claudeHooks)) { Remove-ExistingPath -path $claudeDst | Out-Null @@ -162,7 +173,7 @@ if ((Test-Path $claudeBase) -and (Test-Path $claudeHooks)) { } # PowerShell profile: modules/ をjunctionでリンクし、プロファイルは最適化版を生成 -$profileSrc = Join-Path $repo ".config/windows/powershell" +$profileSrc = Join-Path $repo "dot_config/windows/powershell" $documentsDir = [Environment]::GetFolderPath("MyDocuments") $profileDst = Join-Path $documentsDir "PowerShell" if (Test-Path -LiteralPath $profileSrc) { From e2f95c276992383da5f74ab43bf8f47b1ac314fe Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Fri, 24 Jul 2026 01:01:28 +0900 Subject: [PATCH 14/35] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20ci:=20workflow?= =?UTF-8?q?=E3=82=92=E8=B2=AC=E5=8B=99=E5=88=A5=E3=81=AB=E5=88=86=E5=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ci.ymlをオーケストレーターにし、lint・chezmoi・buildを再利用可能workflowへ分離する。 publish-cacheはmasterのNix設定変更時だけ呼び出す。 --- .github/workflows/build.yml | 40 +++++++ .github/workflows/chezmoi.yml | 58 ++++++++++ .github/workflows/ci.yml | 160 ++++++---------------------- .github/workflows/lint.yml | 60 +++++++++++ .github/workflows/publish-cache.yml | 11 +- 5 files changed, 201 insertions(+), 128 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/chezmoi.yml create mode 100644 .github/workflows/lint.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..3a47fad --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,40 @@ +name: Build + +on: + workflow_call: + +permissions: + contents: read + +jobs: + nixos: + name: NixOS + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Nix + uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - name: Build CI configuration + run: nix build .#nixosConfigurations.nixos-ci.config.system.build.toplevel + + wsl: + name: NixOS-WSL + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Nix + uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - name: Check WSL configuration + run: bash scripts/check_wsl.sh diff --git a/.github/workflows/chezmoi.yml b/.github/workflows/chezmoi.yml new file mode 100644 index 0000000..2781319 --- /dev/null +++ b/.github/workflows/chezmoi.yml @@ -0,0 +1,58 @@ +name: Chezmoi + +on: + workflow_call: + +permissions: + contents: read + +jobs: + windows: + name: Windows junctions + runs-on: windows-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install chezmoi + shell: pwsh + run: choco install chezmoi --yes --no-progress + + - name: Apply Windows profile + shell: pwsh + run: | + $destination = Join-Path $env:RUNNER_TEMP 'chezmoi-home' + New-Item -ItemType Directory -Path $destination -Force | Out-Null + chezmoi --source $PWD --destination $destination init --apply ` + --promptChoice 'Environment profile=windows' + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + + $expected = @{ + (Join-Path $destination 'AppData\Local\nvim') = (Join-Path $PWD 'mutable\nvim') + (Join-Path $destination '.config\cava') = (Join-Path $PWD 'mutable\cava') + } + foreach ($target in $expected.Keys) { + $item = Get-Item -LiteralPath $target -Force + if ($item.LinkType -ne 'Junction') { + throw "Expected junction: $target" + } + if ([IO.Path]::GetFullPath([string]$item.Target) -ne [IO.Path]::GetFullPath($expected[$target])) { + throw "Unexpected junction target: $target -> $($item.Target)" + } + } + + contract: + name: Contract + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Nix + uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - name: Check profiles and ownership + run: nix develop --command bash scripts/check_chezmoi.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee7653e..e8bcab0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,137 +4,47 @@ on: push: workflow_dispatch: -jobs: - chezmoi-windows: - name: Chezmoi Windows junctions - runs-on: windows-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install chezmoi - shell: pwsh - run: choco install chezmoi --yes --no-progress - - - name: Apply Windows profile - shell: pwsh - run: | - $destination = Join-Path $env:RUNNER_TEMP 'chezmoi-home' - New-Item -ItemType Directory -Path $destination -Force | Out-Null - chezmoi --source $PWD --destination $destination init --apply ` - --promptChoice 'Environment profile=windows' - if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } - - $expected = @{ - (Join-Path $destination 'AppData\Local\nvim') = (Join-Path $PWD 'mutable\windows\nvim') - (Join-Path $destination '.config\cava') = (Join-Path $PWD 'mutable\windows\cava') - } - foreach ($target in $expected.Keys) { - $item = Get-Item -LiteralPath $target -Force - if ($item.LinkType -ne 'Junction') { - throw "Expected junction: $target" - } - if ([IO.Path]::GetFullPath([string]$item.Target) -ne [IO.Path]::GetFullPath($expected[$target])) { - throw "Unexpected junction target: $target -> $($item.Target)" - } - } - - chezmoi: - name: Chezmoi contract - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 +permissions: + contents: read - - name: Install Nix - uses: cachix/install-nix-action@v31 - with: - extra_nix_config: | - experimental-features = nix-command flakes - - - name: Check chezmoi profiles and ownership - run: nix develop --command bash scripts/check_chezmoi.sh - - wsl: - name: NixOS-WSL - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install Nix - uses: cachix/install-nix-action@v31 - with: - extra_nix_config: | - experimental-features = nix-command flakes - - - name: Check WSL configuration - run: bash scripts/check_wsl.sh - - syntax: - name: Nix syntax - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install Nix - uses: cachix/install-nix-action@v31 - with: - extra_nix_config: | - experimental-features = nix-command flakes - - - name: Check Nix syntax - run: | - git ls-files '*.nix' \ - | xargs -r -n1 nix-instantiate --parse --quiet >/dev/null - - nix-formatting: - name: Nix formatting - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install Nix - uses: cachix/install-nix-action@v31 - with: - extra_nix_config: | - experimental-features = nix-command flakes - - - name: Check Nix formatting - run: nix run nixpkgs#alejandra -- --check . - - markdown-lint: - name: Markdown lint +jobs: + changes: + name: Detect changes runs-on: ubuntu-latest + permissions: + contents: read + outputs: + nix_configs: ${{ steps.filter.outputs.nix_configs }} steps: - name: Checkout uses: actions/checkout@v4 - - name: Install Nix - uses: cachix/install-nix-action@v31 + - name: Detect changed paths + id: filter + uses: dorny/paths-filter@v3 with: - extra_nix_config: | - experimental-features = nix-command flakes - - - name: Check Markdown lint - run: nix run nixpkgs#markdownlint-cli2 -- - - lua-formatting: - name: Lua formatting - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 + filters: | + nix_configs: + - 'nix-configs/**' - - name: Install Nix - uses: cachix/install-nix-action@v31 - with: - extra_nix_config: | - experimental-features = nix-command flakes + lint: + name: Lint + uses: ./.github/workflows/lint.yml - - name: Check Lua formatting - run: | - git ls-files '*.lua' \ - | xargs -r nix run nixpkgs#stylua -- --check + chezmoi: + name: Chezmoi + uses: ./.github/workflows/chezmoi.yml + + build: + name: Build + uses: ./.github/workflows/build.yml + + publish-cache: + name: Publish cache + needs: changes + if: >- + github.event_name == 'push' && + github.ref == 'refs/heads/master' && + needs.changes.outputs.nix_configs == 'true' + uses: ./.github/workflows/publish-cache.yml + secrets: inherit diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..e127362 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,60 @@ +name: Lint + +on: + workflow_call: + +permissions: + contents: read + +jobs: + syntax: + name: Nix syntax + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Nix + uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - name: Check Nix syntax + run: | + git ls-files '*.nix' \ + | xargs -r -n1 nix-instantiate --parse --quiet >/dev/null + + nix-formatting: + name: Nix formatting + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Nix + uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - name: Check Nix formatting + run: nix run nixpkgs#alejandra -- --check . + + lua-formatting: + name: Lua formatting + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Nix + uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - name: Check Lua formatting + run: | + git ls-files '*.lua' \ + | xargs -r nix run nixpkgs#stylua -- --check diff --git a/.github/workflows/publish-cache.yml b/.github/workflows/publish-cache.yml index 7035a6c..f4bdf51 100644 --- a/.github/workflows/publish-cache.yml +++ b/.github/workflows/publish-cache.yml @@ -3,20 +3,25 @@ name: publish-cache on: + workflow_call: + inputs: + host: + description: "対象 host を 1 つだけ指定したい場合 (空なら matrix の全 host)" + required: false + type: string workflow_dispatch: inputs: host: description: "対象 host を 1 つだけ指定したい場合 (空なら matrix の全 host)" required: false type: string - push: - branches: [master] concurrency: group: publish-cache-${{ github.ref }} cancel-in-progress: false -permissions: {} +permissions: + contents: read jobs: publish: From d5703ddec51cc2771d23f2348846225723855fb0 Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Fri, 24 Jul 2026 01:01:37 +0900 Subject: [PATCH 15/35] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20mutable:=20Windows?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E3=81=AE=E9=85=8D=E7=BD=AE=E3=82=92=E5=B9=B3?= =?UTF-8?q?=E5=9D=A6=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit nvimとcavaをmutable直下へ移し、junction・検証・ドキュメントの参照を更新する。 --- chezmoi/.chezmoiignore | 2 +- chezmoi/run_after_create-windows-junctions.ps1.tmpl | 4 ++-- docs/keybindings/nvim/README.md | 8 ++++---- docs/memo/dotfiles-ownership.tsv | 6 +++--- docs/memo/windows-nixos-dotfiles-design.md | 5 +++-- mutable/{windows => }/cava/shaders/bar_spectrum.frag | 0 mutable/{windows => }/cava/shaders/eye_of_phi.frag | 0 mutable/{windows => }/cava/shaders/northern_lights.frag | 0 mutable/{windows => }/cava/shaders/orion_circle.frag | 0 .../{windows => }/cava/shaders/orion_circle_rotate.frag | 0 mutable/{windows => }/cava/shaders/orion_saturn_core.frag | 0 .../{windows => }/cava/shaders/orion_saturn_subring.frag | 0 mutable/{windows => }/cava/shaders/pass_through.vert | 0 mutable/{windows => }/cava/shaders/spectrogram.frag | 0 .../cava/shaders/winamp_line_style_spectrum.frag | 0 mutable/{windows => }/cava/themes/solarized_dark | 0 mutable/{windows => }/cava/themes/tricolor | 0 mutable/{windows => }/nvim/.gitignore | 0 mutable/{windows => }/nvim/.neoconf.json | 0 mutable/{windows => }/nvim/.typos.toml | 0 mutable/{windows => }/nvim/LICENSE | 0 mutable/{windows => }/nvim/README.md | 0 mutable/{windows => }/nvim/init.lua | 0 mutable/{windows => }/nvim/lazy-lock.json | 0 mutable/{windows => }/nvim/lazyvim.json | 0 mutable/{windows => }/nvim/lua/config/autocmds.lua | 0 mutable/{windows => }/nvim/lua/config/keymaps.lua | 0 mutable/{windows => }/nvim/lua/config/lazy.lua | 0 mutable/{windows => }/nvim/lua/config/options.lua | 0 mutable/{windows => }/nvim/lua/plugins/base/snacks.lua | 0 mutable/{windows => }/nvim/lua/plugins/base/ufo.lua | 0 mutable/{windows => }/nvim/lua/plugins/base/vimdoc-ja.lua | 0 .../{windows => }/nvim/lua/plugins/base/winresizer.lua | 0 mutable/{windows => }/nvim/lua/plugins/base/yazi.lua | 0 mutable/{windows => }/nvim/lua/plugins/disable.lua | 0 .../{windows => }/nvim/lua/plugins/editor/claude-code.lua | 0 mutable/{windows => }/nvim/lua/plugins/editor/codic.lua | 0 .../nvim/lua/plugins/editor/color-picker.lua | 0 .../{windows => }/nvim/lua/plugins/editor/compiler.lua | 0 .../{windows => }/nvim/lua/plugins/editor/diffview.lua | 0 mutable/{windows => }/nvim/lua/plugins/editor/emmet.lua | 0 mutable/{windows => }/nvim/lua/plugins/editor/git.lua | 0 .../nvim/lua/plugins/editor/html-preview.lua | 0 .../nvim/lua/plugins/editor/markdown-preview.lua | 0 .../nvim/lua/plugins/editor/mini-surround.lua | 0 mutable/{windows => }/nvim/lua/plugins/editor/minty.lua | 0 .../nvim/lua/plugins/editor/rainbow-delimiters.lua | 0 .../{windows => }/nvim/lua/plugins/editor/supermaven.lua | 0 mutable/{windows => }/nvim/lua/plugins/editor/test.lua | 0 .../nvim/lua/plugins/editor/treesitter-context.lua | 0 .../{windows => }/nvim/lua/plugins/editor/treesitter.lua | 0 mutable/{windows => }/nvim/lua/plugins/img-clip.lua | 0 mutable/{windows => }/nvim/lua/plugins/lsp/init.lua | 0 mutable/{windows => }/nvim/lua/plugins/lsp/lazydev.lua | 0 .../{windows => }/nvim/lua/plugins/lsp/version-lsp.lua | 0 mutable/{windows => }/nvim/lua/plugins/ui/bufferline.lua | 0 mutable/{windows => }/nvim/lua/plugins/ui/dracula.lua | 0 mutable/{windows => }/nvim/lua/plugins/ui/hlchunk.lua | 0 mutable/{windows => }/nvim/lua/plugins/ui/init.lua | 0 mutable/{windows => }/nvim/lua/plugins/ui/lualine.lua | 0 mutable/{windows => }/nvim/lua/plugins/ui/modicator.lua | 0 mutable/{windows => }/nvim/lua/plugins/ui/noice.lua | 0 .../{windows => }/nvim/lua/plugins/ui/smear-cursor.lua | 0 mutable/{windows => }/nvim/stylua.toml | 0 scripts/check_chezmoi.sh | 6 +++--- 65 files changed, 16 insertions(+), 15 deletions(-) rename mutable/{windows => }/cava/shaders/bar_spectrum.frag (100%) rename mutable/{windows => }/cava/shaders/eye_of_phi.frag (100%) rename mutable/{windows => }/cava/shaders/northern_lights.frag (100%) rename mutable/{windows => }/cava/shaders/orion_circle.frag (100%) rename mutable/{windows => }/cava/shaders/orion_circle_rotate.frag (100%) rename mutable/{windows => }/cava/shaders/orion_saturn_core.frag (100%) rename mutable/{windows => }/cava/shaders/orion_saturn_subring.frag (100%) rename mutable/{windows => }/cava/shaders/pass_through.vert (100%) rename mutable/{windows => }/cava/shaders/spectrogram.frag (100%) rename mutable/{windows => }/cava/shaders/winamp_line_style_spectrum.frag (100%) rename mutable/{windows => }/cava/themes/solarized_dark (100%) rename mutable/{windows => }/cava/themes/tricolor (100%) rename mutable/{windows => }/nvim/.gitignore (100%) rename mutable/{windows => }/nvim/.neoconf.json (100%) rename mutable/{windows => }/nvim/.typos.toml (100%) rename mutable/{windows => }/nvim/LICENSE (100%) rename mutable/{windows => }/nvim/README.md (100%) rename mutable/{windows => }/nvim/init.lua (100%) rename mutable/{windows => }/nvim/lazy-lock.json (100%) rename mutable/{windows => }/nvim/lazyvim.json (100%) rename mutable/{windows => }/nvim/lua/config/autocmds.lua (100%) rename mutable/{windows => }/nvim/lua/config/keymaps.lua (100%) rename mutable/{windows => }/nvim/lua/config/lazy.lua (100%) rename mutable/{windows => }/nvim/lua/config/options.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/base/snacks.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/base/ufo.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/base/vimdoc-ja.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/base/winresizer.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/base/yazi.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/disable.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/claude-code.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/codic.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/color-picker.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/compiler.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/diffview.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/emmet.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/git.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/html-preview.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/markdown-preview.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/mini-surround.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/minty.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/rainbow-delimiters.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/supermaven.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/test.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/treesitter-context.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/editor/treesitter.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/img-clip.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/lsp/init.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/lsp/lazydev.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/lsp/version-lsp.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/ui/bufferline.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/ui/dracula.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/ui/hlchunk.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/ui/init.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/ui/lualine.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/ui/modicator.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/ui/noice.lua (100%) rename mutable/{windows => }/nvim/lua/plugins/ui/smear-cursor.lua (100%) rename mutable/{windows => }/nvim/stylua.toml (100%) diff --git a/chezmoi/.chezmoiignore b/chezmoi/.chezmoiignore index 2eefa08..378cf3b 100644 --- a/chezmoi/.chezmoiignore +++ b/chezmoi/.chezmoiignore @@ -14,5 +14,5 @@ Documents/PowerShell/** {{- end }} # Neovim is never a shared chezmoi target. Windows uses a junction to -# mutable/windows/nvim; NixOS uses nixvim; WSL leaves it unmanaged. +# mutable/nvim; NixOS uses nixvim; WSL leaves it unmanaged. .config/nvim/** diff --git a/chezmoi/run_after_create-windows-junctions.ps1.tmpl b/chezmoi/run_after_create-windows-junctions.ps1.tmpl index 605d5a1..066baaf 100644 --- a/chezmoi/run_after_create-windows-junctions.ps1.tmpl +++ b/chezmoi/run_after_create-windows-junctions.ps1.tmpl @@ -7,11 +7,11 @@ $repo = {{ .chezmoi.workingTree | quote }} $homeDir = {{ .chezmoi.destDir | quote }} $junctions = @( @{ - Source = Join-Path $repo 'mutable\windows\nvim' + Source = Join-Path $repo 'mutable\nvim' Target = Join-Path $homeDir 'AppData\Local\nvim' }, @{ - Source = Join-Path $repo 'mutable\windows\cava' + Source = Join-Path $repo 'mutable\cava' Target = Join-Path $homeDir '.config\cava' } ) diff --git a/docs/keybindings/nvim/README.md b/docs/keybindings/nvim/README.md index f56b524..05141a7 100644 --- a/docs/keybindings/nvim/README.md +++ b/docs/keybindings/nvim/README.md @@ -4,10 +4,10 @@ Vim 初心者向けに、本リポジトリの Neovim 設定 ([LazyVim](https:// 設定ファイル: -- [`mutable/windows/nvim/lua/config/options.lua`](../../../mutable/windows/nvim/lua/config/options.lua) — Windows LazyVimのオプションとリーダーキー -- [`mutable/windows/nvim/lua/config/keymaps.lua`](../../../mutable/windows/nvim/lua/config/keymaps.lua) — Windows LazyVimのカスタムキーマップ -- [`mutable/windows/nvim/lua/config/autocmds.lua`](../../../mutable/windows/nvim/lua/config/autocmds.lua) — Windows LazyVimのautocmdとユーザーコマンド -- [`mutable/windows/nvim/lua/plugins/`](../../../mutable/windows/nvim/lua/plugins/) — Windows LazyVimの各プラグイン設定 +- [`mutable/nvim/lua/config/options.lua`](../../../mutable/nvim/lua/config/options.lua) — Windows LazyVimのオプションとリーダーキー +- [`mutable/nvim/lua/config/keymaps.lua`](../../../mutable/nvim/lua/config/keymaps.lua) — Windows LazyVimのカスタムキーマップ +- [`mutable/nvim/lua/config/autocmds.lua`](../../../mutable/nvim/lua/config/autocmds.lua) — Windows LazyVimのautocmdとユーザーコマンド +- [`mutable/nvim/lua/plugins/`](../../../mutable/nvim/lua/plugins/) — Windows LazyVimの各プラグイン設定 ## 大事な前提 diff --git a/docs/memo/dotfiles-ownership.tsv b/docs/memo/dotfiles-ownership.tsv index e2f167c..c358f1f 100644 --- a/docs/memo/dotfiles-ownership.tsv +++ b/docs/memo/dotfiles-ownership.tsv @@ -1,6 +1,6 @@ profile target owner mode source -windows AppData/Local/nvim chezmoi junction mutable/windows/nvim -windows .config/cava chezmoi junction mutable/windows/cava +windows AppData/Local/nvim chezmoi junction mutable/nvim +windows .config/cava chezmoi junction mutable/cava nixos .config/nvim nix nixvim nix-configs/home/nixvim wsl .config/nvim unmanaged none - wsl /etc/wsl.conf nix generated nix-configs/hosts/wsl/default.nix @@ -22,4 +22,4 @@ wsl .config/wezterm unmanaged none - nixos .config/niri nix generated nix-configs/home/niri.nix nixos .config/swaync nix generated nix-configs/home/swaync.nix nixos .config/waybar nix generated nix-configs/home/waybar.nix -windows Documents/PowerShell chezmoi junction mutable/windows/powershell +windows Documents/PowerShell chezmoi junction mutable/powershell diff --git a/docs/memo/windows-nixos-dotfiles-design.md b/docs/memo/windows-nixos-dotfiles-design.md index be720b7..947ab6d 100644 --- a/docs/memo/windows-nixos-dotfiles-design.md +++ b/docs/memo/windows-nixos-dotfiles-design.md @@ -64,6 +64,7 @@ ownerは次のいずれかとする。 | shell | chezmoi + PowerShell | Home Manager + zsh | Home Manager + zsh | | Git / Starship / Yazi / Lazygit | chezmoi | chezmoi | chezmoi | | WezTerm | chezmoi | chezmoi | 管理しない | +| YASB | chezmoi | 対象外 | 対象外 | | niri / waybar / swaync | 対象外 | Nix | 対象外 | | `/etc/wsl.conf` | 対象外 | 対象外 | NixOS-WSL | @@ -71,7 +72,7 @@ ownerは次のいずれかとする。 ### Windows -LazyVimの実体を`mutable/windows/nvim`へ置き、`%LOCALAPPDATA%\nvim`からjunctionで参照する。Windowsのdirectory symlink権限に依存しないよう、chezmoiの`run_after_` PowerShell scriptでjunctionを収束させる。 +LazyVimの実体を`mutable/nvim`へ置き、`%LOCALAPPDATA%\nvim`からjunctionで参照する。Windowsのdirectory symlink権限に依存しないよう、chezmoiの`run_after_` PowerShell scriptでjunctionを収束させる。 ### NixOS @@ -112,7 +113,7 @@ nixvimをimportせず、chezmoiでも`~/.config/nvim`を生成しない。将来 ### Phase 2: Windows -- 完了: Windows LazyVimとcavaを`mutable/windows`へ移し、chezmoiのjunction所有へ切り替えた。 +- 完了: Windows LazyVimとcavaを`mutable`へ移し、chezmoiのjunction所有へ切り替えた。 - 次: PowerShell profile生成をchezmoiへ移す。 - 最後に`setup_windows.ps1`をchezmoi bootstrapだけへ縮小する。 diff --git a/mutable/windows/cava/shaders/bar_spectrum.frag b/mutable/cava/shaders/bar_spectrum.frag similarity index 100% rename from mutable/windows/cava/shaders/bar_spectrum.frag rename to mutable/cava/shaders/bar_spectrum.frag diff --git a/mutable/windows/cava/shaders/eye_of_phi.frag b/mutable/cava/shaders/eye_of_phi.frag similarity index 100% rename from mutable/windows/cava/shaders/eye_of_phi.frag rename to mutable/cava/shaders/eye_of_phi.frag diff --git a/mutable/windows/cava/shaders/northern_lights.frag b/mutable/cava/shaders/northern_lights.frag similarity index 100% rename from mutable/windows/cava/shaders/northern_lights.frag rename to mutable/cava/shaders/northern_lights.frag diff --git a/mutable/windows/cava/shaders/orion_circle.frag b/mutable/cava/shaders/orion_circle.frag similarity index 100% rename from mutable/windows/cava/shaders/orion_circle.frag rename to mutable/cava/shaders/orion_circle.frag diff --git a/mutable/windows/cava/shaders/orion_circle_rotate.frag b/mutable/cava/shaders/orion_circle_rotate.frag similarity index 100% rename from mutable/windows/cava/shaders/orion_circle_rotate.frag rename to mutable/cava/shaders/orion_circle_rotate.frag diff --git a/mutable/windows/cava/shaders/orion_saturn_core.frag b/mutable/cava/shaders/orion_saturn_core.frag similarity index 100% rename from mutable/windows/cava/shaders/orion_saturn_core.frag rename to mutable/cava/shaders/orion_saturn_core.frag diff --git a/mutable/windows/cava/shaders/orion_saturn_subring.frag b/mutable/cava/shaders/orion_saturn_subring.frag similarity index 100% rename from mutable/windows/cava/shaders/orion_saturn_subring.frag rename to mutable/cava/shaders/orion_saturn_subring.frag diff --git a/mutable/windows/cava/shaders/pass_through.vert b/mutable/cava/shaders/pass_through.vert similarity index 100% rename from mutable/windows/cava/shaders/pass_through.vert rename to mutable/cava/shaders/pass_through.vert diff --git a/mutable/windows/cava/shaders/spectrogram.frag b/mutable/cava/shaders/spectrogram.frag similarity index 100% rename from mutable/windows/cava/shaders/spectrogram.frag rename to mutable/cava/shaders/spectrogram.frag diff --git a/mutable/windows/cava/shaders/winamp_line_style_spectrum.frag b/mutable/cava/shaders/winamp_line_style_spectrum.frag similarity index 100% rename from mutable/windows/cava/shaders/winamp_line_style_spectrum.frag rename to mutable/cava/shaders/winamp_line_style_spectrum.frag diff --git a/mutable/windows/cava/themes/solarized_dark b/mutable/cava/themes/solarized_dark similarity index 100% rename from mutable/windows/cava/themes/solarized_dark rename to mutable/cava/themes/solarized_dark diff --git a/mutable/windows/cava/themes/tricolor b/mutable/cava/themes/tricolor similarity index 100% rename from mutable/windows/cava/themes/tricolor rename to mutable/cava/themes/tricolor diff --git a/mutable/windows/nvim/.gitignore b/mutable/nvim/.gitignore similarity index 100% rename from mutable/windows/nvim/.gitignore rename to mutable/nvim/.gitignore diff --git a/mutable/windows/nvim/.neoconf.json b/mutable/nvim/.neoconf.json similarity index 100% rename from mutable/windows/nvim/.neoconf.json rename to mutable/nvim/.neoconf.json diff --git a/mutable/windows/nvim/.typos.toml b/mutable/nvim/.typos.toml similarity index 100% rename from mutable/windows/nvim/.typos.toml rename to mutable/nvim/.typos.toml diff --git a/mutable/windows/nvim/LICENSE b/mutable/nvim/LICENSE similarity index 100% rename from mutable/windows/nvim/LICENSE rename to mutable/nvim/LICENSE diff --git a/mutable/windows/nvim/README.md b/mutable/nvim/README.md similarity index 100% rename from mutable/windows/nvim/README.md rename to mutable/nvim/README.md diff --git a/mutable/windows/nvim/init.lua b/mutable/nvim/init.lua similarity index 100% rename from mutable/windows/nvim/init.lua rename to mutable/nvim/init.lua diff --git a/mutable/windows/nvim/lazy-lock.json b/mutable/nvim/lazy-lock.json similarity index 100% rename from mutable/windows/nvim/lazy-lock.json rename to mutable/nvim/lazy-lock.json diff --git a/mutable/windows/nvim/lazyvim.json b/mutable/nvim/lazyvim.json similarity index 100% rename from mutable/windows/nvim/lazyvim.json rename to mutable/nvim/lazyvim.json diff --git a/mutable/windows/nvim/lua/config/autocmds.lua b/mutable/nvim/lua/config/autocmds.lua similarity index 100% rename from mutable/windows/nvim/lua/config/autocmds.lua rename to mutable/nvim/lua/config/autocmds.lua diff --git a/mutable/windows/nvim/lua/config/keymaps.lua b/mutable/nvim/lua/config/keymaps.lua similarity index 100% rename from mutable/windows/nvim/lua/config/keymaps.lua rename to mutable/nvim/lua/config/keymaps.lua diff --git a/mutable/windows/nvim/lua/config/lazy.lua b/mutable/nvim/lua/config/lazy.lua similarity index 100% rename from mutable/windows/nvim/lua/config/lazy.lua rename to mutable/nvim/lua/config/lazy.lua diff --git a/mutable/windows/nvim/lua/config/options.lua b/mutable/nvim/lua/config/options.lua similarity index 100% rename from mutable/windows/nvim/lua/config/options.lua rename to mutable/nvim/lua/config/options.lua diff --git a/mutable/windows/nvim/lua/plugins/base/snacks.lua b/mutable/nvim/lua/plugins/base/snacks.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/base/snacks.lua rename to mutable/nvim/lua/plugins/base/snacks.lua diff --git a/mutable/windows/nvim/lua/plugins/base/ufo.lua b/mutable/nvim/lua/plugins/base/ufo.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/base/ufo.lua rename to mutable/nvim/lua/plugins/base/ufo.lua diff --git a/mutable/windows/nvim/lua/plugins/base/vimdoc-ja.lua b/mutable/nvim/lua/plugins/base/vimdoc-ja.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/base/vimdoc-ja.lua rename to mutable/nvim/lua/plugins/base/vimdoc-ja.lua diff --git a/mutable/windows/nvim/lua/plugins/base/winresizer.lua b/mutable/nvim/lua/plugins/base/winresizer.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/base/winresizer.lua rename to mutable/nvim/lua/plugins/base/winresizer.lua diff --git a/mutable/windows/nvim/lua/plugins/base/yazi.lua b/mutable/nvim/lua/plugins/base/yazi.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/base/yazi.lua rename to mutable/nvim/lua/plugins/base/yazi.lua diff --git a/mutable/windows/nvim/lua/plugins/disable.lua b/mutable/nvim/lua/plugins/disable.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/disable.lua rename to mutable/nvim/lua/plugins/disable.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/claude-code.lua b/mutable/nvim/lua/plugins/editor/claude-code.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/claude-code.lua rename to mutable/nvim/lua/plugins/editor/claude-code.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/codic.lua b/mutable/nvim/lua/plugins/editor/codic.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/codic.lua rename to mutable/nvim/lua/plugins/editor/codic.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/color-picker.lua b/mutable/nvim/lua/plugins/editor/color-picker.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/color-picker.lua rename to mutable/nvim/lua/plugins/editor/color-picker.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/compiler.lua b/mutable/nvim/lua/plugins/editor/compiler.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/compiler.lua rename to mutable/nvim/lua/plugins/editor/compiler.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/diffview.lua b/mutable/nvim/lua/plugins/editor/diffview.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/diffview.lua rename to mutable/nvim/lua/plugins/editor/diffview.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/emmet.lua b/mutable/nvim/lua/plugins/editor/emmet.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/emmet.lua rename to mutable/nvim/lua/plugins/editor/emmet.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/git.lua b/mutable/nvim/lua/plugins/editor/git.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/git.lua rename to mutable/nvim/lua/plugins/editor/git.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/html-preview.lua b/mutable/nvim/lua/plugins/editor/html-preview.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/html-preview.lua rename to mutable/nvim/lua/plugins/editor/html-preview.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/markdown-preview.lua b/mutable/nvim/lua/plugins/editor/markdown-preview.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/markdown-preview.lua rename to mutable/nvim/lua/plugins/editor/markdown-preview.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/mini-surround.lua b/mutable/nvim/lua/plugins/editor/mini-surround.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/mini-surround.lua rename to mutable/nvim/lua/plugins/editor/mini-surround.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/minty.lua b/mutable/nvim/lua/plugins/editor/minty.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/minty.lua rename to mutable/nvim/lua/plugins/editor/minty.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/rainbow-delimiters.lua b/mutable/nvim/lua/plugins/editor/rainbow-delimiters.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/rainbow-delimiters.lua rename to mutable/nvim/lua/plugins/editor/rainbow-delimiters.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/supermaven.lua b/mutable/nvim/lua/plugins/editor/supermaven.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/supermaven.lua rename to mutable/nvim/lua/plugins/editor/supermaven.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/test.lua b/mutable/nvim/lua/plugins/editor/test.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/test.lua rename to mutable/nvim/lua/plugins/editor/test.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/treesitter-context.lua b/mutable/nvim/lua/plugins/editor/treesitter-context.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/treesitter-context.lua rename to mutable/nvim/lua/plugins/editor/treesitter-context.lua diff --git a/mutable/windows/nvim/lua/plugins/editor/treesitter.lua b/mutable/nvim/lua/plugins/editor/treesitter.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/editor/treesitter.lua rename to mutable/nvim/lua/plugins/editor/treesitter.lua diff --git a/mutable/windows/nvim/lua/plugins/img-clip.lua b/mutable/nvim/lua/plugins/img-clip.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/img-clip.lua rename to mutable/nvim/lua/plugins/img-clip.lua diff --git a/mutable/windows/nvim/lua/plugins/lsp/init.lua b/mutable/nvim/lua/plugins/lsp/init.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/lsp/init.lua rename to mutable/nvim/lua/plugins/lsp/init.lua diff --git a/mutable/windows/nvim/lua/plugins/lsp/lazydev.lua b/mutable/nvim/lua/plugins/lsp/lazydev.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/lsp/lazydev.lua rename to mutable/nvim/lua/plugins/lsp/lazydev.lua diff --git a/mutable/windows/nvim/lua/plugins/lsp/version-lsp.lua b/mutable/nvim/lua/plugins/lsp/version-lsp.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/lsp/version-lsp.lua rename to mutable/nvim/lua/plugins/lsp/version-lsp.lua diff --git a/mutable/windows/nvim/lua/plugins/ui/bufferline.lua b/mutable/nvim/lua/plugins/ui/bufferline.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/ui/bufferline.lua rename to mutable/nvim/lua/plugins/ui/bufferline.lua diff --git a/mutable/windows/nvim/lua/plugins/ui/dracula.lua b/mutable/nvim/lua/plugins/ui/dracula.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/ui/dracula.lua rename to mutable/nvim/lua/plugins/ui/dracula.lua diff --git a/mutable/windows/nvim/lua/plugins/ui/hlchunk.lua b/mutable/nvim/lua/plugins/ui/hlchunk.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/ui/hlchunk.lua rename to mutable/nvim/lua/plugins/ui/hlchunk.lua diff --git a/mutable/windows/nvim/lua/plugins/ui/init.lua b/mutable/nvim/lua/plugins/ui/init.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/ui/init.lua rename to mutable/nvim/lua/plugins/ui/init.lua diff --git a/mutable/windows/nvim/lua/plugins/ui/lualine.lua b/mutable/nvim/lua/plugins/ui/lualine.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/ui/lualine.lua rename to mutable/nvim/lua/plugins/ui/lualine.lua diff --git a/mutable/windows/nvim/lua/plugins/ui/modicator.lua b/mutable/nvim/lua/plugins/ui/modicator.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/ui/modicator.lua rename to mutable/nvim/lua/plugins/ui/modicator.lua diff --git a/mutable/windows/nvim/lua/plugins/ui/noice.lua b/mutable/nvim/lua/plugins/ui/noice.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/ui/noice.lua rename to mutable/nvim/lua/plugins/ui/noice.lua diff --git a/mutable/windows/nvim/lua/plugins/ui/smear-cursor.lua b/mutable/nvim/lua/plugins/ui/smear-cursor.lua similarity index 100% rename from mutable/windows/nvim/lua/plugins/ui/smear-cursor.lua rename to mutable/nvim/lua/plugins/ui/smear-cursor.lua diff --git a/mutable/windows/nvim/stylua.toml b/mutable/nvim/stylua.toml similarity index 100% rename from mutable/windows/nvim/stylua.toml rename to mutable/nvim/stylua.toml diff --git a/scripts/check_chezmoi.sh b/scripts/check_chezmoi.sh index ac625e0..b9183ae 100644 --- a/scripts/check_chezmoi.sh +++ b/scripts/check_chezmoi.sh @@ -12,7 +12,7 @@ if [[ "$(<"$repo_root/.chezmoiroot")" != "chezmoi" ]]; then exit 1 fi -for mutable_dir in mutable/windows/nvim mutable/windows/cava; do +for mutable_dir in mutable/nvim mutable/cava; do if [[ ! -d "$repo_root/$mutable_dir" ]]; then printf 'mutable source does not exist: %s\n' "$mutable_dir" >&2 exit 1 @@ -70,8 +70,8 @@ for profile in windows nixos wsl; do execute-template \ --file "$repo_root/chezmoi/run_after_create-windows-junctions.ps1.tmpl" > "$rendered_script" if [[ "$profile" == windows ]]; then - if ! grep -q 'mutable\\windows\\nvim' "$rendered_script" \ - || ! grep -q 'mutable\\windows\\cava' "$rendered_script"; then + if ! grep -q 'mutable\\nvim' "$rendered_script" \ + || ! grep -q 'mutable\\cava' "$rendered_script"; then printf '%s\n' 'Windows junction script is incomplete' >&2 exit 1 fi From f78437433c7ba08e1db0a605acc7b9202fefc3d4 Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Fri, 24 Jul 2026 01:01:48 +0900 Subject: [PATCH 16/35] =?UTF-8?q?=F0=9F=90=9B=20yasb:=20Windows=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=81=A8=E5=B0=8E=E5=85=A5=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E5=BE=A9=E5=85=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit YASB設定、wingetパッケージ、setupリンク、runtimeファイルの除外設定を戻す。 --- .gitignore | 4 + .../windows-nixos-dotfiles-design-options.md | 2 +- dot_config/windows/yasb/config.yaml | 486 +++++++++++ dot_config/windows/yasb/greeting.ps1 | 11 + dot_config/windows/yasb/styles.css | 754 ++++++++++++++++++ scripts/bootstrap.ps1 | 1 + scripts/setup_windows.ps1 | 1 + 7 files changed, 1258 insertions(+), 1 deletion(-) create mode 100644 dot_config/windows/yasb/config.yaml create mode 100644 dot_config/windows/yasb/greeting.ps1 create mode 100644 dot_config/windows/yasb/styles.css diff --git a/.gitignore b/.gitignore index 7eed01a..548186c 100644 --- a/.gitignore +++ b/.gitignore @@ -79,5 +79,9 @@ dot_config/nixos/zsh/**/*.zwc # PowerShell (Install-Module で入るモジュール) dot_config/windows/powershell/Modules/ +# YASB +dot_config/windows/yasb/yasb.log +dot_config/windows/yasb/.env + # Cloudflare Wrangler .wrangler/* diff --git a/docs/memo/windows-nixos-dotfiles-design-options.md b/docs/memo/windows-nixos-dotfiles-design-options.md index 18e990e..56cc243 100644 --- a/docs/memo/windows-nixos-dotfiles-design-options.md +++ b/docs/memo/windows-nixos-dotfiles-design-options.md @@ -68,7 +68,7 @@ chezmoi source には `symlink_` エントリ(中身 = link 先 path、`.tmpl` | fcitx5 config | linux | chezmoi | B symlink | | **niri / waybar / swaync** | linux | **Nix** | Nix template(据え置き) | | package / service / systemd / system | linux | **Nix** | 据え置き | -| powershell / cava | windows | chezmoi | A/B | +| powershell / cava / YASB | windows | chezmoi | A/B | niri 系を Nix に残すのは、per-host monitor・palette・keyboard というデータを Nix が握っているため。これらを chezmoi に移すと、そのデータを `.chezmoidata` 等へ再実装する羽目になる(次節)。Linux 専用なので Windows との共有不要= chezmoi に出す動機も薄い。 diff --git a/dot_config/windows/yasb/config.yaml b/dot_config/windows/yasb/config.yaml new file mode 100644 index 0000000..356d082 --- /dev/null +++ b/dot_config/windows/yasb/config.yaml @@ -0,0 +1,486 @@ +watch_stylesheet: true +watch_config: true +debug: false +komorebi: + start_command: "komorebic start" + stop_command: "komorebic stop" + reload_command: "komorebic stop && komorebic start" +bars: + status-bar: + enabled: true + screens: ['*'] + class_name: "yasb-bar" + alignment: + position: "top" + center: false + animation: + enabled: true + duration: 800 + blur_effect: + enabled: false + acrylic: false + dark_mode: false + round_corners: true + border_color: none + window_flags: + always_on_top: false + windows_app_bar: true + dimensions: + width: "100%" + height: 40 + padding: + top: 9 + left: 9 + bottom: 9 + right: 9 + widgets: + left: + [ + "home", + "wallpaper", + "update_check", + "cpu", + "memory", + "traffic", + "battery", + "brightness", + ] + center: + [ + "greeting", + "active_window", + ] + right: + [ + "weather", + "komorebi_workspaces", + "clock", + "cava", + "media", + "volume", + "wifi", + "disk", + "power_menu" + ] +widgets: + komorebi_workspaces: + type: "komorebi.workspaces.WorkspaceWidget" + options: + label_offline: "komorebi offline" + label_workspace_btn: "{index}" + label_workspace_active_btn: "{index}" + label_workspace_populated_btn: "{index}" + label_default_name: "{index}" + label_zero_index: false + hide_empty_workspaces: false + hide_if_offline: true + animation: true + enable_scroll_switching: true + glazewm_workspaces: + type: "glazewm.workspaces.GlazewmWorkspacesWidget" + options: + offline_label: "👋 Hi there!" + hide_empty_workspaces: true + hide_if_offline: true + greeting: + type: "yasb.custom.CustomWidget" + options: + label: "👋 {data}" + label_alt: "👋 {data}" + label_placeholder: "👋 Hi there!" + class_name: "greeting-widget" + exec_options: + run_cmd: "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\\Users\\takow\\.config\\yasb\\greeting.ps1" + run_interval: 60000 + return_format: "string" + hide_empty: false + use_shell: true + wallpaper: + type: "yasb.wallpapers.WallpapersWidget" + options: + label: "\uf03e" + image_path: "C:\\Users\\HP\\Pictures\\Wallpapers" + change_automatically: false # Automatically change wallpaper + update_interval: 60 + gallery: + enabled: true + blur: true + image_width: 250 + image_per_page: 4 + show_buttons: true + orientation: "portrait" + image_spacing: 15 + lazy_load: true + lazy_load_delay: 80 + lazy_load_fadein: 400 + image_corner_radius: 8 + enable_cache: true + cava: + type: "yasb.cava.CavaWidget" + options: + bar_height: 12 + gradient: 1 + reverse: 0 + foreground: "#cba6f7" + gradient_color_1: '#cba6f7' + gradient_color_2: '#B4BEFE' + bars_number: 8 + bar_spacing: 2 + bar_width: 5 + noise_reduction: 1 + sleep_timer: 2 + hide_empty: false + container_padding: + top: 0 + left: 4 + bottom: 0 + right: 4 + home: + type: "yasb.home.HomeWidget" + options: + label: "\udb80\udf5c" + menu_list: + - { title: "Home", path: "~" } + - { title: "Downloads", path: "C:\\Users\\HP\\Downloads"} + - { title: "Documents", path: "C:\\Users\\HP\\Documents"} + - { title: "Pictures", path: "C:\\Users\\HP\\Pictures"} + - { title: "Videos", path: "C:\\Users\\HP\\Videos"} + system_menu: true + power_menu: false + blur: true + round_corners: true + round_corners_type: "normal" + border_color: "" + distance: 10 + container_padding: + top: 0 + left: 0 + bottom: 0 + right: 0 + media: + type: "yasb.media.MediaWidget" + options: + label: "\udb80\udf87 {title}" + label_alt: "\udb80\udf87 {title}" + hide_empty: true + callbacks: + on_left: "toggle_media_menu" + on_middle: "do_nothing" + on_right: "toggle_label" + max_field_size: + label: 50 + label_alt: 50 + show_thumbnail: false + controls_only: false + controls_left: true + thumbnail_alpha: 50 + thumbnail_padding: 0 + thumbnail_corner_radius: 8 + icons: + prev_track: "\ue892" + next_track: "\ue893" + play: "\ue768" + pause: "\ue769" + media_menu: + blur: true + round_corners: true + round_corners_type: "normal" + border_color: "#cba6f7" + alignment: "right" + direction: "down" + offset_top: 6 + offset_left: 0 + thumbnail_corner_radius: 8 + thumbnail_size: 120 + max_title_size: 80 + max_artist_size: 20 + show_source: true + media_menu_icons: + play: "\ue768" + pause: "\ue769" + prev_track: "\ue892" + next_track: "\ue893" + label_shadow: + enabled: true + color: "black" + radius: 3 + offset: [ 1, 1 ] + clock: + type: "yasb.clock.ClockWidget" + options: + label: "\ue769{%H:%M}" + label_alt: "{%Y年%m月%d日 %H:%M:%S}" + timezones: [] #Looking up time zone info from registry + weather: + type: "yasb.weather.WeatherWidget" + options: + label: "{icon} {temp}" + label_alt: "{location}: {conditions} / 最低 {min_temp} / 最高 {max_temp} / 湿度 {humidity}" + api_key: env + update_interval: 600 #Update interval in seconds, Min 600 + hide_decimal: true + location: "Higashiosaka, JP" + units: "metric" + callbacks: + on_left: "toggle_card" + icons: + sunnyDay: "\udb81\udd99" + clearNight: "\ue3c2" + cloudyDay: "\ue21d" + cloudyNight: "\ue226" + rainyDay: "\ue371" + rainyNight: "\ue371" + snowyDay: "\udb81\udf17" + snowyNight: "\udb81\udf17" + blizzardDay: "\udb81\udd99" + default: "\udb81\udd99" + weather_card: + blur: True + round_corners: True + round_corners_type: "normal" + border_color: "#45475a" + alignment: "right" + direction: "down" + distance: 6 + icon_size: 48 + volume: + type: "yasb.volume.VolumeWidget" + options: + label: "{icon} {level}" + label_alt: "{volume}" + volume_icons: + - "\ueee8" + - "\uf026" + - "\uf027" + - "\uf027" + - "\uf028" + audio_menu: + blur: True + round_corners: True + round_corners_type: 'normal' + border_color: '#45475a' + alignment: 'right' + direction: 'down' + distance: 6 + callbacks: + on_left: "toggle_volume_menu" + on_right: "exec cmd.exe /c start ms-settings:sound" + power_menu: + type: "yasb.power_menu.PowerMenuWidget" + options: + label: "\uf011" + uptime: True + blur: False + blur_background: True + animation_duration: 250 + button_row: 3 + buttons: + signout: ["\udb80\udf43","Sign out"] + shutdown: ["\uf011","Shut Down"] + restart: ["\uead2","Restart"] + sleep: ["\udb82\udd04","Sleep"] + lock: ["\uf023","Lock"] + cancel: ["\udb81\udf3a","Cancel"] + active_window: + type: "yasb.active_window.ActiveWindowWidget" + options: + label: "{win[title]}" + label_alt: "" + label_no_window: "" + label_icon: true + label_icon_size: 12 + max_length: 20 + max_length_ellipsis: "..." + monitor_exclusive: true + wallpapers: + type: "yasb.wallpapers.WallpapersWidget" + options: + label: "\uf03e" + image_path: "C:\\Users\\HP\\Pictures\\Wallpapers" # Example path to folder with images + change_automatically: false # Automatically change wallpaper + update_interval: 60 # If change_automatically is true, update interval in seconds + gallery: + enabled: true + blur: false + image_width: 200 + image_per_page: 8 + show_buttons: true + orientation: "portrait" + image_spacing: 8 + lazy_load: true + lazy_load_delay: 80 + lazy_load_fadein: 400 + image_corner_radius: 20 + enable_cache: true + icons: + recording: "\ueba7" + stopped: "\ueba5" + paused: "\ueba7" + hide_when_not_recording: true + blinking_icon: true + disk: + type: "yasb.disk.DiskWidget" + options: + label: "\uf473" + label_alt: "\uf473" + group_label: + volume_labels: ["C", "D", "E", "F"] + show_label_name: true + blur: True + round_corners: True + round_corners_type: "normal" + border_color: "System" + alignment: "right" + direction: "down" + distance: 6 + callbacks: + on_left: "toggle_group" + cpu: + type: "yasb.cpu.CpuWidget" + options: + label: "\uf4bc {info[percent][total]}%" + label_alt: "\uf437 {info[histograms][cpu_percent]}" + update_interval: 2000 + histogram_icons: + - '\u2581' # 0% + - '\u2581' # 10% + - '\u2582' # 20% + - '\u2583' # 30% + - '\u2584' # 40% + - '\u2585' # 50% + - '\u2586' # 60% + - '\u2587' # 70% + - '\u2588' # 80%+ + histogram_num_columns: 8 + callbacks: + on_right: "exec cmd /c Taskmgr" + container_padding: + top: 0 + left: 0 + bottom: 0 + right: 5 + memory: + type: "yasb.memory.MemoryWidget" + options: + label: "\uefc5 {virtual_mem_percent}%" + label_alt: "\uefc5 {virtual_mem_used}/{virtual_mem_total}" + update_interval: 5000 + callbacks: + on_left: "toggle_label" + on_middle: "do_nothing" + on_right: "do_nothing" + container_padding: + top: 0 + left: 8 + bottom: 0 + right: 0 + wifi: + type: "yasb.wifi.WifiWidget" + options: + label: "{wifi_icon}" + label_alt: "{wifi_name} {wifi_strength}%" + update_interval: 5000 + callbacks: + on_left: "exec cmd.exe /c start ms-settings:network" + on_middle: "do_nothing" + on_right: "toggle_label" + container_padding: + top: 0 + left: 0 + bottom: 0 + right: 0 + wifi_icons: [ + "\udb82\udd2e", # Icon for 0% strength + "\udb82\udd1f", # Icon for 1-20% strength + "\udb82\udd22", # Icon for 21-40% strength + "\udb82\udd25", # Icon for 41-80% strength + "\udb82\udd28" # Icon for 81-100% strength + ] + battery: + type: "yasb.battery.BatteryWidget" + options: + label: "{icon} {percent}%" + label_alt: "{icon} {percent}% | {time_remaining}" + update_interval: 5000 + callbacks: + on_left: "toggle_label" + on_middle: "do_nothing" + on_right: "exec cmd.exe /c start ms-settings:batterysaver" + container_padding: + top: 0 + left: 4 + bottom: 0 + right: 4 + brightness: + type: "yasb.brightness.BrightnessWidget" + options: + label: "{icon} {percent}%" + label_alt: "{icon} Brightness {percent}%" + tooltip: true + scroll_step: 1 + hide_unsupported: true + callbacks: + on_left: "toggle_label" + on_middle: "do_nothing" + on_right: "do_nothing" + container_padding: + top: 0 + left: 4 + bottom: 0 + right: 4 + update_check: + type: "yasb.update_check.UpdateCheckWidget" + options: + winget_update: + enabled: true + label: "\uf0ab{count}" + interval: 180 + exclude: + - "Unity.Unity" + windows_update: + enabled: false + label: "\uf0ab{count}" + interval: 240 + exclude: [] + traffic: + type: "yasb.traffic.TrafficWidget" + options: + label: "\udb82\udcfa \uea9a{download_speed} \ueaa1{upload_speed}" + label_alt: "\udb82\udcfa Download {download_speed} | Upload {upload_speed}" + update_interval: 1000 + callbacks: + on_left: 'toggle_label' + on_right: 'exec cmd /c Taskmgr' + notes: + type: "yasb.notes.NotesWidget" + options: + label: "\udb82\udd0c {count}" + label_alt: "{count} notes" + container_padding: + top: 0 + left: 0 + bottom: 0 + right: 0 + menu: + blur: true + round_corners: true + round_corners_type: "normal" + border_color: "System" + alignment: "right" + direction: "down" + offset_top: 6 + offset_left: 0 + max_title_size: 150 + show_date_time: true + icons: + note: "\udb82\udd0c" + delete: "\ue20d" + callbacks: + on_left: "toggle_menu" + on_middle: "do_nothing" + on_right: "toggle_label" + label_shadow: + enabled: true + color: "black" + radius: 3 + offset: [ 1, 4 ] diff --git a/dot_config/windows/yasb/greeting.ps1 b/dot_config/windows/yasb/greeting.ps1 new file mode 100644 index 0000000..4011ad7 --- /dev/null +++ b/dot_config/windows/yasb/greeting.ps1 @@ -0,0 +1,11 @@ +$hour = (Get-Date).Hour + +if ($hour -ge 5 -and $hour -lt 11) { + Write-Output "Good morning" +} elseif ($hour -ge 11 -and $hour -lt 17) { + Write-Output "Good afternoon" +} elseif ($hour -ge 17 -and $hour -lt 23) { + Write-Output "Good evening" +} else { + Write-Output "Good night" +} diff --git a/dot_config/windows/yasb/styles.css b/dot_config/windows/yasb/styles.css new file mode 100644 index 0000000..1e36031 --- /dev/null +++ b/dot_config/windows/yasb/styles.css @@ -0,0 +1,754 @@ + +/* -------------------------------------------------------------------------------------------------- */ +/* Variables */ +/* -------------------------------------------------------------------------------------------------- */ + +:root { + --rosewater: rgb(245, 224, 220); + --flamingo: rgb(242, 205, 205); + --pink: rgb(245, 194, 231); + --mauve: rgb(203, 166, 247); + --red: rgb(243, 139, 168); + --maroon: rgb(235, 160, 172); + --peach: rgb(250, 179, 135); + --yellow: rgb(249, 226, 175); + --green: rgb(166, 227, 161); + --teal: rgb(148, 226, 213); + --sky: rgb(137, 220, 235); + --sapphire: rgb(116, 199, 236); + --blue: rgb(137, 180, 250); + --lavender: rgb(180, 190, 254); + --text: rgb(205, 214, 244); + --subtext1: rgb(186, 194, 222); + --subtext0: rgb(166, 173, 200); + --overlay2: rgb(147, 153, 178); + --overlay1: rgb(127, 132, 156); + --overlay0: rgb(108, 112, 134); + --surface2: rgb(88, 91, 112); + --surface1: rgb(69, 71, 90); + --surface0: rgb(40, 41, 54); + --base: rgb(30, 30, 46); + --mantle: rgb(24, 24, 37); + --crust: rgb(17, 17, 27); +} + +/* -------------------------------------------------------------------------------------------------- */ +/* 1. Layout and Containers */ +/* -------------------------------------------------------------------------------------------------- */ + +* { + font-size: 12px; + color: #cdd6f4; + font-weight: 900; + font-family: "JetBrainsMono NFP"; + margin: 0; + padding: 0; +} +.yasb-bar { + padding: 0 8px; + margin: 0; + background-color: #1e1e2e; + border-radius: 15px; +} + +.widget { + padding: 0 10px; + margin: 0; +} + +.widget .label { + padding: 2px 2px 1px 2px; + +} + +.widget .label.alt { + padding: 1px 8px 1px 8px; +} + +/* -------------------------------------------------------------------------------------------------- */ +/* 2. Widget Containers */ +/* -------------------------------------------------------------------------------------------------- */ + +.glazewm-workspaces .widget-container { + background-color: var(--mantle); + margin: 3px 0px 3px 0px; + border-radius: 8px; +} + +/* -------------------------------------------------------------------------------------------------- */ +/* 3. Widgets */ +/* -------------------------------------------------------------------------------------------------- */ + +/***------------------------------- • Windows Desktops • --------------------------------***/ + +.glazewm-workspaces { + margin: 0; +} +.glazewm-workspaces .offline-status { + color: rgb(205, 214, 244); + font-size: 12px; + padding: 0 4px; + font-weight: 900; +} +.glazewm-greeting-widget { + margin: 0; +} +.glazewm-greeting-widget .widget-container { + background-color: var(--mantle); + margin: 3px 0px 3px 0px; + border-radius: 8px; + padding: 0 12px; +} +.glazewm-greeting-widget .label { + color: var(--text); + padding: 2px 0 1px 0; +} +.glazewm-workspaces .ws-btn { + border: none; + background-color: var(--surface2); + margin: 0px 4px; + padding: 0; + color: rgba(0, 0, 0, 0); + border-radius: 5px; + height: 10px; + width: 10px; +} +.glazewm-workspaces .ws-btn.populated { + background-color:var(--surface2); +} +.glazewm-workspaces .ws-btn.active_populated, +.glazewm-workspaces .ws-btn.active_empty { + color: rgba(0, 68, 255, 0); + background-color:var(--mauve); + width: 28px; + height: 10px; + border-radius: 5px; +} + +/***--------------------------------- • Komorebi Workspaces • ---------------------------***/ + +.komorebi-workspaces { + margin: 0; +} +.komorebi-workspaces .widget-container { + background-color: var(--mantle); + margin: 3px 0px 3px 0px; + border-radius: 8px; + padding: 0 4px; +} +.komorebi-workspaces .offline-status { + color: var(--text); + font-size: 12px; + padding: 0 8px; + font-weight: 600; +} +.komorebi-workspaces .ws-btn { + border: none; + background-color: transparent; + color: var(--overlay0); + margin: 0 2px; + padding: 0 6px; + border-radius: 4px; + font-size: 12px; + min-width: 16px; +} +.komorebi-workspaces .ws-btn.populated { + color: var(--subtext0); +} +.komorebi-workspaces .ws-btn.active { + color: var(--base); + background-color: var(--mauve); + font-weight: 700; +} + +/***--------------------------------- • Audio Widget • ----------------------------------***/ + +.audio-menu { + background-color: var(--mantle); +} +.audio-container .device { + background-color: var(--base); + border: none; + padding: 6px 8px 6px 4px; + margin: 2px 0; + font-size: 12px; + border-radius: 4px; +} +.audio-container .device.selected { + background-color: var(--crust); +} +.audio-container .device:hover { + background-color: var(--base); +} + +.volume-slider::groove { + color: transparent; +} +.volume-slider::handle { + background-color: transparent; +} +.audio-menu { + background-color: rgba(17, 17, 27, 0.4); +} + +/***------------------------------- • Power Menu Widget • --------------------------------***/ + +.power-menu-popup { + background: var(--crust); + border-radius: 8px; +} + +.power-menu-widget .label { + color: #eba0ac; + font-size: 16px; + padding: 0 +} +.power-menu-popup .button { + padding: 0px; + margin: 5px; + width: 250px; + height: 175px; + border-radius: 8px; + background-color: var(--base); + color: white; + +} +.power-menu-popup .button.hover { + background-color: var(--surface1); +} +.power-menu-popup .button .label { + margin-bottom: 0px; + font-size: 16px; + font-weight: 600; + color: var(--text); +} +.power-menu-popup .button .icon { + font-size: 55px; + padding-top: 25px; + padding-right: 10px; + color: var(--text); +} +.power-menu-popup .button.cancel .icon { + color: var(--red); +} +.power-menu-popup .button.cancel .label { + color: var(--red); +} + + +/* --------------------------------------------------------------------------------------------------- */ +/* 6. Icons & Typography */ +/* --------------------------------------------------------------------------------------------------- */ + +.icon { + font-size: 16px; +} +.volume-widget .icon { + color: var(--mauve); + margin: 1px 2px 0 0; +} +.start-menu .icon { + font-size: 18px; + color: #89b4fa +} +.clock-widget .icon { + color: #cba6f7; + font-size: 14px; + margin-right: 7px; +} + +/***--------------------------------- • Weather Icons • ----------------------------------***/ + +.weather-widget .icon { + color: var(--mauve); +} + +/***---------------------------------- • Weather Card • -----------------------------------***/ + +.weather-card { + background-color: var(--mantle); +} +.weather-card-today { + border-radius: 8px; + background-color: var(--base); + color: var(--text); +} +.weather-card-today .label { + font-size: 12px; +} +.weather-card-today .label.location { + font-size: 24px; + font-weight: 800; +} +.weather-card-today .label.alert { + font-size: 12px; + font-weight: 700; + background-color: rgba(247, 199, 42, 0.05); + border: 1px solid rgba(247, 209, 42, 0.1); + color: rgba(196, 181, 162, 0.85); + border-radius: 6px; + padding: 5px 0; +} +.weather-card-day { + border-radius: 8px; + background-color: var(--base); +} +.weather-card-day .label { + font-size: 12px; +} + +/* Media Widget */ + +.media-widget { + padding: 0; + margin-left: 0; +} +.media-widget .label { + color: var(--lavender); + padding-left: 5px; +} + +/* Hide media widget buttons */ + +.media-widget .btn { + max-width: 0; +} + +.calendar { + background-color: var(--mantle); +} +.calendar .calendar-table, +.calendar .calendar-table::item { + background-color: rgba(17, 17, 27, 0); + color: var(--overlay1); + margin: 0; + padding: 0; + border: none; + outline: none; +} + +.calendar .calendar-table::item:selected { + color: var(--base); + background: var(--mauve); + border-radius: 8px; +} +.calendar .day-label { + margin-top: 20px; +} +.calendar .day-label, +.calendar .month-label, +.calendar .date-label { + font-size: 16px; + color: var(--text); + font-weight: 700; + min-width: 180px; + max-width: 180px; +} +.calendar .month-label { + font-weight: normal; + padding-bottom: 12px; +} +.calendar .date-label { + font-size: 88px; + font-weight: 900; + color: var(--text); + margin-top: -20px; +} + +.home-menu { + background-color: var(--mantle); + border-radius: 8px; + padding: 0; + margin-left: 0px; +} +.home-menu .menu-item { + padding: 8px 48px 8px 12px; + font-size: 13px; + font-weight: 600; +} +.home-menu .menu-item:hover { + background-color: var(--mauve); + color: var(--mantle); + margin: 4px 6px; + border-radius: 4px; +} +.home-menu .separator { + max-height: 1px; + background-color: #45475a; + margin: 0 8px; +} + +.wallpapers-gallery-window { + background-color: var(--mantle); + border: 2px; + margin: 0; +} + +.volume-slider { + border: none; +} +.audio-menu { + background-color: rgba(17, 17, 27, 0.4); +} +.audio-container .device { + background-color: transparent; + border: none; + padding: 6px 8px 6px 4px; + margin: 2px 0; + font-size: 12px; + border-radius: 4px; +} +.audio-container .device.selected { + background-color: rgba(255, 255, 255, 0.085); +} +.audio-container .device:hover { + background-color: rgba(255, 255, 255, 0.06); +} + +.wallpapers-gallery-buttons { + background-color: var(--base); + color: var(--text); + border: none; + font-size: 16px; + padding: 8px 0px; + border-radius: 8px; + margin: 8px 8px 8px 8px; + width: 600px; +} + +.wallpapers-widget { + padding: 0 6px 0 6px; +} + +.wallpapers-widget .icon { + color: #cba6f7; +} + + +/***---------------------------------- • Disk • -----------------------------------***/ + +.disk-widget { + padding: 0 6px 0 6px; +} +.disk-group { + background-color:rgba(17, 17, 27, 0.4); +} +.disk-group-row { + min-width: 220px; + max-width: 220px; + max-height: 40px; + margin: 0; + padding: 0; + border-radius: 6px; + border: 1px solid rgba(128, 128, 128, 0); +} +.disk-group-row:hover { + background-color:rgba(255, 255, 255, 0.05); + border: 1px solid rgba(255, 255, 255, 0.1); +} +.disk-group-label-bar{ + max-height:8px; + border:0px solid rgba(128, 128, 128, 0); + background-color: rgba(137, 180, 250, 0.1); + border-radius: 4px; +} +.disk-group-label-bar::chunk{ + background-color: rgb(203, 166, 247); + border-radius: 4px; +} +.disk-group-label { + font-size: 10px; +} +.disk-group-label-size { + font-size: 10px; + color: rgb(203, 166, 247); +} +.disk-widget .icon { + color: var(--mauve); +} + + +.cava-widget { + padding: 0; + margin: 0; +} + +/* CPU MEMORY Setting */ +.cpu-widget { + padding-right: 0; +} +.memory-widget { + padding-left: 0; +} +.cpu-widget .widget-container { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.memory-widget .widget-container { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.memory-widget .label { + min-width: 34px; + max-width: 34px; +} +.cpu-widget .label { + min-width: 34px; + max-width: 34px; +} +.cpu-widget .icon { + color: var(--mauve); + margin-right: 4px; +} +.memory-widget .icon { + color: var(--mauve); + margin-right: 4px; +} + + +/* WIFI Setting */ +.wifi-widget .icon{ + color: var(--mauve) !important; +} + + +.update-check-widget { + padding: 0 0px 0 0px; +} +.update-check-widget .icon { + font-size: 16px; +} +.update-check-widget .widget-container.winget, +.update-check-widget .widget-container.windows { + background: var(--mauve); + margin: 0px 0px 0px 0px; + border-radius: 10px; + border: 0px solid var(--sapphire); +} +.update-check-widget .widget-container.winget .icon, +.update-check-widget .widget-container.windows .icon { + color: var(--base); + margin: 0 2px 0 6px; +} +.update-check-widget .widget-container.winget .label, +.update-check-widget .widget-container.windows .label { + margin: 0 6px 0 1px; + color: var(--base); + font-weight: 900; + font-size: 14px; +} + + + +.traffic-widget .icon { + color: rgb(203, 166, 247); + padding-right: 6px; + padding-left: 6px; +} +.traffic-widget .label { +color: rgb(203, 166, 247); +} + + +.widget { + border-radius: 8px; + margin: 8px 4px; + background-color: var(--surface0); +} + + +.notes-widget { + padding: 4; +} +.notes-widget .label { + font-size: 14px; + color: rgb(203, 166, 247); +} +.notes-widget .icon { + font-size: 16px; + color: rgb(203, 166, 247); +} +/* Notes Widget Menu */ +.notes-menu { + min-width: 400px; + max-width: 400px; + background-color: #1e1e2e; +} +.notes-menu .note-item { + background-color:transparent; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); +} +.notes-menu .note-item:hover { + background-color: rgba(255, 255, 255, 0.1); +} +.notes-menu .note-item .icon { + font-size: 16px; + padding: 0 4px; + color: rgb(203, 166, 247); +} +.notes-menu .delete-button { + color: var(--red); + background: transparent; + border: none; + font-size: 8px; + padding: 7px 8px; + border-radius: 3px; +} +.notes-menu .delete-button:hover { + background-color: rgba(128, 128, 128, 0.5); +} +.notes-menu .note-item .title { + font-size: 13px; + font-family: 'Segoe UI'; +} +.notes-menu .note-item .date { + font-size: 12px; + font-family: 'Segoe UI'; + color: rgba(255, 255, 255, 0.4); +} +.notes-menu .empty-list { + font-family: 'Segoe UI'; + color: rgb(203, 166, 247); + font-size: 24px; + font-weight: 600; + padding: 10px 0 20px 0; +} +.notes-menu .add-button, +.notes-menu .cancel-button { + padding: 8px; + background-color: rgba(255, 255, 255, 0.1); + border: none; + border-radius: 4px; + color: white; + font-family: 'Segoe UI'; +} +.notes-menu .cancel-button { + margin-left: 4px; +} +.notes-menu .add-button:hover, +.notes-menu .cancel-button:hover { + background-color: rgba(255, 255, 255, 0.2); +} +.notes-menu .scroll-area { + background: transparent; + border: none; + border-radius:0; +} +.notes-menu .note-input { + background-color:rgba(17, 17, 27, 0.2); + border: 1px solid rgb(203, 166, 247); + font-family: 'Segoe UI'; + font-size: 14px; + max-height: 30px; + padding: 4px; + border-radius: 6px; +} +.note-input:focus { + border: 1px solid rgb(203, 166, 247); +} + +.media-menu { + min-width: 420px; + max-width: 420px; + background-color: #1e1e2e; + border-radius: 8px; +} +.media-menu .title, +.media-menu .artist, +.media-menu .source { + font-size: 14px; + font-weight: 600; + margin-left: 10px; + font-family: 'Segoe UI'; +} +.media-menu .artist { + font-size: 13px; + color: var(--mauve); + margin-top: 0px; + margin-bottom: 8px; +} +.media-menu .source { + font-size: 11px; + color: #000; + font-weight: normal; + border-radius: 3px; + background-color: #bac2de; + padding: 2px 4px; + +} +/* The source class name is the same as what you see in the media widget; just replace spaces with dashes and convert it to lowercase. +Example: "Windows Media" becomes "windows-media" */ +.media-menu .source.firefox { + background-color: #ff583b; + color: #ffffff; +} +.media-menu .source.spotify { + background-color: #199143; + color: #ffffff; +} +.media-menu .source.edge { + background-color: #0078d4; + color: #ffffff; +} +.media-menu .source.windows-media { + background-color: #0078d4; + color: #ffffff; +} + +.media-menu .btn { + font-family: "Segoe Fluent Icons"; + font-size: 18px; + font-weight: 400; + margin: 10px 2px 0px 2px; + min-width: 40px; + max-width: 40px; + min-height: 40px; + max-height: 40px; + border-radius: 20px; + color: var(--overlay0) ; +} +.media-menu .btn.prev { + margin-left: 10px; +} +.media-menu .btn:hover { + color: var(--overlay2); +} +.media-menu .btn.play { + font-size: 24px +} +.media-menu .btn.disabled:hover, +.media-menu .btn.disabled { + color: var(--surface2); + background-color: rgba(0, 0, 0, 0); +} + +.media-menu .playback-time { + font-size: 13px; + font-family: 'Segoe UI'; + color: var(--mauve); + margin-top: 20px; + min-width: 100px; +} +.media-menu .progress-slider { + height: 10px; + margin: 5px 4px; + border-radius: 3px; +} +.media-menu .progress-slider::groove { + background: transparent; + height: 2px; + border-radius: 3px; + background: rgba(255, 255, 255, 0.1); + +} +.media-menu .progress-slider::groove:hover { + background: transparent; + height: 6px; + border-radius: 3px; + background: rgba(255, 255, 255, 0.2); +} +.media-menu .progress-slider::sub-page { + background: var(--mauve); + border-radius: 3px; + height: 4px; +} diff --git a/scripts/bootstrap.ps1 b/scripts/bootstrap.ps1 index fc03e95..cb50033 100644 --- a/scripts/bootstrap.ps1 +++ b/scripts/bootstrap.ps1 @@ -47,6 +47,7 @@ $wingetPackages = @( @{ Id = 'wez.wezterm.nightly'; Name = 'WezTerm Nightly' } @{ Id = 'Rustlang.Rustup'; Name = 'Rustup' } @{ Id = 'karlstav.cava'; Name = 'cava' } + @{ Id = 'AmN.yasb'; Name = 'YASB' } @{ Id = 'mpv.net'; Name = 'mpv.net' } ) diff --git a/scripts/setup_windows.ps1 b/scripts/setup_windows.ps1 index 41a036b..dfdd659 100644 --- a/scripts/setup_windows.ps1 +++ b/scripts/setup_windows.ps1 @@ -44,6 +44,7 @@ $targets = @( @{ Src = "dot_config/shared/starship.toml"; Dst = ".config/starship.toml" }, @{ Src = "dot_config/shared/fastfetch"; Dst = ".config/fastfetch" }, @{ Src = "dot_config/windows/ccwin-notify"; Dst = ".config/ccwin-notify" }, + @{ Src = "dot_config/windows/yasb"; Dst = ".config/yasb" }, @{ Src = "dot_config/shared/vscode/settings.json"; Dst = (Join-Path $roamingDir "Code\User\settings.json") }, @{ Src = "dot_config/shared/vscode/keybindings.json"; Dst = (Join-Path $roamingDir "Code\User\keybindings.json") }, @{ Src = "dot_config/shared/vscode/snippets"; Dst = (Join-Path $roamingDir "Code\User\snippets") }, From b86086c60769d5bfd7589d27555e503fff12b24e Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Fri, 24 Jul 2026 01:24:37 +0900 Subject: [PATCH 17/35] =?UTF-8?q?=F0=9F=8E=A1=20build:=20build=E3=81=A8pub?= =?UTF-8?q?lish=20cache=E3=81=8C=E5=BD=B9=E5=89=B2=E8=A2=AB=E3=81=A3?= =?UTF-8?q?=E3=81=A6=E3=82=8B=E3=81=8B=E3=82=89=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 40 ------------------------------------- .github/workflows/ci.yml | 4 ---- 2 files changed, 44 deletions(-) delete mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 3a47fad..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Build - -on: - workflow_call: - -permissions: - contents: read - -jobs: - nixos: - name: NixOS - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install Nix - uses: cachix/install-nix-action@v31 - with: - extra_nix_config: | - experimental-features = nix-command flakes - - - name: Build CI configuration - run: nix build .#nixosConfigurations.nixos-ci.config.system.build.toplevel - - wsl: - name: NixOS-WSL - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install Nix - uses: cachix/install-nix-action@v31 - with: - extra_nix_config: | - experimental-features = nix-command flakes - - - name: Check WSL configuration - run: bash scripts/check_wsl.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e8bcab0..b3c353b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,10 +35,6 @@ jobs: name: Chezmoi uses: ./.github/workflows/chezmoi.yml - build: - name: Build - uses: ./.github/workflows/build.yml - publish-cache: name: Publish cache needs: changes From 195ac38e7da843fdbdd3078392e3cf65e91f65ad Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Fri, 24 Jul 2026 01:52:42 +0900 Subject: [PATCH 18/35] =?UTF-8?q?=F0=9F=94=A5=20corne=E3=82=92=E3=82=82?= =?UTF-8?q?=E3=81=86=E4=BE=9D=E5=AD=98=E3=81=97=E3=81=A6=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=81=8B=E3=82=89=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 5 ----- corne | 1 - 2 files changed, 6 deletions(-) delete mode 100644 .gitmodules delete mode 160000 corne diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 4a19b10..0000000 --- a/.gitmodules +++ /dev/null @@ -1,5 +0,0 @@ -[submodule "corne"] - path = corne - url = https://github.com/t4ko0522/corne_v4.git - branch = main - update = merge diff --git a/corne b/corne deleted file mode 160000 index 291af9f..0000000 --- a/corne +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 291af9ff9d43312c6bb0331c5d78e9a2781b0753 From 2470361ea613ccb58ed49e33b9e9f63fa51ba71a Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Fri, 24 Jul 2026 10:33:22 +0900 Subject: [PATCH 19/35] =?UTF-8?q?=F0=9F=94=A5=20=E4=B8=8D=E8=A6=81?= =?UTF-8?q?=E3=81=AAclaude.md=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 93302cd..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1 +0,0 @@ -./AGENTS.md From 89195f5bed6dba45d314964783c670a436cc10ba Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Fri, 24 Jul 2026 10:33:31 +0900 Subject: [PATCH 20/35] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E7=94=BB=E5=83=8F?= =?UTF-8?q?=E3=82=92asset=E3=81=AB=E7=A7=BB=E5=8B=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- image.png => assets/windows.png | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename image.png => assets/windows.png (100%) diff --git a/image.png b/assets/windows.png similarity index 100% rename from image.png rename to assets/windows.png From b06a2c9494d99f8cf80bee657617713ed975f52a Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Sat, 25 Jul 2026 04:09:23 +0900 Subject: [PATCH 21/35] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20nix:=20=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=82=92=E8=B2=AC=E5=8B=99=E5=88=A5=E3=83=AC=E3=82=A4?= =?UTF-8?q?=E3=83=A4=E3=83=BC=E3=81=B8=E5=86=8D=E7=B7=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flake.nix | 80 +--- nix-configs/configuration-ci.nix | 11 - .../modules/core}/locale.nix | 0 .../{modules => feature/modules/core}/nh.nix | 0 .../modules/core}/nix-ld.nix | 2 +- .../{modules => feature/modules/core}/nix.nix | 0 .../modules/core}/unfree.nix | 0 .../modules/core}/users.nix | 0 nix-configs/feature/modules/desktop/audio.nix | 15 + nix-configs/feature/modules/desktop/fonts.nix | 18 + .../feature/modules/desktop/input-method.nix | 41 ++ nix-configs/feature/modules/desktop/niri.nix | 11 + .../feature/modules/desktop/plymouth.nix | 28 ++ .../feature/modules/desktop/portal.nix | 7 + .../modules/desktop}/regreet.nix | 0 .../modules/hardware}/kernel.nix | 0 .../modules/hardware}/lanzaboote.nix | 0 .../modules/hardware}/nvidia-hybrid.nix | 0 .../modules/hardware}/nvidia.nix | 0 .../feature/modules/hardware/openrazer.nix | 11 + .../modules/hardware}/qmk.nix | 0 .../modules/hardware}/xkb.nix | 0 .../modules/services}/bluetooth.nix | 0 .../modules/services}/docker.nix | 4 +- .../modules/services}/networkmanager.nix | 2 +- .../modules/services}/tailscale.nix | 0 nix-configs/feature/profiles/base.nix | 10 + nix-configs/feature/profiles/gaming.nix | 12 + nix-configs/{ => feature}/profiles/vr.nix | 16 +- nix-configs/feature/profiles/workstation.nix | 18 + nix-configs/feature/profiles/wsl.nix | 9 + nix-configs/home-ci.nix | 10 - nix-configs/home-wsl.nix | 22 - nix-configs/home.nix | 23 - nix-configs/home/modules/agents/apm.nix | 43 ++ .../agents/codex-desktop.nix} | 2 +- nix-configs/home/modules/agents/codex.nix | 58 +++ .../home/{ => modules/apps}/firefox.nix | 0 nix-configs/home/{ => modules/apps}/razer.nix | 0 .../home/{ => modules/apps}/spotify.nix | 0 .../home/{ => modules/apps}/vicinae.nix | 2 +- nix-configs/home/{ => modules/apps}/vr.nix | 0 .../home/{ => modules/core}/identity.nix | 0 .../core/programs.nix} | 0 .../desktop/appearance.nix} | 10 +- .../home/{ => modules/desktop}/lockscreen.nix | 14 +- .../{ => modules/desktop}/niri-keybind.nix | 0 .../home/{ => modules/desktop}/niri.nix | 2 +- .../{ => modules/desktop}/quick-shell.nix | 4 +- .../desktop/quick-shell/files/ghostty.conf | 10 + .../desktop/quick-shell/files/starship.toml | 72 ++++ .../home/{ => modules/desktop}/swaync.nix | 4 +- .../modules/desktop/swaync/files/style.css | 133 ++++++ .../home/{ => modules/desktop}/wallpaper.nix | 2 +- .../{ => modules/desktop}/wallpaper/day.nix | 0 .../desktop}/wallpaper/evening.nix | 0 .../desktop}/wallpaper/midnight.nix | 0 .../desktop}/wallpaper/morning.nix | 0 .../{ => modules/desktop}/wallpaper/night.nix | 0 .../home/{ => modules/desktop}/waybar.nix | 4 +- .../modules/desktop/waybar/files/style.css | 318 ++++++++++++++ .../{ => modules/editors}/nixvim/autocmds.nix | 0 .../{ => modules/editors}/nixvim/default.nix | 8 +- .../editors}/nixvim/files/ftdetect/mdc.lua | 0 .../editors}/nixvim/files/ftdetect/zsh.lua | 0 .../nixvim/files/spell/tech.utf-8.add | 0 .../{ => modules/editors}/nixvim/keymaps.nix | 0 .../home/{ => modules/editors}/nixvim/lsp.nix | 0 .../{ => modules/editors}/nixvim/options.nix | 0 .../modules/editors/nixvim/plugins/ai.nix | 12 + .../editors/nixvim/plugins/default.nix | 20 + .../modules/editors/nixvim/plugins/editor.nix | 75 ++++ .../modules/editors/nixvim/plugins/git.nix | 6 + .../editors/nixvim/plugins/languages.nix | 150 +++++++ .../editors/nixvim/plugins/navigation.nix | 29 ++ .../modules/editors/nixvim/plugins/ui.nix | 118 ++++++ .../llm.nix => modules/packages/ai.nix} | 2 +- .../home/{ => modules}/packages/cli.nix | 0 .../home/{ => modules}/packages/core-cli.nix | 0 .../modules/packages/desktop.nix} | 20 +- .../{ => modules}/packages/development.nix | 8 +- .../home/{ => modules}/packages/gaming.nix | 0 .../packages/language-servers.nix} | 0 .../home/{ => modules}/packages/media.nix | 7 +- nix-configs/home/modules/packages/wayland.nix | 20 + nix-configs/home/{ => modules/shell}/zsh.nix | 46 +- .../home/modules/shell/zsh/files/rc/alias.zsh | 59 +++ .../modules/shell/zsh/files/rc/bindkey.zsh | 26 ++ .../shell/zsh/files/rc/functions/fancy-ctrl-z | 9 + .../shell/zsh/files/rc/functions/ghq-fzf | 14 + .../modules/shell/zsh/files/rc/functions/nix | 34 ++ .../shell/zsh/files/rc/functions/nix-shell | 27 ++ .../modules/shell/zsh/files/rc/functions/yy | 9 + .../modules/shell/zsh/files/rc/option.zsh | 26 ++ .../modules/shell/zsh/files/starship-nix.toml | 120 ++++++ nix-configs/home/modules/xdg/files.nix | 7 + nix-configs/home/modules/xdg/mime-apps.nix | 42 ++ nix-configs/home/nixvim/plugins.nix | 393 ------------------ nix-configs/home/packages.nix | 12 - nix-configs/home/packages/core.nix | 9 - nix-configs/home/packages/wayland.nix | 62 --- nix-configs/home/profiles/ci.nix | 13 + nix-configs/home/profiles/workstation.nix | 33 ++ nix-configs/home/profiles/wsl.nix | 9 + nix-configs/home/programs.nix | 3 - nix-configs/home/xdg.nix | 206 --------- nix-configs/hosts/ci/default.nix | 19 + nix-configs/hosts/desktop/default.nix | 40 +- nix-configs/hosts/desktop/home.nix | 29 ++ nix-configs/hosts/laptop/default.nix | 30 +- nix-configs/hosts/laptop/home.nix | 21 + nix-configs/hosts/wsl/default.nix | 7 +- nix-configs/hosts/wsl/home.nix | 3 + nix-configs/lib/mk-nixos.nix | 70 ++++ .../lib/{catppuccin-mocha.nix => theme.nix} | 1 + nix-configs/modules/default.nix | 17 - nix-configs/modules/plymouth.nix | 53 --- .../chiffon-cursor/files}/Chiffon_Cursor.zip | Bin .../chiffon-cursor/package.nix} | 2 +- nix-configs/pkgs/default.nix | 34 ++ nix-configs/pkgs/plymouth-theme/package.nix | 31 ++ .../pkgs/swaylock-long-idle/package.nix | 10 + .../pkgs/swaynotificationcenter/package.nix | 10 + .../swaync-control-center-slide.patch | 0 .../pkgs/vim-plugins/vimdoc-ja/package.nix | 14 + .../pkgs/vim-plugins/winresizer/package.nix | 14 + nix-configs/pkgs/waycal/package.nix | 40 ++ nix-configs/profiles/desktop.nix | 103 ----- nix-configs/profiles/gaming.nix | 18 - 129 files changed, 2085 insertions(+), 1143 deletions(-) delete mode 100644 nix-configs/configuration-ci.nix rename nix-configs/{modules => feature/modules/core}/locale.nix (100%) rename nix-configs/{modules => feature/modules/core}/nh.nix (100%) rename nix-configs/{modules => feature/modules/core}/nix-ld.nix (79%) rename nix-configs/{modules => feature/modules/core}/nix.nix (100%) rename nix-configs/{modules => feature/modules/core}/unfree.nix (100%) rename nix-configs/{modules => feature/modules/core}/users.nix (100%) create mode 100644 nix-configs/feature/modules/desktop/audio.nix create mode 100644 nix-configs/feature/modules/desktop/fonts.nix create mode 100644 nix-configs/feature/modules/desktop/input-method.nix create mode 100644 nix-configs/feature/modules/desktop/niri.nix create mode 100644 nix-configs/feature/modules/desktop/plymouth.nix create mode 100644 nix-configs/feature/modules/desktop/portal.nix rename nix-configs/{profiles => feature/modules/desktop}/regreet.nix (100%) rename nix-configs/{modules => feature/modules/hardware}/kernel.nix (100%) rename nix-configs/{modules => feature/modules/hardware}/lanzaboote.nix (100%) rename nix-configs/{profiles => feature/modules/hardware}/nvidia-hybrid.nix (100%) rename nix-configs/{profiles => feature/modules/hardware}/nvidia.nix (100%) create mode 100644 nix-configs/feature/modules/hardware/openrazer.nix rename nix-configs/{modules => feature/modules/hardware}/qmk.nix (100%) rename nix-configs/{modules => feature/modules/hardware}/xkb.nix (100%) rename nix-configs/{modules => feature/modules/services}/bluetooth.nix (100%) rename nix-configs/{modules => feature/modules/services}/docker.nix (54%) rename nix-configs/{modules => feature/modules/services}/networkmanager.nix (83%) rename nix-configs/{modules => feature/modules/services}/tailscale.nix (100%) create mode 100644 nix-configs/feature/profiles/base.nix create mode 100644 nix-configs/feature/profiles/gaming.nix rename nix-configs/{ => feature}/profiles/vr.nix (83%) create mode 100644 nix-configs/feature/profiles/workstation.nix create mode 100644 nix-configs/feature/profiles/wsl.nix delete mode 100644 nix-configs/home-ci.nix delete mode 100644 nix-configs/home-wsl.nix delete mode 100644 nix-configs/home.nix create mode 100644 nix-configs/home/modules/agents/apm.nix rename nix-configs/home/{codex-desktop-linux.nix => modules/agents/codex-desktop.nix} (86%) create mode 100644 nix-configs/home/modules/agents/codex.nix rename nix-configs/home/{ => modules/apps}/firefox.nix (100%) rename nix-configs/home/{ => modules/apps}/razer.nix (100%) rename nix-configs/home/{ => modules/apps}/spotify.nix (100%) rename nix-configs/home/{ => modules/apps}/vicinae.nix (95%) rename nix-configs/home/{ => modules/apps}/vr.nix (100%) rename nix-configs/home/{ => modules/core}/identity.nix (100%) rename nix-configs/home/{programs-cli.nix => modules/core/programs.nix} (100%) rename nix-configs/home/{profiles/cursor.nix => modules/desktop/appearance.nix} (84%) rename nix-configs/home/{ => modules/desktop}/lockscreen.nix (90%) rename nix-configs/home/{ => modules/desktop}/niri-keybind.nix (100%) rename nix-configs/home/{ => modules/desktop}/niri.nix (99%) rename nix-configs/home/{ => modules/desktop}/quick-shell.nix (97%) create mode 100644 nix-configs/home/modules/desktop/quick-shell/files/ghostty.conf create mode 100644 nix-configs/home/modules/desktop/quick-shell/files/starship.toml rename nix-configs/home/{ => modules/desktop}/swaync.nix (92%) create mode 100644 nix-configs/home/modules/desktop/swaync/files/style.css rename nix-configs/home/{ => modules/desktop}/wallpaper.nix (99%) rename nix-configs/home/{ => modules/desktop}/wallpaper/day.nix (100%) rename nix-configs/home/{ => modules/desktop}/wallpaper/evening.nix (100%) rename nix-configs/home/{ => modules/desktop}/wallpaper/midnight.nix (100%) rename nix-configs/home/{ => modules/desktop}/wallpaper/morning.nix (100%) rename nix-configs/home/{ => modules/desktop}/wallpaper/night.nix (100%) rename nix-configs/home/{ => modules/desktop}/waybar.nix (99%) create mode 100644 nix-configs/home/modules/desktop/waybar/files/style.css rename nix-configs/home/{ => modules/editors}/nixvim/autocmds.nix (100%) rename nix-configs/home/{ => modules/editors}/nixvim/default.nix (88%) rename nix-configs/home/{ => modules/editors}/nixvim/files/ftdetect/mdc.lua (100%) rename nix-configs/home/{ => modules/editors}/nixvim/files/ftdetect/zsh.lua (100%) rename nix-configs/home/{ => modules/editors}/nixvim/files/spell/tech.utf-8.add (100%) rename nix-configs/home/{ => modules/editors}/nixvim/keymaps.nix (100%) rename nix-configs/home/{ => modules/editors}/nixvim/lsp.nix (100%) rename nix-configs/home/{ => modules/editors}/nixvim/options.nix (100%) create mode 100644 nix-configs/home/modules/editors/nixvim/plugins/ai.nix create mode 100644 nix-configs/home/modules/editors/nixvim/plugins/default.nix create mode 100644 nix-configs/home/modules/editors/nixvim/plugins/editor.nix create mode 100644 nix-configs/home/modules/editors/nixvim/plugins/git.nix create mode 100644 nix-configs/home/modules/editors/nixvim/plugins/languages.nix create mode 100644 nix-configs/home/modules/editors/nixvim/plugins/navigation.nix create mode 100644 nix-configs/home/modules/editors/nixvim/plugins/ui.nix rename nix-configs/home/{packages/llm.nix => modules/packages/ai.nix} (52%) rename nix-configs/home/{ => modules}/packages/cli.nix (100%) rename nix-configs/home/{ => modules}/packages/core-cli.nix (100%) rename nix-configs/{profiles/desktop-apps.nix => home/modules/packages/desktop.nix} (69%) rename nix-configs/home/{ => modules}/packages/development.nix (75%) rename nix-configs/home/{ => modules}/packages/gaming.nix (100%) rename nix-configs/home/{packages/lsp.nix => modules/packages/language-servers.nix} (100%) rename nix-configs/home/{ => modules}/packages/media.nix (77%) create mode 100644 nix-configs/home/modules/packages/wayland.nix rename nix-configs/home/{ => modules/shell}/zsh.nix (72%) create mode 100644 nix-configs/home/modules/shell/zsh/files/rc/alias.zsh create mode 100644 nix-configs/home/modules/shell/zsh/files/rc/bindkey.zsh create mode 100644 nix-configs/home/modules/shell/zsh/files/rc/functions/fancy-ctrl-z create mode 100644 nix-configs/home/modules/shell/zsh/files/rc/functions/ghq-fzf create mode 100644 nix-configs/home/modules/shell/zsh/files/rc/functions/nix create mode 100644 nix-configs/home/modules/shell/zsh/files/rc/functions/nix-shell create mode 100644 nix-configs/home/modules/shell/zsh/files/rc/functions/yy create mode 100644 nix-configs/home/modules/shell/zsh/files/rc/option.zsh create mode 100644 nix-configs/home/modules/shell/zsh/files/starship-nix.toml create mode 100644 nix-configs/home/modules/xdg/files.nix create mode 100644 nix-configs/home/modules/xdg/mime-apps.nix delete mode 100644 nix-configs/home/nixvim/plugins.nix delete mode 100644 nix-configs/home/packages.nix delete mode 100644 nix-configs/home/packages/core.nix delete mode 100644 nix-configs/home/packages/wayland.nix create mode 100644 nix-configs/home/profiles/ci.nix create mode 100644 nix-configs/home/profiles/workstation.nix create mode 100644 nix-configs/home/profiles/wsl.nix delete mode 100644 nix-configs/home/programs.nix delete mode 100644 nix-configs/home/xdg.nix create mode 100644 nix-configs/hosts/ci/default.nix create mode 100644 nix-configs/hosts/desktop/home.nix create mode 100644 nix-configs/hosts/laptop/home.nix create mode 100644 nix-configs/hosts/wsl/home.nix create mode 100644 nix-configs/lib/mk-nixos.nix rename nix-configs/lib/{catppuccin-mocha.nix => theme.nix} (96%) delete mode 100644 nix-configs/modules/default.nix delete mode 100644 nix-configs/modules/plymouth.nix rename nix-configs/{cursors => pkgs/chiffon-cursor/files}/Chiffon_Cursor.zip (100%) rename nix-configs/{cursors/chiffon.nix => pkgs/chiffon-cursor/package.nix} (98%) create mode 100644 nix-configs/pkgs/default.nix create mode 100644 nix-configs/pkgs/plymouth-theme/package.nix create mode 100644 nix-configs/pkgs/swaylock-long-idle/package.nix create mode 100644 nix-configs/pkgs/swaynotificationcenter/package.nix rename nix-configs/{home/packages/patches => pkgs/swaynotificationcenter}/swaync-control-center-slide.patch (100%) create mode 100644 nix-configs/pkgs/vim-plugins/vimdoc-ja/package.nix create mode 100644 nix-configs/pkgs/vim-plugins/winresizer/package.nix create mode 100644 nix-configs/pkgs/waycal/package.nix delete mode 100644 nix-configs/profiles/desktop.nix delete mode 100644 nix-configs/profiles/gaming.nix diff --git a/flake.nix b/flake.nix index 18b5801..3f28d69 100644 --- a/flake.nix +++ b/flake.nix @@ -77,76 +77,40 @@ fcitxLayout = "jp"; }; - mkNixos = { - configuration, - homeConfiguration, - editor ? "nvim", - extraModules ? [], - homeDirectory ? "/home/${username}", - platformModules ? [ - vicinae.nixosModules.default - nixos-loading-plymouth.nixosModules.default - ], - sharedHomeModules ? [ - vicinae.homeManagerModules.default - codex-desktop-linux.homeManagerModules.default - ], - systemOverlays ? [spotify-cli.overlays.default], - userExtraGroups ? [ - "audio" - "input" - "networkmanager" - "plugdev" - "wheel" - ], - username ? "t4ko", - }: - nixpkgs.lib.nixosSystem { - inherit system; - specialArgs = { - inherit dotfilesDir homeDirectory keyboardLayout userExtraGroups username; - nixosLoadingPlymouth = nixos-loading-plymouth; - }; - modules = - [ - home-manager.nixosModules.home-manager - configuration - ] - ++ platformModules - ++ extraModules - ++ [ - { - nixpkgs.overlays = systemOverlays; - home-manager = { - useGlobalPkgs = true; - useUserPackages = true; - backupFileExtension = "hm-backup"; - extraSpecialArgs = { - inherit dotfilesDir editor homeDirectory keyboardLayout llm-agents username; - }; - sharedModules = [nixvim.homeModules.nixvim] ++ sharedHomeModules; - users.${username} = import homeConfiguration; - }; - } - ]; - }; + mkNixos = import ./nix-configs/lib/mk-nixos.nix { + inherit + codex-desktop-linux + home-manager + llm-agents + nixos-loading-plymouth + nixpkgs + nixvim + spotify-cli + system + vicinae + ; + }; laptop = mkNixos { configuration = ./nix-configs/hosts/laptop; - homeConfiguration = ./nix-configs/home.nix; + homeConfiguration = ./nix-configs/hosts/laptop/home.nix; + inherit dotfilesDir keyboardLayout; }; desktop = mkNixos { configuration = ./nix-configs/hosts/desktop; - homeConfiguration = ./nix-configs/home.nix; + homeConfiguration = ./nix-configs/hosts/desktop/home.nix; + inherit dotfilesDir keyboardLayout; extraModules = [lanzaboote.nixosModules.lanzaboote]; }; nixosCi = mkNixos { - configuration = ./nix-configs/configuration-ci.nix; - homeConfiguration = ./nix-configs/home-ci.nix; + configuration = ./nix-configs/hosts/ci; + homeConfiguration = ./nix-configs/home/profiles/ci.nix; + inherit dotfilesDir keyboardLayout; }; wsl = mkNixos { configuration = ./nix-configs/hosts/wsl; - homeConfiguration = ./nix-configs/home-wsl.nix; + homeConfiguration = ./nix-configs/hosts/wsl/home.nix; + inherit dotfilesDir keyboardLayout; platformModules = [nixos-wsl.nixosModules.default]; sharedHomeModules = []; userExtraGroups = ["wheel"]; diff --git a/nix-configs/configuration-ci.nix b/nix-configs/configuration-ci.nix deleted file mode 100644 index 757aea0..0000000 --- a/nix-configs/configuration-ci.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ - imports = [ - ./hosts/desktop/hardware-configuration.nix - ./modules - ]; - - networking.hostName = "nixos"; - - boot.loader.systemd-boot.enable = true; - boot.loader.efi.canTouchEfiVariables = true; -} diff --git a/nix-configs/modules/locale.nix b/nix-configs/feature/modules/core/locale.nix similarity index 100% rename from nix-configs/modules/locale.nix rename to nix-configs/feature/modules/core/locale.nix diff --git a/nix-configs/modules/nh.nix b/nix-configs/feature/modules/core/nh.nix similarity index 100% rename from nix-configs/modules/nh.nix rename to nix-configs/feature/modules/core/nh.nix diff --git a/nix-configs/modules/nix-ld.nix b/nix-configs/feature/modules/core/nix-ld.nix similarity index 79% rename from nix-configs/modules/nix-ld.nix rename to nix-configs/feature/modules/core/nix-ld.nix index 7720e1b..1a9c769 100644 --- a/nix-configs/modules/nix-ld.nix +++ b/nix-configs/feature/modules/core/nix-ld.nix @@ -1,3 +1,3 @@ -{...}: { +_: { programs.nix-ld.enable = true; } diff --git a/nix-configs/modules/nix.nix b/nix-configs/feature/modules/core/nix.nix similarity index 100% rename from nix-configs/modules/nix.nix rename to nix-configs/feature/modules/core/nix.nix diff --git a/nix-configs/modules/unfree.nix b/nix-configs/feature/modules/core/unfree.nix similarity index 100% rename from nix-configs/modules/unfree.nix rename to nix-configs/feature/modules/core/unfree.nix diff --git a/nix-configs/modules/users.nix b/nix-configs/feature/modules/core/users.nix similarity index 100% rename from nix-configs/modules/users.nix rename to nix-configs/feature/modules/core/users.nix diff --git a/nix-configs/feature/modules/desktop/audio.nix b/nix-configs/feature/modules/desktop/audio.nix new file mode 100644 index 0000000..f17e375 --- /dev/null +++ b/nix-configs/feature/modules/desktop/audio.nix @@ -0,0 +1,15 @@ +{ + services = { + xserver.enable = false; + printing.enable = true; + pulseaudio.enable = false; + pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + }; + }; + + security.rtkit.enable = true; +} diff --git a/nix-configs/feature/modules/desktop/fonts.nix b/nix-configs/feature/modules/desktop/fonts.nix new file mode 100644 index 0000000..ac5fcdd --- /dev/null +++ b/nix-configs/feature/modules/desktop/fonts.nix @@ -0,0 +1,18 @@ +{pkgs, ...}: { + fonts.packages = with pkgs; [ + noto-fonts + noto-fonts-cjk-sans + noto-fonts-cjk-serif + noto-fonts-color-emoji + nerd-fonts.jetbrains-mono + nerd-fonts.symbols-only + plemoljp-nf + ]; + + fonts.fontconfig.defaultFonts = { + monospace = ["PlemolJP Console NF" "Noto Sans Mono CJK JP"]; + sansSerif = ["Noto Sans CJK JP" "Noto Sans"]; + serif = ["Noto Serif CJK JP" "Noto Serif"]; + emoji = ["Noto Color Emoji"]; + }; +} diff --git a/nix-configs/feature/modules/desktop/input-method.nix b/nix-configs/feature/modules/desktop/input-method.nix new file mode 100644 index 0000000..1f2b48d --- /dev/null +++ b/nix-configs/feature/modules/desktop/input-method.nix @@ -0,0 +1,41 @@ +{ + keyboardLayout, + pkgs, + ... +}: { + i18n.inputMethod = { + enable = true; + type = "fcitx5"; + fcitx5 = { + waylandFrontend = true; + addons = with pkgs; [ + fcitx5-mozc + fcitx5-gtk + fcitx5-material-color + qt6Packages.fcitx5-qt + ]; + settings.inputMethod = { + "Groups/0" = { + Name = "Default"; + "Default Layout" = keyboardLayout.fcitxLayout; + DefaultIM = "mozc"; + }; + "Groups/0/Items/0" = { + Name = "keyboard-jp"; + Layout = keyboardLayout.fcitxLayout; + }; + "Groups/0/Items/1" = { + Name = "mozc"; + Layout = keyboardLayout.fcitxLayout; + }; + GroupOrder."0" = "Default"; + }; + }; + }; + + environment.sessionVariables = { + GTK_IM_MODULE = "fcitx"; + QT_IM_MODULE = "fcitx"; + XMODIFIERS = "@im=fcitx"; + }; +} diff --git a/nix-configs/feature/modules/desktop/niri.nix b/nix-configs/feature/modules/desktop/niri.nix new file mode 100644 index 0000000..cbd195b --- /dev/null +++ b/nix-configs/feature/modules/desktop/niri.nix @@ -0,0 +1,11 @@ +{ + programs.niri.enable = true; + programs.dconf.enable = true; + security.polkit.enable = true; + hardware.graphics.enable = true; + + environment.sessionVariables = { + NIXOS_OZONE_WL = "1"; + MOZ_ENABLE_WAYLAND = "1"; + }; +} diff --git a/nix-configs/feature/modules/desktop/plymouth.nix b/nix-configs/feature/modules/desktop/plymouth.nix new file mode 100644 index 0000000..e9f3b56 --- /dev/null +++ b/nix-configs/feature/modules/desktop/plymouth.nix @@ -0,0 +1,28 @@ +{ + lib, + localPackages, + ... +}: let + themeName = "nixos-loading-default-logs"; +in { + boot = { + plymouth.nixos-loading = { + enable = true; + variant = "default"; + }; + plymouth = { + theme = lib.mkForce themeName; + themePackages = lib.mkForce [localPackages.plymouthTheme]; + }; + + consoleLogLevel = 7; + initrd.verbose = true; + + kernelParams = [ + "rd.udev.log_level=info" + "rd.systemd.show_status=true" + "udev.log_level=info" + "systemd.show_status=true" + ]; + }; +} diff --git a/nix-configs/feature/modules/desktop/portal.nix b/nix-configs/feature/modules/desktop/portal.nix new file mode 100644 index 0000000..41de31e --- /dev/null +++ b/nix-configs/feature/modules/desktop/portal.nix @@ -0,0 +1,7 @@ +{pkgs, ...}: { + xdg.portal = { + enable = true; + extraPortals = [pkgs.xdg-desktop-portal-gtk]; + configPackages = [pkgs.niri]; + }; +} diff --git a/nix-configs/profiles/regreet.nix b/nix-configs/feature/modules/desktop/regreet.nix similarity index 100% rename from nix-configs/profiles/regreet.nix rename to nix-configs/feature/modules/desktop/regreet.nix diff --git a/nix-configs/modules/kernel.nix b/nix-configs/feature/modules/hardware/kernel.nix similarity index 100% rename from nix-configs/modules/kernel.nix rename to nix-configs/feature/modules/hardware/kernel.nix diff --git a/nix-configs/modules/lanzaboote.nix b/nix-configs/feature/modules/hardware/lanzaboote.nix similarity index 100% rename from nix-configs/modules/lanzaboote.nix rename to nix-configs/feature/modules/hardware/lanzaboote.nix diff --git a/nix-configs/profiles/nvidia-hybrid.nix b/nix-configs/feature/modules/hardware/nvidia-hybrid.nix similarity index 100% rename from nix-configs/profiles/nvidia-hybrid.nix rename to nix-configs/feature/modules/hardware/nvidia-hybrid.nix diff --git a/nix-configs/profiles/nvidia.nix b/nix-configs/feature/modules/hardware/nvidia.nix similarity index 100% rename from nix-configs/profiles/nvidia.nix rename to nix-configs/feature/modules/hardware/nvidia.nix diff --git a/nix-configs/feature/modules/hardware/openrazer.nix b/nix-configs/feature/modules/hardware/openrazer.nix new file mode 100644 index 0000000..c876e58 --- /dev/null +++ b/nix-configs/feature/modules/hardware/openrazer.nix @@ -0,0 +1,11 @@ +{ + pkgs, + username, + ... +}: { + hardware.openrazer = { + enable = true; + users = [username]; + }; + environment.systemPackages = [pkgs.openrazer-daemon]; +} diff --git a/nix-configs/modules/qmk.nix b/nix-configs/feature/modules/hardware/qmk.nix similarity index 100% rename from nix-configs/modules/qmk.nix rename to nix-configs/feature/modules/hardware/qmk.nix diff --git a/nix-configs/modules/xkb.nix b/nix-configs/feature/modules/hardware/xkb.nix similarity index 100% rename from nix-configs/modules/xkb.nix rename to nix-configs/feature/modules/hardware/xkb.nix diff --git a/nix-configs/modules/bluetooth.nix b/nix-configs/feature/modules/services/bluetooth.nix similarity index 100% rename from nix-configs/modules/bluetooth.nix rename to nix-configs/feature/modules/services/bluetooth.nix diff --git a/nix-configs/modules/docker.nix b/nix-configs/feature/modules/services/docker.nix similarity index 54% rename from nix-configs/modules/docker.nix rename to nix-configs/feature/modules/services/docker.nix index 33ae340..48c8701 100644 --- a/nix-configs/modules/docker.nix +++ b/nix-configs/feature/modules/services/docker.nix @@ -1,8 +1,8 @@ -{ +{username, ...}: { virtualisation.docker = { enable = true; autoPrune.enable = true; }; - users.users."t4ko".extraGroups = ["docker"]; + users.users.${username}.extraGroups = ["docker"]; } diff --git a/nix-configs/modules/networkmanager.nix b/nix-configs/feature/modules/services/networkmanager.nix similarity index 83% rename from nix-configs/modules/networkmanager.nix rename to nix-configs/feature/modules/services/networkmanager.nix index e1e9450..0533ec2 100644 --- a/nix-configs/modules/networkmanager.nix +++ b/nix-configs/feature/modules/services/networkmanager.nix @@ -1,3 +1,3 @@ -{...}: { +_: { networking.networkmanager.enable = true; } diff --git a/nix-configs/modules/tailscale.nix b/nix-configs/feature/modules/services/tailscale.nix similarity index 100% rename from nix-configs/modules/tailscale.nix rename to nix-configs/feature/modules/services/tailscale.nix diff --git a/nix-configs/feature/profiles/base.nix b/nix-configs/feature/profiles/base.nix new file mode 100644 index 0000000..50a687c --- /dev/null +++ b/nix-configs/feature/profiles/base.nix @@ -0,0 +1,10 @@ +{ + imports = [ + ../modules/core/locale.nix + ../modules/core/nh.nix + ../modules/core/nix.nix + ../modules/core/nix-ld.nix + ../modules/core/unfree.nix + ../modules/core/users.nix + ]; +} diff --git a/nix-configs/feature/profiles/gaming.nix b/nix-configs/feature/profiles/gaming.nix new file mode 100644 index 0000000..eb426f8 --- /dev/null +++ b/nix-configs/feature/profiles/gaming.nix @@ -0,0 +1,12 @@ +{pkgs, ...}: { + imports = [../modules/hardware/openrazer.nix]; + + programs.steam = { + enable = true; + extraCompatPackages = with pkgs; [proton-ge-bin]; + }; + + programs.gamemode.enable = true; + + hardware.graphics.enable32Bit = true; +} diff --git a/nix-configs/profiles/vr.nix b/nix-configs/feature/profiles/vr.nix similarity index 83% rename from nix-configs/profiles/vr.nix rename to nix-configs/feature/profiles/vr.nix index c6efe60..b683e11 100644 --- a/nix-configs/profiles/vr.nix +++ b/nix-configs/feature/profiles/vr.nix @@ -1,5 +1,6 @@ { config, + localPackages, pkgs, ... }: { @@ -19,20 +20,7 @@ # ドライバ lib を追加する (AT_SECURE でも絶対パスの RUNPATH は有効)。 services.wivrn = { enable = true; - package = - (pkgs.callPackage ../pkgs/wivrn/package.nix {cudaSupport = true;}).overrideAttrs - (old: { - postFixup = - (old.postFixup or "") - + '' - driverLib=${pkgs.addDriverRunpath.driverLink}/lib - for f in "$out"/bin/.wivrn-server-wrapped "$out"/lib/wivrn/*.so*; do - if [ -f "$f" ] && patchelf --print-rpath "$f" >/dev/null 2>&1; then - patchelf --add-rpath "$driverLib" "$f" - fi - done - ''; - }); + package = localPackages.wivrnNvenc; autoStart = true; openFirewall = true; # 無線ストリーミング用ポートを開放 highPriority = true; # 非同期リプロジェクション用の優先度を付与 diff --git a/nix-configs/feature/profiles/workstation.nix b/nix-configs/feature/profiles/workstation.nix new file mode 100644 index 0000000..add9650 --- /dev/null +++ b/nix-configs/feature/profiles/workstation.nix @@ -0,0 +1,18 @@ +{ + imports = [ + ./base.nix + ../modules/hardware/kernel.nix + ../modules/hardware/qmk.nix + ../modules/hardware/xkb.nix + ../modules/services/bluetooth.nix + ../modules/services/docker.nix + ../modules/services/networkmanager.nix + ../modules/services/tailscale.nix + ../modules/desktop/audio.nix + ../modules/desktop/fonts.nix + ../modules/desktop/input-method.nix + ../modules/desktop/niri.nix + ../modules/desktop/portal.nix + ../modules/desktop/regreet.nix + ]; +} diff --git a/nix-configs/feature/profiles/wsl.nix b/nix-configs/feature/profiles/wsl.nix new file mode 100644 index 0000000..5d6de34 --- /dev/null +++ b/nix-configs/feature/profiles/wsl.nix @@ -0,0 +1,9 @@ +{ + imports = [ + ../modules/core/nh.nix + ../modules/core/nix.nix + ../modules/core/nix-ld.nix + ../modules/core/unfree.nix + ../modules/core/users.nix + ]; +} diff --git a/nix-configs/home-ci.nix b/nix-configs/home-ci.nix deleted file mode 100644 index 8e88f47..0000000 --- a/nix-configs/home-ci.nix +++ /dev/null @@ -1,10 +0,0 @@ -{...}: { - imports = [ - ./home/identity.nix - ./home/packages/core.nix - ./home/packages/cli.nix - ./home/xdg.nix - ./home/zsh.nix - ./home/programs.nix - ]; -} diff --git a/nix-configs/home-wsl.nix b/nix-configs/home-wsl.nix deleted file mode 100644 index aa91eb1..0000000 --- a/nix-configs/home-wsl.nix +++ /dev/null @@ -1,22 +0,0 @@ -{config, ...}: { - imports = [ - ./home/identity.nix - ./home/packages/core-cli.nix - ./home/packages/cli.nix - ./home/programs-cli.nix - ]; - - programs.zsh = { - enable = true; - defaultKeymap = "emacs"; - history = { - path = "${config.xdg.stateHome}/zsh/history"; - size = 100000; - save = 100000; - ignoreAllDups = true; - ignoreDups = true; - ignoreSpace = true; - share = true; - }; - }; -} diff --git a/nix-configs/home.nix b/nix-configs/home.nix deleted file mode 100644 index 1529e09..0000000 --- a/nix-configs/home.nix +++ /dev/null @@ -1,23 +0,0 @@ -{...}: { - imports = [ - ./home/identity.nix - ./home/profiles/cursor.nix - ./home/packages.nix - ./home/xdg.nix - ./home/quick-shell.nix - ./home/niri.nix - ./home/lockscreen.nix - ./home/wallpaper.nix - ./home/swaync.nix - ./home/waybar.nix - ./home/razer.nix - ./home/vr.nix - ./home/zsh.nix - ./home/programs.nix - ./home/nixvim - ./home/firefox.nix - ./home/vicinae.nix - ./home/spotify.nix - ./home/codex-desktop-linux.nix - ]; -} diff --git a/nix-configs/home/modules/agents/apm.nix b/nix-configs/home/modules/agents/apm.nix new file mode 100644 index 0000000..494f68b --- /dev/null +++ b/nix-configs/home/modules/agents/apm.nix @@ -0,0 +1,43 @@ +{ + config, + lib, + llm-agents, + pkgs, + ... +}: let + link = path: config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/dotfiles/${path}"; +in { + home = { + file.".claude/skills".source = link "mutable/shared/apm/.claude/skills"; + + activation = { + apmInstallSkills = lib.hm.dag.entryAfter ["writeBoundary"] '' + cd "${config.home.homeDirectory}/dotfiles/mutable/shared/apm" + export GITHUB_TOKEN="$(${pkgs.gh}/bin/gh auth token 2>/dev/null || true)" + ${llm-agents.packages.${pkgs.stdenv.hostPlatform.system}.apm}/bin/apm install + ''; + + linkCodexSkills = lib.hm.dag.entryAfter ["apmInstallSkills"] '' + source_dir="${config.home.homeDirectory}/dotfiles/mutable/shared/apm/.agents/skills" + target_dir="${config.home.homeDirectory}/.codex/skills" + mkdir -p "$target_dir" + find "$target_dir" -maxdepth 1 -type l -lname "$source_dir/*" -delete + for skill in "$source_dir"/*; do + [ -d "$skill" ] || continue + ln -sfn "$skill" "$target_dir/$(basename "$skill")" + done + ''; + + linkOpencodeSkills = lib.hm.dag.entryAfter ["apmInstallSkills"] '' + source_dir="${config.home.homeDirectory}/dotfiles/mutable/shared/apm/.agents/skills" + target_dir="${config.home.homeDirectory}/.config/opencode/skills" + mkdir -p "$target_dir" + find "$target_dir" -maxdepth 1 -type l -lname "$source_dir/*" -delete + for skill in "$source_dir"/*; do + [ -d "$skill" ] || continue + ln -sfn "$skill" "$target_dir/$(basename "$skill")" + done + ''; + }; + }; +} diff --git a/nix-configs/home/codex-desktop-linux.nix b/nix-configs/home/modules/agents/codex-desktop.nix similarity index 86% rename from nix-configs/home/codex-desktop-linux.nix rename to nix-configs/home/modules/agents/codex-desktop.nix index e3659ac..f415abd 100644 --- a/nix-configs/home/codex-desktop-linux.nix +++ b/nix-configs/home/modules/agents/codex-desktop.nix @@ -9,6 +9,6 @@ # トップレベルの pkgs.codex は 0.133.0 と古く、タスク作成時にツール定義へ inputSchema を # 付与しないためバックエンドが "missing field `inputSchema`" で弾く。llm.nix で PATH に # llm-agents の codex と揃え、新しいコアを使わせる。 - cliPackage = llm-agents.packages.${pkgs.system}.codex; + cliPackage = llm-agents.packages.${pkgs.stdenv.hostPlatform.system}.codex; }; } diff --git a/nix-configs/home/modules/agents/codex.nix b/nix-configs/home/modules/agents/codex.nix new file mode 100644 index 0000000..1f975f7 --- /dev/null +++ b/nix-configs/home/modules/agents/codex.nix @@ -0,0 +1,58 @@ +{ + config, + lib, + pkgs, + ... +}: { + home = { + activation = { + seedCodexConfig = lib.hm.dag.entryAfter ["writeBoundary"] '' + codex_cfg="${config.home.homeDirectory}/.codex/config.toml" + codex_tmpl="${config.home.homeDirectory}/dotfiles/chezmoi/.chezmoitemplates/codex-config.toml" + mkdir -p "${config.home.homeDirectory}/.codex" + if [ -L "$codex_cfg" ] || [ ! -e "$codex_cfg" ]; then + rm -f "$codex_cfg" + cp "$codex_tmpl" "$codex_cfg" + chmod u+w "$codex_cfg" + fi + ''; + + migrateCodexSandboxState = lib.hm.dag.entryAfter ["seedCodexConfig"] '' + codex_dir="${config.home.homeDirectory}/.codex" + codex_cfg="$codex_dir/config.toml" + + if [ -f "$codex_cfg" ] \ + && ${pkgs.gnugrep}/bin/grep -q '^default_permissions = "personal"$' "$codex_cfg" \ + && ${pkgs.gnugrep}/bin/grep -q '^":root" = "write"$' "$codex_cfg"; then + ${pkgs.gnused}/bin/sed -i 's/^":root" = "write"$/":root" = "read"/' "$codex_cfg" + fi + + for state_file in "$codex_dir/.codex-global-state.json" "$codex_dir/.codex-global-state.json.bak"; do + [ -f "$state_file" ] || continue + if ${pkgs.jq}/bin/jq -e ' + any( + ((.["thread-writable-roots"] // {}) | to_entries[]?.value?); + type == "array" and any(.[]; . == "/") + ) + ' "$state_file" >/dev/null; then + state_tmp="$state_file.tmp.$$" + if ${pkgs.jq}/bin/jq ' + if type == "object" and (.["thread-writable-roots"] | type) == "object" then + .["thread-writable-roots"] |= with_entries( + .value |= if type == "array" then map(select(. != "/")) else . end + ) + else + . + end + ' "$state_file" > "$state_tmp"; then + ${pkgs.coreutils}/bin/chmod --reference="$state_file" "$state_tmp" + ${pkgs.coreutils}/bin/mv "$state_tmp" "$state_file" + else + ${pkgs.coreutils}/bin/rm -f "$state_tmp" + fi + fi + done + ''; + }; + }; +} diff --git a/nix-configs/home/firefox.nix b/nix-configs/home/modules/apps/firefox.nix similarity index 100% rename from nix-configs/home/firefox.nix rename to nix-configs/home/modules/apps/firefox.nix diff --git a/nix-configs/home/razer.nix b/nix-configs/home/modules/apps/razer.nix similarity index 100% rename from nix-configs/home/razer.nix rename to nix-configs/home/modules/apps/razer.nix diff --git a/nix-configs/home/spotify.nix b/nix-configs/home/modules/apps/spotify.nix similarity index 100% rename from nix-configs/home/spotify.nix rename to nix-configs/home/modules/apps/spotify.nix diff --git a/nix-configs/home/vicinae.nix b/nix-configs/home/modules/apps/vicinae.nix similarity index 95% rename from nix-configs/home/vicinae.nix rename to nix-configs/home/modules/apps/vicinae.nix index 7f07a24..86635b7 100644 --- a/nix-configs/home/vicinae.nix +++ b/nix-configs/home/modules/apps/vicinae.nix @@ -1,5 +1,5 @@ _: { - services.vicinae = { + programs.vicinae = { enable = true; systemd = { enable = true; diff --git a/nix-configs/home/vr.nix b/nix-configs/home/modules/apps/vr.nix similarity index 100% rename from nix-configs/home/vr.nix rename to nix-configs/home/modules/apps/vr.nix diff --git a/nix-configs/home/identity.nix b/nix-configs/home/modules/core/identity.nix similarity index 100% rename from nix-configs/home/identity.nix rename to nix-configs/home/modules/core/identity.nix diff --git a/nix-configs/home/programs-cli.nix b/nix-configs/home/modules/core/programs.nix similarity index 100% rename from nix-configs/home/programs-cli.nix rename to nix-configs/home/modules/core/programs.nix diff --git a/nix-configs/home/profiles/cursor.nix b/nix-configs/home/modules/desktop/appearance.nix similarity index 84% rename from nix-configs/home/profiles/cursor.nix rename to nix-configs/home/modules/desktop/appearance.nix index e64792c..223f33a 100644 --- a/nix-configs/home/profiles/cursor.nix +++ b/nix-configs/home/modules/desktop/appearance.nix @@ -1,8 +1,10 @@ -{pkgs, ...}: let - chiffonCursor = pkgs.callPackage ../../cursors/chiffon.nix {}; -in { +{ + localPackages, + pkgs, + ... +}: { home.pointerCursor = { - package = chiffonCursor; + package = localPackages.chiffonCursor; name = "Chiffon"; size = 24; gtk.enable = true; diff --git a/nix-configs/home/lockscreen.nix b/nix-configs/home/modules/desktop/lockscreen.nix similarity index 90% rename from nix-configs/home/lockscreen.nix rename to nix-configs/home/modules/desktop/lockscreen.nix index 23da929..f7f4081 100644 --- a/nix-configs/home/lockscreen.nix +++ b/nix-configs/home/modules/desktop/lockscreen.nix @@ -1,10 +1,11 @@ { config, lib, + localPackages, pkgs, ... }: let - c = import ../lib/catppuccin-mocha.nix; + c = import ../../../lib/theme.nix; niriCfg = config.t4ko.niri; wallpaperCfg = config.t4ko.wallpaper; restoreWallpaperCommand = @@ -38,20 +39,11 @@ -composite \ "$out" ''; - swaylock = pkgs.swaylock.overrideAttrs (old: { - postPatch = - (old.postPatch or "") - + '' - substituteInPlace password.c \ - --replace-fail "state->eventloop, 1500, set_input_idle, state" \ - "state->eventloop, 10000, set_input_idle, state" - ''; - }); lockscreen = pkgs.writeShellApplication { name = "lockscreen"; runtimeInputs = [ pkgs.niri - swaylock + localPackages.swaylockLongIdle ]; text = '' restore_monitors() { diff --git a/nix-configs/home/niri-keybind.nix b/nix-configs/home/modules/desktop/niri-keybind.nix similarity index 100% rename from nix-configs/home/niri-keybind.nix rename to nix-configs/home/modules/desktop/niri-keybind.nix diff --git a/nix-configs/home/niri.nix b/nix-configs/home/modules/desktop/niri.nix similarity index 99% rename from nix-configs/home/niri.nix rename to nix-configs/home/modules/desktop/niri.nix index cca1e48..721cbf8 100644 --- a/nix-configs/home/niri.nix +++ b/nix-configs/home/modules/desktop/niri.nix @@ -4,7 +4,7 @@ keyboardLayout, ... }: let - c = import ../lib/catppuccin-mocha.nix; + c = import ../../../lib/theme.nix; cfg = config.t4ko.niri; quickShell = config.t4ko.quickShell; lockscreenCommand = lib.getExe config.t4ko.lockscreen.command; diff --git a/nix-configs/home/quick-shell.nix b/nix-configs/home/modules/desktop/quick-shell.nix similarity index 97% rename from nix-configs/home/quick-shell.nix rename to nix-configs/home/modules/desktop/quick-shell.nix index e7ec499..a86f4af 100644 --- a/nix-configs/home/quick-shell.nix +++ b/nix-configs/home/modules/desktop/quick-shell.nix @@ -5,8 +5,8 @@ }: let appId = "dev.t4ko.quickshell"; sessionName = "quick-shell"; - ghosttyConfig = ../../dot_config/nixos/ghostty-quick-shell.conf; - starshipConfig = ../../dot_config/nixos/starship-quick-shell.toml; + ghosttyConfig = ./quick-shell/files/ghostty.conf; + starshipConfig = ./quick-shell/files/starship.toml; quickShellSession = pkgs.writeShellApplication { name = "quick-shell-session"; diff --git a/nix-configs/home/modules/desktop/quick-shell/files/ghostty.conf b/nix-configs/home/modules/desktop/quick-shell/files/ghostty.conf new file mode 100644 index 0000000..1f55f36 --- /dev/null +++ b/nix-configs/home/modules/desktop/quick-shell/files/ghostty.conf @@ -0,0 +1,10 @@ +title = Quick Shell +gtk-single-instance = false +quit-after-last-window-closed = true +background-opacity = 0.92 + +window-decoration = none +window-padding-x = 14 +window-padding-y = 12 +window-width = 112 +window-height = 26 diff --git a/nix-configs/home/modules/desktop/quick-shell/files/starship.toml b/nix-configs/home/modules/desktop/quick-shell/files/starship.toml new file mode 100644 index 0000000..280852b --- /dev/null +++ b/nix-configs/home/modules/desktop/quick-shell/files/starship.toml @@ -0,0 +1,72 @@ +"$schema" = 'https://starship.rs/config-schema.json' + +format = """ +[░▒▓](#a3aed2)\ +[  ](bg:#a3aed2 fg:#090c0c)\ +[](bg:#769ff0 fg:#a3aed2)\ +$directory\ +[](fg:#769ff0 bg:#394260)\ +$git_branch\ +$git_status\ +[](fg:#394260 bg:#212736)\ +$nodejs\ +$bun\ +$rust\ +$golang\ +$php\ +[](fg:#212736 bg:#1d2230)\ +$time\ +[ ](fg:#1d2230)\ +\n$character""" + +[directory] +style = "fg:#e3e5e5 bg:#769ff0" +format = "[ $path ]($style)" +truncation_length = 3 +truncation_symbol = "…/" + +[directory.substitutions] +"Documents" = "󰈙 " +"Downloads" = " " +"Music" = " " +"Pictures" = " " + +[git_branch] +symbol = "" +style = "bg:#394260" +format = '[[ $symbol $branch ](fg:#769ff0 bg:#394260)]($style)' + +[git_status] +style = "bg:#394260" +format = '[[($all_status$ahead_behind )](fg:#769ff0 bg:#394260)]($style)' + +[nodejs] +symbol = "" +style = "bg:#212736" +format = '[[ $symbol ($version) ](fg:#769ff0 bg:#212736)]($style)' + +[bun] +symbol = "" +style = "bg:#212736" +format = '[[ $symbol ($version) ](fg:#769ff0 bg:#212736)]($style)' + +[rust] +symbol = "" +style = "bg:#212736" +format = '[[ $symbol ($version) ](fg:#769ff0 bg:#212736)]($style)' + +[golang] +symbol = "" +style = "bg:#212736" +format = '[[ $symbol ($version) ](fg:#769ff0 bg:#212736)]($style)' + +[php] +symbol = "" +style = "bg:#212736" +format = '[[ $symbol ($version) ](fg:#769ff0 bg:#212736)]($style)' + +[time] +disabled = false +time_format = "%R" +style = "bg:#1d2230" +format = '[[  $time ](fg:#a0a9cb bg:#1d2230)]($style)' diff --git a/nix-configs/home/swaync.nix b/nix-configs/home/modules/desktop/swaync.nix similarity index 92% rename from nix-configs/home/swaync.nix rename to nix-configs/home/modules/desktop/swaync.nix index 80c2bc3..b487d2f 100644 --- a/nix-configs/home/swaync.nix +++ b/nix-configs/home/modules/desktop/swaync.nix @@ -1,5 +1,5 @@ _: let - c = import ../lib/catppuccin-mocha.nix; + c = import ../../../lib/theme.nix; in { xdg.configFile."swaync/config.json".text = builtins.toJSON { positionX = "right"; @@ -51,5 +51,5 @@ in { @define-color yellow ${c.yellow}; @define-color red ${c.red}; '' - + builtins.readFile ../../dot_config/nixos/swaync/style.css; + + builtins.readFile ./swaync/files/style.css; } diff --git a/nix-configs/home/modules/desktop/swaync/files/style.css b/nix-configs/home/modules/desktop/swaync/files/style.css new file mode 100644 index 0000000..48f655d --- /dev/null +++ b/nix-configs/home/modules/desktop/swaync/files/style.css @@ -0,0 +1,133 @@ + @keyframes swaync-timeout { + from { + background-position: 0% bottom; + } + to { + background-position: 100% bottom; + } + } + + * { + font-family: "JetBrainsMono Nerd Font"; + font-size: 12px; + color: @fg; + } + + .control-center { + background: @bg; + border: 1px solid alpha(@lavender, 0.24); + border-radius: 12px; + box-shadow: 0 10px 32px rgba(0, 0, 0, 0.36); + padding: 10px; + } + + .notification-row { + outline: none; + margin: 0 0 8px 0; + transition: margin 300ms cubic-bezier(0.2, 0.9, 0.2, 1), opacity 300ms ease, transform 300ms cubic-bezier(0.2, 0.9, 0.2, 1); + } + + .notification-row:focus, + .notification-row:hover { + background: transparent; + } + + .notification { + background-color: alpha(@surface, 0.92); + background-image: linear-gradient(to right, @mauve 50%, alpha(@mauve, 0) 50%); + background-repeat: no-repeat; + background-size: 200% 3px; + background-position: 0% bottom; + border: 1px solid alpha(@lavender, 0.18); + border-radius: 10px; + padding: 10px; + box-shadow: 0 6px 18px rgba(0, 0, 0, 0.28); + transition: background-color 160ms ease, border-color 160ms ease, box-shadow 160ms ease, opacity 300ms ease, transform 300ms cubic-bezier(0.2, 0.9, 0.2, 1); + animation: swaync-timeout 8s linear forwards; + } + + .notification.low { + animation-duration: 4s; + } + + .notification:hover { + background-color: alpha(@surface, 0.98); + border-color: alpha(@mauve, 0.42); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.36); + } + + .notification.critical { + background-image: none; + border-color: alpha(@red, 0.72); + box-shadow: 0 0 0 2px alpha(@red, 0.28), 0 8px 24px rgba(0, 0, 0, 0.36); + animation: none; + } + + .notification-content { + margin: 0; + padding: 0; + } + + .summary { + color: @fg; + font-weight: 900; + } + + .time, + .body { + color: alpha(@fg, 0.78); + font-weight: 700; + } + + .close-button { + background: alpha(@overlay, 0.25); + color: @fg; + border-radius: 999px; + min-width: 18px; + min-height: 18px; + margin: 4px; + transition: background 140ms ease; + } + + .close-button:hover { + background: alpha(@red, 0.72); + } + + .notification-action, + .control-center-clear-all, + .widget-dnd > switch { + background: alpha(@mauve, 0.16); + border: 1px solid alpha(@mauve, 0.28); + border-radius: 8px; + color: @fg; + transition: background 140ms ease, border-color 140ms ease; + } + + .notification-action:hover, + .control-center-clear-all:hover, + .widget-dnd > switch:hover { + background: alpha(@mauve, 0.28); + border-color: alpha(@lavender, 0.5); + } + + .widget-title, + .widget-dnd { + background: transparent; + margin: 0 0 8px 0; + } + + .widget-title > label { + font-size: 13px; + font-weight: 900; + color: @lavender; + } + + .widget-dnd > label { + color: alpha(@fg, 0.82); + font-weight: 800; + } + + .widget-dnd > switch:checked { + background: alpha(@red, 0.42); + border-color: alpha(@red, 0.72); + } diff --git a/nix-configs/home/wallpaper.nix b/nix-configs/home/modules/desktop/wallpaper.nix similarity index 99% rename from nix-configs/home/wallpaper.nix rename to nix-configs/home/modules/desktop/wallpaper.nix index fe1d4ea..761154e 100644 --- a/nix-configs/home/wallpaper.nix +++ b/nix-configs/home/modules/desktop/wallpaper.nix @@ -213,7 +213,7 @@ in { fallbackImage = lib.mkOption { type = lib.types.nullOr lib.types.path; - default = ../assets/wallpapers/nix.png; + default = ../../../assets/wallpapers/nix.png; description = '' Static wallpaper rendered by swaybg on every output. It is spawned before linux-wallpaperengine so that it stays visible whenever the engine fails to diff --git a/nix-configs/home/wallpaper/day.nix b/nix-configs/home/modules/desktop/wallpaper/day.nix similarity index 100% rename from nix-configs/home/wallpaper/day.nix rename to nix-configs/home/modules/desktop/wallpaper/day.nix diff --git a/nix-configs/home/wallpaper/evening.nix b/nix-configs/home/modules/desktop/wallpaper/evening.nix similarity index 100% rename from nix-configs/home/wallpaper/evening.nix rename to nix-configs/home/modules/desktop/wallpaper/evening.nix diff --git a/nix-configs/home/wallpaper/midnight.nix b/nix-configs/home/modules/desktop/wallpaper/midnight.nix similarity index 100% rename from nix-configs/home/wallpaper/midnight.nix rename to nix-configs/home/modules/desktop/wallpaper/midnight.nix diff --git a/nix-configs/home/wallpaper/morning.nix b/nix-configs/home/modules/desktop/wallpaper/morning.nix similarity index 100% rename from nix-configs/home/wallpaper/morning.nix rename to nix-configs/home/modules/desktop/wallpaper/morning.nix diff --git a/nix-configs/home/wallpaper/night.nix b/nix-configs/home/modules/desktop/wallpaper/night.nix similarity index 100% rename from nix-configs/home/wallpaper/night.nix rename to nix-configs/home/modules/desktop/wallpaper/night.nix diff --git a/nix-configs/home/waybar.nix b/nix-configs/home/modules/desktop/waybar.nix similarity index 99% rename from nix-configs/home/waybar.nix rename to nix-configs/home/modules/desktop/waybar.nix index 2c9b3a0..439723f 100644 --- a/nix-configs/home/waybar.nix +++ b/nix-configs/home/modules/desktop/waybar.nix @@ -1,5 +1,5 @@ {pkgs, ...}: let - c = import ../lib/catppuccin-mocha.nix; + c = import ../../../lib/theme.nix; powerMenu = pkgs.writeShellScriptBin "waybar-power-menu" '' if ${pkgs.procps}/bin/pgrep -u "$USER" -x nwg-bar >/dev/null; then ${pkgs.procps}/bin/pkill -u "$USER" -x nwg-bar @@ -475,7 +475,7 @@ in { @define-color peach ${c.peach}; @define-color red ${c.red}; '' - + builtins.readFile ../../dot_config/nixos/waybar/style.css; + + builtins.readFile ./waybar/files/style.css; }; systemd.user.services.waybar.Service.ExecStartPre = "${pkgs.runtimeShell} -c '${pkgs.procps}/bin/pkill -u %u -f \"(^|/)waybar($|[[:space:]])\" || true'"; diff --git a/nix-configs/home/modules/desktop/waybar/files/style.css b/nix-configs/home/modules/desktop/waybar/files/style.css new file mode 100644 index 0000000..177ce8c --- /dev/null +++ b/nix-configs/home/modules/desktop/waybar/files/style.css @@ -0,0 +1,318 @@ + * { + margin: 0; + padding: 0; + border: none; + font-family: "JetBrainsMono Nerd Font"; + font-size: 12px; + font-weight: 900; + color: @fg; + } + + window#waybar { + background-color: transparent; + } + + @keyframes module-press { + from { + box-shadow: inset 0 0 0 12px alpha(@lavender, 0.38); + } + to { + box-shadow: inset 0 0 0 0 alpha(@lavender, 0); + } + } + + #waybar > box { + margin: 0; + padding: 0; + background-color: transparent; + border: none; + box-shadow: none; + } + + window#waybar.empty #mpris { + margin: 0; + padding: 0; + border: none; + background-color: transparent; + } + + #left1, + .modules-center, + #right-status, + #mpris { + background-color: @bg; + border-radius: 15px; + padding: 0 2px; + margin: 5px 5px 2px 5px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); + border: 0.5px solid alpha(@lavender, 0.22); + } + + .modules-center { + padding: 0; + } + + #workspaces { + background-color: transparent; + border: none; + padding: 1px; + margin: 2px 6px 2px 0; + border-radius: 50px; + } + + #workspaces button { + padding: 0 5px; + margin: 0 2px; + color: transparent; + border-radius: 100px; + background: linear-gradient(45deg, @mauve, @lavender); + transition: background 0.25s cubic-bezier(0.4, 0, 0.2, 1), + color 0.25s cubic-bezier(0.4, 0, 0.2, 1), + padding 0.2s cubic-bezier(0.4, 0, 0.2, 1); + } + + #workspaces button.active { + padding: 0 18px; + margin: 0 2px; + background: linear-gradient(45deg, @mauve, @lavender); + color: transparent; + border-radius: 100px; + } + + #workspaces button.empty { + color: transparent; + background: alpha(@mauve, 0.12); + } + + #workspaces button.empty.active { + padding: 0 18px; + margin: 0 2px; + background: linear-gradient(45deg, alpha(@mauve, 0.5), alpha(@lavender, 0.45)); + color: transparent; + border-radius: 100px; + background-clip: padding-box; + } + + #workspaces button:hover { + background: linear-gradient(135deg, alpha(@mauve, 0.5), alpha(@lavender, 0.45)); + color: @bg; + border-radius: 100px; + box-shadow: none; + border: none; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + } + + #workspaces button.empty:hover { + background: alpha(@mauve, 0.25); + border-radius: 100px; + color: @lavender; + } + + #tray, + #idle_inhibitor, + #battery, + #backlight, + #network, + #bluetooth, + #pulseaudio, + #pulseaudio.input, + #wlr-taskbar, + #custom-menu, + #clock, + #custom-notification, + #custom-separator, + #custom-separator2, + #custom-separator3, + #custom-power { + min-width: 14px; + color: @lavender; + padding: 0 4px; + margin: 3px 2px; + border-radius: 15px; + transition: all 0.25s ease; + } + + #idle_inhibitor:active, + #backlight:active, + #network:active, + #bluetooth:active, + #pulseaudio:active, + #pulseaudio.input:active, + #custom-menu:active, + #clock:active, + #custom-notification:active, + #custom-power:active, + #wlr-taskbar button:active { + animation: module-press 160ms ease-out; + background-color: alpha(@mauve, 0.24); + color: @fg; + } + + #idle_inhibitor:hover, + #backlight:hover, + #network:hover, + #bluetooth:hover, + #pulseaudio:hover, + #pulseaudio.input:hover, + #custom-menu:hover, + #clock:hover, + #custom-notification:hover, + #custom-power:hover, + #wlr-taskbar button:hover { + background-color: alpha(@mauve, 0.16); + color: @fg; + box-shadow: inset 0 0 0 1px alpha(@lavender, 0.18); + transition: background-color 120ms ease, color 120ms ease, box-shadow 120ms ease; + } + + #wlr-taskbar { + padding: 0 2px; + } + + #wlr-taskbar button { + background: transparent; + border-radius: 12px; + margin: 0 2px; + padding: 0 4px; + transition: all 0.25s ease; + } + + #wlr-taskbar button:hover, + #wlr-taskbar button.active { + background: alpha(@mauve, 0.2); + } + + #memory, + #cpu, + #pulseaudio.output, + #cava { + min-width: 14px; + background-color: alpha(@mauve, 0.88); + color: @mantle; + padding: 0 8px; + margin: 3px 3px; + border-radius: 15px; + transition: all 0.25s ease; + } + + #clock { + color: @lavender; + } + + #battery, + #bluetooth.connected, + #custom-notification.notification, + #idle_inhibitor.activated { + color: @mauve; + } + + #custom-notification.notification, + #custom-notification.inhibited-notification { + animation: notify-bounce 1.4s ease-in-out infinite; + } + + #custom-notification.dnd-none, + #custom-notification.dnd-notification, + #custom-notification.dnd-inhibited-none, + #custom-notification.dnd-inhibited-notification { + color: @overlay; + } + + #tray { + padding-top: 1px; + } + + #custom-power, + #custom-menu { + font-size: 14px; + color: @lavender; + } + + #mpris { + color: @lavender; + } + + #mpris.playing { + animation: hover-mirror 3s ease-in-out infinite alternate; + color: @mauve; + } + + #idle_inhibitor.activated, + #idle_inhibitor.deactivated { + padding-left: 0; + font-size: 12px; + } + + #battery.charging, + #battery.plugged { + color: @yellow; + } + + #battery.warning:not(.charging) { + color: @peach; + } + + tooltip { + background: alpha(@bg, 0.95); + border: 1px solid alpha(@lavender, 0.22); + border-radius: 8px; + } + + tooltip label { + color: @fg; + padding: 4px; + } + + #custom-separator, + #custom-separator2, + #custom-separator3 { + color: @mauve; + opacity: 1; + font-size: 10px; + padding: 0 3px; + padding-top: 1px; + } + + @keyframes hover-mirror { + from { + box-shadow: inset 0 0 @mauve; + background-color: @bg; + } + to { + box-shadow: inset 0 -2px @lavender; + background-color: @bg; + } + } + + @keyframes blink-recording { + to { + color: @bg; + } + } + + @keyframes notify-bounce { + 0% { + margin-top: 3px; + } + 45% { + margin-top: 0; + } + 100% { + margin-top: 3px; + } + } + + #battery.critical:not(.charging) { + color: @red; + animation: blink-recording 0.5s steps(12) infinite alternate; + } + + #memory.warning, + #cpu.warning { + color: @peach; + } + + #memory.critical, + #cpu.critical { + color: @red; + } diff --git a/nix-configs/home/nixvim/autocmds.nix b/nix-configs/home/modules/editors/nixvim/autocmds.nix similarity index 100% rename from nix-configs/home/nixvim/autocmds.nix rename to nix-configs/home/modules/editors/nixvim/autocmds.nix diff --git a/nix-configs/home/nixvim/default.nix b/nix-configs/home/modules/editors/nixvim/default.nix similarity index 88% rename from nix-configs/home/nixvim/default.nix rename to nix-configs/home/modules/editors/nixvim/default.nix index ac7f5a8..9b1ac7e 100644 --- a/nix-configs/home/nixvim/default.nix +++ b/nix-configs/home/modules/editors/nixvim/default.nix @@ -1,4 +1,8 @@ -{pkgs, ...}: { +{ + localPackages, + pkgs, + ... +}: { programs.nixvim = { enable = true; defaultEditor = true; @@ -27,7 +31,7 @@ ./keymaps.nix ./autocmds.nix ./lsp.nix - ./plugins.nix + (import ./plugins {inherit localPackages;}) ]; }; } diff --git a/nix-configs/home/nixvim/files/ftdetect/mdc.lua b/nix-configs/home/modules/editors/nixvim/files/ftdetect/mdc.lua similarity index 100% rename from nix-configs/home/nixvim/files/ftdetect/mdc.lua rename to nix-configs/home/modules/editors/nixvim/files/ftdetect/mdc.lua diff --git a/nix-configs/home/nixvim/files/ftdetect/zsh.lua b/nix-configs/home/modules/editors/nixvim/files/ftdetect/zsh.lua similarity index 100% rename from nix-configs/home/nixvim/files/ftdetect/zsh.lua rename to nix-configs/home/modules/editors/nixvim/files/ftdetect/zsh.lua diff --git a/nix-configs/home/nixvim/files/spell/tech.utf-8.add b/nix-configs/home/modules/editors/nixvim/files/spell/tech.utf-8.add similarity index 100% rename from nix-configs/home/nixvim/files/spell/tech.utf-8.add rename to nix-configs/home/modules/editors/nixvim/files/spell/tech.utf-8.add diff --git a/nix-configs/home/nixvim/keymaps.nix b/nix-configs/home/modules/editors/nixvim/keymaps.nix similarity index 100% rename from nix-configs/home/nixvim/keymaps.nix rename to nix-configs/home/modules/editors/nixvim/keymaps.nix diff --git a/nix-configs/home/nixvim/lsp.nix b/nix-configs/home/modules/editors/nixvim/lsp.nix similarity index 100% rename from nix-configs/home/nixvim/lsp.nix rename to nix-configs/home/modules/editors/nixvim/lsp.nix diff --git a/nix-configs/home/nixvim/options.nix b/nix-configs/home/modules/editors/nixvim/options.nix similarity index 100% rename from nix-configs/home/nixvim/options.nix rename to nix-configs/home/modules/editors/nixvim/options.nix diff --git a/nix-configs/home/modules/editors/nixvim/plugins/ai.nix b/nix-configs/home/modules/editors/nixvim/plugins/ai.nix new file mode 100644 index 0000000..2e0a88b --- /dev/null +++ b/nix-configs/home/modules/editors/nixvim/plugins/ai.nix @@ -0,0 +1,12 @@ +{ + plugins.claudecode = { + enable = true; + settings = { + diff_opts = { + layout = "vertical"; + open_in_new_tab = true; + }; + terminal.provider = "snacks"; + }; + }; +} diff --git a/nix-configs/home/modules/editors/nixvim/plugins/default.nix b/nix-configs/home/modules/editors/nixvim/plugins/default.nix new file mode 100644 index 0000000..3eb5249 --- /dev/null +++ b/nix-configs/home/modules/editors/nixvim/plugins/default.nix @@ -0,0 +1,20 @@ +{localPackages}: {pkgs, ...}: { + imports = [ + ./ai.nix + ./editor.nix + ./git.nix + ./languages.nix + ./navigation.nix + ./ui.nix + ]; + + extraPlugins = with pkgs.vimPlugins; [ + bracey-vim + dracula-nvim + incline-nvim + nvim-ufo + promise-async + localPackages.vimdocJa + localPackages.winresizer + ]; +} diff --git a/nix-configs/home/modules/editors/nixvim/plugins/editor.nix b/nix-configs/home/modules/editors/nixvim/plugins/editor.nix new file mode 100644 index 0000000..c86242d --- /dev/null +++ b/nix-configs/home/modules/editors/nixvim/plugins/editor.nix @@ -0,0 +1,75 @@ +{lib, ...}: { + plugins = { + compiler.enable = true; + grug-far.enable = true; + img-clip = { + enable = true; + settings.default = { + dir_path = "assets"; + extension = "png"; + prompt_for_file_name = true; + relative_to_current_file = true; + show_dir_path_in_prompt = false; + use_absolute_path = false; + }; + }; + inc-rename.enable = true; + mini = { + enable = true; + modules = { + ai = {}; + hipatterns = {}; + pairs = {}; + surround = { + mappings = { + add = "gsa"; + delete = "gsd"; + find = "gsf"; + find_left = "gsF"; + highlight = "gsh"; + replace = "gsr"; + update_n_lines = "gsn"; + }; + }; + }; + }; + persistence.enable = true; + rainbow-delimiters.enable = true; + todo-comments.enable = true; + }; + + extraConfigLuaPost = lib.mkOrder 1120 '' + vim.o.cursorline = true + vim.o.number = true + vim.o.foldcolumn = "1" + vim.o.foldlevel = 99 + vim.o.foldlevelstart = 99 + vim.o.foldenable = true + require("ufo").setup({ + fold_virt_text_handler = function(virtual_text, start_line, end_line, width, truncate) + local suffix = (" 󰁂 %d "):format(end_line - start_line) + local target_width, current_width = width - vim.fn.strdisplaywidth(suffix), 0 + local result = {} + for _, chunk in ipairs(virtual_text) do + local text, highlight = chunk[1], chunk[2] + local text_width = vim.fn.strdisplaywidth(text) + if target_width > current_width + text_width then + table.insert(result, chunk) + else + text = truncate(text, target_width - current_width) + table.insert(result, { text, highlight }) + suffix = suffix .. string.rep(" ", math.max(0, target_width - current_width - vim.fn.strdisplaywidth(text))) + break + end + current_width = current_width + text_width + end + table.insert(result, { suffix, "MoreMsg" }) + return result + end, + provider_selector = function(buffer, filetype) + if filetype == "markdown" then return markdown_fold_provider end + return { "treesitter", "indent" } + end, + }) + ''; +} diff --git a/nix-configs/home/modules/editors/nixvim/plugins/git.nix b/nix-configs/home/modules/editors/nixvim/plugins/git.nix new file mode 100644 index 0000000..ee1ec9c --- /dev/null +++ b/nix-configs/home/modules/editors/nixvim/plugins/git.nix @@ -0,0 +1,6 @@ +{ + plugins = { + diffview.enable = true; + gitsigns.enable = true; + }; +} diff --git a/nix-configs/home/modules/editors/nixvim/plugins/languages.nix b/nix-configs/home/modules/editors/nixvim/plugins/languages.nix new file mode 100644 index 0000000..c7c76fa --- /dev/null +++ b/nix-configs/home/modules/editors/nixvim/plugins/languages.nix @@ -0,0 +1,150 @@ +{ + config, + lib, + pkgs, + ... +}: { + extraPackages = with pkgs; [ + gofumpt + gotools + markdownlint-cli2 + nixfmt + prettier + statix + stylua + ]; + + extraFiles = { + "ftdetect/mdc.lua".source = ../files/ftdetect/mdc.lua; + "ftdetect/zsh.lua".source = ../files/ftdetect/zsh.lua; + "spell/tech.utf-8.add".source = ../files/spell/tech.utf-8.add; + }; + + plugins = { + emmet.enable = true; + markdown-preview = { + enable = true; + settings = { + auto_close = 0; + browser = ""; + combine_preview = 0; + combine_preview_auto_refresh = 1; + filetypes = ["markdown"]; + open_to_the_world = 0; + theme = "dark"; + }; + }; + render-markdown.enable = true; + rustaceanvim.enable = true; + treesitter = { + enable = true; + grammarPackages = with config.plugins.treesitter.package.builtGrammars; [ + bash + c + css + dockerfile + go + html + javascript + json + lua + markdown + markdown_inline + nix + python + rust + scss + toml + tsx + typescript + vim + vimdoc + yaml + zsh + ]; + highlight.enable = true; + indent.enable = true; + }; + treesitter-context = { + enable = true; + settings = { + max_lines = 3; + min_window_height = 20; + mode = "cursor"; + multiline_threshold = 1; + trim_scope = "outer"; + }; + }; + ts-autotag.enable = true; + ts-comments.enable = true; + venv-selector.enable = true; + }; + + extraConfigLuaPost = lib.mkMerge [ + (lib.mkOrder 1100 '' + local function markdown_fold_provider(buffer) + local lines, folds, blocks, headings = vim.api.nvim_buf_get_lines(buffer, 0, -1, false), {}, {}, {} + local in_code, code_start = false, nil + local function trim_empty(last) + while last > 0 and lines[last + 1] and lines[last + 1]:match("^%s*$") do last = last - 1 end + return last + end + local function close_headings(level, last) + while #headings > 0 and headings[#headings].level >= level do + local heading = table.remove(headings) + local finish = trim_empty(last - 1) + if finish > heading.line then table.insert(folds, { startLine = heading.line, endLine = finish }) end + end + end + for index, line in ipairs(lines) do + local line_number = index - 1 + if line:match("^```") or line:match("^~~~") then + if in_code then + in_code = false + if line_number > code_start then table.insert(folds, { startLine = code_start, endLine = line_number }) end + else + in_code, code_start = true, line_number + end + end + if not in_code then + if line:match("^:::details") or line:match("^:::message") then + table.insert(blocks, line_number) + elseif line:match("^:::$") and #blocks > 0 then + table.insert(folds, { startLine = table.remove(blocks), endLine = line_number }) + end + local hashes = line:match("^(#+)%s") + if hashes then + close_headings(#hashes, line_number) + table.insert(headings, { line = line_number, level = #hashes }) + end + end + end + local last = trim_empty(#lines - 1) + for _, heading in ipairs(headings) do + if last > heading.line then table.insert(folds, { startLine = heading.line, endLine = last }) end + end + return folds + end + '') + (lib.mkOrder 1140 '' + vim.g.bracey_auto_start_browser = 1 + vim.g.bracey_refresh_on_save = 1 + vim.g.bracey_server_allow_remote_connections = 0 + vim.g.user_emmet_leader_key = "" + vim.g.user_emmet_settings = { + variables = { lang = "ja" }, + html = { + indentation = " ", + snippets = { + ["html:5"] = "\n\n\n\t\n\t\n\t\n\t\n\n\n\t''${child}|\n\n", + }, + }, + } + + local spellfiles = vim.fn.globpath(vim.o.runtimepath, "spell/tech.utf-8.add", false, true) + if #spellfiles > 0 then + vim.opt.spellfile = { spellfiles[1], vim.fn.stdpath("data") .. "/spell/local.utf-8.add" } + end + '') + ]; +} diff --git a/nix-configs/home/modules/editors/nixvim/plugins/navigation.nix b/nix-configs/home/modules/editors/nixvim/plugins/navigation.nix new file mode 100644 index 0000000..c065dd0 --- /dev/null +++ b/nix-configs/home/modules/editors/nixvim/plugins/navigation.nix @@ -0,0 +1,29 @@ +{ + plugins = { + flash.enable = true; + snacks = { + enable = true; + settings = { + image = { + doc = { + enabled = true; + inline = true; + max_height = 40; + max_width = 80; + }; + enabled = true; + }; + scroll.enabled = false; + }; + }; + trouble.enable = true; + which-key.enable = true; + yazi = { + enable = true; + settings = { + keymaps.show_help = ""; + open_for_directories = false; + }; + }; + }; +} diff --git a/nix-configs/home/modules/editors/nixvim/plugins/ui.nix b/nix-configs/home/modules/editors/nixvim/plugins/ui.nix new file mode 100644 index 0000000..ce90496 --- /dev/null +++ b/nix-configs/home/modules/editors/nixvim/plugins/ui.nix @@ -0,0 +1,118 @@ +{lib, ...}: { + plugins = { + bufferline.enable = true; + hlchunk = { + enable = true; + settings.chunk = { + chars = { + horizontal_line = "─"; + left_bottom = "╰"; + left_top = "╭"; + right_arrow = ">"; + vertical_line = "│"; + }; + enable = true; + style = "#806d9c"; + }; + }; + lualine = { + enable = true; + settings.options.theme = "dracula-nvim"; + }; + modicator = { + enable = true; + settings = { + highlights.defaults.bold = true; + integration.lualine.enabled = false; + show_warnings = false; + }; + }; + noice = { + enable = true; + settings = { + lsp = { + hover = { + enabled = true; + silent = true; + }; + signature.enabled = true; + }; + presets = { + bottom_search = true; + command_palette = true; + inc_rename = true; + long_message_to_split = true; + lsp_doc_border = true; + }; + routes = [ + { + filter = { + event = "msg_show"; + find = "written"; + kind = ""; + }; + opts.skip = true; + } + { + filter = { + event = "msg_show"; + kind = "search_count"; + }; + opts.skip = true; + } + ]; + }; + }; + notify = { + enable = true; + settings = { + background_colour = "#1e1e2e"; + render = "compact"; + stages = "fade"; + timeout = 3000; + }; + }; + smear-cursor = { + enable = true; + settings = { + distance_stop_animating = 0.5; + hide_target_hack = false; + stiffness = 0.8; + trailing_exponent = 2; + trailing_stiffness = 0.5; + }; + }; + web-devicons.enable = true; + }; + + extraConfigLuaPost = lib.mkMerge [ + (lib.mkOrder 1110 '' + local dracula = require("dracula") + dracula.setup({ + italic_comment = true, + overrides = function(colors) + return { + CursorLineNr = { fg = colors.purple, bold = true }, + LineNr = { fg = colors.white }, + LineNrAbove = { fg = colors.white }, + LineNrBelow = { fg = colors.white }, + } + end, + transparent_bg = false, + }) + vim.cmd.colorscheme("dracula") + '') + (lib.mkOrder 1130 '' + require("incline").setup({ + hide = { cursorline = true }, + highlight = { + groups = { + InclineNormal = { guibg = "#BD93F9", guifg = "#282A36" }, + InclineNormalNC = { guibg = "#44475A", guifg = "#6272A4" }, + }, + }, + window = { margin = { vertical = 0, horizontal = 1 } }, + }) + '') + ]; +} diff --git a/nix-configs/home/packages/llm.nix b/nix-configs/home/modules/packages/ai.nix similarity index 52% rename from nix-configs/home/packages/llm.nix rename to nix-configs/home/modules/packages/ai.nix index ccb5ee7..c97aa84 100644 --- a/nix-configs/home/packages/llm.nix +++ b/nix-configs/home/modules/packages/ai.nix @@ -3,7 +3,7 @@ pkgs, ... }: { - home.packages = with llm-agents.packages.${pkgs.system}; [ + home.packages = with llm-agents.packages.${pkgs.stdenv.hostPlatform.system}; [ claude-code codex opencode diff --git a/nix-configs/home/packages/cli.nix b/nix-configs/home/modules/packages/cli.nix similarity index 100% rename from nix-configs/home/packages/cli.nix rename to nix-configs/home/modules/packages/cli.nix diff --git a/nix-configs/home/packages/core-cli.nix b/nix-configs/home/modules/packages/core-cli.nix similarity index 100% rename from nix-configs/home/packages/core-cli.nix rename to nix-configs/home/modules/packages/core-cli.nix diff --git a/nix-configs/profiles/desktop-apps.nix b/nix-configs/home/modules/packages/desktop.nix similarity index 69% rename from nix-configs/profiles/desktop-apps.nix rename to nix-configs/home/modules/packages/desktop.nix index 1d242d6..96505e2 100644 --- a/nix-configs/profiles/desktop-apps.nix +++ b/nix-configs/home/modules/packages/desktop.nix @@ -1,23 +1,25 @@ {pkgs, ...}: { - environment.systemPackages = with pkgs; [ + imports = [./core-cli.nix]; + + home.packages = with pkgs; [ + brave fuzzel gh + google-chrome + ghostty lazygit + linux-wallpaperengine nautilus - networkmanagerapplet pavucontrol playerctl qt6Packages.fcitx5-configtool - linux-wallpaperengine + spotify swaybg swayidle swaylock - vial vesktop - xwayland-satellite - brave - google-chrome - prismlauncher - spotify + vial + wezterm + zed-editor ]; } diff --git a/nix-configs/home/packages/development.nix b/nix-configs/home/modules/packages/development.nix similarity index 75% rename from nix-configs/home/packages/development.nix rename to nix-configs/home/modules/packages/development.nix index df62f67..5ed01e2 100644 --- a/nix-configs/home/packages/development.nix +++ b/nix-configs/home/modules/packages/development.nix @@ -1,8 +1,12 @@ -{pkgs, ...}: { +{ + localPackages, + pkgs, + ... +}: { home.packages = with pkgs; [ rustup nodejs - (pkgs.callPackage ../../pkgs/vite-plus/package.nix {}) + localPackages.vitePlus deno bun python3 diff --git a/nix-configs/home/packages/gaming.nix b/nix-configs/home/modules/packages/gaming.nix similarity index 100% rename from nix-configs/home/packages/gaming.nix rename to nix-configs/home/modules/packages/gaming.nix diff --git a/nix-configs/home/packages/lsp.nix b/nix-configs/home/modules/packages/language-servers.nix similarity index 100% rename from nix-configs/home/packages/lsp.nix rename to nix-configs/home/modules/packages/language-servers.nix diff --git a/nix-configs/home/packages/media.nix b/nix-configs/home/modules/packages/media.nix similarity index 77% rename from nix-configs/home/packages/media.nix rename to nix-configs/home/modules/packages/media.nix index f42b7a7..5f5a5f6 100644 --- a/nix-configs/home/packages/media.nix +++ b/nix-configs/home/modules/packages/media.nix @@ -1,17 +1,16 @@ { config, lib, + localPackages, pkgs, ... -}: let - librepods = pkgs.callPackage ../../pkgs/librepods/package.nix {}; -in { +}: { home.packages = with pkgs; [ audacity ffmpeg gimp imv - librepods + localPackages.librepods kooha mpv obs-studio diff --git a/nix-configs/home/modules/packages/wayland.nix b/nix-configs/home/modules/packages/wayland.nix new file mode 100644 index 0000000..cd5902f --- /dev/null +++ b/nix-configs/home/modules/packages/wayland.nix @@ -0,0 +1,20 @@ +{ + localPackages, + pkgs, + ... +}: { + home.packages = with pkgs; [ + blueman + brightnessctl + cava + libnotify + networkmanagerapplet + pamixer + localPackages.swaynotificationcenterSlide + localPackages.waycal + waybar + wl-clipboard + xwayland-satellite + xdg-utils + ]; +} diff --git a/nix-configs/home/zsh.nix b/nix-configs/home/modules/shell/zsh.nix similarity index 72% rename from nix-configs/home/zsh.nix rename to nix-configs/home/modules/shell/zsh.nix index 8d357ac..6b3cf15 100644 --- a/nix-configs/home/zsh.nix +++ b/nix-configs/home/modules/shell/zsh.nix @@ -1,9 +1,15 @@ { config, + editor, lib, pkgs, ... }: { + xdg.configFile = lib.mkIf (editor == "nvim") { + "zsh/rc".source = ./zsh/files/rc; + "zsh/starship-nix.toml".source = ./zsh/files/starship-nix.toml; + }; + programs.zsh = { enable = true; dotDir = "${config.xdg.configHome}/zsh"; @@ -11,7 +17,10 @@ enableCompletion = false; history = { - path = "${config.xdg.configHome}/zsh/.zsh_history"; + path = + if editor == "nvim" + then "${config.xdg.configHome}/zsh/.zsh_history" + else "${config.xdg.stateHome}/zsh/history"; size = 100000; save = 100000; extended = true; @@ -23,27 +32,32 @@ }; sessionVariables = { - MANPAGER = "nvim +Man!"; + MANPAGER = + if editor == "nvim" + then "nvim +Man!" + else "less"; LESSHISTFILE = "\${XDG_STATE_HOME:-$HOME/.local/state}/less/history"; LISTMAX = "50"; }; - envExtra = '' - setopt no_global_rcs - - export ZRCDIR="$ZDOTDIR/rc" - export LOCAL_ZSH_DIR="$HOME/.config/local/zsh" + envExtra = + '' + setopt no_global_rcs - export EDITOR=nvim - export VISUAL="$EDITOR" - export GIT_EDITOR="$EDITOR" + export EDITOR=${editor} + export VISUAL="$EDITOR" + export GIT_EDITOR="$EDITOR" - export GOPATH="$HOME/go" - export GO111MODULE=on - path=("$HOME/.local/bin" "$GOPATH/bin" "$HOME/.cargo/bin" $path) - ''; + export GOPATH="$HOME/go" + export GO111MODULE=on + path=("$HOME/.local/bin" "$GOPATH/bin" "$HOME/.cargo/bin" $path) + '' + + lib.optionalString (editor == "nvim") '' + export ZRCDIR="$ZDOTDIR/rc" + export LOCAL_ZSH_DIR="$HOME/.config/local/zsh" + ''; - initContent = lib.mkMerge [ + initContent = lib.mkIf (editor == "nvim") (lib.mkMerge [ (lib.mkOrder 560 '' fpath+=(${pkgs.zsh-completions}/share/zsh/site-functions) '') @@ -96,6 +110,6 @@ zstyle ':autocomplete:*' list-lines 10 source ${pkgs.zsh-autocomplete}/share/zsh-autocomplete/zsh-autocomplete.plugin.zsh '' - ]; + ]); }; } diff --git a/nix-configs/home/modules/shell/zsh/files/rc/alias.zsh b/nix-configs/home/modules/shell/zsh/files/rc/alias.zsh new file mode 100644 index 0000000..b88ef25 --- /dev/null +++ b/nix-configs/home/modules/shell/zsh/files/rc/alias.zsh @@ -0,0 +1,59 @@ +# common +alias history='fc -l -10' +alias v='nvim' +# nixpkgs の zed-editor は `zeditor` のみ提供するため、`zed` で呼べるようにする +if command -v zeditor >/dev/null 2>&1; then + alias zed='zeditor' +fi +alias yz='yazi' +alias cls='clear' +alias ct='/home/t4ko/Project/github.com/T4ko0522' +alias cdp='/home/t4koProject' +alias la='lsd -lah' +alias ..='../' +alias ...='../../' +alias ....='../../../' +alias .....='../../../../' + +if command -v eza >/dev/null 2>&1; then + export EZA_COLORS='hd=1;38;2;180;190;254:di=1;38;2;245;194;231:ex=1;38;2;148;226;213:fi=1;38;2;245;224;220:ln=38;2;137;180;250:or=38;2;243;139;168:ur=38;2;180;190;254:uw=38;2;137;180;250:ux=38;2;116;199;236:ue=38;2;116;199;236:gr=38;2;137;220;235:gw=38;2;148;226;213:gx=38;2;166;227;161:tr=38;2;249;226;175:tw=38;2;250;179;135:tx=38;2;235;160;172:sn=1;38;2;166;227;161:sb=1;38;2;166;227;161:uu=38;2;203;166;247:un=38;2;203;166;247:uR=38;2;203;166;247:gu=38;2;203;166;247:gn=38;2;203;166;247:gR=38;2;203;166;247:da=38;2;137;220;235:ic=1' + alias ls='eza -l --header --icons=auto --group-directories-first' +else + alias ls='ls -lF --color=auto' +fi + +if command -v gomi >/dev/null 2>&1; then + alias gm='gomi' +fi + +alias lg='lazygit' +alias ff='fastfetch' +alias y='yy' + +function open { + local target="${1:-.}" + + if command -v xdg-open >/dev/null 2>&1; then + xdg-open "$target" >/dev/null 2>&1 &! + elif command -v nautilus >/dev/null 2>&1; then + nautilus "$target" >/dev/null 2>&1 &! + else + print -u2 'open: xdg-open or nautilus is required' + return 127 + fi +} + +function ghcd { + if ! command -v ghq >/dev/null 2>&1 || ! command -v fzf >/dev/null 2>&1; then + print -u2 'ghcd: ghq and fzf are required' + return 127 + fi + + local src + src=$(ghq list | fzf --preview 'bat --color=always --style=header,grid --line-range :80 "$(ghq root)"/{}/README.* 2>/dev/null') || return + [[ -n "$src" ]] && cd "$(ghq root)/$src" +} + +hash -d xdata="$XDG_DATA_HOME" +hash -d nvim="$XDG_DATA_HOME/nvim" +hash -d dotfiles="$HOME/dotfiles" diff --git a/nix-configs/home/modules/shell/zsh/files/rc/bindkey.zsh b/nix-configs/home/modules/shell/zsh/files/rc/bindkey.zsh new file mode 100644 index 0000000..e3a3d6c --- /dev/null +++ b/nix-configs/home/modules/shell/zsh/files/rc/bindkey.zsh @@ -0,0 +1,26 @@ +# Use emacs keybinds. +bindkey -e +bindkey -r '^X^F' + +zle -N ghq-fzf +bindkey '^g' ghq-fzf + +zle -N fancy-ctrl-z +bindkey '^Z' fancy-ctrl-z + +autoload -Uz history-search-end +zle -N history-beginning-search-backward-end history-search-end +zle -N history-beginning-search-forward-end history-search-end +bindkey '^p' history-beginning-search-backward-end +bindkey '^n' history-beginning-search-forward-end + +autoload -Uz smart-insert-last-word +zle -N insert-last-word smart-insert-last-word +bindkey '^[.' insert-last-word + +autoload -Uz edit-command-line +zle -N edit-command-line +bindkey '^[e' edit-command-line + +bindkey '^X^R' redo +bindkey '^Xr' redo diff --git a/nix-configs/home/modules/shell/zsh/files/rc/functions/fancy-ctrl-z b/nix-configs/home/modules/shell/zsh/files/rc/functions/fancy-ctrl-z new file mode 100644 index 0000000..c5be513 --- /dev/null +++ b/nix-configs/home/modules/shell/zsh/files/rc/functions/fancy-ctrl-z @@ -0,0 +1,9 @@ +#!/usr/bin/env zsh + +if [[ $#BUFFER -eq 0 ]]; then + BUFFER=' fg' + zle accept-line +else + zle push-input +fi +zle clear-screen diff --git a/nix-configs/home/modules/shell/zsh/files/rc/functions/ghq-fzf b/nix-configs/home/modules/shell/zsh/files/rc/functions/ghq-fzf new file mode 100644 index 0000000..568357b --- /dev/null +++ b/nix-configs/home/modules/shell/zsh/files/rc/functions/ghq-fzf @@ -0,0 +1,14 @@ +#!/usr/bin/env zsh + +if ! command -v ghq >/dev/null 2>&1 || ! command -v fzf >/dev/null 2>&1; then + zle -M 'ghq and fzf are required' + return 1 +fi + +local src +src=$(ghq list | fzf --preview 'bat --color=always --style=header,grid --line-range :80 "$(ghq root)"/{}/README.* 2>/dev/null') +if [[ -n "$src" ]]; then + BUFFER="cd $(ghq root)/$src" + zle accept-line +fi +zle -R -c diff --git a/nix-configs/home/modules/shell/zsh/files/rc/functions/nix b/nix-configs/home/modules/shell/zsh/files/rc/functions/nix new file mode 100644 index 0000000..4bd08b6 --- /dev/null +++ b/nix-configs/home/modules/shell/zsh/files/rc/functions/nix @@ -0,0 +1,34 @@ +#!/usr/bin/env zsh +# `nix develop` を素の bash ではなく zsh で起動するラッパー。 +# 普段の対話環境 (alias / starship / 補完 / zoxide など) を保ったまま +# dev shell に入れるようにする。 +# +# 介入するのは「対話的に dev shell へ入ろうとしている」場合だけ: +# - stdout が tty (パイプや CI、スクリプト経由では介入しない) +# - サブコマンドが develop +# - ユーザーが自分で実行コマンドを指定していない (-c/--command など) +# それ以外は素の nix にそのまま委譲する。 + +emulate -L zsh + +if [[ "$1" == "develop" && -t 1 ]]; then + local arg + for arg in "$@"; do + case "$arg" in + -c | --command | -h | --help | --version) + command nix "$@" + return + ;; + esac + done + # dev shell 内では starship を Nix テーマ配色に差し替える (子 zsh の環境だけに適用)。 + local nix_starship="$XDG_CONFIG_HOME/zsh/starship-nix.toml" + if [[ -r "$nix_starship" ]]; then + STARSHIP_CONFIG="$nix_starship" command nix "$@" --command zsh + else + command nix "$@" --command zsh + fi + return +fi + +command nix "$@" diff --git a/nix-configs/home/modules/shell/zsh/files/rc/functions/nix-shell b/nix-configs/home/modules/shell/zsh/files/rc/functions/nix-shell new file mode 100644 index 0000000..3f24d71 --- /dev/null +++ b/nix-configs/home/modules/shell/zsh/files/rc/functions/nix-shell @@ -0,0 +1,27 @@ +#!/usr/bin/env zsh +# `nix-shell` (旧 API) も同様に zsh で起動するラッパー。 +# nix() の develop 版と同じ方針: 対話的に入る場合だけ --command zsh を補う。 + +emulate -L zsh + +if [[ -t 1 ]]; then + local arg + for arg in "$@"; do + case "$arg" in + --run | --command | --exec | -h | --help | --version) + command nix-shell "$@" + return + ;; + esac + done + # nix() と同様に dev shell 内では starship を Nix テーマ配色に差し替える。 + local nix_starship="$XDG_CONFIG_HOME/zsh/starship-nix.toml" + if [[ -r "$nix_starship" ]]; then + STARSHIP_CONFIG="$nix_starship" command nix-shell "$@" --command zsh + else + command nix-shell "$@" --command zsh + fi + return +fi + +command nix-shell "$@" diff --git a/nix-configs/home/modules/shell/zsh/files/rc/functions/yy b/nix-configs/home/modules/shell/zsh/files/rc/functions/yy new file mode 100644 index 0000000..94e1ac5 --- /dev/null +++ b/nix-configs/home/modules/shell/zsh/files/rc/functions/yy @@ -0,0 +1,9 @@ +#!/usr/bin/env zsh + +local tmp cwd +tmp="$(mktemp -t 'yazi-cwd.XXXXXX')" +yazi "$@" --cwd-file="$tmp" +if cwd="$(command cat -- "$tmp")" && [[ -n "$cwd" && "$cwd" != "$PWD" ]]; then + builtin cd -- "$cwd" +fi +rm -f -- "$tmp" diff --git a/nix-configs/home/modules/shell/zsh/files/rc/option.zsh b/nix-configs/home/modules/shell/zsh/files/rc/option.zsh new file mode 100644 index 0000000..2dec7b3 --- /dev/null +++ b/nix-configs/home/modules/shell/zsh/files/rc/option.zsh @@ -0,0 +1,26 @@ +setopt correct + +setopt extended_history +setopt share_history +setopt hist_verify +setopt hist_ignore_dups +setopt hist_ignore_all_dups +setopt hist_ignore_space +setopt hist_no_store +setopt hist_reduce_blanks +setopt hist_save_no_dups +setopt hist_expand +setopt inc_append_history + +setopt auto_cd +setopt auto_pushd +setopt pushd_ignore_dups + +unsetopt bg_nice +setopt list_packed +setopt no_beep +unsetopt list_types + +if [[ -t 0 ]]; then + stty -ixon +fi diff --git a/nix-configs/home/modules/shell/zsh/files/starship-nix.toml b/nix-configs/home/modules/shell/zsh/files/starship-nix.toml new file mode 100644 index 0000000..7ec147e --- /dev/null +++ b/nix-configs/home/modules/shell/zsh/files/starship-nix.toml @@ -0,0 +1,120 @@ +add_newline = true + +# ---------------------------------------------------- +# format +# ---------------------------------------------------- +format = """ +$username\ +$directory\ +$git_branch\ +$git_status\ +$direnv\ +$nix_shell\ +$python\ +$aws\ +$fill\ +$cmd_duration\ +$time\ +\n$character\ +""" + +# Enable if it appears on the same line as the command +# right_format = """ +# $cmd_duration\ +# $time\ +# """ + +# ---------------------------------------------------- +# left module +# ---------------------------------------------------- +[username] +show_always = true +format = "[ $user ]($style)" +style_user = 'bold fg:#7ebae4' +style_root = 'bold fg:#f38ba8' +[python] +format = """ +[](fg:#f9e2af)\ +[$virtualenv]($style)\ +[](fg:#f9e2af)\ +""" +style = "bold fg:#313244 bg:#f9e2af" + +[fill] +symbol = '─' +[directory] +truncation_length = 6 +truncation_symbol = ' ' +truncate_to_repo = false +home_symbol = '~' +read_only = ' 󰌾 ' +format = """ +[](fg:#7ebae4)\ +[$path]($style)\ +[$read_only]($read_only_style)\ +[](fg:#7ebae4)\ +""" +style = 'bold fg:#313244 bg:#7ebae4' +read_only_style = 'bold fg:#313244 bg:#7ebae4' +[directory.substitutions] +"~/Project/github.com/" = " " +"Project/github.com/" = " " +"~/Project/github.com" = "" +"Project/github.com" = "" +"~/Project/gitlab.com/" = " " +"Project/gitlab.com/" = " " +"~/Project/gitlab.com" = "" +"Project/gitlab.com" = "" + +[direnv] +disabled = false +format = """ +[](fg:#5277c3)\ +[$symbol$allowed]($style)\ +[](fg:#5277c3)\ +""" +style = "bold fg:#e6eefb bg:#5277c3" + +[nix_shell] +disabled = false +symbol = " " +format = """ +[](fg:#5277c3)\ +[$symbol$state]($style)\ +[](fg:#5277c3)\ +""" +style = "bold fg:#e6eefb bg:#5277c3" + +[git_branch] +symbol = "" +style = "fg:#7ebae4 bg:#1d2230" +format = """ +[](fg:#1d2230)\ +[$symbol $branch]($style)\ +""" + +[git_status] +style = "fg:#7ebae4 bg:#1d2230" +format = """ +[$all_status$ahead_behind]($style)\ +[](fg:#1d2230)\ +""" + +# ---------------------------------------------------- +# right module +# ---------------------------------------------------- +[cmd_duration] +min_time = 1 +style = 'fg:#fab387' +format = "[ $duration]($style)" # nf-pl-right_soft_divider, nf-mdi-clock + +[time] +disabled = false +time_format = "%R" # Hour:Minute Format +format = '[[  $time](fg:#7ebae4)]($style)' + +# ---------------------------------------------------- +# prompt module +# ---------------------------------------------------- +[character] +vimcmd_symbol = '[V](bold green) ' diff --git a/nix-configs/home/modules/xdg/files.nix b/nix-configs/home/modules/xdg/files.nix new file mode 100644 index 0000000..0524137 --- /dev/null +++ b/nix-configs/home/modules/xdg/files.nix @@ -0,0 +1,7 @@ +{config, ...}: let + link = path: config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/dotfiles/${path}"; +in { + xdg.configFile = { + "fcitx5/config".source = link "mutable/nixos/fcitx5/config"; + }; +} diff --git a/nix-configs/home/modules/xdg/mime-apps.nix b/nix-configs/home/modules/xdg/mime-apps.nix new file mode 100644 index 0000000..049a84a --- /dev/null +++ b/nix-configs/home/modules/xdg/mime-apps.nix @@ -0,0 +1,42 @@ +{ + xdg = { + mimeApps = { + enable = true; + defaultApplications = { + "application/xhtml+xml" = "brave-browser.desktop"; + "audio/aac" = "mpv.desktop"; + "audio/flac" = "mpv.desktop"; + "audio/mpeg" = "mpv.desktop"; + "audio/ogg" = "mpv.desktop"; + "audio/opus" = "mpv.desktop"; + "audio/wav" = "mpv.desktop"; + "audio/x-m4a" = "mpv.desktop"; + "image/avif" = "imv.desktop"; + "image/bmp" = "imv.desktop"; + "image/gif" = "imv.desktop"; + "image/jpeg" = "imv.desktop"; + "image/png" = "imv.desktop"; + "image/svg+xml" = "imv.desktop"; + "image/tiff" = "imv.desktop"; + "image/webp" = "imv.desktop"; + "inode/directory" = "org.gnome.Nautilus.desktop"; + "video/mp4" = "mpv.desktop"; + "video/mpeg" = "mpv.desktop"; + "video/quicktime" = "mpv.desktop"; + "video/webm" = "mpv.desktop"; + "video/x-matroska" = "mpv.desktop"; + "video/x-msvideo" = "mpv.desktop"; + "text/html" = "brave-browser.desktop"; + "x-scheme-handler/about" = "brave-browser.desktop"; + "x-scheme-handler/claude-cli" = "claude-code-url-handler.desktop"; + "x-scheme-handler/discord" = "vesktop.desktop"; + "x-scheme-handler/http" = "brave-browser.desktop"; + "x-scheme-handler/https" = "brave-browser.desktop"; + "x-scheme-handler/unknown" = "brave-browser.desktop"; + }; + }; + + configFile."mimeapps.list".force = true; + dataFile."applications/mimeapps.list".force = true; + }; +} diff --git a/nix-configs/home/nixvim/plugins.nix b/nix-configs/home/nixvim/plugins.nix deleted file mode 100644 index 88d9f13..0000000 --- a/nix-configs/home/nixvim/plugins.nix +++ /dev/null @@ -1,393 +0,0 @@ -{ - config, - pkgs, - ... -}: let - vimdocJa = pkgs.vimUtils.buildVimPlugin { - pname = "vimdoc-ja"; - version = "2026-07-15"; - src = pkgs.fetchFromGitHub { - owner = "vim-jp"; - repo = "vimdoc-ja"; - rev = "c8c3b339302b4e88be2859b3ba99a4f0a3a2f8bd"; - hash = "sha256-362QsKxCbqXrOru3p+ReoqtfwTLSSblNGzzxTE2DWoI="; - }; - }; - - winresizer = pkgs.vimUtils.buildVimPlugin { - pname = "winresizer"; - version = "2026-07-15"; - src = pkgs.fetchFromGitHub { - owner = "simeji"; - repo = "winresizer"; - rev = "299076f7f79e2e2f7706b2dfacbb3c074ce53257"; - hash = "sha256-rTTe6hFgEz9CFPJFDUjoD3SQr97V5E5Lg6J4c8mU+6s="; - }; - }; -in { - extraPackages = with pkgs; [ - gofumpt - gotools - markdownlint-cli2 - nixfmt - prettier - statix - stylua - ]; - - extraPlugins = with pkgs.vimPlugins; [ - bracey-vim - dracula-nvim - incline-nvim - nvim-ufo - promise-async - vimdocJa - winresizer - ]; - - extraFiles = { - "ftdetect/mdc.lua".source = ./files/ftdetect/mdc.lua; - "ftdetect/zsh.lua".source = ./files/ftdetect/zsh.lua; - "spell/tech.utf-8.add".source = ./files/spell/tech.utf-8.add; - }; - - plugins = { - bufferline.enable = true; - claudecode = { - enable = true; - settings = { - diff_opts = { - layout = "vertical"; - open_in_new_tab = true; - }; - terminal.provider = "snacks"; - }; - }; - compiler.enable = true; - diffview.enable = true; - emmet.enable = true; - flash.enable = true; - gitsigns.enable = true; - grug-far.enable = true; - hlchunk = { - enable = true; - settings.chunk = { - chars = { - horizontal_line = "─"; - left_bottom = "╰"; - left_top = "╭"; - right_arrow = ">"; - vertical_line = "│"; - }; - enable = true; - style = "#806d9c"; - }; - }; - img-clip = { - enable = true; - settings.default = { - dir_path = "assets"; - extension = "png"; - prompt_for_file_name = true; - relative_to_current_file = true; - show_dir_path_in_prompt = false; - use_absolute_path = false; - }; - }; - inc-rename.enable = true; - lualine = { - enable = true; - settings.options.theme = "dracula-nvim"; - }; - markdown-preview = { - enable = true; - settings = { - auto_close = 0; - browser = ""; - combine_preview = 0; - combine_preview_auto_refresh = 1; - filetypes = ["markdown"]; - open_to_the_world = 0; - theme = "dark"; - }; - }; - mini = { - enable = true; - modules = { - ai = {}; - hipatterns = {}; - pairs = {}; - surround = { - mappings = { - add = "gsa"; - delete = "gsd"; - find = "gsf"; - find_left = "gsF"; - highlight = "gsh"; - replace = "gsr"; - update_n_lines = "gsn"; - }; - }; - }; - }; - modicator = { - enable = true; - settings = { - highlights.defaults.bold = true; - integration.lualine.enabled = false; - show_warnings = false; - }; - }; - noice = { - enable = true; - settings = { - lsp = { - hover = { - enabled = true; - silent = true; - }; - signature.enabled = true; - }; - presets = { - bottom_search = true; - command_palette = true; - inc_rename = true; - long_message_to_split = true; - lsp_doc_border = true; - }; - routes = [ - { - filter = { - event = "msg_show"; - find = "written"; - kind = ""; - }; - opts.skip = true; - } - { - filter = { - event = "msg_show"; - kind = "search_count"; - }; - opts.skip = true; - } - ]; - }; - }; - notify = { - enable = true; - settings = { - background_colour = "#1e1e2e"; - render = "compact"; - stages = "fade"; - timeout = 3000; - }; - }; - persistence.enable = true; - rainbow-delimiters.enable = true; - render-markdown.enable = true; - rustaceanvim.enable = true; - smear-cursor = { - enable = true; - settings = { - distance_stop_animating = 0.5; - hide_target_hack = false; - stiffness = 0.8; - trailing_exponent = 2; - trailing_stiffness = 0.5; - }; - }; - snacks = { - enable = true; - settings = { - image = { - doc = { - enabled = true; - inline = true; - max_height = 40; - max_width = 80; - }; - enabled = true; - }; - scroll.enabled = false; - }; - }; - todo-comments.enable = true; - treesitter = { - enable = true; - grammarPackages = with config.plugins.treesitter.package.builtGrammars; [ - bash - c - css - dockerfile - go - html - javascript - json - lua - markdown - markdown_inline - nix - python - rust - scss - toml - tsx - typescript - vim - vimdoc - yaml - zsh - ]; - highlight.enable = true; - indent.enable = true; - }; - treesitter-context = { - enable = true; - settings = { - max_lines = 3; - min_window_height = 20; - mode = "cursor"; - multiline_threshold = 1; - trim_scope = "outer"; - }; - }; - trouble.enable = true; - ts-autotag.enable = true; - ts-comments.enable = true; - venv-selector.enable = true; - web-devicons.enable = true; - which-key.enable = true; - yazi = { - enable = true; - settings = { - keymaps.show_help = ""; - open_for_directories = false; - }; - }; - }; - - extraConfigLuaPost = '' - local function markdown_fold_provider(buffer) - local lines, folds, blocks, headings = vim.api.nvim_buf_get_lines(buffer, 0, -1, false), {}, {}, {} - local in_code, code_start = false, nil - local function trim_empty(last) - while last > 0 and lines[last + 1] and lines[last + 1]:match("^%s*$") do last = last - 1 end - return last - end - local function close_headings(level, last) - while #headings > 0 and headings[#headings].level >= level do - local heading = table.remove(headings) - local finish = trim_empty(last - 1) - if finish > heading.line then table.insert(folds, { startLine = heading.line, endLine = finish }) end - end - end - for index, line in ipairs(lines) do - local line_number = index - 1 - if line:match("^```") or line:match("^~~~") then - if in_code then - in_code = false - if line_number > code_start then table.insert(folds, { startLine = code_start, endLine = line_number }) end - else - in_code, code_start = true, line_number - end - end - if not in_code then - if line:match("^:::details") or line:match("^:::message") then - table.insert(blocks, line_number) - elseif line:match("^:::$") and #blocks > 0 then - table.insert(folds, { startLine = table.remove(blocks), endLine = line_number }) - end - local hashes = line:match("^(#+)%s") - if hashes then - close_headings(#hashes, line_number) - table.insert(headings, { line = line_number, level = #hashes }) - end - end - end - local last = trim_empty(#lines - 1) - for _, heading in ipairs(headings) do - if last > heading.line then table.insert(folds, { startLine = heading.line, endLine = last }) end - end - return folds - end - - local dracula = require("dracula") - dracula.setup({ - italic_comment = true, - overrides = function(colors) - return { - CursorLineNr = { fg = colors.purple, bold = true }, - LineNr = { fg = colors.white }, - LineNrAbove = { fg = colors.white }, - LineNrBelow = { fg = colors.white }, - } - end, - transparent_bg = false, - }) - vim.cmd.colorscheme("dracula") - - vim.o.cursorline = true - vim.o.number = true - vim.o.foldcolumn = "1" - vim.o.foldlevel = 99 - vim.o.foldlevelstart = 99 - vim.o.foldenable = true - require("ufo").setup({ - fold_virt_text_handler = function(virtual_text, start_line, end_line, width, truncate) - local suffix = (" 󰁂 %d "):format(end_line - start_line) - local target_width, current_width = width - vim.fn.strdisplaywidth(suffix), 0 - local result = {} - for _, chunk in ipairs(virtual_text) do - local text, highlight = chunk[1], chunk[2] - local text_width = vim.fn.strdisplaywidth(text) - if target_width > current_width + text_width then - table.insert(result, chunk) - else - text = truncate(text, target_width - current_width) - table.insert(result, { text, highlight }) - suffix = suffix .. string.rep(" ", math.max(0, target_width - current_width - vim.fn.strdisplaywidth(text))) - break - end - current_width = current_width + text_width - end - table.insert(result, { suffix, "MoreMsg" }) - return result - end, - provider_selector = function(buffer, filetype) - if filetype == "markdown" then return markdown_fold_provider end - return { "treesitter", "indent" } - end, - }) - - require("incline").setup({ - hide = { cursorline = true }, - highlight = { - groups = { - InclineNormal = { guibg = "#BD93F9", guifg = "#282A36" }, - InclineNormalNC = { guibg = "#44475A", guifg = "#6272A4" }, - }, - }, - window = { margin = { vertical = 0, horizontal = 1 } }, - }) - - vim.g.bracey_auto_start_browser = 1 - vim.g.bracey_refresh_on_save = 1 - vim.g.bracey_server_allow_remote_connections = 0 - vim.g.user_emmet_leader_key = "" - vim.g.user_emmet_settings = { - variables = { lang = "ja" }, - html = { - indentation = " ", - snippets = { - ["html:5"] = "\n\n\n\t\n\t\n\t\n\t\n\n\n\t''${child}|\n\n", - }, - }, - } - - local spellfiles = vim.fn.globpath(vim.o.runtimepath, "spell/tech.utf-8.add", false, true) - if #spellfiles > 0 then - vim.opt.spellfile = { spellfiles[1], vim.fn.stdpath("data") .. "/spell/local.utf-8.add" } - end - ''; -} diff --git a/nix-configs/home/packages.nix b/nix-configs/home/packages.nix deleted file mode 100644 index a2b79ec..0000000 --- a/nix-configs/home/packages.nix +++ /dev/null @@ -1,12 +0,0 @@ -{...}: { - imports = [ - ./packages/core.nix - ./packages/cli.nix - ./packages/development.nix - ./packages/lsp.nix - ./packages/llm.nix - ./packages/media.nix - ./packages/gaming.nix - ./packages/wayland.nix - ]; -} diff --git a/nix-configs/home/packages/core.nix b/nix-configs/home/packages/core.nix deleted file mode 100644 index 51ecd64..0000000 --- a/nix-configs/home/packages/core.nix +++ /dev/null @@ -1,9 +0,0 @@ -{pkgs, ...}: { - imports = [./core-cli.nix]; - - home.packages = with pkgs; [ - ghostty - wezterm - zed-editor - ]; -} diff --git a/nix-configs/home/packages/wayland.nix b/nix-configs/home/packages/wayland.nix deleted file mode 100644 index aead4d1..0000000 --- a/nix-configs/home/packages/wayland.nix +++ /dev/null @@ -1,62 +0,0 @@ -{pkgs, ...}: let - swaynotificationcenterWithSlideDismiss = pkgs.swaynotificationcenter.overrideAttrs (oldAttrs: { - patches = (oldAttrs.patches or []) ++ [./patches/swaync-control-center-slide.patch]; - postPatch = - (oldAttrs.postPatch or "") - + '' - substituteInPlace data/ui/notification.blp \ - --replace-fail "transition-type: crossfade;" "transition-type: slide_right;" - ''; - }); - - waycal = pkgs.rustPlatform.buildRustPackage rec { - pname = "waycal"; - version = "0.2.0"; - - src = pkgs.fetchFromGitHub { - owner = "forrestknight"; - repo = "waycal"; - rev = "237640a09242408e767d68e2080b0f011fecc8e3"; - hash = "sha256-h/+L1cAVdamfUGcz5wFGgLNcXCq/O3/LSQJ4Ap8kS2E="; - }; - - cargoHash = "sha256-zOOG8vF0d3+X85O6bu0Y5XKNZSjcufKMHXQmZ54jCXw="; - nativeBuildInputs = [pkgs.pkg-config]; - buildInputs = [ - pkgs.gtk4 - pkgs.gtk4-layer-shell - ]; - - postPatch = '' - substituteInPlace src/main.rs \ - --replace-fail '#1a2125' '#1e1e2e' \ - --replace-fail '#8FBC8F' '#cba6f7' \ - --replace-fail '#c9d1d9' '#cdd6f4' \ - --replace-fail '#6a7a71' '#7f849c' \ - --replace-fail 'rgba(26, 33, 37, 0.96)' 'rgba(30, 30, 46, 0.96)' \ - --replace-fail 'rgba(143, 188, 143, 0.18)' 'rgba(203, 166, 247, 0.18)' - ''; - - meta = { - description = "Tiny GTK4 calendar popup for Waybar"; - homepage = "https://www.waycal.dev"; - license = pkgs.lib.licenses.mit; - mainProgram = "waycal"; - }; - }; -in { - home.packages = with pkgs; [ - blueman - brightnessctl - cava - libnotify - networkmanagerapplet - pamixer - swaynotificationcenterWithSlideDismiss - waycal - waybar - wl-clipboard - xwayland-satellite - xdg-utils - ]; -} diff --git a/nix-configs/home/profiles/ci.nix b/nix-configs/home/profiles/ci.nix new file mode 100644 index 0000000..6682494 --- /dev/null +++ b/nix-configs/home/profiles/ci.nix @@ -0,0 +1,13 @@ +{ + imports = [ + ../modules/core/identity.nix + ../modules/core/programs.nix + ../modules/packages/desktop.nix + ../modules/packages/cli.nix + ../modules/shell/zsh.nix + ../modules/agents/apm.nix + ../modules/agents/codex.nix + ../modules/xdg/files.nix + ../modules/xdg/mime-apps.nix + ]; +} diff --git a/nix-configs/home/profiles/workstation.nix b/nix-configs/home/profiles/workstation.nix new file mode 100644 index 0000000..1e9a2c5 --- /dev/null +++ b/nix-configs/home/profiles/workstation.nix @@ -0,0 +1,33 @@ +{...}: { + imports = [ + ../modules/core/identity.nix + ../modules/core/programs.nix + ../modules/shell/zsh.nix + ../modules/packages/desktop.nix + ../modules/packages/cli.nix + ../modules/packages/development.nix + ../modules/packages/language-servers.nix + ../modules/packages/ai.nix + ../modules/packages/media.nix + ../modules/packages/gaming.nix + ../modules/packages/wayland.nix + ../modules/desktop/appearance.nix + ../modules/desktop/quick-shell.nix + ../modules/desktop/niri.nix + ../modules/desktop/lockscreen.nix + ../modules/desktop/wallpaper.nix + ../modules/desktop/swaync.nix + ../modules/desktop/waybar.nix + ../modules/apps/razer.nix + ../modules/apps/vr.nix + ../modules/editors/nixvim + ../modules/apps/firefox.nix + ../modules/apps/vicinae.nix + ../modules/apps/spotify.nix + ../modules/agents/apm.nix + ../modules/agents/codex.nix + ../modules/agents/codex-desktop.nix + ../modules/xdg/files.nix + ../modules/xdg/mime-apps.nix + ]; +} diff --git a/nix-configs/home/profiles/wsl.nix b/nix-configs/home/profiles/wsl.nix new file mode 100644 index 0000000..f5b3316 --- /dev/null +++ b/nix-configs/home/profiles/wsl.nix @@ -0,0 +1,9 @@ +{ + imports = [ + ../modules/core/identity.nix + ../modules/core/programs.nix + ../modules/packages/core-cli.nix + ../modules/packages/cli.nix + ../modules/shell/zsh.nix + ]; +} diff --git a/nix-configs/home/programs.nix b/nix-configs/home/programs.nix deleted file mode 100644 index 719a723..0000000 --- a/nix-configs/home/programs.nix +++ /dev/null @@ -1,3 +0,0 @@ -{...}: { - imports = [./programs-cli.nix]; -} diff --git a/nix-configs/home/xdg.nix b/nix-configs/home/xdg.nix deleted file mode 100644 index e18b68d..0000000 --- a/nix-configs/home/xdg.nix +++ /dev/null @@ -1,206 +0,0 @@ -{ - config, - lib, - pkgs, - llm-agents, - ... -}: let - # link (out-of-store): mkOutOfStoreSymlink で store の外にある「書き込み可能な実体」を指す。 - # dotfilesDir (= self.outPath) は store 内 (読み取り専用) なので、ライブの作業ツリー - # (~/dotfiles) を基準に symlink を張る。プログラム自身が設定 dir/file へ書き戻すもの - # (lazygit の state.yml、zsh の .zwc、codex/claude のランタイム状態、 - # GUI 由来で再書き込みされる fcitx5 など) に使う。編集に rebuild は不要。 - link = path: config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/dotfiles/${path}"; - - # store (in-store): path をそのまま nix store へコピーし、読み取り専用で配置する。 - # プログラムが書き込まない静的設定に使う。変更には rebuild (just os-switch) が必要になる - # 代わりに再現性が上がり、誤編集で壊れない。flake 評価で参照するため対象は Git track 必須。 - store = path: ../../. + "/${path}"; - - claudeSettings = lib.recursiveUpdate (builtins.fromJSON (builtins.readFile (store "dot_config/shared/claude/settings.json"))) ( - builtins.fromJSON (builtins.readFile (store "dot_config/nixos/claude/settings.hooks.json")) - ); -in { - xdg = { - mimeApps = { - enable = true; - defaultApplications = { - "application/xhtml+xml" = "brave-browser.desktop"; - "audio/aac" = "mpv.desktop"; - "audio/flac" = "mpv.desktop"; - "audio/mpeg" = "mpv.desktop"; - "audio/ogg" = "mpv.desktop"; - "audio/opus" = "mpv.desktop"; - "audio/wav" = "mpv.desktop"; - "audio/x-m4a" = "mpv.desktop"; - "image/avif" = "imv.desktop"; - "image/bmp" = "imv.desktop"; - "image/gif" = "imv.desktop"; - "image/jpeg" = "imv.desktop"; - "image/png" = "imv.desktop"; - "image/svg+xml" = "imv.desktop"; - "image/tiff" = "imv.desktop"; - "image/webp" = "imv.desktop"; - "inode/directory" = "org.gnome.Nautilus.desktop"; - "video/mp4" = "mpv.desktop"; - "video/mpeg" = "mpv.desktop"; - "video/quicktime" = "mpv.desktop"; - "video/webm" = "mpv.desktop"; - "video/x-matroska" = "mpv.desktop"; - "video/x-msvideo" = "mpv.desktop"; - "text/html" = "brave-browser.desktop"; - "x-scheme-handler/about" = "brave-browser.desktop"; - "x-scheme-handler/claude-cli" = "claude-code-url-handler.desktop"; - "x-scheme-handler/discord" = "vesktop.desktop"; - "x-scheme-handler/http" = "brave-browser.desktop"; - "x-scheme-handler/https" = "brave-browser.desktop"; - "x-scheme-handler/unknown" = "brave-browser.desktop"; - }; - }; - - configFile = { - "mimeapps.list".force = true; - # in-store: プログラムが書き込まない静的設定。 - "fastfetch".source = store "dot_config/shared/fastfetch"; - "starship.toml".source = store "dot_config/shared/starship.toml"; - "vim".source = store "dot_config/shared/vim"; - "wezterm".source = store "dot_config/shared/wezterm"; - "yazi".source = store "dot_config/shared/yazi"; - # out-of-store: プログラム自身が dir/file へ書き戻すもの。 - "lazygit".source = link "dot_config/shared/lazygit"; # state.yml を書き込む - "zed".source = link "dot_config/shared/zed"; # GUI 設定変更で settings.json を書き戻す - "zsh/rc".source = link "dot_config/nixos/zsh/rc"; # .zwc を zcompile する - "fcitx5/config".source = link "dot_config/nixos/fcitx5/config"; # GUI 設定で再書き込み - }; - - dataFile."applications/mimeapps.list".force = true; - }; - - home.file = { - # in-store: プログラムが書き込まない静的設定。 - ".git_template/hooks".source = store ".git_template/hooks"; - ".codex/AGENTS.md".source = store "dot_config/shared/codex/AGENTS.md"; - ".codex/agents".source = store "dot_config/shared/codex/agents"; - ".codex/rules".source = store "dot_config/shared/codex/rules"; - ".claude/CLAUDE.md".source = store "dot_config/shared/claude/CLAUDE.md"; - ".claude/agents".source = store "dot_config/shared/claude/agents"; - ".claude/statusline.sh".source = store "dot_config/shared/claude/statusline.sh"; - ".claude/claude-icon.svg".source = store "dot_config/shared/claude/claude-icon.svg"; - ".claude/claude-notify-hook.sh" = { - source = store "dot_config/nixos/claude/claude-notify-hook.sh"; - executable = true; - }; - - # out-of-store: プログラム自身が書き戻すもの。 - ".gitconfig".source = link ".gitconfig"; # git config --global で書き込む - # .codex/config.toml は home.activation.seedCodexConfig で管理する (下記)。 - # out-of-store symlink にすると codex が marketplaces/plugins/mcp_servers 等の実行時状態を - # dotfiles の git 追跡ファイルへ書き戻し汚染するため、静的テンプレートから初回シードした - # 「実ファイル」を codex に所有させ、git ツリーから切り離す。 - ".claude/skills".source = link "dot_config/shared/apm/.claude/skills"; # apm install の生成物 - }; - - # Claude settings.json: 共通 base に NixOS 固有 hooks をマージして生成する。 - # Windows 側の setup_windows.ps1 と同じく、通知 hook の依存は OS 固有ディレクトリに閉じ込める。 - home.activation.generateClaudeSettings = lib.hm.dag.entryAfter ["writeBoundary"] '' - claude_dir="${config.home.homeDirectory}/.claude" - mkdir -p "$claude_dir" - rm -f "$claude_dir/settings.json" - cat > "$claude_dir/settings.json" <<'EOF' - ${builtins.toJSON claudeSettings} - EOF - chmod 0644 "$claude_dir/settings.json" - ''; - - # Codex config.toml: 静的テンプレートから ~/.codex/config.toml を「実ファイル」として初回シードする。 - # codex は起動時に marketplaces/plugins/mcp_servers 等をこのファイルへ書き戻すため、out-of-store - # symlink にすると dotfiles の git 追跡ファイルが汚染される。実ファイル化して codex に所有させ、 - # dotfiles 側は静的な初期値テンプレートとしてのみ保持する (再生成可能に保つ)。 - # 既存が symlink (旧構成の名残) または未作成の場合のみテンプレートで初期化し、実ファイルは温存する。 - home.activation.seedCodexConfig = lib.hm.dag.entryAfter ["writeBoundary"] '' - codex_cfg="${config.home.homeDirectory}/.codex/config.toml" - codex_tmpl="${config.home.homeDirectory}/dotfiles/dot_config/shared/codex/config.toml" - mkdir -p "${config.home.homeDirectory}/.codex" - if [ -L "$codex_cfg" ] || [ ! -e "$codex_cfg" ]; then - rm -f "$codex_cfg" - cp "$codex_tmpl" "$codex_cfg" - chmod u+w "$codex_cfg" - fi - ''; - - # Codex の設定と Desktop の thread state は実行時に書き換えられるため、 - # 過去の root-wide write を安全な値へ一度だけ移行する。 - home.activation.migrateCodexSandboxState = lib.hm.dag.entryAfter ["seedCodexConfig"] '' - codex_dir="${config.home.homeDirectory}/.codex" - codex_cfg="$codex_dir/config.toml" - - # 旧 personal profile の `:root = "write"` は workspace root として `/` を - # Desktop に渡し得る。現在のテンプレートと同じ read-only root に揃える。 - if [ -f "$codex_cfg" ] \ - && ${pkgs.gnugrep}/bin/grep -q '^default_permissions = "personal"$' "$codex_cfg" \ - && ${pkgs.gnugrep}/bin/grep -q '^":root" = "write"$' "$codex_cfg"; then - ${pkgs.gnused}/bin/sed -i 's/^":root" = "write"$/":root" = "read"/' "$codex_cfg" - fi - - # Retained roots are merged into later Desktop requests. Remove only `/` from - # this specific state key; project roots and all other Codex state are preserved. - for state_file in "$codex_dir/.codex-global-state.json" "$codex_dir/.codex-global-state.json.bak"; do - [ -f "$state_file" ] || continue - if ${pkgs.jq}/bin/jq -e ' - any( - ((.["thread-writable-roots"] // {}) | to_entries[]?.value?); - type == "array" and any(.[]; . == "/") - ) - ' "$state_file" >/dev/null; then - state_tmp="$state_file.tmp.$$" - if ${pkgs.jq}/bin/jq ' - if type == "object" and (.["thread-writable-roots"] | type) == "object" then - .["thread-writable-roots"] |= with_entries( - .value |= if type == "array" then map(select(. != "/")) else . end - ) - else - . - end - ' "$state_file" > "$state_tmp"; then - ${pkgs.coreutils}/bin/chmod --reference="$state_file" "$state_tmp" - ${pkgs.coreutils}/bin/mv "$state_tmp" "$state_file" - else - ${pkgs.coreutils}/bin/rm -f "$state_tmp" - fi - fi - done - ''; - - # apm install: dot_config/shared/apm/packages//.apm/skills/から各targetのskills dirへdeployする。 - # APMはCodex向けskillを`.agents/skills`に生成する。Codexは~/.codex/skills/.systemを保持する必要があるため、skillごとのリンクを後段で作る。 - home.activation.apmInstallSkills = lib.hm.dag.entryAfter ["writeBoundary"] '' - cd "${config.home.homeDirectory}/dotfiles/dot_config/shared/apm" - # activation は systemd 環境で走るため ~/.zshenv は読まれない。gh CLI の keyring からトークンを渡し、 - # apm install が mizchi/skills などを clone する際に GitHub 認証が通るようにする。 - export GITHUB_TOKEN="$(${pkgs.gh}/bin/gh auth token 2>/dev/null || true)" - ${llm-agents.packages.${pkgs.system}.apm}/bin/apm install - ''; - - home.activation.linkCodexSkills = lib.hm.dag.entryAfter ["apmInstallSkills"] '' - source_dir="${config.home.homeDirectory}/dotfiles/dot_config/shared/apm/.agents/skills" - target_dir="${config.home.homeDirectory}/.codex/skills" - mkdir -p "$target_dir" - find "$target_dir" -maxdepth 1 -type l -lname "$source_dir/*" -delete - for skill in "$source_dir"/*; do - [ -d "$skill" ] || continue - ln -sfn "$skill" "$target_dir/$(basename "$skill")" - done - ''; - - # opencode 向け skill: apm 生成物 (.agents/skills) を ~/.config/opencode/skills/ へ張る。 - home.activation.linkOpencodeSkills = lib.hm.dag.entryAfter ["apmInstallSkills"] '' - source_dir="${config.home.homeDirectory}/dotfiles/dot_config/shared/apm/.agents/skills" - target_dir="${config.home.homeDirectory}/.config/opencode/skills" - mkdir -p "$target_dir" - find "$target_dir" -maxdepth 1 -type l -lname "$source_dir/*" -delete - for skill in "$source_dir"/*; do - [ -d "$skill" ] || continue - ln -sfn "$skill" "$target_dir/$(basename "$skill")" - done - ''; -} diff --git a/nix-configs/hosts/ci/default.nix b/nix-configs/hosts/ci/default.nix new file mode 100644 index 0000000..670c035 --- /dev/null +++ b/nix-configs/hosts/ci/default.nix @@ -0,0 +1,19 @@ +{ + imports = [ + ../desktop/hardware-configuration.nix + ../../feature/profiles/base.nix + ../../feature/modules/hardware/kernel.nix + ../../feature/modules/hardware/qmk.nix + ../../feature/modules/hardware/xkb.nix + ../../feature/modules/services/bluetooth.nix + ../../feature/modules/services/docker.nix + ../../feature/modules/services/networkmanager.nix + ../../feature/modules/services/tailscale.nix + ]; + + networking.hostName = "nixos"; + system.stateVersion = "26.05"; + + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; +} diff --git a/nix-configs/hosts/desktop/default.nix b/nix-configs/hosts/desktop/default.nix index 2b42c93..8ba0df2 100644 --- a/nix-configs/hosts/desktop/default.nix +++ b/nix-configs/hosts/desktop/default.nix @@ -1,14 +1,12 @@ { imports = [ ./hardware-configuration.nix - ../../modules - ../../modules/lanzaboote.nix - ../../modules/plymouth.nix - ../../profiles/desktop.nix - ../../profiles/nvidia.nix - ../../profiles/gaming.nix - ../../profiles/vr.nix - ../../profiles/desktop-apps.nix + ../../feature/profiles/workstation.nix + ../../feature/modules/hardware/lanzaboote.nix + ../../feature/modules/desktop/plymouth.nix + ../../feature/modules/hardware/nvidia.nix + ../../feature/profiles/gaming.nix + ../../feature/profiles/vr.nix ]; networking.hostName = "desktop"; @@ -16,32 +14,6 @@ t4ko.regreet.mainOutput = "DP-2"; - home-manager.users.t4ko.t4ko.niri.monitors = { - "DP-1" = { - mode = "1920x1080@144.000"; - position = { - x = 3840; - y = -840; - }; - transform = "90"; - }; - "DP-2" = { - focusAtStartup = true; - mode = "1920x1080@360.000"; - position = { - x = 0; - y = 0; - }; - }; - "HDMI-A-1" = { - mode = "1920x1080@75.000"; - position = { - x = 1920; - y = 0; - }; - }; - }; - boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; } diff --git a/nix-configs/hosts/desktop/home.nix b/nix-configs/hosts/desktop/home.nix new file mode 100644 index 0000000..76a3819 --- /dev/null +++ b/nix-configs/hosts/desktop/home.nix @@ -0,0 +1,29 @@ +{ + imports = [../../home/profiles/workstation.nix]; + + t4ko.niri.monitors = { + "DP-1" = { + mode = "1920x1080@144.000"; + position = { + x = 3840; + y = -840; + }; + transform = "90"; + }; + "DP-2" = { + focusAtStartup = true; + mode = "1920x1080@360.000"; + position = { + x = 0; + y = 0; + }; + }; + "HDMI-A-1" = { + mode = "1920x1080@75.000"; + position = { + x = 1920; + y = 0; + }; + }; + }; +} diff --git a/nix-configs/hosts/laptop/default.nix b/nix-configs/hosts/laptop/default.nix index af8c76f..2364bd6 100644 --- a/nix-configs/hosts/laptop/default.nix +++ b/nix-configs/hosts/laptop/default.nix @@ -1,13 +1,11 @@ { imports = [ ./hardware-configuration.nix - ../../modules - ../../modules/plymouth.nix - ../../profiles/desktop.nix - ../../profiles/nvidia-hybrid.nix - ../../profiles/gaming.nix - # ../../profiles/vr.nix - ../../profiles/desktop-apps.nix + ../../feature/profiles/workstation.nix + ../../feature/modules/desktop/plymouth.nix + ../../feature/modules/hardware/nvidia-hybrid.nix + ../../feature/profiles/gaming.nix + # ../../feature/profiles/vr.nix ]; networking.hostName = "laptop"; @@ -48,24 +46,6 @@ ]; }; - home-manager.users.t4ko.t4ko.niri.monitors = { - "eDP-1" = { - mode = "1920x1080@165.016"; - position = { - x = 0; - y = 0; - }; - }; - "HDMI-A-1" = { - focusAtStartup = true; - mode = "1920x1080@60.000"; - position = { - x = 1920; - y = 0; - }; - }; - }; - boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; } diff --git a/nix-configs/hosts/laptop/home.nix b/nix-configs/hosts/laptop/home.nix new file mode 100644 index 0000000..e4e501a --- /dev/null +++ b/nix-configs/hosts/laptop/home.nix @@ -0,0 +1,21 @@ +{ + imports = [../../home/profiles/workstation.nix]; + + t4ko.niri.monitors = { + "eDP-1" = { + mode = "1920x1080@165.016"; + position = { + x = 0; + y = 0; + }; + }; + "HDMI-A-1" = { + focusAtStartup = true; + mode = "1920x1080@60.000"; + position = { + x = 1920; + y = 0; + }; + }; + }; +} diff --git a/nix-configs/hosts/wsl/default.nix b/nix-configs/hosts/wsl/default.nix index 60784bd..9427523 100644 --- a/nix-configs/hosts/wsl/default.nix +++ b/nix-configs/hosts/wsl/default.nix @@ -1,9 +1,6 @@ {username, ...}: { imports = [ - ../../modules/nh.nix - ../../modules/nix.nix - ../../modules/unfree.nix - ../../modules/users.nix + ../../feature/profiles/wsl.nix ]; networking.hostName = "nixos-wsl"; @@ -26,7 +23,5 @@ }; }; - programs.nix-ld.enable = true; - system.stateVersion = "26.05"; } diff --git a/nix-configs/hosts/wsl/home.nix b/nix-configs/hosts/wsl/home.nix new file mode 100644 index 0000000..f2bbd60 --- /dev/null +++ b/nix-configs/hosts/wsl/home.nix @@ -0,0 +1,3 @@ +{ + imports = [../../home/profiles/wsl.nix]; +} diff --git a/nix-configs/lib/mk-nixos.nix b/nix-configs/lib/mk-nixos.nix new file mode 100644 index 0000000..6ba5b51 --- /dev/null +++ b/nix-configs/lib/mk-nixos.nix @@ -0,0 +1,70 @@ +{ + codex-desktop-linux, + home-manager, + llm-agents, + nixos-loading-plymouth, + nixpkgs, + nixvim, + spotify-cli, + system, + vicinae, +}: { + configuration, + dotfilesDir, + editor ? "nvim", + extraModules ? [], + homeConfiguration, + homeDirectory ? "/home/${username}", + keyboardLayout, + platformModules ? [ + vicinae.nixosModules.default + nixos-loading-plymouth.nixosModules.default + ], + sharedHomeModules ? [ + vicinae.homeManagerModules.default + codex-desktop-linux.homeManagerModules.default + ], + systemOverlays ? [spotify-cli.overlays.default], + userExtraGroups ? [ + "audio" + "input" + "networkmanager" + "plugdev" + "wheel" + ], + username ? "t4ko", +}: let + localPackages = import ../pkgs { + nixosLoadingPlymouth = nixos-loading-plymouth; + pkgs = nixpkgs.legacyPackages.${system}; + }; +in + nixpkgs.lib.nixosSystem { + inherit system; + specialArgs = { + inherit dotfilesDir homeDirectory keyboardLayout localPackages userExtraGroups username; + nixosLoadingPlymouth = nixos-loading-plymouth; + }; + modules = + [ + home-manager.nixosModules.home-manager + configuration + ] + ++ platformModules + ++ extraModules + ++ [ + { + nixpkgs.overlays = systemOverlays; + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + backupFileExtension = "hm-backup"; + extraSpecialArgs = { + inherit dotfilesDir editor homeDirectory keyboardLayout llm-agents localPackages username; + }; + sharedModules = [nixvim.homeModules.nixvim] ++ sharedHomeModules; + users.${username} = import homeConfiguration; + }; + } + ]; + } diff --git a/nix-configs/lib/catppuccin-mocha.nix b/nix-configs/lib/theme.nix similarity index 96% rename from nix-configs/lib/catppuccin-mocha.nix rename to nix-configs/lib/theme.nix index 333612c..c5d7357 100644 --- a/nix-configs/lib/catppuccin-mocha.nix +++ b/nix-configs/lib/theme.nix @@ -1,3 +1,4 @@ +# catpuccin { base = "#1e1e2e"; mantle = "#181825"; diff --git a/nix-configs/modules/default.nix b/nix-configs/modules/default.nix deleted file mode 100644 index 3fd89ec..0000000 --- a/nix-configs/modules/default.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ - imports = [ - ./bluetooth.nix - ./docker.nix - ./kernel.nix - ./locale.nix - ./nh.nix - ./nix.nix - ./networkmanager.nix - ./nix-ld.nix - ./qmk.nix - ./tailscale.nix - ./unfree.nix - ./users.nix - ./xkb.nix - ]; -} diff --git a/nix-configs/modules/plymouth.nix b/nix-configs/modules/plymouth.nix deleted file mode 100644 index 9481fd7..0000000 --- a/nix-configs/modules/plymouth.nix +++ /dev/null @@ -1,53 +0,0 @@ -{ - lib, - nixosLoadingPlymouth, - pkgs, - ... -}: let - themeName = "nixos-loading-default-logs"; - themePackage = pkgs.stdenvNoCC.mkDerivation { - pname = themeName; - version = "0.1.0"; - dontUnpack = true; - - installPhase = '' - themeDir="$out/share/plymouth/themes/${themeName}" - mkdir -p "$themeDir" - cp -r "${nixosLoadingPlymouth.packages.${pkgs.stdenv.hostPlatform.system}.nixos-loading-default}/share/plymouth/themes/nixos-loading-default/." "$themeDir/" - rm "$themeDir/nixos-loading-default.plymouth" - cp "${../assets/plymouth/nixos-loading-logs.script}" "$themeDir/nixos-loading-logs.script" - - cat > "$themeDir/${themeName}.plymouth" </dev/null 2>&1; then + patchelf --add-rpath "$driverLib" "$f" + fi + done + ''; + }); +} diff --git a/nix-configs/pkgs/plymouth-theme/package.nix b/nix-configs/pkgs/plymouth-theme/package.nix new file mode 100644 index 0000000..1f3616e --- /dev/null +++ b/nix-configs/pkgs/plymouth-theme/package.nix @@ -0,0 +1,31 @@ +{ + script, + sourceTheme, + stdenvNoCC, +}: let + themeName = "nixos-loading-default-logs"; +in + stdenvNoCC.mkDerivation { + pname = themeName; + version = "0.1.0"; + dontUnpack = true; + + installPhase = '' + themeDir="$out/share/plymouth/themes/${themeName}" + mkdir -p "$themeDir" + cp -r "${sourceTheme}/share/plymouth/themes/nixos-loading-default/." "$themeDir/" + rm "$themeDir/nixos-loading-default.plymouth" + cp "${script}" "$themeDir/nixos-loading-logs.script" + + cat > "$themeDir/${themeName}.plymouth" <eventloop, 1500, set_input_idle, state" \ + "state->eventloop, 10000, set_input_idle, state" + ''; +}) diff --git a/nix-configs/pkgs/swaynotificationcenter/package.nix b/nix-configs/pkgs/swaynotificationcenter/package.nix new file mode 100644 index 0000000..ec97314 --- /dev/null +++ b/nix-configs/pkgs/swaynotificationcenter/package.nix @@ -0,0 +1,10 @@ +{swaynotificationcenter}: +swaynotificationcenter.overrideAttrs (old: { + patches = (old.patches or []) ++ [./swaync-control-center-slide.patch]; + postPatch = + (old.postPatch or "") + + '' + substituteInPlace data/ui/notification.blp \ + --replace-fail "transition-type: crossfade;" "transition-type: slide_right;" + ''; +}) diff --git a/nix-configs/home/packages/patches/swaync-control-center-slide.patch b/nix-configs/pkgs/swaynotificationcenter/swaync-control-center-slide.patch similarity index 100% rename from nix-configs/home/packages/patches/swaync-control-center-slide.patch rename to nix-configs/pkgs/swaynotificationcenter/swaync-control-center-slide.patch diff --git a/nix-configs/pkgs/vim-plugins/vimdoc-ja/package.nix b/nix-configs/pkgs/vim-plugins/vimdoc-ja/package.nix new file mode 100644 index 0000000..debde17 --- /dev/null +++ b/nix-configs/pkgs/vim-plugins/vimdoc-ja/package.nix @@ -0,0 +1,14 @@ +{ + fetchFromGitHub, + vimUtils, +}: +vimUtils.buildVimPlugin { + pname = "vimdoc-ja"; + version = "2026-07-15"; + src = fetchFromGitHub { + owner = "vim-jp"; + repo = "vimdoc-ja"; + rev = "c8c3b339302b4e88be2859b3ba99a4f0a3a2f8bd"; + hash = "sha256-362QsKxCbqXrOru3p+ReoqtfwTLSSblNGzzxTE2DWoI="; + }; +} diff --git a/nix-configs/pkgs/vim-plugins/winresizer/package.nix b/nix-configs/pkgs/vim-plugins/winresizer/package.nix new file mode 100644 index 0000000..385c2d6 --- /dev/null +++ b/nix-configs/pkgs/vim-plugins/winresizer/package.nix @@ -0,0 +1,14 @@ +{ + fetchFromGitHub, + vimUtils, +}: +vimUtils.buildVimPlugin { + pname = "winresizer"; + version = "2026-07-15"; + src = fetchFromGitHub { + owner = "simeji"; + repo = "winresizer"; + rev = "299076f7f79e2e2f7706b2dfacbb3c074ce53257"; + hash = "sha256-rTTe6hFgEz9CFPJFDUjoD3SQr97V5E5Lg6J4c8mU+6s="; + }; +} diff --git a/nix-configs/pkgs/waycal/package.nix b/nix-configs/pkgs/waycal/package.nix new file mode 100644 index 0000000..5caa6ff --- /dev/null +++ b/nix-configs/pkgs/waycal/package.nix @@ -0,0 +1,40 @@ +{ + fetchFromGitHub, + gtk4, + gtk4-layer-shell, + lib, + pkg-config, + rustPlatform, +}: +rustPlatform.buildRustPackage rec { + pname = "waycal"; + version = "0.2.0"; + + src = fetchFromGitHub { + owner = "forrestknight"; + repo = "waycal"; + rev = "237640a09242408e767d68e2080b0f011fecc8e3"; + hash = "sha256-h/+L1cAVdamfUGcz5wFGgLNcXCq/O3/LSQJ4Ap8kS2E="; + }; + + cargoHash = "sha256-zOOG8vF0d3+X85O6bu0Y5XKNZSjcufKMHXQmZ54jCXw="; + nativeBuildInputs = [pkg-config]; + buildInputs = [gtk4 gtk4-layer-shell]; + + postPatch = '' + substituteInPlace src/main.rs \ + --replace-fail '#1a2125' '#1e1e2e' \ + --replace-fail '#8FBC8F' '#cba6f7' \ + --replace-fail '#c9d1d9' '#cdd6f4' \ + --replace-fail '#6a7a71' '#7f849c' \ + --replace-fail 'rgba(26, 33, 37, 0.96)' 'rgba(30, 30, 46, 0.96)' \ + --replace-fail 'rgba(143, 188, 143, 0.18)' 'rgba(203, 166, 247, 0.18)' + ''; + + meta = { + description = "Tiny GTK4 calendar popup for Waybar"; + homepage = "https://www.waycal.dev"; + license = lib.licenses.mit; + mainProgram = "waycal"; + }; +} diff --git a/nix-configs/profiles/desktop.nix b/nix-configs/profiles/desktop.nix deleted file mode 100644 index bfd27a1..0000000 --- a/nix-configs/profiles/desktop.nix +++ /dev/null @@ -1,103 +0,0 @@ -{ - keyboardLayout, - pkgs, - ... -}: { - imports = [ - ./regreet.nix - ]; - - i18n.inputMethod = { - enable = true; - type = "fcitx5"; - fcitx5 = { - waylandFrontend = true; - addons = with pkgs; [ - fcitx5-mozc - fcitx5-gtk - fcitx5-material-color - qt6Packages.fcitx5-qt - ]; - settings.inputMethod = { - "Groups/0" = { - Name = "Default"; - "Default Layout" = keyboardLayout.fcitxLayout; - DefaultIM = "mozc"; - }; - "Groups/0/Items/0" = { - Name = "keyboard-jp"; - Layout = keyboardLayout.fcitxLayout; - }; - "Groups/0/Items/1" = { - Name = "mozc"; - Layout = keyboardLayout.fcitxLayout; - }; - GroupOrder."0" = "Default"; - }; - }; - }; - - fonts.packages = with pkgs; [ - noto-fonts - noto-fonts-cjk-sans - noto-fonts-cjk-serif - noto-fonts-color-emoji - nerd-fonts.jetbrains-mono - nerd-fonts.symbols-only - plemoljp-nf - ]; - - fonts.fontconfig.defaultFonts = { - monospace = [ - "PlemolJP Console NF" - "Noto Sans Mono CJK JP" - ]; - sansSerif = [ - "Noto Sans CJK JP" - "Noto Sans" - ]; - serif = [ - "Noto Serif CJK JP" - "Noto Serif" - ]; - emoji = ["Noto Color Emoji"]; - }; - - services = { - xserver.enable = false; - - printing.enable = true; - - pulseaudio.enable = false; - pipewire = { - enable = true; - alsa.enable = true; - alsa.support32Bit = true; - pulse.enable = true; - }; - }; - - programs.niri.enable = true; - programs.dconf.enable = true; - - xdg.portal = { - enable = true; - extraPortals = with pkgs; [ - xdg-desktop-portal-gtk - ]; - configPackages = [pkgs.niri]; - }; - - security.polkit.enable = true; - security.rtkit.enable = true; - - environment.sessionVariables = { - NIXOS_OZONE_WL = "1"; - MOZ_ENABLE_WAYLAND = "1"; - GTK_IM_MODULE = "fcitx"; - QT_IM_MODULE = "fcitx"; - XMODIFIERS = "@im=fcitx"; - }; - - hardware.graphics.enable = true; -} diff --git a/nix-configs/profiles/gaming.nix b/nix-configs/profiles/gaming.nix deleted file mode 100644 index 3d4e991..0000000 --- a/nix-configs/profiles/gaming.nix +++ /dev/null @@ -1,18 +0,0 @@ -{pkgs, ...}: { - programs.steam = { - enable = true; - extraCompatPackages = with pkgs; [proton-ge-bin]; - }; - - programs.gamemode.enable = true; - - hardware.graphics.enable32Bit = true; - - # Razer デバイス制御 (OpenRazer カーネルモジュール + デーモン) - # GUI フロントエンドの polychromatic は home/packages/gaming.nix 側で導入済み - hardware.openrazer = { - enable = true; - users = ["t4ko"]; - }; - environment.systemPackages = [pkgs.openrazer-daemon]; -} From bdadf0186b520c8e34d914c907684caa907adbaa Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Sat, 25 Jul 2026 04:09:51 +0900 Subject: [PATCH 22/35] =?UTF-8?q?=E2=9C=85=20nix:=20=E5=85=A8=E6=A7=8B?= =?UTF-8?q?=E6=88=90=E3=81=AE=E5=8F=AF=E7=94=A8=E6=80=A7=E5=A5=91=E7=B4=84?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 8 ++++++ .github/workflows/nixos.yml | 49 ++++++++++++++++++++++++++++++++ docs/memo/vr-setup-2026-06-15.md | 12 ++++---- scripts/check_profiles.sh | 47 ++++++++++++++++++++++++++++++ scripts/check_wsl.sh | 2 +- 5 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/nixos.yml create mode 100644 scripts/check_profiles.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b3c353b..6d92a6c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,6 +2,7 @@ name: Checks on: push: + pull_request: workflow_dispatch: permissions: @@ -26,6 +27,9 @@ jobs: filters: | nix_configs: - 'nix-configs/**' + - 'flake.nix' + - 'flake.lock' + - 'scripts/check_profiles.sh' lint: name: Lint @@ -35,6 +39,10 @@ jobs: name: Chezmoi uses: ./.github/workflows/chezmoi.yml + nixos: + name: NixOS + uses: ./.github/workflows/nixos.yml + publish-cache: name: Publish cache needs: changes diff --git a/.github/workflows/nixos.yml b/.github/workflows/nixos.yml new file mode 100644 index 0000000..1502655 --- /dev/null +++ b/.github/workflows/nixos.yml @@ -0,0 +1,49 @@ +name: NixOS + +on: + workflow_call: + +permissions: + contents: read + +jobs: + contracts: + name: Profile contracts + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Nix + uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - name: Check profile contracts + run: bash scripts/check_profiles.sh + + build: + name: Build ${{ matrix.host }} + runs-on: ubuntu-latest + timeout-minutes: 120 + strategy: + fail-fast: false + matrix: + host: + - laptop + - desktop + - wsl + - nixos-ci + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Nix + uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - name: Build configuration + run: nix build .#nixosConfigurations.${{ matrix.host }}.config.system.build.toplevel diff --git a/docs/memo/vr-setup-2026-06-15.md b/docs/memo/vr-setup-2026-06-15.md index 84fc601..e65efa3 100644 --- a/docs/memo/vr-setup-2026-06-15.md +++ b/docs/memo/vr-setup-2026-06-15.md @@ -30,7 +30,7 @@ NixOS + Meta Quest 3 で VRChat を中心とした VR 環境を構築した際 ### やったこと - `services.wivrn` を導入(`autoStart` / `openFirewall` / `highPriority` / `steam.importOXRRuntimes`)。 -- OpenComposite (`home/vr.nix`) で OpenVR→OpenXR 変換し SteamVR を回避。 +- OpenComposite (`home/modules/apps/vr.nix`) で OpenVR→OpenXR 変換し SteamVR を回避。 - Quest 3 に Meta Store 版 WiVRn アプリをインストール。 ### 試して却下したもの @@ -95,7 +95,7 @@ NixOS + Meta Quest 3 で VRChat を中心とした VR 環境を構築した際 - 機能: デスクトップ画面の VR 内表示 / 仮想キーボード / 手首ウォッチUI (時計・バッテリー)。 - 起動: `wayvr --openxr` - **motoc** (nixpkgs に 0.3.6): プレイスペース調整・フルボディトラッキング校正。OVR Advanced Settings の代替。 -- 導入: `home/vr.nix` の `home.packages` に追加。 +- 導入: `home/modules/apps/vr.nix` の `home.packages` に追加。 - wayvr に無い機能: デスクトップ通知転送・リッチなメディアウィジェット・凝ったテーマ (Linux ネイティブには現状なし)。 ### その他の選択肢 (パラダイム違い) @@ -166,11 +166,11 @@ NixOS + Meta Quest 3 で VRChat を中心とした VR 環境を構築した際 | ファイル | 変更 | |---|---| | `nix-configs/pkgs/wivrn/package.nix` | WiVRn 26.6 を PR #531078 からローカル取り込み (新規) | -| `nix-configs/profiles/vr.nix` | `services.wivrn` (NVENC AV1 10bit / RUNPATH 対応 / importOXRRuntimes) | -| `nix-configs/home/vr.nix` | OpenComposite + openvrpaths.vrpath + wayvr + motoc | +| `nix-configs/feature/profiles/vr.nix` | `services.wivrn` (NVENC AV1 10bit / RUNPATH 対応 / importOXRRuntimes) | +| `nix-configs/home/modules/apps/vr.nix` | OpenComposite + openvrpaths.vrpath + wayvr + motoc | | `nix-configs/configuration.nix` | `./profiles/vr.nix` を import | -| `nix-configs/home.nix` | `./home/vr.nix` を import | -| `nix-configs/home/packages/gaming.nix` | `vrcx` (既存) | +| `nix-configs/home/profiles/workstation.nix` | `../modules/apps/vr.nix` を import | +| `nix-configs/home/modules/packages/gaming.nix` | `vrcx` (既存) | ### 起動フロー diff --git a/scripts/check_profiles.sh b/scripts/check_profiles.sh new file mode 100644 index 0000000..0a8512d --- /dev/null +++ b/scripts/check_profiles.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +set -euo pipefail + +flake="${1:-.}" + +expect() { + local expression=$1 + local expected=$2 + local actual + actual="$(nix eval "$flake#$expression" --raw)" + if [[ "$actual" != "$expected" ]]; then + printf 'profile contract failed: %s (expected %s, got %s)\n' "$expression" "$expected" "$actual" >&2 + exit 1 + fi +} + +expect nixosConfigurations.wsl.config.home-manager.users.t4ko.home.sessionVariables.EDITOR vim +expect nixosConfigurations.laptop.config.home-manager.users.t4ko.home.sessionVariables.EDITOR nvim +expect nixosConfigurations.laptop.config.networking.hostName laptop +expect nixosConfigurations.desktop.config.networking.hostName desktop +expect nixosConfigurations.wsl.config.networking.hostName nixos-wsl +expect nixosConfigurations.nixos-ci.config.networking.hostName nixos + +for host in laptop desktop; do + nix eval "$flake#nixosConfigurations.$host.config.home-manager.users.t4ko.programs.nixvim.enable" \ + --apply 'enabled: assert enabled; "ok"' --raw >/dev/null + nix eval "$flake#nixosConfigurations.$host.config.home-manager.users.t4ko.xdg.configFile" \ + --apply 'files: assert builtins.hasAttr "niri/config.kdl" files; assert builtins.hasAttr "swaync/config.json" files; assert builtins.hasAttr "waybar/config" files; assert !builtins.hasAttr "fastfetch" files; assert !builtins.hasAttr "lazygit" files; assert !builtins.hasAttr "starship.toml" files; assert !builtins.hasAttr "vim" files; assert !builtins.hasAttr "wezterm" files; assert !builtins.hasAttr "yazi" files; assert !builtins.hasAttr "zed" files; "ok"' \ + --raw >/dev/null + nix eval "$flake#nixosConfigurations.$host.config.home-manager.users.t4ko.home.file" \ + --apply 'files: assert !builtins.hasAttr ".claude/CLAUDE.md" files; assert !builtins.hasAttr ".claude/settings.json" files; assert !builtins.hasAttr ".codex/AGENTS.md" files; assert !builtins.hasAttr ".gitconfig" files; assert !builtins.hasAttr ".git_template/hooks" files; "ok"' \ + --raw >/dev/null +done + +nix eval "$flake#nixosConfigurations.wsl.config.home-manager.users.t4ko.programs.nixvim.enable" \ + --apply 'enabled: assert !enabled; "ok"' --raw >/dev/null + +codex_seed="$(nix eval "$flake#nixosConfigurations.laptop.config.home-manager.users.t4ko.home.activation.seedCodexConfig.data" --raw)" +if [[ "$codex_seed" != *'/dotfiles/chezmoi/.chezmoitemplates/codex-config.toml'* ]]; then + printf '%s\n' 'Codex seed does not use the chezmoi template source' >&2 + exit 1 +fi +if [[ "$codex_seed" != *'[ -L "$codex_cfg" ] || [ ! -e "$codex_cfg" ]'* ]]; then + printf '%s\n' 'Codex seed does not preserve an existing regular config file' >&2 + exit 1 +fi diff --git a/scripts/check_wsl.sh b/scripts/check_wsl.sh index a5a44a3..35d3a6d 100644 --- a/scripts/check_wsl.sh +++ b/scripts/check_wsl.sh @@ -3,7 +3,7 @@ set -euo pipefail repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -flake_ref="$repo_root" +flake_ref="${1:-$repo_root}" assert_json() { local attribute=$1 From 3e0bb8aa38ac473f929fcc3bc34bcb4dd0626eaf Mon Sep 17 00:00:00 2001 From: T4ko0522 Date: Sat, 25 Jul 2026 04:10:57 +0900 Subject: [PATCH 23/35] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20chezmoi:=20=E5=85=B1?= =?UTF-8?q?=E6=9C=89dotfile=E3=82=92source=20state=E3=81=B8=E7=A7=BB?= =?UTF-8?q?=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .markdownlint-cli2.jsonc | 3 +- chezmoi/.chezmoiignore | 10 + .../claude-settings-base.json | 0 .../claude-settings-nixos-hooks.json | 0 .../.chezmoitemplates/codex-config.toml | 0 .../dot_config}/fastfetch/anime.txt | 0 .../dot_config}/fastfetch/config.jsonc | 0 .../dot_config}/fastfetch/mclaren.txt | 2 +- .../dot_config}/fastfetch/show_music.py | 0 .../dot_config}/fastfetch/windows.txt | 2 +- .../dot_config}/starship.toml | 0 chezmoi/dot_config/symlink_lazygit.tmpl | 1 + chezmoi/dot_config/symlink_zed.tmpl | 1 + .../shared => chezmoi/dot_config}/vim/vimrc | 0 .../dot_config}/wezterm/appearance.lua | 0 .../dot_config}/wezterm/keymaps.lua | 0 .../wezterm/modules/claude_status.lua | 0 .../dot_config}/wezterm/modules/opacity.lua | 0 .../dot_config}/wezterm/modules/wsl.lua | 0 .../dot_config}/wezterm/statusbar.lua | 0 .../dot_config}/wezterm/tab.lua | 0 .../dot_config}/wezterm/wezterm.lua | 0 .../dot_config}/wezterm/workspace.lua | 0 .../dot_config}/yazi/keymap.toml | 0 .../dot_config}/yazi/theme.toml | 0 .../dot_config}/yazi/yazi.toml | 0 .../private_dot_claude}/CLAUDE.md | 0 .../private_dot_claude}/agents/README.md | 0 .../private_dot_claude}/agents/at-analyzer.md | 0 .../agents/at-doc-auditor.md | 0 .../agents/at-doc-reviewer-codex.md | 0 .../agents/at-doc-reviewer-opus.md | 0 .../agents/at-doc-writer.md | 0 .../private_dot_claude}/agents/at-explorer.md | 0 .../agents/at-impl-reviewer-codex.md | 0 .../agents/at-impl-reviewer-opus.md | 0 .../agents/at-implementer.md | 0 .../agents/at-performance.md | 0 .../agents/at-plan-reviewer.md | 0 .../private_dot_claude}/agents/at-planner.md | 0 .../agents/at-security-codex.md | 0 .../agents/at-security-opus.md | 0 .../agents/at-test-reviewer-codex.md | 0 .../agents/at-test-reviewer-opus.md | 0 .../private_dot_claude}/agents/at-tester.md | 0 .../agents/tp-qa-architect.md | 0 .../agents/tp-requirements-analyst.md | 0 .../agents/tp-system-designer.md | 0 .../agents/tp-task-decomposer.md | 0 .../private_dot_claude}/claude-icon.svg | 0 .../executable_claude-notify-hook.sh | 0 .../executable_statusline.sh | 0 chezmoi/private_dot_claude/settings.json.tmpl | 10 + .../private_dot_codex}/AGENTS.md | 0 .../private_dot_codex}/agents/worker.toml | 0 .../private_dot_codex/create_config.toml.tmpl | 1 + .../private_dot_codex}/rules/npm.rules | 0 .../private_dot_codex}/rules/safety.rules | 0 .../hooks/executable_prepare-commit-msg | 0 chezmoi/symlink_dot_gitconfig.tmpl | 1 + dot_config/shared/claude/sounds.mp3.bak | Bin 217065 -> 0 bytes dot_config/shared/lazygit/LICENSE | 21 - dot_config/shared/lazygit/README.md | 618 ------------------ dot_config/shared/lazygit/lazygit.exe | Bin 22552576 -> 0 bytes .gitconfig => mutable/shared/gitconfig | 0 .../shared/lazygit/config.yml | 0 .../shared/zed/keymap.json | 0 .../shared/zed/settings.json | 0 68 files changed, 27 insertions(+), 643 deletions(-) rename dot_config/shared/claude/settings.json => chezmoi/.chezmoitemplates/claude-settings-base.json (100%) rename dot_config/nixos/claude/settings.hooks.json => chezmoi/.chezmoitemplates/claude-settings-nixos-hooks.json (100%) rename dot_config/shared/codex/config.toml => chezmoi/.chezmoitemplates/codex-config.toml (100%) rename {dot_config/shared => chezmoi/dot_config}/fastfetch/anime.txt (100%) rename {dot_config/shared => chezmoi/dot_config}/fastfetch/config.jsonc (100%) rename {dot_config/shared => chezmoi/dot_config}/fastfetch/mclaren.txt (95%) rename {dot_config/shared => chezmoi/dot_config}/fastfetch/show_music.py (100%) rename {dot_config/shared => chezmoi/dot_config}/fastfetch/windows.txt (94%) rename {dot_config/shared => chezmoi/dot_config}/starship.toml (100%) create mode 100644 chezmoi/dot_config/symlink_lazygit.tmpl create mode 100644 chezmoi/dot_config/symlink_zed.tmpl rename {dot_config/shared => chezmoi/dot_config}/vim/vimrc (100%) rename {dot_config/shared => chezmoi/dot_config}/wezterm/appearance.lua (100%) rename {dot_config/shared => chezmoi/dot_config}/wezterm/keymaps.lua (100%) rename {dot_config/shared => chezmoi/dot_config}/wezterm/modules/claude_status.lua (100%) rename {dot_config/shared => chezmoi/dot_config}/wezterm/modules/opacity.lua (100%) rename {dot_config/shared => chezmoi/dot_config}/wezterm/modules/wsl.lua (100%) rename {dot_config/shared => chezmoi/dot_config}/wezterm/statusbar.lua (100%) rename {dot_config/shared => chezmoi/dot_config}/wezterm/tab.lua (100%) rename {dot_config/shared => chezmoi/dot_config}/wezterm/wezterm.lua (100%) rename {dot_config/shared => chezmoi/dot_config}/wezterm/workspace.lua (100%) rename {dot_config/shared => chezmoi/dot_config}/yazi/keymap.toml (100%) rename {dot_config/shared => chezmoi/dot_config}/yazi/theme.toml (100%) rename {dot_config/shared => chezmoi/dot_config}/yazi/yazi.toml (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/CLAUDE.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/README.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-analyzer.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-doc-auditor.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-doc-reviewer-codex.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-doc-reviewer-opus.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-doc-writer.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-explorer.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-impl-reviewer-codex.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-impl-reviewer-opus.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-implementer.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-performance.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-plan-reviewer.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-planner.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-security-codex.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-security-opus.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-test-reviewer-codex.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-test-reviewer-opus.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/at-tester.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/tp-qa-architect.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/tp-requirements-analyst.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/tp-system-designer.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/agents/tp-task-decomposer.md (100%) rename {dot_config/shared/claude => chezmoi/private_dot_claude}/claude-icon.svg (100%) rename dot_config/nixos/claude/claude-notify-hook.sh => chezmoi/private_dot_claude/executable_claude-notify-hook.sh (100%) rename dot_config/shared/claude/statusline.sh => chezmoi/private_dot_claude/executable_statusline.sh (100%) create mode 100644 chezmoi/private_dot_claude/settings.json.tmpl rename {dot_config/shared/codex => chezmoi/private_dot_codex}/AGENTS.md (100%) rename {dot_config/shared/codex => chezmoi/private_dot_codex}/agents/worker.toml (100%) create mode 100644 chezmoi/private_dot_codex/create_config.toml.tmpl rename {dot_config/shared/codex => chezmoi/private_dot_codex}/rules/npm.rules (100%) rename {dot_config/shared/codex => chezmoi/private_dot_codex}/rules/safety.rules (100%) rename .git_template/hooks/prepare-commit-msg => chezmoi/private_dot_git_template/hooks/executable_prepare-commit-msg (100%) mode change 100755 => 100644 create mode 100644 chezmoi/symlink_dot_gitconfig.tmpl delete mode 100644 dot_config/shared/claude/sounds.mp3.bak delete mode 100644 dot_config/shared/lazygit/LICENSE delete mode 100644 dot_config/shared/lazygit/README.md delete mode 100644 dot_config/shared/lazygit/lazygit.exe rename .gitconfig => mutable/shared/gitconfig (100%) rename {dot_config => mutable}/shared/lazygit/config.yml (100%) rename {dot_config => mutable}/shared/zed/keymap.json (100%) rename {dot_config => mutable}/shared/zed/settings.json (100%) diff --git a/.markdownlint-cli2.jsonc b/.markdownlint-cli2.jsonc index 020e7d4..5ce8a9b 100644 --- a/.markdownlint-cli2.jsonc +++ b/.markdownlint-cli2.jsonc @@ -29,8 +29,7 @@ ".git/**", ".config/claude/projects/**", ".config/claude/cache/**", - ".config/claude/backups/**", - "dot_config/shared/lazygit/README.md" + ".config/claude/backups/**" ], // .gitignore の除外を反映 "gitignore": true diff --git a/chezmoi/.chezmoiignore b/chezmoi/.chezmoiignore index 378cf3b..13a444a 100644 --- a/chezmoi/.chezmoiignore +++ b/chezmoi/.chezmoiignore @@ -1,6 +1,15 @@ {{- if ne .profile "windows" }} AppData/** Documents/PowerShell/** +.config/ccwin-notify/** +.config/mise/** +.config/yasb/** +.claude/ccwin-hook.ps1 +.codex/config.toml +{{- end }} + +{{- if ne .profile "nixos" }} +.claude/claude-notify-hook.sh {{- end }} {{- if eq .profile "windows" }} @@ -11,6 +20,7 @@ Documents/PowerShell/** {{- if eq .profile "wsl" }} .config/wezterm/** +.config/zed {{- end }} # Neovim is never a shared chezmoi target. Windows uses a junction to diff --git a/dot_config/shared/claude/settings.json b/chezmoi/.chezmoitemplates/claude-settings-base.json similarity index 100% rename from dot_config/shared/claude/settings.json rename to chezmoi/.chezmoitemplates/claude-settings-base.json diff --git a/dot_config/nixos/claude/settings.hooks.json b/chezmoi/.chezmoitemplates/claude-settings-nixos-hooks.json similarity index 100% rename from dot_config/nixos/claude/settings.hooks.json rename to chezmoi/.chezmoitemplates/claude-settings-nixos-hooks.json diff --git a/dot_config/shared/codex/config.toml b/chezmoi/.chezmoitemplates/codex-config.toml similarity index 100% rename from dot_config/shared/codex/config.toml rename to chezmoi/.chezmoitemplates/codex-config.toml diff --git a/dot_config/shared/fastfetch/anime.txt b/chezmoi/dot_config/fastfetch/anime.txt similarity index 100% rename from dot_config/shared/fastfetch/anime.txt rename to chezmoi/dot_config/fastfetch/anime.txt diff --git a/dot_config/shared/fastfetch/config.jsonc b/chezmoi/dot_config/fastfetch/config.jsonc similarity index 100% rename from dot_config/shared/fastfetch/config.jsonc rename to chezmoi/dot_config/fastfetch/config.jsonc diff --git a/dot_config/shared/fastfetch/mclaren.txt b/chezmoi/dot_config/fastfetch/mclaren.txt similarity index 95% rename from dot_config/shared/fastfetch/mclaren.txt rename to chezmoi/dot_config/fastfetch/mclaren.txt index bd33b7e..d872dd9 100644 --- a/dot_config/shared/fastfetch/mclaren.txt +++ b/chezmoi/dot_config/fastfetch/mclaren.txt @@ -13,4 +13,4 @@ $1 =@@@@@@%+. $1 :%@@@%*- $1 -%@@#=. $1 +@%+: -$1 :: \ No newline at end of file +$1 :: diff --git a/dot_config/shared/fastfetch/show_music.py b/chezmoi/dot_config/fastfetch/show_music.py similarity index 100% rename from dot_config/shared/fastfetch/show_music.py rename to chezmoi/dot_config/fastfetch/show_music.py diff --git a/dot_config/shared/fastfetch/windows.txt b/chezmoi/dot_config/fastfetch/windows.txt similarity index 94% rename from dot_config/shared/fastfetch/windows.txt rename to chezmoi/dot_config/fastfetch/windows.txt index ca92a29..0e6953f 100644 --- a/dot_config/shared/fastfetch/windows.txt +++ b/chezmoi/dot_config/fastfetch/windows.txt @@ -13,4 +13,4 @@ E::::::::zt33L @EEEtttt::::z3F {3=*^```"*4E3) ;EEEtttt:::::tZ` ` :EEEEtttt::::z7 - "VEzjt:;;z>*` \ No newline at end of file + "VEzjt:;;z>*` diff --git a/dot_config/shared/starship.toml b/chezmoi/dot_config/starship.toml similarity index 100% rename from dot_config/shared/starship.toml rename to chezmoi/dot_config/starship.toml diff --git a/chezmoi/dot_config/symlink_lazygit.tmpl b/chezmoi/dot_config/symlink_lazygit.tmpl new file mode 100644 index 0000000..93bae2c --- /dev/null +++ b/chezmoi/dot_config/symlink_lazygit.tmpl @@ -0,0 +1 @@ +{{ .chezmoi.sourceDir }}/../mutable/shared/lazygit diff --git a/chezmoi/dot_config/symlink_zed.tmpl b/chezmoi/dot_config/symlink_zed.tmpl new file mode 100644 index 0000000..1acf5b6 --- /dev/null +++ b/chezmoi/dot_config/symlink_zed.tmpl @@ -0,0 +1 @@ +{{ .chezmoi.sourceDir }}/../mutable/shared/zed diff --git a/dot_config/shared/vim/vimrc b/chezmoi/dot_config/vim/vimrc similarity index 100% rename from dot_config/shared/vim/vimrc rename to chezmoi/dot_config/vim/vimrc diff --git a/dot_config/shared/wezterm/appearance.lua b/chezmoi/dot_config/wezterm/appearance.lua similarity index 100% rename from dot_config/shared/wezterm/appearance.lua rename to chezmoi/dot_config/wezterm/appearance.lua diff --git a/dot_config/shared/wezterm/keymaps.lua b/chezmoi/dot_config/wezterm/keymaps.lua similarity index 100% rename from dot_config/shared/wezterm/keymaps.lua rename to chezmoi/dot_config/wezterm/keymaps.lua diff --git a/dot_config/shared/wezterm/modules/claude_status.lua b/chezmoi/dot_config/wezterm/modules/claude_status.lua similarity index 100% rename from dot_config/shared/wezterm/modules/claude_status.lua rename to chezmoi/dot_config/wezterm/modules/claude_status.lua diff --git a/dot_config/shared/wezterm/modules/opacity.lua b/chezmoi/dot_config/wezterm/modules/opacity.lua similarity index 100% rename from dot_config/shared/wezterm/modules/opacity.lua rename to chezmoi/dot_config/wezterm/modules/opacity.lua diff --git a/dot_config/shared/wezterm/modules/wsl.lua b/chezmoi/dot_config/wezterm/modules/wsl.lua similarity index 100% rename from dot_config/shared/wezterm/modules/wsl.lua rename to chezmoi/dot_config/wezterm/modules/wsl.lua diff --git a/dot_config/shared/wezterm/statusbar.lua b/chezmoi/dot_config/wezterm/statusbar.lua similarity index 100% rename from dot_config/shared/wezterm/statusbar.lua rename to chezmoi/dot_config/wezterm/statusbar.lua diff --git a/dot_config/shared/wezterm/tab.lua b/chezmoi/dot_config/wezterm/tab.lua similarity index 100% rename from dot_config/shared/wezterm/tab.lua rename to chezmoi/dot_config/wezterm/tab.lua diff --git a/dot_config/shared/wezterm/wezterm.lua b/chezmoi/dot_config/wezterm/wezterm.lua similarity index 100% rename from dot_config/shared/wezterm/wezterm.lua rename to chezmoi/dot_config/wezterm/wezterm.lua diff --git a/dot_config/shared/wezterm/workspace.lua b/chezmoi/dot_config/wezterm/workspace.lua similarity index 100% rename from dot_config/shared/wezterm/workspace.lua rename to chezmoi/dot_config/wezterm/workspace.lua diff --git a/dot_config/shared/yazi/keymap.toml b/chezmoi/dot_config/yazi/keymap.toml similarity index 100% rename from dot_config/shared/yazi/keymap.toml rename to chezmoi/dot_config/yazi/keymap.toml diff --git a/dot_config/shared/yazi/theme.toml b/chezmoi/dot_config/yazi/theme.toml similarity index 100% rename from dot_config/shared/yazi/theme.toml rename to chezmoi/dot_config/yazi/theme.toml diff --git a/dot_config/shared/yazi/yazi.toml b/chezmoi/dot_config/yazi/yazi.toml similarity index 100% rename from dot_config/shared/yazi/yazi.toml rename to chezmoi/dot_config/yazi/yazi.toml diff --git a/dot_config/shared/claude/CLAUDE.md b/chezmoi/private_dot_claude/CLAUDE.md similarity index 100% rename from dot_config/shared/claude/CLAUDE.md rename to chezmoi/private_dot_claude/CLAUDE.md diff --git a/dot_config/shared/claude/agents/README.md b/chezmoi/private_dot_claude/agents/README.md similarity index 100% rename from dot_config/shared/claude/agents/README.md rename to chezmoi/private_dot_claude/agents/README.md diff --git a/dot_config/shared/claude/agents/at-analyzer.md b/chezmoi/private_dot_claude/agents/at-analyzer.md similarity index 100% rename from dot_config/shared/claude/agents/at-analyzer.md rename to chezmoi/private_dot_claude/agents/at-analyzer.md diff --git a/dot_config/shared/claude/agents/at-doc-auditor.md b/chezmoi/private_dot_claude/agents/at-doc-auditor.md similarity index 100% rename from dot_config/shared/claude/agents/at-doc-auditor.md rename to chezmoi/private_dot_claude/agents/at-doc-auditor.md diff --git a/dot_config/shared/claude/agents/at-doc-reviewer-codex.md b/chezmoi/private_dot_claude/agents/at-doc-reviewer-codex.md similarity index 100% rename from dot_config/shared/claude/agents/at-doc-reviewer-codex.md rename to chezmoi/private_dot_claude/agents/at-doc-reviewer-codex.md diff --git a/dot_config/shared/claude/agents/at-doc-reviewer-opus.md b/chezmoi/private_dot_claude/agents/at-doc-reviewer-opus.md similarity index 100% rename from dot_config/shared/claude/agents/at-doc-reviewer-opus.md rename to chezmoi/private_dot_claude/agents/at-doc-reviewer-opus.md diff --git a/dot_config/shared/claude/agents/at-doc-writer.md b/chezmoi/private_dot_claude/agents/at-doc-writer.md similarity index 100% rename from dot_config/shared/claude/agents/at-doc-writer.md rename to chezmoi/private_dot_claude/agents/at-doc-writer.md diff --git a/dot_config/shared/claude/agents/at-explorer.md b/chezmoi/private_dot_claude/agents/at-explorer.md similarity index 100% rename from dot_config/shared/claude/agents/at-explorer.md rename to chezmoi/private_dot_claude/agents/at-explorer.md diff --git a/dot_config/shared/claude/agents/at-impl-reviewer-codex.md b/chezmoi/private_dot_claude/agents/at-impl-reviewer-codex.md similarity index 100% rename from dot_config/shared/claude/agents/at-impl-reviewer-codex.md rename to chezmoi/private_dot_claude/agents/at-impl-reviewer-codex.md diff --git a/dot_config/shared/claude/agents/at-impl-reviewer-opus.md b/chezmoi/private_dot_claude/agents/at-impl-reviewer-opus.md similarity index 100% rename from dot_config/shared/claude/agents/at-impl-reviewer-opus.md rename to chezmoi/private_dot_claude/agents/at-impl-reviewer-opus.md diff --git a/dot_config/shared/claude/agents/at-implementer.md b/chezmoi/private_dot_claude/agents/at-implementer.md similarity index 100% rename from dot_config/shared/claude/agents/at-implementer.md rename to chezmoi/private_dot_claude/agents/at-implementer.md diff --git a/dot_config/shared/claude/agents/at-performance.md b/chezmoi/private_dot_claude/agents/at-performance.md similarity index 100% rename from dot_config/shared/claude/agents/at-performance.md rename to chezmoi/private_dot_claude/agents/at-performance.md diff --git a/dot_config/shared/claude/agents/at-plan-reviewer.md b/chezmoi/private_dot_claude/agents/at-plan-reviewer.md similarity index 100% rename from dot_config/shared/claude/agents/at-plan-reviewer.md rename to chezmoi/private_dot_claude/agents/at-plan-reviewer.md diff --git a/dot_config/shared/claude/agents/at-planner.md b/chezmoi/private_dot_claude/agents/at-planner.md similarity index 100% rename from dot_config/shared/claude/agents/at-planner.md rename to chezmoi/private_dot_claude/agents/at-planner.md diff --git a/dot_config/shared/claude/agents/at-security-codex.md b/chezmoi/private_dot_claude/agents/at-security-codex.md similarity index 100% rename from dot_config/shared/claude/agents/at-security-codex.md rename to chezmoi/private_dot_claude/agents/at-security-codex.md diff --git a/dot_config/shared/claude/agents/at-security-opus.md b/chezmoi/private_dot_claude/agents/at-security-opus.md similarity index 100% rename from dot_config/shared/claude/agents/at-security-opus.md rename to chezmoi/private_dot_claude/agents/at-security-opus.md diff --git a/dot_config/shared/claude/agents/at-test-reviewer-codex.md b/chezmoi/private_dot_claude/agents/at-test-reviewer-codex.md similarity index 100% rename from dot_config/shared/claude/agents/at-test-reviewer-codex.md rename to chezmoi/private_dot_claude/agents/at-test-reviewer-codex.md diff --git a/dot_config/shared/claude/agents/at-test-reviewer-opus.md b/chezmoi/private_dot_claude/agents/at-test-reviewer-opus.md similarity index 100% rename from dot_config/shared/claude/agents/at-test-reviewer-opus.md rename to chezmoi/private_dot_claude/agents/at-test-reviewer-opus.md diff --git a/dot_config/shared/claude/agents/at-tester.md b/chezmoi/private_dot_claude/agents/at-tester.md similarity index 100% rename from dot_config/shared/claude/agents/at-tester.md rename to chezmoi/private_dot_claude/agents/at-tester.md diff --git a/dot_config/shared/claude/agents/tp-qa-architect.md b/chezmoi/private_dot_claude/agents/tp-qa-architect.md similarity index 100% rename from dot_config/shared/claude/agents/tp-qa-architect.md rename to chezmoi/private_dot_claude/agents/tp-qa-architect.md diff --git a/dot_config/shared/claude/agents/tp-requirements-analyst.md b/chezmoi/private_dot_claude/agents/tp-requirements-analyst.md similarity index 100% rename from dot_config/shared/claude/agents/tp-requirements-analyst.md rename to chezmoi/private_dot_claude/agents/tp-requirements-analyst.md diff --git a/dot_config/shared/claude/agents/tp-system-designer.md b/chezmoi/private_dot_claude/agents/tp-system-designer.md similarity index 100% rename from dot_config/shared/claude/agents/tp-system-designer.md rename to chezmoi/private_dot_claude/agents/tp-system-designer.md diff --git a/dot_config/shared/claude/agents/tp-task-decomposer.md b/chezmoi/private_dot_claude/agents/tp-task-decomposer.md similarity index 100% rename from dot_config/shared/claude/agents/tp-task-decomposer.md rename to chezmoi/private_dot_claude/agents/tp-task-decomposer.md diff --git a/dot_config/shared/claude/claude-icon.svg b/chezmoi/private_dot_claude/claude-icon.svg similarity index 100% rename from dot_config/shared/claude/claude-icon.svg rename to chezmoi/private_dot_claude/claude-icon.svg diff --git a/dot_config/nixos/claude/claude-notify-hook.sh b/chezmoi/private_dot_claude/executable_claude-notify-hook.sh similarity index 100% rename from dot_config/nixos/claude/claude-notify-hook.sh rename to chezmoi/private_dot_claude/executable_claude-notify-hook.sh diff --git a/dot_config/shared/claude/statusline.sh b/chezmoi/private_dot_claude/executable_statusline.sh similarity index 100% rename from dot_config/shared/claude/statusline.sh rename to chezmoi/private_dot_claude/executable_statusline.sh diff --git a/chezmoi/private_dot_claude/settings.json.tmpl b/chezmoi/private_dot_claude/settings.json.tmpl new file mode 100644 index 0000000..1729ade --- /dev/null +++ b/chezmoi/private_dot_claude/settings.json.tmpl @@ -0,0 +1,10 @@ +{{- $base := include ".chezmoitemplates/claude-settings-base.json" | fromJson -}} +{{- if eq .profile "windows" -}} +{{- $hooks := include ".chezmoitemplates/claude-settings-windows-hooks.json" | fromJson -}} +{{ mergeOverwrite $base $hooks | toPrettyJson }} +{{- else if eq .profile "nixos" -}} +{{- $hooks := include ".chezmoitemplates/claude-settings-nixos-hooks.json" | fromJson -}} +{{ mergeOverwrite $base $hooks | toPrettyJson }} +{{- else -}} +{{ $base | toPrettyJson }} +{{- end }} diff --git a/dot_config/shared/codex/AGENTS.md b/chezmoi/private_dot_codex/AGENTS.md similarity index 100% rename from dot_config/shared/codex/AGENTS.md rename to chezmoi/private_dot_codex/AGENTS.md diff --git a/dot_config/shared/codex/agents/worker.toml b/chezmoi/private_dot_codex/agents/worker.toml similarity index 100% rename from dot_config/shared/codex/agents/worker.toml rename to chezmoi/private_dot_codex/agents/worker.toml diff --git a/chezmoi/private_dot_codex/create_config.toml.tmpl b/chezmoi/private_dot_codex/create_config.toml.tmpl new file mode 100644 index 0000000..223f340 --- /dev/null +++ b/chezmoi/private_dot_codex/create_config.toml.tmpl @@ -0,0 +1 @@ +{{ include ".chezmoitemplates/codex-config.toml" }} diff --git a/dot_config/shared/codex/rules/npm.rules b/chezmoi/private_dot_codex/rules/npm.rules similarity index 100% rename from dot_config/shared/codex/rules/npm.rules rename to chezmoi/private_dot_codex/rules/npm.rules diff --git a/dot_config/shared/codex/rules/safety.rules b/chezmoi/private_dot_codex/rules/safety.rules similarity index 100% rename from dot_config/shared/codex/rules/safety.rules rename to chezmoi/private_dot_codex/rules/safety.rules diff --git a/.git_template/hooks/prepare-commit-msg b/chezmoi/private_dot_git_template/hooks/executable_prepare-commit-msg old mode 100755 new mode 100644 similarity index 100% rename from .git_template/hooks/prepare-commit-msg rename to chezmoi/private_dot_git_template/hooks/executable_prepare-commit-msg diff --git a/chezmoi/symlink_dot_gitconfig.tmpl b/chezmoi/symlink_dot_gitconfig.tmpl new file mode 100644 index 0000000..c426927 --- /dev/null +++ b/chezmoi/symlink_dot_gitconfig.tmpl @@ -0,0 +1 @@ +{{ .chezmoi.sourceDir }}/../mutable/shared/gitconfig diff --git a/dot_config/shared/claude/sounds.mp3.bak b/dot_config/shared/claude/sounds.mp3.bak deleted file mode 100644 index 525c05447021099a43e46443f4d706a5385df59d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217065 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 T836o6NuPw<;4cXf@m=v>Pom$? diff --git a/dot_config/shared/lazygit/LICENSE b/dot_config/shared/lazygit/LICENSE deleted file mode 100644 index 83121f5..0000000 --- a/dot_config/shared/lazygit/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2018 Jesse Duffield - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/dot_config/shared/lazygit/README.md b/dot_config/shared/lazygit/README.md deleted file mode 100644 index d840421..0000000 --- a/dot_config/shared/lazygit/README.md +++ /dev/null @@ -1,618 +0,0 @@ - - -

- -

- -
- -A simple terminal UI for git commands -
- -[![GitHub Releases](https://img.shields.io/github/downloads/jesseduffield/lazygit/total)](https://github.com/jesseduffield/lazygit/releases) [![Go Report Card](https://goreportcard.com/badge/github.com/jesseduffield/lazygit)](https://goreportcard.com/report/github.com/jesseduffield/lazygit) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/f46416b715d74622895657935fcada21)](https://app.codacy.com/gh/jesseduffield/lazygit/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) [![Codacy Badge](https://app.codacy.com/project/badge/Coverage/f46416b715d74622895657935fcada21)](https://app.codacy.com/gh/jesseduffield/lazygit/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage) [![golangci-lint](https://img.shields.io/badge/linted%20by-golangci--lint-brightgreen)](https://golangci-lint.run/) [![GitHub tag](https://img.shields.io/github/v/tag/jesseduffield/lazygit?color=blue)](https://github.com/jesseduffield/lazygit/releases/latest) [![homebrew](https://img.shields.io/homebrew/v/lazygit?color=blue)](https://formulae.brew.sh/formula/lazygit) - -![commit_and_push](../assets/demo/commit_and_push-compressed.gif) - -
- -## Sponsors - -

- Maintenance of this project is made possible by all the contributors and sponsors. If you'd like to sponsor this project and have your avatar or company logo appear below click here. 💙 -

- -

-Mark LussierDean HerbertPeter BjorklundReilly WoodOliver GüntherPawan DhananjayCarsten GehlingChau TranmatejciktheAverageDev (Luca Tumedei)Nicholas CloudAliaksandr StelmachonakPedro PombeiroBurgy BenjaminJoe KlemmerTobias LütkeBen BeaumontHollyTom LanserCasey BoettcherJeff ForcierMaciej T. NowakJames HillyerdYuryOlivier 'reivilibre'Braden SteffaniakJordan GillardSebastianAndy SlezakMartin KockJesse AlamaDaniel KokottJan HeijmansKevin NowaldEthan LiRobert ForlerJan ZenknerFrederick MorlockMaximilian LangenfeldNeil LambertDavid Heinemeier HanssonEthan FischerTerry TaiAdam RoesnerTim MorganMax ShypulniakKovács ÁdámPatricio SerranoKiriJohn Even BjørnevikMichael OberstAdam TrepanierKenth FagerlundJulien TardotAaron ArredondoEllord TayagEdgar Post-BuijsPierre SpringZac ClayThomas MüllerCarl AssmannSergey OgnevMoody LiuMichael HowardLasse Bloch LauritsenLarry MarburgerDavid BrockmanAlexander SlavschikAidan GaulandMaksym BieńkowskiJimmy Sáenz RizoJoshua WootonnSimon Sandvik LeeThomas GilbertSzymon MuchaUnnawut LeepaisalsuwannaBret WortmanSimon CardonaAndré LameirinhasScott VelezjustinMayfieldSoma HolidaybizmythDessalinesSean Hong(홍성민)Alex DreymannFelipe OspinaRiccardo Novagliarxz -

- -## Elevator Pitch - -Rant time: You've heard it before, git is _powerful_, but what good is that power when everything is so damn hard to do? Interactive rebasing requires you to edit a goddamn TODO file in your editor? _Are you kidding me?_ To stage part of a file you need to use a command line program to step through each hunk and if a hunk can't be split down any further but contains code you don't want to stage, you have to edit an arcane patch file _by hand_? _Are you KIDDING me?!_ Sometimes you get asked to stash your changes when switching branches only to realise that after you switch and unstash that there weren't even any conflicts and it would have been fine to just checkout the branch directly? _YOU HAVE GOT TO BE KIDDING ME!_ - -If you're a mere mortal like me and you're tired of hearing how powerful git is when in your daily life it's a powerful pain in your ass, lazygit might be for you. - -## Table of contents - -- [Sponsors](#sponsors) -- [Elevator Pitch](#elevator-pitch) -- [Table of contents](#table-of-contents) -- [Features](#features) - - [Stage individual lines](#stage-individual-lines) - - [Interactive Rebase](#interactive-rebase) - - [Cherry-pick](#cherry-pick) - - [Bisect](#bisect) - - [Nuke the working tree](#nuke-the-working-tree) - - [Amend an old commit](#amend-an-old-commit) - - [Filter](#filter) - - [Invoke a custom command](#invoke-a-custom-command) - - [Worktrees](#worktrees) - - [Rebase magic (custom patches)](#rebase-magic-custom-patches) - - [Rebase from marked base commit](#rebase-from-marked-base-commit) - - [Undo](#undo) - - [Commit graph](#commit-graph) - - [Compare two commits](#compare-two-commits) -- [Tutorials](#tutorials) -- [Installation](#installation) - - [Binary Releases](#binary-releases) - - [Dev container](#dev-container-feature) - - [Homebrew](#homebrew) - - [MacPorts](#macports) - - [Void Linux](#void-linux) - - [Scoop (Windows)](#scoop-windows) - - [gah (Linux and Mac OS)](#gah-linux-and-mac-os) - - [Arch Linux](#arch-linux) - - [Fedora / Amazon Linux 2023 / CentOS Stream](#fedora--amazon-linux-2023--centos-stream) - - [Solus Linux](#solus-linux) - - [Debian and Ubuntu](#debian-and-ubuntu) - - [Funtoo Linux](#funtoo-linux) - - [Gentoo Linux](#gentoo-linux) - - [openSUSE](#opensuse) - - [NixOS](#nixos) - - [Flox](#flox) - - [FreeBSD](#freebsd) - - [Termux](#termux) - - [Conda](#conda) - - [Go](#go) - - [Chocolatey (Windows)](#chocolatey-windows) - - [Winget (Windows 10 1709 or later)](#winget-windows-10-1709-or-later) - - [Manual](#manual) -- [Usage](#usage) - - [Keybindings](#keybindings) - - [Changing Directory On Exit](#changing-directory-on-exit) - - [Undo/Redo](#undoredo) -- [Configuration](#configuration) - - [Custom Pagers](#custom-pagers) - - [Custom Commands](#custom-commands) - - [Git flow support](#git-flow-support) -- [Contributing](#contributing) - - [Debugging Locally](#debugging-locally) -- [Donate](#donate) -- [FAQ](#faq) - - [What do the commit colors represent?](#what-do-the-commit-colors-represent) -- [Shameless Plug](#shameless-plug) -- [Alternatives](#alternatives) - -Lazygit is not my fulltime job but it is a hefty part time job so if you want to support the project please consider [sponsoring me](https://github.com/sponsors/jesseduffield) - -## Features - -### Stage individual lines - -Press space on the selected line to stage it, or press `v` to start selecting a range of lines. You can also press `a` to select the entirety of the current hunk. - -![stage_lines](../assets/demo/stage_lines-compressed.gif) - -### Interactive Rebase - -Press `i` to start an interactive rebase. Then squash (`s`), fixup (`f`), drop (`d`), edit (`e`), move up (`ctrl+k`) or move down (`ctrl+j`) any of TODO commits, before continuing the rebase by bringing up the rebase options menu with `m` and then selecting `continue`. - -You can also perform any these actions as a once-off (e.g. pressing `s` on a commit to squash it) without explicitly starting a rebase. - -This demo also uses shift+down to select a range of commits to move and fixup. - -![interactive_rebase](../assets/demo/interactive_rebase-compressed.gif) - -### Cherry-pick - -Press `shift+c` on a commit to copy it and press `shift+v` to paste (cherry-pick) it. - -![cherry_pick](../assets/demo/cherry_pick-compressed.gif) - -### Bisect - -Press `b` in the commits view to mark a commit as good/bad in order to begin a git bisect. - -![bisect](../assets/demo/bisect-compressed.gif) - -### Nuke the working tree - -For when you really want to just get rid of anything that shows up when you run `git status` (and yes that includes dirty submodules) [kidpix style](https://www.youtube.com/watch?v=N4E2B_k2Bss), press `shift+d` to bring up the reset options menu and then select the 'nuke' option. - -![Nuke working tree](../assets/demo/nuke_working_tree-compressed.gif) - -### Amend an old commit - -Pressing `shift+a` on any commit will amend that commit with the currently staged changes (running an interactive rebase in the background). - -![amend_old_commit](../assets/demo/amend_old_commit-compressed.gif) - -### Filter - -You can filter a view with `/`. Here we filter down our branches view and then hit `enter` to view its commits. - -![filter](../assets/demo/filter-compressed.gif) - -### Invoke a custom command - -Lazygit has a very flexible [custom command system](docs/Custom_Command_Keybindings.md). In this example a custom command is defined which emulates the built-in branch checkout action. - -![custom_command](../assets/demo/custom_command-compressed.gif) - -### Worktrees - -You can create worktrees to have multiple branches going at once without the need for stashing or creating WIP commits when switching between them. Press `w` in the branches view to create a worktree from the selected branch and switch to it. - -![worktree_create_from_branches](../assets/demo/worktree_create_from_branches-compressed.gif) - -### Rebase magic (custom patches) - -You can build a custom patch from an old commit and then remove the patch from the commit, split out a new commit, apply the patch in reverse to the index, and more. - -In this example we have a redundant comment that we want to remove from an old commit. We hit `` on the commit to view its files, then `` on a file to focus the patch, then `` to add the comment line to our custom patch, and then `ctrl+p` to view the custom patch options; selecting to remove the patch from the current commit. - -Learn more in the [Rebase magic Youtube tutorial](https://youtu.be/4XaToVut_hs). - -![custom_patch](../assets/demo/custom_patch-compressed.gif) - -### Rebase from marked base commit - -Say you're on a feature branch that was itself branched off of the develop branch, and you've decided you'd rather be branching off the master branch. You need a way to rebase only the commits from your feature branch. In this demo we check to see which was the last commit on the develop branch, then press `shift+b` to mark that commit as our base commit, then press `r` on the master branch to rebase onto it, only bringing across the commits from our feature branch. Then we push our changes with `shift+p`. - -![rebase_onto](../assets/demo/rebase_onto-compressed.gif) - -### Undo - -You can undo the last action by pressing `z` and redo with `ctrl+z`. Here we drop a couple of commits and then undo the actions. -Undo uses the reflog which is specific to commits and branches so we can't undo changes to the working tree or stash. - -[More info](/docs/Undoing.md) - -![undo](../assets/demo/undo-compressed.gif) - -### Commit graph - -When viewing the commit graph in an enlarged window (use `+` and `_` to cycle screen modes), the commit graph is shown. Colours correspond to the commit authors, and as you navigate down the graph, the parent commits of the selected commit are highlighted. - -![commit_graph](../assets/demo/commit_graph-compressed.gif) - -### Compare two commits - -If you press `shift+w` on a commit (or branch/ref) a menu will open that allows you to mark that commit so that any other commit you select will be diffed against it. Once you've selected the second commit, you'll see the diff in the main view and if you press `` you'll see the files of the diff. You can press `shift+w` to view the diff menu again to see options like reversing the diff direction or exiting diff mode. You can also exit diff mode by pressing ``. - -![diff_commits](../assets/demo/diff_commits-compressed.gif) - -## Tutorials - -[](https://youtu.be/CPLdltN7wgE) - -- [15 Lazygit Features in 15 Minutes](https://youtu.be/CPLdltN7wgE) -- [Basics Tutorial](https://youtu.be/VDXvbHZYeKY) -- [Rebase Magic Tutorial](https://youtu.be/4XaToVut_hs) - -## Installation - -[![Packaging status](https://repology.org/badge/vertical-allrepos/lazygit.svg?columns=3)](https://repology.org/project/lazygit/versions) - -_Most of the above packages are maintained by third parties so be sure to vet them yourself and confirm that the maintainer is a trustworthy looking person who attends local sports games and gives back to their communities with barbeque fundraisers etc_ - -### Binary Releases - -For Windows, Mac OS(10.12+) or Linux, you can download a binary release [here](../../releases). - -### Dev container feature - -If you want to use lazygit in e.g. one of your GitHub Codespaces, there is a third-party [dev container feature](https://github.com/GeorgOfenbeck/features/tree/main/src/lazygit-linuxbinary) based on the binary releases mentioned above. - -### Homebrew - -It works with Linux, too. - -```sh -brew install lazygit -``` - -### MacPorts - -Latest version built from github releases. -Tap: - -``` -sudo port install lazygit -``` - -### Void Linux - -Packages for Void Linux are available in the distro repo - -They follow upstream latest releases - -```sh -sudo xbps-install -S lazygit -``` - -### Scoop (Windows) - -You can install `lazygit` using [scoop](https://scoop.sh/). It's in the `extras` bucket: - -```sh -# Add the extras bucket -scoop bucket add extras - -# Install lazygit -scoop install lazygit -``` - -### gah (Linux and Mac OS) - -You can install `lazygit` using [gah](https://github.com/marverix/gah/): - -```sh -gah install lazygit -``` - -### Arch Linux - -Packages for Arch Linux are available via pacman and AUR (Arch User Repository). - -There are two packages. The stable one which is built with the latest release -and the git version which builds from the most recent commit. - -- Stable: `sudo pacman -S lazygit` -- Development: - -Instruction of how to install AUR content can be found here: - - -### Fedora / Amazon Linux 2023 / CentOS Stream - -Packages for Fedora, Amazon Linux 2023 and CentOS Stream are available via -[Copr](https://copr.fedorainfracloud.org/coprs/dejan/lazygit/) (Cool Other Package Repo). - -```sh -sudo dnf copr enable dejan/lazygit -sudo dnf install lazygit -``` - -These packages are built using the RPM spec file located here: https://codeberg.org/dejan/rpm-lazygit - -You should be able to build RPMs for Fedora 41 or older, and other Fedora derivatives using the -SRPM (Source RPM) file that you can grab from the latest COPR build. - -### Solus Linux - -```sh -sudo eopkg install lazygit -``` - -### Debian and Ubuntu - -For **Debian 13 "Trixie", Sid**, and later, or **Ubuntu 25.10 "Questing Quokka"** and later: - -```sh -sudo apt install lazygit -``` - -For **Debian 12 "Bookworm", Ubuntu 25.04 "Plucky Puffin"** and earlier: - -```sh -LAZYGIT_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazygit/releases/latest" | \grep -Po '"tag_name": *"v\K[^"]*') -curl -Lo lazygit.tar.gz "https://github.com/jesseduffield/lazygit/releases/download/v${LAZYGIT_VERSION}/lazygit_${LAZYGIT_VERSION}_Linux_x86_64.tar.gz" -tar xf lazygit.tar.gz lazygit -sudo install lazygit -D -t /usr/local/bin/ -``` - -Verify the correct installation of lazygit: - -```sh -lazygit --version -``` - -### Funtoo Linux - -Funtoo Linux has an autogenerated lazygit package in [dev-kit](https://github.com/funtoo/dev-kit/tree/1.4-release/dev-vcs/lazygit): - -```sh -sudo emerge dev-vcs/lazygit -``` - -### Gentoo Linux - -Lazygit is not (yet) in main Gentoo portage, however an ebuild is available in [GURU overlay](https://github.com/gentoo-mirror/guru/tree/master/dev-vcs/lazygit) - -You can either add the overlay to your system and install lazygit as usual: - -```sh -sudo eselect repository enable guru -sudo emaint sync -r guru -sudo emerge dev-vcs/lazygit -``` - -### openSUSE - -The lazygit package is currently built in [devel:languages:go/lazygit](https://build.opensuse.org/package/show/devel:languages:go/lazygit). - -To install lazygit on openSUSE Tumbleweed run: - -```sh -sudo zypper ar https://download.opensuse.org/repositories/devel:/languages:/go/openSUSE_Factory/devel:languages:go.repo -sudo zypper ref && sudo zypper in lazygit -``` - -To install lazygit on openSUSE Leap run: - -```sh -source /etc/os-release -sudo zypper ar https://download.opensuse.org/repositories/devel:/languages:/go/$VERSION_ID/devel:languages:go.repo -sudo zypper ref && sudo zypper in lazygit -``` - -### NixOS - -#### Using lazygit from nixpkgs - -On NixOS, lazygit is packaged with nix and distributed via nixpkgs. -You can try lazygit without installing it with: - -```sh -nix-shell -p lazygit -# or with flakes enabled -nix run nixpkgs#lazygit -``` -Or you can add lazygit to your `configuration.nix` using the `environment.systemPackages` option. -More details can be found via NixOS search [page](https://search.nixos.org/). - -#### Using the official lazygit flake - -This repository includes a nix flake that provides the latest development version and additional development tools: - -**Run lazygit directly from the repository:** -```sh -nix run github:jesseduffield/lazygit -# or from a local clone -nix run . -``` - -**Build lazygit from source:** -```sh -nix build github:jesseduffield/lazygit -# or from a local clone -nix build . -``` - -**Development environment:** -For contributors, the flake provides a development shell with Go toolchain, development tools, and dependencies: -```sh -nix develop github:jesseduffield/lazygit -# or from a local clone -nix develop -``` - -The development shell includes: -- Go toolchain -- git and make -- Proper environment variables for development - -**Using in other flakes:** -The flake also provides an overlay for easy integration into other flake-based projects: -```nix -{ - inputs.lazygit.url = "github:jesseduffield/lazygit"; - - outputs = { self, nixpkgs, lazygit }: { - # Use the overlay - nixpkgs.overlays = [ lazygit.overlays.default ]; - }; -} -``` - -### Flox - -Lazygit can be installed into a Flox environment as follows. - -```sh -flox install lazygit -``` - -More details about Flox can be found on [their website](https://flox.dev/). - -### FreeBSD - -```sh -pkg install lazygit -``` - -### Termux - -```sh -apt install lazygit -``` - -### Conda - -Released versions are available for different platforms, see - -```sh -conda install -c conda-forge lazygit -``` - -### Go - -```sh -go install github.com/jesseduffield/lazygit@latest -``` - -Please note: -If you get an error claiming that lazygit cannot be found or is not defined, you -may need to add `~/go/bin` to your $PATH (MacOS/Linux), or `%HOME%\go\bin` -(Windows). Not to be mistaken for `C:\Go\bin` (which is for Go's own binaries, -not apps like lazygit). - -### Chocolatey (Windows) - -You can install `lazygit` using [Chocolatey](https://chocolatey.org/): - -```sh -choco install lazygit -``` - -### Winget (Windows 10 1709 or later) - -You can install `lazygit` using the `winget` command in the Windows Terminal with the following command: - -```powershell -winget install -e --id=JesseDuffield.lazygit -``` - -### Manual - -You'll need to [install Go](https://golang.org/doc/install) - -``` -git clone https://github.com/jesseduffield/lazygit.git -cd lazygit -go install -``` - -You can also use `go run main.go` to compile and run in one go (pun definitely intended) - -## Usage - -Call `lazygit` in your terminal inside a git repository. - -```sh -$ lazygit -``` - -If you want, you can -also add an alias for this with `echo "alias lg='lazygit'" >> ~/.zshrc` (or -whichever rc file you're using). - -### Keybindings - -You can check out the list of keybindings [here](/docs/keybindings). - -### Changing Directory On Exit - -If you change repos in lazygit and want your shell to change directory into that repo on exiting lazygit, add this to your `~/.zshrc` (or other rc file): - -``` -lg() -{ - export LAZYGIT_NEW_DIR_FILE=~/.lazygit/newdir - - lazygit "$@" - - if [ -f $LAZYGIT_NEW_DIR_FILE ]; then - cd "$(cat $LAZYGIT_NEW_DIR_FILE)" - rm -f $LAZYGIT_NEW_DIR_FILE > /dev/null - fi -} -``` - -Then `source ~/.zshrc` and from now on when you call `lg` and exit you'll switch directories to whatever you were in inside lazygit. To override this behaviour you can exit using `shift+Q` rather than just `q`. - -### Undo/Redo - -See the [docs](/docs/Undoing.md) - -## Configuration - -Check out the [configuration docs](docs/Config.md). - -### Custom Pagers - -See the [docs](docs/Custom_Pagers.md) - -### Custom Commands - -If lazygit is missing a feature, there's a good chance you can implement it yourself with a custom command! - -See the [docs](docs/Custom_Command_Keybindings.md) - -### Git flow support - -Lazygit supports [Gitflow](https://github.com/nvie/gitflow) if you have it installed. To understand how the Gitflow model works check out Vincent Driessen's original [post](https://nvie.com/posts/a-successful-git-branching-model/) explaining it. To view Gitflow options from within Lazygit, press `i` from within the branches view. - -## Contributing - -We love your input! Please check out the [contributing guide](CONTRIBUTING.md). -For contributor discussion about things not better discussed here in the repo, join the [discord channel](https://discord.gg/ehwFt2t4wt) - - - -Check out this [video](https://www.youtube.com/watch?v=kNavnhzZHtk) walking through the creation of a small feature in lazygit if you want an idea of where to get started. - -### Debugging Locally - -Run `lazygit --debug` in one terminal tab and `lazygit --logs` in another to view the program and its log output side by side - -## Donate - -If you would like to support the development of lazygit, consider [sponsoring me](https://github.com/sponsors/jesseduffield) (github is matching all donations dollar-for-dollar for 12 months) - -## FAQ - -### What do the commit colors represent? - -- Green: the commit is included in the master branch -- Yellow: the commit is not included in the master branch -- Red: the commit has not been pushed to the upstream branch - -## Shameless Plug - -If you want to see what I (Jesse) am up to in terms of development, follow me on -[twitter](https://twitter.com/DuffieldJesse) or check out my [blog](https://jesseduffield.com/) - -## Alternatives - -If you find that lazygit doesn't quite satisfy your requirements, these may be a better fit: - -- [GitUI](https://github.com/Extrawurst/gitui) -- [tig](https://github.com/jonas/tig) -- [GitArbor TUI](https://github.com/cadamsdev/gitarbor-tui) diff --git a/dot_config/shared/lazygit/lazygit.exe b/dot_config/shared/lazygit/lazygit.exe deleted file mode 100644 index aaec9297013e4462472cf27e6dc4655b927c5eec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22552576 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%0ANn`axYyQhYo1hKnbem-A9G4Sh?2;ow+|p^ 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