Repository: craftzdog/dotfiles-public Branch: master Commit: accc00345455 Files: 40 Total size: 55.0 KB Directory structure: gitextract_9scmqroy/ ├── .config/ │ ├── fish/ │ │ ├── conf.d/ │ │ │ └── tide.fish │ │ ├── config-linux.fish │ │ ├── config-osx.fish │ │ ├── config-windows.fish │ │ ├── config.fish │ │ └── functions/ │ │ ├── fish_user_key_bindings.fish │ │ └── fzf_change_directory.fish │ ├── ghostty/ │ │ └── config │ ├── lazygit/ │ │ └── config.yml │ ├── mise/ │ │ └── config.toml │ ├── nvim/ │ │ ├── init.lua │ │ └── lua/ │ │ ├── config/ │ │ │ ├── autocmds.lua │ │ │ ├── keymaps.lua │ │ │ ├── lazy.lua │ │ │ └── options.lua │ │ ├── craftzdog/ │ │ │ ├── discipline.lua │ │ │ ├── hsl.lua │ │ │ └── lsp.lua │ │ ├── plugins/ │ │ │ ├── coding.lua │ │ │ ├── colorscheme.lua │ │ │ ├── editor.lua │ │ │ ├── lsp.lua │ │ │ ├── treesitter.lua │ │ │ └── ui.lua │ │ └── util/ │ │ └── debug.lua │ ├── powershell/ │ │ ├── takuya.omp.json │ │ └── user_profile.ps1 │ └── tmux/ │ ├── macos.conf │ ├── statusline.conf │ ├── theme.conf │ ├── tmux.conf │ └── utility.conf ├── .czrc ├── .gitconfig ├── .github/ │ └── workflows/ │ ├── claude-code-review.yml │ └── claude.yml ├── .gitignore ├── .scripts/ │ └── ide ├── ISSUE_TEMPLATE.md └── README.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: .config/fish/conf.d/tide.fish ================================================ set -g tide_git_bg_color 268bd2 set -g tide_git_bg_color_unstable C4A000 set -g tide_git_bg_color_urgent CC0000 set -g tide_git_branch_color 000000 set -g tide_git_color_branch 000000 set -g tide_git_color_conflicted 000000 set -g tide_git_color_dirty 000000 set -g tide_git_color_operation 000000 set -g tide_git_color_staged 000000 set -g tide_git_color_stash 000000 set -g tide_git_color_untracked 000000 set -g tide_git_color_upstream 000000 set -g tide_git_conflicted_color 000000 set -g tide_git_dirty_color 000000 set -g tide_git_icon  set -g tide_git_operation_color 000000 set -g tide_git_staged_color 000000 set -g tide_git_stash_color 000000 set -g tide_git_untracked_color 000000 set -g tide_git_upstream_color 000000 set -g tide_pwd_bg_color 444444 ================================================ FILE: .config/fish/config-linux.fish ================================================ if type -q eza alias ll "eza -l -g --icons" alias lla "ll -a" end ================================================ FILE: .config/fish/config-osx.fish ================================================ if type -q eza alias ll "eza -l -g --icons" alias lla "ll -a" end # Inkdrop set -gx INKDROP_HOME ~/.inkdrop # Fzf set -g FZF_PREVIEW_FILE_CMD "bat --style=numbers --color=always --line-range :500" set -g FZF_LEGACY_KEYBINDINGS 0 ================================================ FILE: .config/fish/config-windows.fish ================================================ ================================================ FILE: .config/fish/config.fish ================================================ set fish_greeting "" set -gx TERM xterm-256color # theme set -g theme_color_scheme terminal-dark set -g fish_prompt_pwd_dir_length 1 set -g theme_display_user yes set -g theme_hide_hostname no set -g theme_hostname always # aliases alias ls "ls -p -G" alias la "ls -A" alias ll "ls -l" alias lla "ll -A" alias g git alias c claude alias claude-yolo "claude --dangerously-skip-permissions" command -qv nvim && alias vim nvim set -gx EDITOR nvim set -gx PATH bin $PATH set -gx PATH ~/bin $PATH set -gx PATH ~/.local/bin $PATH # NodeJS set -gx PATH node_modules/.bin $PATH # Go set -g GOPATH $HOME/go set -gx PATH $GOPATH/bin $PATH switch (uname) case Darwin source (dirname (status --current-filename))/config-osx.fish case Linux source (dirname (status --current-filename))/config-linux.fish case '*' source (dirname (status --current-filename))/config-windows.fish end set LOCAL_CONFIG (dirname (status --current-filename))/config-local.fish if test -f $LOCAL_CONFIG source $LOCAL_CONFIG end ================================================ FILE: .config/fish/functions/fish_user_key_bindings.fish ================================================ function fish_user_key_bindings # fzf bind \cf fzf_change_directory # vim-like bind \cl forward-char # prevent iterm2 from closing when typing Ctrl-D (EOF) bind \cd delete-char end # fzf plugin fzf_configure_bindings --directory=\co ================================================ FILE: .config/fish/functions/fzf_change_directory.fish ================================================ function _fzf_change_directory fzf | perl -pe 's/([ ()])/\\\\$1/g'|read foo if [ $foo ] builtin cd $foo commandline -r '' commandline -f repaint else commandline '' end end function fzf_change_directory begin echo $HOME/.config find $(ghq root) -maxdepth 4 -type d -name .git | sed 's/\/\.git//' ls -ad */|perl -pe "s#^#$PWD/#"|grep -v \.git ls -ad $HOME/Developments/*/* |grep -v \.git end | sed -e 's/\/$//' | awk '!a[$0]++' | _fzf_change_directory $argv end ================================================ FILE: .config/ghostty/config ================================================ theme = "Solarized Dark - Patched" background-opacity = 0.9 background-blur-radius = 20 background = #031219 font-family = "PlemolJP Console NF" cursor-style = block cursor-style-blink = true #keybind = global:cmd+ctrl+shift+j=toggle_visibility macos-option-as-alt = left keybind = alt+left=unbind keybind = alt+right=unbind ================================================ FILE: .config/lazygit/config.yml ================================================ customCommands: - key: "C" command: "git cz" description: "commit with commitizen" context: "files" loadingText: "opening commitizen commit tool" output: terminal gui: mouseEvents: false ================================================ FILE: .config/mise/config.toml ================================================ [tools] bun = "latest" ghq = "latest" node = "latest" python = "latest" ruby = "latest" rust = "latest" ================================================ FILE: .config/nvim/init.lua ================================================ if vim.loader then vim.loader.enable() end _G.dd = function(...) require("util.debug").dump(...) end vim.print = _G.dd require("config.lazy") ================================================ FILE: .config/nvim/lua/config/autocmds.lua ================================================ -- Turn off paste mode when leaving insert vim.api.nvim_create_autocmd("InsertLeave", { pattern = "*", command = "set nopaste", }) -- Disable the concealing in some file formats -- The default conceallevel is 3 in LazyVim vim.api.nvim_create_autocmd("FileType", { pattern = { "json", "jsonc", "markdown" }, callback = function() vim.opt.conceallevel = 0 end, }) ================================================ FILE: .config/nvim/lua/config/keymaps.lua ================================================ local discipline = require("craftzdog.discipline") discipline.cowboy() local keymap = vim.keymap local opts = { noremap = true, silent = true } -- Do things without affecting the registers keymap.set("n", "x", '"_x') keymap.set("n", "p", '"0p') keymap.set("n", "P", '"0P') keymap.set("v", "p", '"0p') keymap.set("n", "c", '"_c') keymap.set("n", "C", '"_C') keymap.set("v", "c", '"_c') keymap.set("v", "C", '"_C') keymap.set("n", "d", '"_d') keymap.set("n", "D", '"_D') keymap.set("v", "d", '"_d') keymap.set("v", "D", '"_D') -- Increment/decrement keymap.set("n", "+", "") keymap.set("n", "-", "") -- Delete a word backwards keymap.set("n", "dw", 'vb"_d') -- Select all keymap.set("n", "", "ggG") -- Save with root permission (not working for now) --vim.api.nvim_create_user_command('W', 'w !sudo tee > /dev/null %', {}) -- Disable continuations keymap.set("n", "o", "o^Da", opts) keymap.set("n", "O", "O^Da", opts) -- Jumplist keymap.set("n", "", "", opts) -- New tab keymap.set("n", "te", ":tabedit") keymap.set("n", "", ":tabnext", opts) keymap.set("n", "", ":tabprev", opts) -- Split window keymap.set("n", "ss", ":split", opts) keymap.set("n", "sv", ":vsplit", opts) -- Move window keymap.set("n", "sh", "h") keymap.set("n", "sk", "k") keymap.set("n", "sj", "j") keymap.set("n", "sl", "l") -- Resize window keymap.set("n", "", "<") keymap.set("n", "", ">") keymap.set("n", "", "+") keymap.set("n", "", "-") -- Diagnostics keymap.set("n", "", function() vim.diagnostic.goto_next() end, opts) keymap.set("n", "r", function() require("craftzdog.hsl").replaceHexWithHSL() end) keymap.set("n", "i", function() require("craftzdog.lsp").toggleInlayHints() end) vim.api.nvim_create_user_command("ToggleAutoformat", function() require("craftzdog.lsp").toggleAutoformat() end, {}) ================================================ FILE: .config/nvim/lua/config/lazy.lua ================================================ local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", -- latest stable release lazypath, }) end vim.opt.rtp:prepend(lazypath) require("lazy").setup({ spec = { -- add LazyVim and import its plugins { "LazyVim/LazyVim", import = "lazyvim.plugins", opts = { colorscheme = "solarized-osaka", news = { lazyvim = true, neovim = true, }, }, }, -- import any extras modules here { import = "lazyvim.plugins.extras.linting.eslint" }, { import = "lazyvim.plugins.extras.formatting.prettier" }, { import = "lazyvim.plugins.extras.lang.typescript" }, { import = "lazyvim.plugins.extras.lang.json" }, -- { import = "lazyvim.plugins.extras.lang.markdown" }, { import = "lazyvim.plugins.extras.lang.rust" }, { import = "lazyvim.plugins.extras.lang.tailwind" }, -- { import = "lazyvim.plugins.extras.dap.core" }, -- { import = "lazyvim.plugins.extras.vscode" }, { import = "lazyvim.plugins.extras.util.mini-hipatterns" }, -- { import = "lazyvim.plugins.extras.test.core" }, -- { import = "lazyvim.plugins.extras.coding.yanky" }, -- { import = "lazyvim.plugins.extras.editor.mini-files" }, -- { import = "lazyvim.plugins.extras.util.project" }, { import = "plugins" }, }, defaults = { -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup. -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default. lazy = false, -- It's recommended to leave version=false for now, since a lot the plugin that support versioning, -- have outdated releases, which may break your Neovim install. version = false, -- always use the latest git commit -- version = "*", -- try installing the latest stable version for plugins that support semver }, dev = { path = "~/.ghq/github.com", }, checker = { enabled = true }, -- automatically check for plugin updates performance = { cache = { enabled = true, -- disable_events = {}, }, rtp = { -- disable some rtp plugins disabled_plugins = { "gzip", -- "matchit", -- "matchparen", "netrwPlugin", "rplugin", "tarPlugin", "tohtml", "tutor", "zipPlugin", }, }, }, ui = { custom_keys = { ["d"] = function(plugin) dd(plugin) end, }, }, debug = false, }) ================================================ FILE: .config/nvim/lua/config/options.lua ================================================ vim.g.mapleader = " " vim.opt.encoding = "utf-8" vim.opt.fileencoding = "utf-8" vim.opt.number = true vim.opt.title = true vim.opt.autoindent = true vim.opt.smartindent = true vim.opt.hlsearch = true vim.opt.backup = false vim.opt.showcmd = true vim.opt.cmdheight = 1 vim.opt.laststatus = 3 vim.opt.expandtab = true vim.opt.scrolloff = 10 vim.opt.shell = "fish" vim.opt.backupskip = { "/tmp/*", "/private/tmp/*" } vim.opt.inccommand = "split" vim.opt.ignorecase = true -- Case insensitive searching UNLESS /C or capital in search vim.opt.smarttab = true vim.opt.breakindent = true vim.opt.shiftwidth = 2 vim.opt.tabstop = 2 vim.opt.wrap = false -- No Wrap lines vim.opt.backspace = { "start", "eol", "indent" } vim.opt.path:append({ "**" }) -- Finding files - Search down into subfolders vim.opt.wildignore:append({ "*/node_modules/*" }) vim.opt.splitbelow = true -- Put new windows below current vim.opt.splitright = true -- Put new windows right of current vim.opt.splitkeep = "cursor" vim.opt.mouse = "" -- Undercurl vim.cmd([[let &t_Cs = "\e[4:3m"]]) vim.cmd([[let &t_Ce = "\e[4:0m"]]) -- Add asterisks in block comments vim.opt.formatoptions:append({ "r" }) vim.cmd([[au BufNewFile,BufRead *.astro setf astro]]) vim.cmd([[au BufNewFile,BufRead Podfile setf ruby]]) if vim.fn.has("nvim-0.8") == 1 then vim.opt.cmdheight = 0 end -- File types vim.filetype.add({ extension = { mdx = "mdx", }, }) vim.g.lazyvim_prettier_needs_config = true vim.g.lazyvim_picker = "telescope" vim.g.lazyvim_cmp = "blink.cmp" ================================================ FILE: .config/nvim/lua/craftzdog/discipline.lua ================================================ local M = {} function M.cowboy() ---@type table? local ok = true for _, key in ipairs({ "h", "j", "k", "l", "+", "-" }) do local count = 0 local timer = assert(vim.uv.new_timer()) local map = key vim.keymap.set("n", key, function() if vim.v.count > 0 then count = 0 end if count >= 10 and vim.bo.buftype ~= "nofile" then ok = pcall(vim.notify, "Hold it Cowboy!", vim.log.levels.WARN, { icon = "🤠", id = "cowboy", keep = function() return count >= 10 end, }) if not ok then return map end else count = count + 1 timer:start(2000, 0, function() count = 0 end) return map end end, { expr = true, silent = true }) end end return M ================================================ FILE: .config/nvim/lua/craftzdog/hsl.lua ================================================ -- https://github.com/EmmanuelOga/columns/blob/master/utils/color.lua local M = {} local hexChars = "0123456789abcdef" function M.hex_to_rgb(hex) hex = string.lower(hex) local ret = {} for i = 0, 2 do local char1 = string.sub(hex, i * 2 + 2, i * 2 + 2) local char2 = string.sub(hex, i * 2 + 3, i * 2 + 3) local digit1 = string.find(hexChars, char1) - 1 local digit2 = string.find(hexChars, char2) - 1 ret[i + 1] = (digit1 * 16 + digit2) / 255.0 end return ret end --[[ * Converts an RGB color value to HSL. Conversion formula * adapted from http://en.wikipedia.org/wiki/HSL_color_space. * Assumes r, g, and b are contained in the set [0, 255] and * returns h, s, and l in the set [0, 1]. * * @param Number r The red color value * @param Number g The green color value * @param Number b The blue color value * @return Array The HSL representation ]] function M.rgbToHsl(r, g, b) local max, min = math.max(r, g, b), math.min(r, g, b) local h = 0 local s = 0 local l = 0 l = (max + min) / 2 if max == min then h, s = 0, 0 -- achromatic else local d = max - min if l > 0.5 then s = d / (2 - max - min) else s = d / (max + min) end if max == r then h = (g - b) / d if g < b then h = h + 6 end elseif max == g then h = (b - r) / d + 2 elseif max == b then h = (r - g) / d + 4 end h = h / 6 end return h * 360, s * 100, l * 100 end --[[ * Converts an HSL color value to RGB. Conversion formula * adapted from http://en.wikipedia.org/wiki/HSL_color_space. * Assumes h, s, and l are contained in the set [0, 1] and * returns r, g, and b in the set [0, 255]. * * @param Number h The hue * @param Number s The saturation * @param Number l The lightness * @return Array The RGB representation ]] function M.hslToRgb(h, s, l) local r, g, b if s == 0 then r, g, b = l, l, l -- achromatic else function hue2rgb(p, q, t) if t < 0 then t = t + 1 end if t > 1 then t = t - 1 end if t < 1 / 6 then return p + (q - p) * 6 * t end if t < 1 / 2 then return q end if t < 2 / 3 then return p + (q - p) * (2 / 3 - t) * 6 end return p end local q if l < 0.5 then q = l * (1 + s) else q = l + s - l * s end local p = 2 * l - q r = hue2rgb(p, q, h + 1 / 3) g = hue2rgb(p, q, h) b = hue2rgb(p, q, h - 1 / 3) end return r * 255, g * 255, b * 255 end function M.hexToHSL(hex) local hsluv = require("solarized-osaka.hsluv") local rgb = M.hex_to_rgb(hex) local h, s, l = M.rgbToHsl(rgb[1], rgb[2], rgb[3]) return string.format("hsl(%d, %d, %d)", math.floor(h + 0.5), math.floor(s + 0.5), math.floor(l + 0.5)) end --[[ * Converts an HSL color value to RGB in Hex representation. * @param Number h The hue * @param Number s The saturation * @param Number l The lightness * @return String The hex representation ]] function M.hslToHex(h, s, l) local r, g, b = M.hslToRgb(h / 360, s / 100, l / 100) return string.format("#%02x%02x%02x", r, g, b) end function M.replaceHexWithHSL() -- Get the current line number local line_number = vim.api.nvim_win_get_cursor(0)[1] -- Get the line content local line_content = vim.api.nvim_buf_get_lines(0, line_number - 1, line_number, false)[1] -- Find hex code patterns and replace them for hex in line_content:gmatch("#[0-9a-fA-F]+") do local hsl = M.hexToHSL(hex) line_content = line_content:gsub(hex, hsl) end -- Set the line content back vim.api.nvim_buf_set_lines(0, line_number - 1, line_number, false, { line_content }) end return M ================================================ FILE: .config/nvim/lua/craftzdog/lsp.lua ================================================ local M = {} local LazyvimUtil = require("lazyvim.util") function M.toggleInlayHints() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) end function M.toggleAutoformat() LazyvimUtil.format.toggle() end return M ================================================ FILE: .config/nvim/lua/plugins/coding.lua ================================================ return { -- Incremental rename { "smjonas/inc-rename.nvim", cmd = "IncRename", config = true, }, -- Go forward/backward with square brackets { "nvim-mini/mini.bracketed", event = "BufReadPost", config = function() local bracketed = require("mini.bracketed") bracketed.setup({ file = { suffix = "" }, window = { suffix = "" }, quickfix = { suffix = "" }, yank = { suffix = "" }, treesitter = { suffix = "n" }, }) end, }, -- Better increase/descrease { "monaqa/dial.nvim", -- stylua: ignore keys = { { "", function() return require("dial.map").inc_normal() end, expr = true, desc = "Increment" }, { "", function() return require("dial.map").dec_normal() end, expr = true, desc = "Decrement" }, }, config = function() local augend = require("dial.augend") require("dial.config").augends:register_group({ default = { augend.integer.alias.decimal, augend.integer.alias.hex, augend.date.alias["%Y/%m/%d"], augend.constant.alias.bool, augend.semver.alias.semver, augend.constant.new({ elements = { "let", "const" } }), }, }) end, }, -- copilot { "zbirenbaum/copilot.lua", opts = { suggestion = { auto_trigger = true, keymap = { accept = "", accept_word = "", accept_line = "", next = "", prev = "", dismiss = "", }, }, filetypes = { markdown = true, help = true, }, }, }, } ================================================ FILE: .config/nvim/lua/plugins/colorscheme.lua ================================================ return { { "craftzdog/solarized-osaka.nvim", lazy = true, priority = 1000, opts = function() return { transparent = true, } end, }, } ================================================ FILE: .config/nvim/lua/plugins/editor.lua ================================================ return { { enabled = false, "folke/flash.nvim", ---@type Flash.Config opts = { search = { forward = true, multi_window = false, wrap = false, incremental = true, }, }, }, { "brenoprata10/nvim-highlight-colors", event = "BufReadPre", opts = { render = "background", enable_hex = true, enable_short_hex = true, enable_rgb = true, enable_hsl = true, enable_hsl_without_function = true, enable_ansi = true, enable_var_usage = true, enable_tailwind = true, }, }, { "dinhhuy258/git.nvim", event = "BufReadPre", opts = { keymaps = { -- Open blame window blame = "gb", -- Open file/folder in git repository browse = "go", }, }, }, { "nvim-telescope/telescope.nvim", dependencies = { { "nvim-telescope/telescope-fzf-native.nvim", build = "make", }, "nvim-telescope/telescope-file-browser.nvim", }, keys = { { "fP", function() require("telescope.builtin").find_files({ cwd = require("lazy.core.config").options.root, }) end, desc = "Find Plugin File", }, { ";f", function() local builtin = require("telescope.builtin") builtin.find_files({ no_ignore = false, hidden = true, }) end, desc = "Lists files in your current working directory, respects .gitignore", }, { ";r", function() local builtin = require("telescope.builtin") builtin.live_grep({ additional_args = { "--hidden" }, }) end, desc = "Search for a string in your current working directory and get results live as you type, respects .gitignore", }, { "\\\\", function() local builtin = require("telescope.builtin") builtin.buffers() end, desc = "Lists open buffers", }, { ";t", function() local builtin = require("telescope.builtin") builtin.help_tags() end, desc = "Lists available help tags and opens a new window with the relevant help info on ", }, { ";;", function() local builtin = require("telescope.builtin") builtin.resume() end, desc = "Resume the previous telescope picker", }, { ";e", function() local builtin = require("telescope.builtin") builtin.diagnostics() end, desc = "Lists Diagnostics for all open buffers or a specific buffer", }, { ";s", function() local builtin = require("telescope.builtin") builtin.treesitter() end, desc = "Lists Function names, variables, from Treesitter", }, { ";c", function() local builtin = require("telescope.builtin") builtin.lsp_incoming_calls() end, desc = "Lists LSP incoming calls for word under the cursor", }, { "sf", function() local telescope = require("telescope") local function telescope_buffer_dir() return vim.fn.expand("%:p:h") end telescope.extensions.file_browser.file_browser({ path = "%:p:h", cwd = telescope_buffer_dir(), respect_gitignore = false, hidden = true, grouped = true, previewer = false, initial_mode = "normal", layout_config = { height = 40 }, }) end, desc = "Open File Browser with the path of the current buffer", }, }, config = function(_, opts) local telescope = require("telescope") local actions = require("telescope.actions") local fb_actions = require("telescope").extensions.file_browser.actions opts.defaults = vim.tbl_deep_extend("force", opts.defaults, { wrap_results = true, layout_strategy = "horizontal", layout_config = { prompt_position = "top" }, sorting_strategy = "ascending", winblend = 0, mappings = { n = {}, }, }) opts.pickers = { diagnostics = { theme = "ivy", initial_mode = "normal", layout_config = { preview_cutoff = 9999, }, }, } opts.extensions = { file_browser = { theme = "dropdown", -- disables netrw and use telescope-file-browser in its place hijack_netrw = true, mappings = { -- your custom insert mode mappings ["n"] = { -- your custom normal mode mappings ["N"] = fb_actions.create, ["h"] = fb_actions.goto_parent_dir, ["/"] = function() vim.cmd("startinsert") end, [""] = function(prompt_bufnr) for i = 1, 10 do actions.move_selection_previous(prompt_bufnr) end end, [""] = function(prompt_bufnr) for i = 1, 10 do actions.move_selection_next(prompt_bufnr) end end, [""] = actions.preview_scrolling_up, [""] = actions.preview_scrolling_down, }, }, }, } telescope.setup(opts) require("telescope").load_extension("fzf") require("telescope").load_extension("file_browser") end, }, { "kazhala/close-buffers.nvim", event = "VeryLazy", keys = { { "th", function() require("close_buffers").delete({ type = "hidden" }) end, "Close Hidden Buffers", }, { "tu", function() require("close_buffers").delete({ type = "nameless" }) end, "Close Nameless Buffers", }, }, }, { "saghen/blink.cmp", opts = { completion = { menu = { winblend = vim.o.pumblend, }, }, signature = { window = { winblend = vim.o.pumblend, }, }, }, }, } ================================================ FILE: .config/nvim/lua/plugins/lsp.lua ================================================ return { -- tools { "mason-org/mason.nvim", opts = function(_, opts) vim.list_extend(opts.ensure_installed, { "stylua", "selene", "luacheck", "shellcheck", "shfmt", "tailwindcss-language-server", "typescript-language-server", "css-lsp", }) end, }, -- lsp servers { "neovim/nvim-lspconfig", opts = { inlay_hints = { enabled = false }, ---@type lspconfig.options servers = { cssls = {}, tailwindcss = { root_dir = function(...) return require("lspconfig.util").root_pattern(".git")(...) end, }, tsserver = { root_dir = function(...) return require("lspconfig.util").root_pattern(".git")(...) end, single_file_support = false, settings = { typescript = { inlayHints = { includeInlayParameterNameHints = "literal", includeInlayParameterNameHintsWhenArgumentMatchesName = false, includeInlayFunctionParameterTypeHints = true, includeInlayVariableTypeHints = false, includeInlayPropertyDeclarationTypeHints = true, includeInlayFunctionLikeReturnTypeHints = true, includeInlayEnumMemberValueHints = true, }, }, javascript = { inlayHints = { includeInlayParameterNameHints = "all", includeInlayParameterNameHintsWhenArgumentMatchesName = false, includeInlayFunctionParameterTypeHints = true, includeInlayVariableTypeHints = true, includeInlayPropertyDeclarationTypeHints = true, includeInlayFunctionLikeReturnTypeHints = true, includeInlayEnumMemberValueHints = true, }, }, }, }, html = {}, yamlls = { settings = { yaml = { keyOrdering = false, }, }, }, lua_ls = { -- enabled = false, single_file_support = true, settings = { Lua = { workspace = { checkThirdParty = false, }, completion = { workspaceWord = true, callSnippet = "Both", }, misc = { parameters = { -- "--log-level=trace", }, }, hint = { enable = true, setType = false, paramType = true, paramName = "Disable", semicolon = "Disable", arrayIndex = "Disable", }, doc = { privateName = { "^_" }, }, type = { castNumberToInteger = true, }, diagnostics = { disable = { "incomplete-signature-doc", "trailing-space" }, -- enable = false, groupSeverity = { strong = "Warning", strict = "Warning", }, groupFileStatus = { ["ambiguity"] = "Opened", ["await"] = "Opened", ["codestyle"] = "None", ["duplicate"] = "Opened", ["global"] = "Opened", ["luadoc"] = "Opened", ["redefined"] = "Opened", ["strict"] = "Opened", ["strong"] = "Opened", ["type-check"] = "Opened", ["unbalanced"] = "Opened", ["unused"] = "Opened", }, unusedLocalExclude = { "_*" }, }, format = { enable = false, defaultConfig = { indent_style = "space", indent_size = "2", continuation_indent_size = "2", }, }, }, }, }, }, setup = {}, }, }, { "neovim/nvim-lspconfig", opts = function() local keys = require("lazyvim.plugins.lsp.keymaps").get() vim.list_extend(keys, { { "gd", function() -- DO NOT RESUSE WINDOW require("telescope.builtin").lsp_definitions({ reuse_win = false }) end, desc = "Goto Definition", has = "definition", }, }) end, }, } ================================================ FILE: .config/nvim/lua/plugins/treesitter.lua ================================================ return { { "nvim-treesitter/playground", cmd = "TSPlaygroundToggle" }, { "nvim-treesitter/nvim-treesitter", build = ":TSUpdate", opts = { ensure_installed = { "astro", "cmake", "cpp", "css", "fish", "gitignore", "go", "graphql", "http", "java", "php", "rust", "scss", "sql", "svelte", }, -- matchup = { -- enable = true, -- }, -- https://github.com/nvim-treesitter/playground#query-linter query_linter = { enable = true, use_virtual_text = true, lint_events = { "BufWrite", "CursorHold" }, }, playground = { enable = true, disable = {}, updatetime = 25, -- Debounced time for highlighting nodes in the playground from source code persist_queries = true, -- Whether the query persists across vim sessions keybindings = { toggle_query_editor = "o", toggle_hl_groups = "i", toggle_injected_languages = "t", toggle_anonymous_nodes = "a", toggle_language_display = "I", focus_language = "f", unfocus_language = "F", update = "R", goto_node = "", show_help = "?", }, }, }, config = function(_, opts) local TS = require("nvim-treesitter") TS.setup(opts) -- MDX vim.filetype.add({ extension = { mdx = "mdx", }, }) vim.treesitter.language.register("markdown", "mdx") end, }, } ================================================ FILE: .config/nvim/lua/plugins/ui.lua ================================================ return { -- messages, cmdline and the popupmenu { "folke/noice.nvim", opts = function(_, opts) table.insert(opts.routes, { filter = { event = "notify", find = "No information available", }, opts = { skip = true }, }) local focused = true vim.api.nvim_create_autocmd("FocusGained", { callback = function() focused = true end, }) vim.api.nvim_create_autocmd("FocusLost", { callback = function() focused = false end, }) table.insert(opts.routes, 1, { filter = { cond = function() return not focused end, }, view = "notify_send", opts = { stop = false }, }) opts.commands = { all = { -- options for the message history that you get with `:Noice` view = "split", opts = { enter = true, format = "details" }, filter = {}, }, } vim.api.nvim_create_autocmd("FileType", { pattern = "markdown", callback = function(event) vim.schedule(function() require("noice.text.markdown").keys(event.buf) end) end, }) opts.presets.lsp_doc_border = true end, }, { "rcarriga/nvim-notify", opts = { timeout = 5000, }, }, { "snacks.nvim", opts = { scroll = { enabled = false }, }, keys = {}, }, -- buffer line { "akinsho/bufferline.nvim", event = "VeryLazy", keys = { { "", "BufferLineCycleNext", desc = "Next tab" }, { "", "BufferLineCyclePrev", desc = "Prev tab" }, }, opts = { options = { mode = "tabs", -- separator_style = "slant", show_buffer_close_icons = false, show_close_icon = false, }, }, }, -- filename { "b0o/incline.nvim", dependencies = { "craftzdog/solarized-osaka.nvim" }, event = "BufReadPre", priority = 1200, config = function() local colors = require("solarized-osaka.colors").setup() require("incline").setup({ highlight = { groups = { InclineNormal = { guibg = colors.magenta500, guifg = colors.base04 }, InclineNormalNC = { guifg = colors.violet500, guibg = colors.base03 }, }, }, window = { margin = { vertical = 0, horizontal = 1 } }, hide = { cursorline = true, }, render = function(props) local filename = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(props.buf), ":t") if vim.bo[props.buf].modified then filename = "[+] " .. filename end local icon, color = require("nvim-web-devicons").get_icon_color(filename) return { { icon, guifg = color }, { " " }, { filename } } end, }) end, }, -- statusline { "nvim-lualine/lualine.nvim", opts = function(_, opts) local LazyVim = require("lazyvim.util") opts.sections.lualine_c[4] = { LazyVim.lualine.pretty_path({ length = 0, relative = "cwd", modified_hl = "MatchParen", directory_hl = "", filename_hl = "Bold", modified_sign = "", readonly_icon = " 󰌾 ", }), } end, }, { "folke/zen-mode.nvim", cmd = "ZenMode", opts = { plugins = { gitsigns = true, tmux = true, kitty = { enabled = false, font = "+2" }, }, }, keys = { { "z", "ZenMode", desc = "Zen Mode" } }, }, { "MeanderingProgrammer/render-markdown.nvim", enabled = false, }, { "folke/snacks.nvim", opts = { dashboard = { preset = { header = [[ ██████╗ ███████╗██╗ ██╗ █████╗ ███████╗██╗ ██╗███████╗███████╗ ██╔══██╗██╔════╝██║ ██║██╔══██╗██╔════╝██║ ██║██╔════╝██╔════╝ ██║ ██║█████╗ ██║ ██║███████║███████╗██║ ██║█████╗ █████╗ ██║ ██║██╔══╝ ╚██╗ ██╔╝██╔══██║╚════██║██║ ██║██╔══╝ ██╔══╝ ██████╔╝███████╗ ╚████╔╝ ██║ ██║███████║███████╗██║██║ ███████╗ ╚═════╝ ╚══════╝ ╚═══╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝╚═╝ ╚══════╝ ]], }, }, }, }, } ================================================ FILE: .config/nvim/lua/util/debug.lua ================================================ -- selene: allow(global_usage) local M = {} function M.get_loc() local me = debug.getinfo(1, "S") local level = 2 local info = debug.getinfo(level, "S") while info and (info.source == me.source or info.source == "@" .. vim.env.MYVIMRC or info.what ~= "Lua") do level = level + 1 info = debug.getinfo(level, "S") end info = info or me local source = info.source:sub(2) source = vim.loop.fs_realpath(source) or source return source .. ":" .. info.linedefined end ---@param value any ---@param opts? {loc:string} function M._dump(value, opts) opts = opts or {} opts.loc = opts.loc or M.get_loc() if vim.in_fast_event() then return vim.schedule(function() M._dump(value, opts) end) end opts.loc = vim.fn.fnamemodify(opts.loc, ":~:.") local msg = vim.inspect(value) vim.notify(msg, vim.log.levels.INFO, { title = "Debug: " .. opts.loc, on_open = function(win) vim.wo[win].conceallevel = 3 vim.wo[win].concealcursor = "" vim.wo[win].spell = false local buf = vim.api.nvim_win_get_buf(win) if not pcall(vim.treesitter.start, buf, "lua") then vim.bo[buf].filetype = "lua" end end, }) end function M.dump(...) local value = { ... } if vim.tbl_isempty(value) then value = nil else value = vim.tbl_islist(value) and vim.tbl_count(value) <= 1 and value[1] or value end M._dump(value) end function M.extmark_leaks() local nsn = vim.api.nvim_get_namespaces() local counts = {} for name, ns in pairs(nsn) do for _, buf in ipairs(vim.api.nvim_list_bufs()) do local count = #vim.api.nvim_buf_get_extmarks(buf, ns, 0, -1, {}) if count > 0 then counts[#counts + 1] = { name = name, buf = buf, count = count, ft = vim.bo[buf].ft, } end end end table.sort(counts, function(a, b) return a.count > b.count end) dd(counts) end function estimateSize(value, visited) if value == nil then return 0 end local bytes = 0 -- initialize the visited table if not already done --- @type table visited = visited or {} -- handle already-visited value to avoid infinite recursion if visited[value] then return 0 else visited[value] = true end if type(value) == "boolean" or value == nil then bytes = 4 elseif type(value) == "number" then bytes = 8 elseif type(value) == "string" then bytes = string.len(value) + 24 elseif type(value) == "function" then bytes = 32 -- base size for a function -- add size of upvalues local i = 1 while true do local name, val = debug.getupvalue(value, i) if not name then break end bytes = bytes + estimateSize(val, visited) i = i + 1 end elseif type(value) == "table" then bytes = 40 -- base size for a table entry for k, v in pairs(value) do bytes = bytes + estimateSize(k, visited) + estimateSize(v, visited) end local mt = debug.getmetatable(value) if mt then bytes = bytes + estimateSize(mt, visited) end end return bytes end function M.module_leaks(filter) local sizes = {} for modname, mod in pairs(package.loaded) do if not filter or modname:match(filter) then local root = modname:match("^([^%.]+)%..*$") or modname -- root = modname sizes[root] = sizes[root] or { mod = root, size = 0 } sizes[root].size = sizes[root].size + estimateSize(mod) / 1024 / 1024 end end sizes = vim.tbl_values(sizes) table.sort(sizes, function(a, b) return a.size > b.size end) dd(sizes) end function M.get_upvalue(func, name) local i = 1 while true do local n, v = debug.getupvalue(func, i) if not n then break end if n == name then return v end i = i + 1 end end return M ================================================ FILE: .config/powershell/takuya.omp.json ================================================ { "$schema": "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json", "blocks": [ { "alignment": "left", "segments": [ { "background": "#0077c2", "foreground": "#ffffff", "leading_diamond": "\u256d\u2500\ue0b6", "style": "diamond", "template": " {{ .Name }} ", "type": "shell" }, { "background": "#ef5350", "foreground": "#FFFB38", "properties": { "root_icon": "\uf292" }, "style": "diamond", "template": "\ue0b0 \uf0e7 ", "type": "root" }, { "background": "#444444", "foreground": "#E4E4E4", "powerline_symbol": "\ue0b0", "properties": { "style": "full" }, "style": "powerline", "template": " {{ .Path }} ", "type": "path" }, { "background": "#FFFB38", "background_templates": [ "{{ if or (.Working.Changed) (.Staging.Changed) }}#ffeb95{{ end }}", "{{ if and (gt .Ahead 0) (gt .Behind 0) }}#c5e478{{ end }}", "{{ if gt .Ahead 0 }}#C792EA{{ end }}", "{{ if gt .Behind 0 }}#C792EA{{ end }}" ], "foreground": "#011627", "powerline_symbol": "\ue0b0", "properties": { "branch_icon": "\ue725 ", "fetch_status": true, "fetch_upstream_icon": true }, "style": "powerline", "template": " {{ .HEAD }} {{ if .Working.Changed }}{{ .Working.String }}{{ end }}{{ if and (.Working.Changed) (.Staging.Changed) }} |{{ end }}{{ if .Staging.Changed }}<#ef5350> \uf046 {{ .Staging.String }}{{ end }} ", "type": "git" } ], "type": "prompt" }, { "alignment": "right", "segments": [ { "background": "#303030", "foreground": "#3C873A", "leading_diamond": " \ue0b6", "properties": { "fetch_package_manager": true, "npm_icon": " <#cc3a3a>\ue5fa ", "yarn_icon": " <#348cba>\ue6a7" }, "style": "diamond", "template": "\ue718 {{ if .PackageManagerIcon }}{{ .PackageManagerIcon }} {{ end }}{{ .Full }}", "trailing_diamond": "\ue0b4", "type": "node" }, { "background": "#40c4ff", "foreground": "#ffffff", "invert_powerline": true, "leading_diamond": " \ue0b6", "style": "diamond", "template": " \ue641 {{ .CurrentDate | date .Format }} ", "trailing_diamond": "\ue0b4", "type": "time" } ], "type": "prompt" }, { "alignment": "left", "newline": true, "segments": [ { "foreground": "#21c7c7", "style": "plain", "template": "\u2570\u2500", "type": "text" }, { "foreground": "#e0f8ff", "foreground_templates": [ "{{ if gt .Code 0 }}#ef5350{{ end }}" ], "properties": { "always_enabled": true }, "style": "plain", "template": "\u276f ", "type": "status" } ], "type": "prompt" } ], "version": 3 } ================================================ FILE: .config/powershell/user_profile.ps1 ================================================ Import-Module posh-git $omp_config = Join-Path $PSScriptRoot ".\takuya.omp.json" oh-my-posh init pwsh --config $omp_config | Invoke-Expression Import-Module -Name Terminal-Icons # PSReadLine Set-PSReadLineOption -EditMode Emacs Set-PSReadLineOption -BellStyle None Set-PSReadLineKeyHandler -Chord 'Ctrl+d' -Function DeleteChar Set-PSReadLineOption -PredictionSource History # Fzf Import-Module PSFzf Set-PsFzfOption -PSReadlineChordProvider 'Ctrl+f' -PSReadlineChordReverseHistory 'Ctrl+r' # Env $env:GIT_SSH = "C:\Windows\system32\OpenSSH\ssh.exe" # Alias Set-Alias -Name vim -Value nvim Set-Alias ll ls Set-Alias g git Set-Alias grep findstr Set-Alias tig 'C:\Program Files\Git\usr\bin\tig.exe' Set-Alias less 'C:\Program Files\Git\usr\bin\less.exe' # Paths $env:PATH += ';.\node_modules\.bin' $env:PATH += ';C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64' # Utilities function which ($command) { Get-Command -Name $command -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Path -ErrorAction SilentlyContinue } ================================================ FILE: .config/tmux/macos.conf ================================================ # osx clipboard set-option -g default-command "which reattach-to-user-namespace > /dev/null && reattach-to-user-namespace -l $SHELL || $SHELL" # Undercurl set -as terminal-overrides ',*:Smulx=\E[4::%p1%dm' # undercurl support set -as terminal-overrides ',*:Setulc=\E[58::2::%p1%{65536}%/%d::%p1%{256}%/%{255}%&%d::%p1%{255}%&%d%;m' # underscore colours - needs tmux-3.0 ================================================ FILE: .config/tmux/statusline.conf ================================================ # vim: ft=tmux set -g mode-style "fg=#eee8d5,bg=#073642" set -g message-style "fg=#eee8d5,bg=#073642" set -g message-command-style "fg=#eee8d5,bg=#073642" set -g pane-border-style "fg=#073642" set -g pane-active-border-style "fg=#eee8d5" set -g status "on" set -g status-interval 1 set -g status-justify "left" set -g status-style "fg=#586e75,bg=#073642" set -g status-bg "#002b36" set -g status-left-length "100" set -g status-right-length "100" set -g status-left-style NONE set -g status-right-style NONE set -g status-left "#[fg=#073642,bg=#eee8d5,bold] #S:#I.#P #[fg=#eee8d5,bg=#93a1a1,nobold,nounderscore,noitalics]#[fg=#15161E,bg=#93a1a1,bold] #(whoami) #[fg=#93a1a1,bg=#002b36]" set -g status-right "#[fg=#586e75,bg=#002b36,nobold,nounderscore,noitalics]#[fg=#93a1a1,bg=#586e75]#[fg=#657b83,bg=#586e75,nobold,nounderscore,noitalics]#[fg=#93a1a1,bg=#657b83]#[fg=#93a1a1,bg=#657b83,nobold,nounderscore,noitalics]#[fg=#15161E,bg=#93a1a1,bold] #h " setw -g window-status-activity-style "underscore,fg=#839496,bg=#002b36" setw -g window-status-separator "" setw -g window-status-style "NONE,fg=#839496,bg=#002b36" setw -g window-status-format '#[fg=#002b36,bg=#002b36]#[default] #I  #{b:pane_current_path} #[fg=#002b36,bg=#002b36,nobold,nounderscore,noitalics]' setw -g window-status-current-format '#[fg=#002b36,bg=#eee8d5]#[fg=#b58900,bg=#eee8d5] #I #[fg=#eee8d5,bg=#b58900] #{b:pane_current_path} #[fg=#b58900,bg=#002b36,nobold]' ================================================ FILE: .config/tmux/theme.conf ================================================ #### COLOUR (Solarized 256) # default statusbar colors set-option -g status-style bg=colour235,fg=colour136,default # default window title colors set-window-option -g window-status-style fg=colour244,bg=colour234,dim # active window title colors set-window-option -g window-status-current-style fg=colour166,bg=default,bright # pane border set-option -g pane-border-style fg=colour235 #base02 set-option -g pane-active-border-style fg=colour136,bg=colour235 # message text set-option -g message-style bg=colour235,fg=colour166 # pane number display set-option -g display-panes-active-colour colour33 #blue set-option -g display-panes-colour colour166 #orange # clock set-window-option -g clock-mode-colour colour64 #green ================================================ FILE: .config/tmux/tmux.conf ================================================ #set -g default-terminal "tmux-256color" set -g default-terminal "xterm-256color" #set -ga terminal-overrides ",*256col*:Tc" set -ga terminal-overrides ",xterm-256color:Tc" # action key unbind C-b set-option -g prefix C-t set-option -g repeat-time 0 set-option -g focus-events on #### Key bindings set-window-option -g mode-keys vi #bind t send-key C-t # Reload settings bind r source-file ~/.config/tmux/tmux.conf \; display "Reloaded!" # Open current directory bind o run-shell "open '#{pane_current_path}'" bind -r e kill-pane -a # Moving window bind-key -n C-S-Left swap-window -t -1 \; previous-window bind-key -n C-S-Right swap-window -t +1 \; next-window #### basic settings set-option -g status-justify "left" #set-option utf8-default on #set-option -g mouse-select-pane set-window-option -g mode-keys vi #set-window-option -g utf8 on # look'n feel set-option -g status-fg cyan set-option -g status-bg black set -g pane-active-border-style fg=colour166,bg=default set -g window-style fg=colour10,bg=default set -g window-active-style fg=colour12,bg=default set-option -g history-limit 64096 set -sg escape-time 10 # allow the title bar to adapt to whatever host you connect to set -g set-titles on set -g set-titles-string "#T" # import if-shell "uname -s | grep -q Darwin" "source ~/.config/tmux/macos.conf" source ~/.config/tmux/theme.conf source ~/.config/tmux/statusline.conf source ~/.config/tmux/utility.conf set -g @plugin 'tmux-plugins/tpm' set -g @plugin 'tmux-plugins/tmux-pain-control' run '~/.config/tmux/plugins/tpm/tpm' ================================================ FILE: .config/tmux/utility.conf ================================================ # Display lazygit bind -r g display-popup -d '#{pane_current_path}' -w80% -h80% -E lazygit # Run Claude Code in a separate session bind -r y run-shell '\ SESSION="claude-$(echo #{pane_current_path} | md5sum | cut -c1-8)"; \ tmux has-session -t "$SESSION" 2>/dev/null || \ tmux new-session -d -s "$SESSION" -c "#{pane_current_path}" "claude"; \ tmux display-popup -w80% -h80% -E "tmux attach-session -t $SESSION"' ================================================ FILE: .czrc ================================================ { "path": "cz-git" } ================================================ FILE: .gitconfig ================================================ [core] excludesfile = ~/.gitignore editor = nvim ignorecase = false [push] default = simple [color] status = auto diff = auto branch = auto interactive = auto grep = auto ui = auto [alias] a = "!git status --short | peco | awk '{print $2}' | xargs git add" d = diff co = checkout ci = commit ca = commit -a ps = "!git push origin $(git rev-parse --abbrev-ref HEAD)" pl = "!git pull origin $(git rev-parse --abbrev-ref HEAD)" st = status br = branch ba = branch -a bm = branch --merged bn = branch --no-merged df = "!git hist | peco | awk '{print $2}' | xargs -I {} git diff {}^ {}" hist = log --pretty=format:\"%Cgreen%h %Creset%cd %Cblue[%cn] %Creset%s%C(yellow)%d%C(reset)\" --graph --date=relative --decorate --all llog = log --graph --name-status --pretty=format:\"%C(red)%h %C(reset)(%cd) %C(green)%an %Creset%s %C(yellow)%d%Creset\" --date=relative open = "!hub browse" type = cat-file -t dump = cat-file -p find = "!f() { git log --pretty=format:\"%h %cd [%cn] %s%d\" --date=relative -S'pretty' -S\"$@\" | peco | awk '{print $1}' | xargs -I {} git diff {}^ {}; }; f" # edit conflicted file on merge edit-unmerged = "!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; vim `f`" # add conflicted file on merge add-unmerged = "!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; git add `f`" [hub] protocol = https [github] user = craftzdog [diff] tool = nvimdiff [difftool "nvimdiff"] cmd = nvim -d \"$LOCAL\" \"$REMOTE\" path = [mergetool "nvimdiff"] cmd = nvim -d \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\" trustExitCode = true [filter "lfs"] clean = git-lfs clean -- %f smudge = git-lfs smudge -- %f required = true process = git-lfs filter-process [ghq] root = ~/.ghq ================================================ FILE: .github/workflows/claude-code-review.yml ================================================ name: Claude Code Review on: pull_request: types: [opened, synchronize] # Optional: Only run on specific file changes # paths: # - "src/**/*.ts" # - "src/**/*.tsx" # - "src/**/*.js" # - "src/**/*.jsx" jobs: claude-review: # Optional: Filter by PR author # if: | # github.event.pull_request.user.login == 'external-contributor' || # github.event.pull_request.user.login == 'new-developer' || # github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' runs-on: ubuntu-latest permissions: contents: read pull-requests: read issues: read id-token: write steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 1 - name: Run Claude Code Review id: claude-review uses: anthropics/claude-code-action@beta with: claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} # Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4) # model: "claude-opus-4-20250514" # Direct prompt for automated review (no @claude mention needed) direct_prompt: | Please review this pull request and provide feedback on: - Code quality and best practices - Potential bugs or issues - Performance considerations - Security concerns - Test coverage Be constructive and helpful in your feedback. # Optional: Use sticky comments to make Claude reuse the same comment on subsequent pushes to the same PR # use_sticky_comment: true # Optional: Customize review based on file types # direct_prompt: | # Review this PR focusing on: # - For TypeScript files: Type safety and proper interface usage # - For API endpoints: Security, input validation, and error handling # - For React components: Performance, accessibility, and best practices # - For tests: Coverage, edge cases, and test quality # Optional: Different prompts for different authors # direct_prompt: | # ${{ github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' && # 'Welcome! Please review this PR from a first-time contributor. Be encouraging and provide detailed explanations for any suggestions.' || # 'Please provide a thorough code review focusing on our coding standards and best practices.' }} # Optional: Add specific tools for running tests or linting # allowed_tools: "Bash(npm run test),Bash(npm run lint),Bash(npm run typecheck)" # Optional: Skip review for certain conditions # if: | # !contains(github.event.pull_request.title, '[skip-review]') && # !contains(github.event.pull_request.title, '[WIP]') ================================================ FILE: .github/workflows/claude.yml ================================================ name: Claude Code on: issue_comment: types: [created] pull_request_review_comment: types: [created] issues: types: [opened, assigned] pull_request_review: types: [submitted] jobs: claude: if: | (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) runs-on: ubuntu-latest permissions: contents: read pull-requests: read issues: read id-token: write actions: read # Required for Claude to read CI results on PRs steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 1 - name: Run Claude Code id: claude uses: anthropics/claude-code-action@beta with: claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} # This is an optional setting that allows Claude to read CI results on PRs additional_permissions: | actions: read # Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4) # model: "claude-opus-4-20250514" # Optional: Customize the trigger phrase (default: @claude) # trigger_phrase: "/claude" # Optional: Trigger when specific user is assigned to an issue # assignee_trigger: "claude-bot" # Optional: Allow Claude to run specific commands # allowed_tools: "Bash(npm install),Bash(npm run build),Bash(npm run test:*),Bash(npm run lint:*)" # Optional: Add custom instructions for Claude to customize its behavior for your project # custom_instructions: | # Follow our coding standards # Ensure all new code has tests # Use TypeScript for new files # Optional: Custom environment variables for Claude # claude_env: | # NODE_ENV: test ================================================ FILE: .gitignore ================================================ *.o \#*# *# .#* .*~ *~ .DS_Store *.sw[po] tags TAGS .svn *.dSYM *.log *.dvi *.aux *.elc .zshrc.local .python-version samples .netrwhist .bundle /vendor/bundle Gemfile.lock node_modules bower_components fishd.* # Vim Session.vim .vim/bundle/ .vimrc_sample .vim/ftdetect/Dockerfile.vim .vim/syntax/Dockerfile.vim .vim/snippets/ .luarc.json # Xcode build/ *.pbxuser !default.pbxuser *.mode1v3 !default.mode1v3 *.mode2v3 !default.mode2v3 *.perspectivev3 !default.perspectivev3 xcuserdata *.xccheckout *.moved-aside DerivedData *.hmap *.ipa *.xcuserstate *.xcworkspace/xcshareddata # CocoaPods Pods/ # Fish local config .config/fish/config-local.fish .config/fish/fish_variables.x86_64 # Karabiner .config/karabiner/automatic_backups # Tmux .config/tmux/plugins # Lazygit .config/lazygit/state.yml .config/nvim/lazy-lock.json .config/nvim/lazyvim.json # Zed .config/zed/.tmp* .config/zed/embeddings .config/zed/prompts # Claude Code .claude/*.local.json ================================================ FILE: .scripts/ide ================================================ #!/bin/bash tmux split-window -h -l 20% tmux select-pane -L tmux split-window -v -l 30% tmux split-window -h -l 66% tmux split-window -h -l 50% ================================================ FILE: ISSUE_TEMPLATE.md ================================================ ================================================ FILE: README.md ================================================ ![fish screenshot](./images/screenshot-1.png) ![nvim screenshot](./images/screenshot-neovim.png) # Takuya's dotfiles **Warning**: Don’t blindly use my settings unless you know what that entails. Use at your own risk! ### Looking for a Markdown note-taking app? Check out my app called [Inkdrop](https://www.inkdrop.app/) [![Inkdrop](./images/screenshot-inkdrop.png)](https://www.inkdrop.app/) ## Contents - vim (Neovim) config - tmux config - git config - fish config - PowerShell config ## Neovim setup ### Requirements - Neovim >= **0.9.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) - [LazyVim](https://www.lazyvim.org/) - a [Nerd Font](https://www.nerdfonts.com/)(v3.0 or greater) **_(optional, but needed to display some icons)_** - [lazygit](https://github.com/jesseduffield/lazygit) **_(optional)_** - a **C** compiler for `nvim-treesitter`. See [here](https://github.com/nvim-treesitter/nvim-treesitter#requirements) - for [telescope.nvim](https://github.com/nvim-telescope/telescope.nvim) **_(optional)_** - **live grep**: [ripgrep](https://github.com/BurntSushi/ripgrep) - **find files**: [fd](https://github.com/sharkdp/fd) - a terminal that support true color and *undercurl*: - [kitty](https://github.com/kovidgoyal/kitty) **_(Linux & Macos)_** - [wezterm](https://github.com/wez/wezterm) **_(Linux, Macos & Windows)_** - [alacritty](https://github.com/alacritty/alacritty) **_(Linux, Macos & Windows)_** - [iterm2](https://iterm2.com/) **_(Macos)_** - [Solarized Osaka](https://github.com/craftzdog/solarized-osaka.nvim) ## Shell setup (macOS & Linux) - [Fish shell](https://fishshell.com/) - [Fisher](https://github.com/jorgebucaran/fisher) - Plugin manager - [Tide](https://github.com/IlanCosman/tide) - Shell theme - [Nerd fonts](https://github.com/ryanoasis/nerd-fonts) - Patched fonts for development-use. I use [PlemolJP](https://github.com/yuru7/PlemolJP) and BlexMono. - [z for fish](https://github.com/jethrokuan/z) - Directory jumping - [Eza](https://github.com/eza-community/eza) - `ls` replacement - [ghq](https://github.com/x-motemen/ghq) - Local Git repository organizer - [fzf](https://github.com/PatrickF1/fzf.fish) - Interactive filtering ## PowerShell setup (Windows) - [Scoop](https://scoop.sh/) - A command-line installer - [Git for Windows](https://gitforwindows.org/) - [Oh My Posh](https://ohmyposh.dev/) - Prompt theme engine - [Terminal Icons](https://github.com/devblackops/Terminal-Icons) - Folder and file icons - [PSReadLine](https://docs.microsoft.com/en-us/powershell/module/psreadline/) - Cmdlets for customizing the editing environment, used for autocompletion - [z](https://www.powershellgallery.com/packages/z) - Directory jumper - [PSFzf](https://github.com/kelleyma49/PSFzf) - Fuzzy finder ## How to use Watch my video tutorials: 1. [My Neovim setup](https://www.youtube.com/watch?v=fFHlfbKVi30) - [Article version](https://www.devas.life/effective-neovim-setup-for-web-development-towards-2024/) 1. [My dev workflow using tmux and vim](https://www.youtube.com/watch?v=sSOfr2MtRU8&list=PLxQA0uNgQDCICMRwlOzWAZBPL05XBC_br&index=10) 1. [A productive command-line Git workflow for indie app developers](https://www.youtube.com/watch?v=qKpY7t5m35k&list=PLxQA0uNgQDCICMRwlOzWAZBPL05XBC_br&index=4) - [Blogpost](https://dev.to/craftzdog/a-productive-command-line-git-workflow-for-indie-app-developers-k7d) 1. [My Fish shell workflow for coding](https://www.youtube.com/watch?v=KKxhf50FIPI) 1. [How to set up PowerShell prompt with Oh My Posh on Windows 11](https://www.youtube.com/watch?v=5-aK2_WwrmM) ## About me - [@inkdrop_app on X](https://twitter.com/inkdrop_app) - [Newsletters](https://www.devas.life/) - [My product: Inkdrop - Markdown note-taking app](https://www.inkdrop.app/)