├── .config ├── yazi │ ├── keymap.toml │ ├── theme.toml │ ├── yazi.toml │ ├── flavors │ │ └── tokyo-night.yazi │ │ │ ├── preview.png │ │ │ ├── LICENSE │ │ │ ├── LICENSE-tmtheme │ │ │ ├── README.md │ │ │ └── flavor.toml │ └── package.toml ├── kitty │ ├── current-theme.conf │ ├── bg-blurred.png │ ├── bg-blurred-darker.png │ ├── kitty.conf │ ├── kitty-coding.conf │ ├── kitty-screencasting.conf │ ├── change-profile.sh │ ├── toggle-transparency.sh │ ├── cyberdream-transparent.conf │ ├── cyberdream.conf │ ├── oxocarbon.conf │ ├── tokyonight_day.conf │ ├── tokyonight_night.conf │ ├── tokyonight_moon.conf │ ├── tokyonight_storm.conf │ └── catppuccin-theme.conf ├── nvim │ ├── .gitignore │ ├── lua │ │ ├── plugins │ │ │ ├── ui │ │ │ │ ├── dressing.lua │ │ │ │ ├── colorscheme.lua │ │ │ │ └── treesitter-context.lua │ │ │ ├── coding │ │ │ │ ├── todo-comments.lua │ │ │ │ ├── autopairs.lua │ │ │ │ ├── trouble.lua │ │ │ │ ├── treesitter.lua │ │ │ │ ├── ai.lua │ │ │ │ └── cmp.lua │ │ │ ├── editor │ │ │ │ ├── hardtime.lua │ │ │ │ ├── snacks.lua │ │ │ │ ├── grug-far.lua │ │ │ │ ├── lazygit.lua │ │ │ │ ├── mini.lua │ │ │ │ ├── tmux.lua │ │ │ │ ├── overseer.lua │ │ │ │ ├── ufo.lua │ │ │ │ ├── lualine-theme.lua │ │ │ │ ├── which-key.lua │ │ │ │ ├── gitsigns.lua │ │ │ │ ├── file-tree.lua │ │ │ │ ├── fzf.lua │ │ │ │ ├── lualine.lua │ │ │ │ └── telescope.lua │ │ │ ├── languages │ │ │ │ ├── docker.lua │ │ │ │ ├── astro.lua │ │ │ │ ├── php.lua │ │ │ │ ├── tailwind.lua │ │ │ │ ├── laravel.lua │ │ │ │ ├── go.lua │ │ │ │ ├── python.lua │ │ │ │ └── typescript.lua │ │ │ ├── linting │ │ │ │ ├── phpstan.lua │ │ │ │ └── core.lua │ │ │ ├── formatting │ │ │ │ ├── prettier.lua │ │ │ │ └── conform.lua │ │ │ ├── test │ │ │ │ └── core.lua │ │ │ ├── dap │ │ │ │ └── core.lua │ │ │ └── util │ │ │ │ └── mini-hipatterns.lua │ │ ├── globals.lua │ │ ├── health.lua │ │ ├── options.lua │ │ ├── keymaps.lua │ │ └── lazy-init.lua │ ├── lazyvim.json │ ├── stylua.toml │ ├── init.lua │ └── lazy-lock.json ├── wezterm │ ├── assets │ │ ├── bg-blurred.png │ │ └── bg-blurred-darker.png │ ├── stylua.toml │ ├── commands │ │ ├── init.lua │ │ ├── toggle-theme.lua │ │ └── toggle-transparency.lua │ ├── constants.lua │ ├── cyberdream.lua │ ├── cyberdream-light.lua │ ├── wezterm.lua │ └── nightwolf.lua ├── mise │ └── config.toml ├── lazygit │ └── config.yml ├── zed │ ├── prompts │ │ └── prompts-library-db.0.mdb │ │ │ ├── data.mdb │ │ │ └── lock.mdb │ ├── embeddings │ │ └── semantic-index-db.0.mdb │ │ │ ├── data.mdb │ │ │ └── lock.mdb │ ├── settings.json │ └── keymap.json ├── tmux │ ├── hooks │ │ └── update-pane-status.sh │ ├── switch-catppuccin-theme.sh │ └── tmux.conf ├── mcphub │ └── servers.json ├── raycast │ └── scripts │ │ ├── new-video-project.sh │ │ ├── recording-mode.applescript │ │ ├── undo-recording-mode.applescript │ │ └── screencast-window.applescript ├── opencode │ └── config.json ├── ghostty │ └── config └── btop │ └── btop.conf ├── .claude ├── plugins │ └── config.json ├── settings.json └── agents │ ├── javascript-developer.md │ ├── php-developer.md │ └── frontend-developer.md ├── .stow-local-ignore ├── .gitignore ├── README.md ├── .zshrc └── Library └── Application Support └── Cursor └── User ├── settings.json └── keybindings.json /.config/yazi/keymap.toml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.claude/plugins/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "repositories": {} 3 | } -------------------------------------------------------------------------------- /.config/yazi/theme.toml: -------------------------------------------------------------------------------- 1 | [flavor] 2 | dark = "tokyo-night" 3 | -------------------------------------------------------------------------------- /.config/yazi/yazi.toml: -------------------------------------------------------------------------------- 1 | [preview] 2 | max_width = 1200 3 | max_height = 1200 4 | -------------------------------------------------------------------------------- /.claude/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "alwaysThinkingEnabled": false, 3 | "model": "opusplan" 4 | } 5 | -------------------------------------------------------------------------------- /.config/kitty/current-theme.conf: -------------------------------------------------------------------------------- 1 | # include cyberdream-transparent.conf 2 | include cyberdream.conf 3 | -------------------------------------------------------------------------------- /.config/kitty/bg-blurred.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikolovlazar/dotfiles/HEAD/.config/kitty/bg-blurred.png -------------------------------------------------------------------------------- /.config/kitty/bg-blurred-darker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikolovlazar/dotfiles/HEAD/.config/kitty/bg-blurred-darker.png -------------------------------------------------------------------------------- /.config/nvim/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | tags 3 | test.sh 4 | .luarc.json 5 | nvim 6 | 7 | spell/ 8 | lazy-lock.json 9 | 10 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/ui/dressing.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'stevearc/dressing.nvim', 4 | opts = {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /.config/wezterm/assets/bg-blurred.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikolovlazar/dotfiles/HEAD/.config/wezterm/assets/bg-blurred.png -------------------------------------------------------------------------------- /.config/nvim/lazyvim.json: -------------------------------------------------------------------------------- 1 | { 2 | "extras": [ 3 | 4 | ], 5 | "news": { 6 | "NEWS.md": "10960" 7 | }, 8 | "version": 8 9 | } -------------------------------------------------------------------------------- /.config/mise/config.toml: -------------------------------------------------------------------------------- 1 | [tools] 2 | node = "24.4.1" 3 | "npm:@anthropic-ai/claude-code" = "latest" 4 | 5 | [settings] 6 | lockfile = true 7 | -------------------------------------------------------------------------------- /.config/lazygit/config.yml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://raw.githubusercontent.com/jesseduffield/lazygit/master/schema/config.json 2 | -------------------------------------------------------------------------------- /.config/wezterm/assets/bg-blurred-darker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikolovlazar/dotfiles/HEAD/.config/wezterm/assets/bg-blurred-darker.png -------------------------------------------------------------------------------- /.config/yazi/flavors/tokyo-night.yazi/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikolovlazar/dotfiles/HEAD/.config/yazi/flavors/tokyo-night.yazi/preview.png -------------------------------------------------------------------------------- /.config/zed/prompts/prompts-library-db.0.mdb/data.mdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikolovlazar/dotfiles/HEAD/.config/zed/prompts/prompts-library-db.0.mdb/data.mdb -------------------------------------------------------------------------------- /.config/zed/prompts/prompts-library-db.0.mdb/lock.mdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikolovlazar/dotfiles/HEAD/.config/zed/prompts/prompts-library-db.0.mdb/lock.mdb -------------------------------------------------------------------------------- /.config/zed/embeddings/semantic-index-db.0.mdb/data.mdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikolovlazar/dotfiles/HEAD/.config/zed/embeddings/semantic-index-db.0.mdb/data.mdb -------------------------------------------------------------------------------- /.config/zed/embeddings/semantic-index-db.0.mdb/lock.mdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikolovlazar/dotfiles/HEAD/.config/zed/embeddings/semantic-index-db.0.mdb/lock.mdb -------------------------------------------------------------------------------- /.config/yazi/package.toml: -------------------------------------------------------------------------------- 1 | [plugin] 2 | deps = [] 3 | 4 | [[flavor.deps]] 5 | use = "BennyOe/tokyo-night" 6 | rev = "695dac6" 7 | hash = "a8f426ea0d9cb843b081d62ab01364c8" 8 | -------------------------------------------------------------------------------- /.config/nvim/stylua.toml: -------------------------------------------------------------------------------- 1 | column_width = 80 2 | line_endings = "Unix" 3 | indent_type = "Spaces" 4 | indent_width = 2 5 | quote_style = "AutoPreferSingle" 6 | call_parentheses = "None" 7 | -------------------------------------------------------------------------------- /.config/wezterm/stylua.toml: -------------------------------------------------------------------------------- 1 | column_width = 80 2 | line_endings = "Unix" 3 | indent_type = "Spaces" 4 | indent_width = 2 5 | quote_style = "AutoPreferSingle" 6 | call_parentheses = "None" 7 | -------------------------------------------------------------------------------- /.config/nvim/init.lua: -------------------------------------------------------------------------------- 1 | vim.g.mapleader = ' ' 2 | vim.g.maplocalleader = ' ' 3 | 4 | vim.g.have_nerd_font = true 5 | 6 | require 'globals' 7 | require 'options' 8 | require 'keymaps' 9 | require 'lazy-init' 10 | -------------------------------------------------------------------------------- /.stow-local-ignore: -------------------------------------------------------------------------------- 1 | README.md 2 | .git 3 | .gitignore 4 | Library/Application\ Support/Cursor/User/profiles/*+/globalStorage 5 | .config/old-lazy-nvim-conf 6 | .config/zed/* 7 | !.config/zed/keymap.json 8 | !.config/zed/settings.json 9 | -------------------------------------------------------------------------------- /.config/wezterm/commands/init.lua: -------------------------------------------------------------------------------- 1 | local toggle_transparency = require 'commands.toggle-transparency' 2 | local toggle_theme = require 'commands.toggle-theme' 3 | 4 | local M = { 5 | toggle_transparency, 6 | toggle_theme, 7 | } 8 | 9 | return M 10 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/coding/todo-comments.lua: -------------------------------------------------------------------------------- 1 | -- Highlight todo, notes, etc in comments 2 | return { 3 | { 'folke/todo-comments.nvim', event = 'VimEnter', dependencies = { 'nvim-lua/plenary.nvim' }, opts = { signs = false } }, 4 | } 5 | -- vim: ts=2 sts=2 sw=2 et 6 | -------------------------------------------------------------------------------- /.config/wezterm/constants.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | M.bg_blurred_darker = os.getenv 'HOME' 4 | .. '/dotfiles/.config/wezterm/assets/bg-blurred-darker.png' 5 | M.bg_blurred = os.getenv 'HOME' 6 | .. '/dotfiles/.config/wezterm/assets/bg-blurred.png' 7 | M.bg_image = M.bg_blurred_darker 8 | 9 | return M 10 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/ui/colorscheme.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'catppuccin/nvim', 4 | lazy = false, 5 | priority = 1000, 6 | config = function() 7 | require('catppuccin').setup { 8 | flavour = 'mocha', 9 | } 10 | 11 | vim.cmd [[colorscheme catppuccin]] 12 | end, 13 | }, 14 | } 15 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/hardtime.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'm4xshen/hardtime.nvim', 4 | lazy = false, 5 | dependencies = { 'MunifTanjim/nui.nvim' }, 6 | opts = { 7 | restricted_keys = { 8 | ['h'] = false, 9 | ['j'] = false, 10 | ['k'] = false, 11 | ['l'] = false, 12 | }, 13 | }, 14 | }, 15 | } 16 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/snacks.lua: -------------------------------------------------------------------------------- 1 | return { 2 | 'folke/snacks.nvim', 3 | priority = 1000, 4 | lazy = false, 5 | ---@type snacks.Config 6 | opts = { 7 | -- your configuration comes here 8 | -- or leave it empty to use the default settings 9 | -- refer to the configuration section below 10 | picker = { enabled = true }, 11 | }, 12 | } 13 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/languages/docker.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'nvim-treesitter/nvim-treesitter', 4 | opts = { ensure_installed = { 'dockerfile' } }, 5 | }, 6 | { 7 | 'mason.nvim', 8 | opts = { ensure_installed = { 'hadolint' } }, 9 | }, 10 | { 11 | 'neovim/nvim-lspconfig', 12 | opts = { 13 | servers = { 14 | dockerls = {}, 15 | docker_compose_language_service = {}, 16 | }, 17 | }, 18 | }, 19 | } 20 | -------------------------------------------------------------------------------- /.config/tmux/hooks/update-pane-status.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Count panes in the current tmux window 4 | pane_count=$(tmux list-panes | wc -l) 5 | 6 | if [ "$pane_count" -gt 1 ]; then 7 | tmux set -g pane-border-lines single 8 | tmux set -g pane-border-status top 9 | tmux set -g pane-border-format " Pane ###{pane_index} " 10 | else 11 | tmux set -g pane-border-lines single 12 | tmux set -g pane-border-status off 13 | tmux set -g pane-border-format "" 14 | fi 15 | -------------------------------------------------------------------------------- /.config/kitty/kitty.conf: -------------------------------------------------------------------------------- 1 | # vim:fileencoding=utf-8:foldmethod=marker 2 | 3 | # Font settings 4 | font_family Geist Mono 5 | bold_font auto 6 | italic_font auto 7 | bold_italic_font auto 8 | font_size 19.0 9 | adjust_line_height 120% 10 | font_features none 11 | 12 | # Cursor 13 | cursor_blink_interval 0 14 | 15 | # Window 16 | hide_window_decorations titlebar-only 17 | 18 | # Misc 19 | macos_option_as_alt yes 20 | 21 | # Theme 22 | include current-theme.conf 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .config/tmux/plugins 2 | .config/tmux/*.log 3 | **/.DS_Store 4 | .config/**/.tmp* 5 | .config/lazygit/state.yml 6 | .config/zed/* 7 | !.config/zed/keymap.json 8 | !.config/zed/settings.json 9 | .config/raycast/extensions 10 | environment.sh 11 | .claude/backups 12 | .claude/logs 13 | .claude/projects 14 | .claude/shell-snapshots 15 | .claude/statsig 16 | .claude/todos 17 | .claude/.superclaude-metadata.json 18 | .claude/debug 19 | .claude/history.jsonl 20 | .claude/file-history 21 | -------------------------------------------------------------------------------- /.config/kitty/kitty-coding.conf: -------------------------------------------------------------------------------- 1 | # vim:fileencoding=utf-8:foldmethod=marker 2 | 3 | # Font settings 4 | font_family DankMono Nerd Font 5 | bold_font auto 6 | italic_font auto 7 | bold_italic_font auto 8 | font_size 19.0 9 | adjust_line_height 120% 10 | font_features none 11 | 12 | # Cursor 13 | cursor_blink_interval 0 14 | 15 | # Window 16 | hide_window_decorations titlebar-only 17 | 18 | # Misc 19 | macos_option_as_alt yes 20 | 21 | # Theme 22 | include current-theme.conf 23 | -------------------------------------------------------------------------------- /.config/kitty/kitty-screencasting.conf: -------------------------------------------------------------------------------- 1 | # vim:fileencoding=utf-8:foldmethod=marker 2 | 3 | # Font settings 4 | font_family DankMono Nerd Font 5 | bold_font auto 6 | italic_font auto 7 | bold_italic_font auto 8 | font_size 28.0 9 | adjust_line_height 108% 10 | font_features none 11 | 12 | # Cursor 13 | cursor_blink_interval 0 14 | 15 | # Window 16 | hide_window_decorations titlebar-only 17 | 18 | # Misc 19 | macos_option_as_alt yes 20 | 21 | # Theme 22 | include current-theme.conf 23 | -------------------------------------------------------------------------------- /.config/kitty/change-profile.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Select a profile:" 4 | echo " (1) Coding" 5 | echo " (2) Screencasting" 6 | read -r profile 7 | 8 | if [ "$profile" -eq 1 ]; then 9 | rm ~/dotfiles/.config/kitty/kitty.conf 10 | cp ~/dotfiles/.config/kitty/kitty-coding.conf ~/dotfiles/.config/kitty/kitty.conf 11 | echo "Get in the flow!" 12 | elif [ "$profile" -eq 2 ]; then 13 | rm ~/dotfiles/.config/kitty/kitty.conf 14 | cp ~/dotfiles/.config/kitty/kitty-screencasting.conf ~/dotfiles/.config/kitty/kitty.conf 15 | echo "Have fun recording!" 16 | else 17 | echo "What the hell?" 18 | fi 19 | -------------------------------------------------------------------------------- /.config/mcphub/servers.json: -------------------------------------------------------------------------------- 1 | { 2 | "mcpServers": { 3 | "sentry": { 4 | "disabled": false, 5 | "url": "https://mcp.sentry.dev/mcp" 6 | }, 7 | "github.com/modelcontextprotocol/servers/tree/main/src/sequentialthinking": { 8 | "disabled": false, 9 | "args": ["-y", "@modelcontextprotocol/server-sequential-thinking"], 10 | "command": "npx" 11 | }, 12 | "github.com/upstash/context7-mcp": { 13 | "disabled": false, 14 | "args": ["-y", "@upstash/context7-mcp"], 15 | "command": "npx" 16 | } 17 | }, 18 | "nativeMCPServers": [] 19 | } 20 | 21 | -------------------------------------------------------------------------------- /.config/nvim/lua/globals.lua: -------------------------------------------------------------------------------- 1 | -- Prevent Netrw from showing up at beginning 2 | vim.g.loaded_netrw = 1 3 | vim.g.loaded_netrwPlugin = 1 4 | vim.o.winborder = 'rounded' 5 | 6 | vim.diagnostic.config { 7 | signs = { 8 | text = { 9 | [vim.diagnostic.severity.ERROR] = ' ', 10 | [vim.diagnostic.severity.WARN] = ' ', 11 | [vim.diagnostic.severity.INFO] = '󰋼 ', 12 | [vim.diagnostic.severity.HINT] = ' ', 13 | }, 14 | }, 15 | severity_sort = true, 16 | } 17 | 18 | -- Prepend mise shims to PATH 19 | vim.env.PATH = vim.env.HOME .. '/.local/share/mise/shims:' .. vim.env.PATH 20 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/coding/autopairs.lua: -------------------------------------------------------------------------------- 1 | -- autopairs 2 | -- https://github.com/windwp/nvim-autopairs 3 | 4 | return { 5 | 'windwp/nvim-autopairs', 6 | event = 'InsertEnter', 7 | -- Optional dependency 8 | dependencies = { 'hrsh7th/nvim-cmp' }, 9 | config = function() 10 | require('nvim-autopairs').setup {} 11 | -- If you want to automatically add `(` after selecting a function or method 12 | local cmp_autopairs = require 'nvim-autopairs.completion.cmp' 13 | local cmp = require 'cmp' 14 | cmp.event:on('confirm_done', cmp_autopairs.on_confirm_done()) 15 | end, 16 | } 17 | -------------------------------------------------------------------------------- /.config/kitty/toggle-transparency.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if grep -q 'background_opacity 0.9' ~/dotfiles/.config/kitty/current-theme.conf; then 4 | sed -i '' 's/background_opacity 0.9/background_opacity 1/g' ~/dotfiles/.config/kitty/current-theme.conf 5 | echo "Done! Reload kitty config!" 6 | elif grep -q 'background_opacity 1' ~/dotfiles/.config/kitty/current-theme.conf; then 7 | sed -i '' 's/background_opacity 1/background_opacity 0.9/g' ~/dotfiles/.config/kitty/current-theme.conf 8 | echo "Done! Reload kitty config!" 9 | else 10 | echo "There's no background_opacity present in the current kitty theme..." 11 | fi 12 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/grug-far.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'MagicDuck/grug-far.nvim', 4 | opts = { headerMaxWidth = 80 }, 5 | cmd = 'GrugFar', 6 | keys = { 7 | { 8 | 'sr', 9 | function() 10 | local grug = require 'grug-far' 11 | local ext = vim.bo.buftype == '' and vim.fn.expand '%:e' 12 | grug.open { 13 | transient = true, 14 | prefills = { 15 | filesFilter = ext and ext ~= '' and '*.' .. ext or nil, 16 | }, 17 | } 18 | end, 19 | mode = { 'n', 'v' }, 20 | desc = 'Replace', 21 | }, 22 | }, 23 | }, 24 | } 25 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/ui/treesitter-context.lua: -------------------------------------------------------------------------------- 1 | -- Show context of the current function 2 | return { 3 | 'nvim-treesitter/nvim-treesitter-context', 4 | event = { 'BufReadPost', 'BufWritePost', 'BufNewFile' }, 5 | opts = function() 6 | local tsc = require 'treesitter-context' 7 | 8 | local function toggle_treesitter_context() 9 | if tsc.enabled then 10 | tsc.disable() 11 | else 12 | tsc.enable() 13 | end 14 | end 15 | 16 | vim.api.nvim_set_keymap( 17 | 'n', 18 | 'ut', 19 | ':lua toggle_treesitter_context()', 20 | { noremap = true, silent = true } 21 | ) 22 | 23 | return { mode = 'cursor', max_lines = 3 } 24 | end, 25 | } 26 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/lazygit.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'kdheepak/lazygit.nvim', 4 | lazy = true, 5 | cmd = { 6 | 'LazyGit', 7 | 'LazyGitConfig', 8 | 'LazyGitCurrentFile', 9 | 'LazyGitFilter', 10 | 'LazyGitFilterCurrentFile', 11 | }, 12 | -- optional for floating window border decoration 13 | dependencies = { 14 | 'nvim-lua/plenary.nvim', 15 | }, 16 | -- setting the keybinding for LazyGit with 'keys' is recommended in 17 | -- order to load the plugin when the command is run for the first time 18 | keys = { 19 | { 20 | 'gg', 21 | 'LazyGit', 22 | desc = 'LazyGit', 23 | }, 24 | }, 25 | }, 26 | } 27 | -------------------------------------------------------------------------------- /.config/wezterm/commands/toggle-theme.lua: -------------------------------------------------------------------------------- 1 | local wezterm = require 'wezterm' 2 | 3 | local command = { 4 | brief = 'Toggle theme', 5 | icon = 'md_theme_light_dark', 6 | action = wezterm.action_callback(function(window) 7 | local home = os.getenv 'HOME' 8 | 9 | if window:effective_config().color_scheme == 'custom-latte' then 10 | wezterm.run_child_process { 11 | '/bin/bash', 12 | '-c', 13 | home .. '/.config/tmux/switch-catppuccin-theme.sh latte', 14 | } 15 | else 16 | wezterm.run_child_process { 17 | '/bin/bash', 18 | '-c', 19 | home .. '/.config/tmux/switch-catppuccin-theme.sh mocha', 20 | } 21 | end 22 | end), 23 | } 24 | 25 | return command 26 | -------------------------------------------------------------------------------- /.config/wezterm/cyberdream.lua: -------------------------------------------------------------------------------- 1 | -- cyberdream theme for wezterm 2 | return { 3 | foreground = '#ffffff', 4 | background = '#000000', 5 | 6 | cursor_bg = '#ffffff', 7 | cursor_fg = '#16181a', 8 | cursor_border = '#ffffff', 9 | 10 | selection_fg = '#ffffff', 11 | selection_bg = '#3c4048', 12 | 13 | scrollbar_thumb = '#16181a', 14 | split = '#16181a', 15 | 16 | ansi = { 17 | '#16181a', 18 | '#ff6e5e', 19 | '#5eff6c', 20 | '#f1ff5e', 21 | '#5ea1ff', 22 | '#bd5eff', 23 | '#5ef1ff', 24 | '#ffffff', 25 | }, 26 | brights = { 27 | '#3c4048', 28 | '#ff6e5e', 29 | '#5eff6c', 30 | '#f1ff5e', 31 | '#5ea1ff', 32 | '#bd5eff', 33 | '#5ef1ff', 34 | '#ffffff', 35 | }, 36 | indexed = { [17] = '#ff6e5e' }, 37 | } 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Lazar's dotfiles ✨💽 2 | 3 | This repository contains my ever-evolving dotfiles. Check them out! If you find something useful, feel free to add it to your own dotfiles. 4 | 5 | ## Neovim Plugins 6 | 7 | - [Kickstart.nvim](https://github.com/nvim-lua/kickstart.nvim) (base configuration) 8 | - [Catppuccin](https://github.com/catppuccin/nvim) (colorscheme) 9 | - [Tokyonight Tmux](https://github.com/nikolovlazar/tokyo-night-tmux) (tmux theme integration) 10 | - [aserowy/tmux.nvim](https://github.com/aserowy/tmux.nvim) (tmux + neovim integration) 11 | 12 | ## Requirements 13 | 14 | - [A Nerd Font](https://www.nerdfonts.com/font-downloads) (it's for the icons) 15 | - [Wezterm](https://wezfurlong.org/wezterm/) (a powerful cross-platform terminal emulator and multiplexer written in Rust) 16 | -------------------------------------------------------------------------------- /.config/wezterm/cyberdream-light.lua: -------------------------------------------------------------------------------- 1 | -- cyberdream light theme for wezterm 2 | return { 3 | foreground = '#16181a', 4 | background = '#ffffff', 5 | 6 | cursor_bg = '#16181a', 7 | cursor_fg = '#ffffff', 8 | cursor_border = '#16181a', 9 | 10 | selection_fg = '#16181a', 11 | selection_bg = '#acacac', 12 | 13 | scrollbar_thumb = '#ffffff', 14 | split = '#ffffff', 15 | 16 | ansi = { 17 | '#ffffff', 18 | '#d11500', 19 | '#008b0c', 20 | '#997b00', 21 | '#0057d1', 22 | '#a018ff', 23 | '#008c99', 24 | '#16181a', 25 | }, 26 | brights = { 27 | '#acacac', 28 | '#d11500', 29 | '#008b0c', 30 | '#997b00', 31 | '#0057d1', 32 | '#a018ff', 33 | '#008c99', 34 | '#16181a', 35 | }, 36 | indexed = { [16] = '#d17c00', [17] = '#d11500' }, 37 | } 38 | -------------------------------------------------------------------------------- /.config/wezterm/commands/toggle-transparency.lua: -------------------------------------------------------------------------------- 1 | local wezterm = require 'wezterm' 2 | -- local constants = require 'constants' 3 | 4 | local command = { 5 | brief = 'Toggle terminal transparency', 6 | icon = 'md_circle_opacity', 7 | action = wezterm.action_callback(function(window) 8 | local overrides = window:get_config_overrides() or {} 9 | 10 | if 11 | not overrides.window_background_opacity 12 | or overrides.window_background_opacity == 1 13 | then 14 | overrides.window_background_opacity = 0.8 15 | -- overrides.window_background_image = '' 16 | else 17 | overrides.window_background_opacity = 1 18 | -- overrides.window_background_image = constants.bg_image 19 | end 20 | 21 | window:set_config_overrides(overrides) 22 | end), 23 | } 24 | 25 | return command 26 | -------------------------------------------------------------------------------- /.config/raycast/scripts/new-video-project.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Required parameters: 4 | # @raycast.schemaVersion 1 5 | # @raycast.title New Video Project Structure 6 | # @raycast.mode silent 7 | # 8 | # Optional parameters: 9 | # @raycast.icon 📂 10 | # @raycast.author nikolovlazar 11 | # @raycast.authorURL https://raycast.com/nikolovlazar 12 | # @raycast.description Creates a folder structure for a new video project 13 | # @raycast.argument1 { "type": "text", "placeholder": "slug" } 14 | 15 | date=$(date "+%Y%m%d") 16 | mkdir ~/Movies/${date}-${1//} 17 | cd ~/Movies/${date}-${1//} 18 | 19 | folders=("FOOTAGE" "AUDIO" "MUSIC" "GRAPHICS" "AE" "SEQUENCES" "EXPORTS" "PREMIERE") 20 | 21 | for ((i = 0; i < ${#folders[@]}; i++)); do 22 | index=$((i+1)) 23 | dirname=$(printf "%02d %s" "$index" "${folders[$i]}") 24 | mkdir "$dirname" 25 | done 26 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/mini.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'echasnovski/mini.nvim', 4 | config = function() 5 | require('mini.ai').setup { n_lines = 500 } 6 | 7 | require('mini.surround').setup { 8 | mappings = { 9 | add = 'gsa', 10 | delete = 'gsd', 11 | find = 'gsf', 12 | find_left = 'gsF', 13 | highlight = 'gsh', 14 | replace = 'gsr', 15 | update_n_lines = 'gsn', 16 | }, 17 | } 18 | 19 | require('mini.move').setup { 20 | mappings = { 21 | left = 'H', 22 | right = 'L', 23 | down = 'J', 24 | up = 'K', 25 | line_left = '', 26 | line_right = '', 27 | line_down = '', 28 | line_up = '', 29 | }, 30 | } 31 | end, 32 | }, 33 | } 34 | -------------------------------------------------------------------------------- /.config/kitty/cyberdream-transparent.conf: -------------------------------------------------------------------------------- 1 | # cyberdream theme for kitty 2 | background #000000 3 | foreground #ffffff 4 | cursor #ffffff 5 | cursor_text_color #16181a 6 | selection_background #3c4048 7 | color0 #16181a 8 | color8 #8D96A0 9 | color1 #ff6e5e 10 | color9 #ff6e5e 11 | color2 #5eff6c 12 | color10 #5eff6c 13 | color3 #f1ff5e 14 | color11 #f1ff5e 15 | color4 #5ea1ff 16 | color12 #5ea1ff 17 | color5 #bd5eff 18 | color13 #bd5eff 19 | color6 #5ef1ff 20 | color14 #5ef1ff 21 | color7 #ffffff 22 | color15 #ffffff 23 | selection_foreground #ffffff 24 | 25 | background_opacity 0.8 26 | background_blur 48 27 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/tmux.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'aserowy/tmux.nvim', 4 | config = function() 5 | return require('tmux').setup { 6 | resize = { 7 | enable_default_keybindings = true, 8 | }, 9 | } 10 | end, 11 | }, 12 | { 13 | 'christoomey/vim-tmux-navigator', 14 | cmd = { 15 | 'TmuxNavigateLeft', 16 | 'TmuxNavigateDown', 17 | 'TmuxNavigateUp', 18 | 'TmuxNavigateRight', 19 | 'TmuxNavigatePrevious', 20 | 'TmuxNavigatorProcessList', 21 | }, 22 | keys = { 23 | { '', 'TmuxNavigateLeft' }, 24 | { '', 'TmuxNavigateDown' }, 25 | { '', 'TmuxNavigateUp' }, 26 | { '', 'TmuxNavigateRight' }, 27 | { '', 'TmuxNavigatePrevious' }, 28 | }, 29 | }, 30 | } 31 | -------------------------------------------------------------------------------- /.config/kitty/cyberdream.conf: -------------------------------------------------------------------------------- 1 | # cyberdream theme for kitty 2 | background #000000 3 | foreground #ffffff 4 | cursor #ffffff 5 | cursor_text_color #16181a 6 | selection_background #3c4048 7 | color0 #16181a 8 | color8 #8D96A0 9 | color1 #ff6e5e 10 | color9 #ff6e5e 11 | color2 #5eff6c 12 | color10 #5eff6c 13 | color3 #f1ff5e 14 | color11 #f1ff5e 15 | color4 #5ea1ff 16 | color12 #5ea1ff 17 | color5 #bd5eff 18 | color13 #bd5eff 19 | color6 #5ef1ff 20 | color14 #5ef1ff 21 | color7 #ffffff 22 | color15 #ffffff 23 | selection_foreground #ffffff 24 | 25 | background_image bg-blurred-darker.png 26 | background_image_layout scaled 27 | -------------------------------------------------------------------------------- /.config/raycast/scripts/recording-mode.applescript: -------------------------------------------------------------------------------- 1 | #!/usr/bin/osascript 2 | 3 | # Required parameters: 4 | # @raycast.schemaVersion 1 5 | # @raycast.title Recording mode 6 | # @raycast.mode compact 7 | 8 | # Optional parameters: 9 | # @raycast.icon 🎥 10 | 11 | # Documentation: 12 | # @raycast.description Hide icons, menu bar, and dock, and change background 13 | # @raycast.author nikolovlazar 14 | # @raycast.authorURL https://raycast.com/nikolovlazar 15 | 16 | tell application "System Events" 17 | -- Hide the menu bar 18 | tell dock preferences to set autohide menu bar to true 19 | -- Hide the dock 20 | tell dock preferences to set autohide to true 21 | -- Hide the icons 22 | do shell script "defaults write com.apple.finder CreateDesktop -bool FALSE; killall Finder" 23 | -- Don't let the dock pop up when you mouse down 24 | do shell script "defaults write com.apple.dock autohide-delay -float 100 && killall Dock" 25 | end tell 26 | 27 | -------------------------------------------------------------------------------- /.config/raycast/scripts/undo-recording-mode.applescript: -------------------------------------------------------------------------------- 1 | #!/usr/bin/osascript 2 | 3 | # Required parameters: 4 | # @raycast.schemaVersion 1 5 | # @raycast.title Undo Recording Mode 6 | # @raycast.mode compact 7 | 8 | # Optional parameters: 9 | # @raycast.icon 🎥 10 | 11 | # Documentation: 12 | # @raycast.description Undo the "Recording Mode" script 13 | # @raycast.author nikolovlazar 14 | # @raycast.authorURL https://raycast.com/nikolovlazar 15 | 16 | tell application "System Events" 17 | -- Show the menu bar 18 | tell dock preferences to set autohide menu bar to false 19 | -- Show the icons 20 | do shell script "defaults write com.apple.finder CreateDesktop -bool TRUE; killall Finder" 21 | -- Let the dock pop up when you mouse down 22 | do shell script "defaults delete com.apple.dock autohide-delay; killall Dock" 23 | -- Ensure the dock remains hidden but can be activated on mouse down 24 | tell dock preferences to set autohide to true 25 | end tell 26 | 27 | -------------------------------------------------------------------------------- /.config/opencode/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://opencode.ai/config.json", 3 | "theme": "catppuccin", 4 | "model": "anthropic/claude-opus-4-5", 5 | "autoupdate": true, 6 | "mcp": { 7 | "sentry": { 8 | "enabled": true, 9 | "type": "local", 10 | "command": [ 11 | "npx", 12 | "-y", 13 | "mcp-remote@latest", 14 | "https://mcp.sentry.dev/mcp" 15 | ] 16 | }, 17 | "spotlight": { 18 | "enabled": true, 19 | "type": "local", 20 | "command": [ 21 | "npx", 22 | "-y", 23 | "--prefer-online", 24 | "@spotlightjs/spotlight@latest", 25 | "mcp" 26 | ] 27 | }, 28 | "shadcn": { 29 | "enabled": true, 30 | "type": "local", 31 | "command": ["npx", "shadcn@latest", "mcp"] 32 | }, 33 | "neon": { 34 | "enabled": true, 35 | "type": "remote", 36 | "url": "https://mcp.neon.tech/mcp" 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/linting/phpstan.lua: -------------------------------------------------------------------------------- 1 | local function get_cwd() 2 | local current_file = vim.fn.expand '%:p' 3 | if current_file == '' then 4 | return vim.fn.getcwd() 5 | end 6 | local root = vim.fs.find({ 'phpstan.neon', 'composer.json', 'vendor' }, { 7 | path = current_file, 8 | upward = true, 9 | })[1] 10 | return root and vim.fs.dirname(root) or vim.fn.getcwd() 11 | end 12 | 13 | return { 14 | name = 'phpstan', 15 | cmd = './vendor/bin/phpstan', 16 | stdin = false, 17 | append_fname = true, 18 | args = { 19 | '--memory-limit=2G', 20 | 'analyse', 21 | '--error-format=raw', 22 | '--no-progress', 23 | }, 24 | stream = 'both', 25 | ignore_exitcode = true, 26 | cwd = get_cwd(), 27 | parser = require('lint.parser').from_pattern( 28 | '^(.+):(%d+):(.+)$', 29 | { 'file', 'lnum', 'message' }, 30 | nil, 31 | { 32 | source = 'phpstan', 33 | severity = vim.diagnostic.severity.WARN, 34 | } 35 | ), 36 | } 37 | -------------------------------------------------------------------------------- /.config/ghostty/config: -------------------------------------------------------------------------------- 1 | # General appearance settings 2 | cursor-color = #89DCEB 3 | cursor-text = #000000 4 | 5 | # Font settings 6 | font-family = "Monaspace Neon Var" 7 | font-feature = "calt,cv02,cv10,cv11,cv31,ss01,ss02,ss03,ss04,ss05,ss06,ss07,ss08,ss09,ss10,dlig" 8 | font-size = 16 9 | 10 | # Theme 11 | theme = "Catppuccin Mocha" 12 | 13 | # URL handling while running tmux 14 | link-url = true 15 | mouse-shift-capture = never 16 | 17 | # Keybindings 18 | keybind = ctrl+b>v=new_split:down 19 | keybind = ctrl+b>h=new_split:right 20 | 21 | keybind = ctrl+super+h=goto_split:left 22 | keybind = ctrl+super+j=goto_split:down 23 | keybind = ctrl+super+k=goto_split:up 24 | keybind = ctrl+super+l=goto_split:right 25 | 26 | keybind = alt+super+h=resize_split:left,10 27 | keybind = alt+super+j=resize_split:down,10 28 | keybind = alt+super+k=resize_split:up,10 29 | keybind = alt+super+l=resize_split:right,10 30 | 31 | keybind = ctrl+b>z=toggle_split_zoom 32 | 33 | keybind = ctrl+b>,=prompt_surface_title 34 | 35 | # Misc 36 | macos-option-as-alt = true 37 | -------------------------------------------------------------------------------- /.config/kitty/oxocarbon.conf: -------------------------------------------------------------------------------- 1 | # vim:ft=kitty 2 | 3 | ## name: Oxocarbon-Kitty 4 | ## upstream: https://github.com/nikolovlazar/dotfiles/raw/main/.config/kitty/oxocarbon.conf 5 | 6 | background #161616 7 | foreground #d0d0d0 8 | selection_background #393939 9 | selection_foreground #d0d0d0 10 | url_color #73daca 11 | cursor #c0caf5 12 | cursor_text_color #1a1b26 13 | 14 | # Tabs 15 | active_tab_background #85a7fa 16 | active_tab_foreground #16161e 17 | inactive_tab_background #292e42 18 | inactive_tab_foreground #545c7e 19 | #tab_bar_background #15161e 20 | 21 | # Windows 22 | active_border_color #7aa2f7 23 | inactive_border_color #292e42 24 | 25 | # normal 26 | color0 #262626 27 | color1 #33b1ff 28 | color2 #be95ff 29 | color3 #42be65 30 | color4 #78a9ff 31 | color5 #82cfff 32 | color6 #3ddbd9 33 | color7 #f2f2f2 34 | 35 | # bright 36 | color8 #525252 37 | color9 #33b1ff 38 | color10 #be95ff 39 | color11 #42be65 40 | color12 #78a9ff 41 | color13 #82cfff 42 | color14 #08bdba 43 | color15 #ffffff 44 | 45 | # extended colors 46 | color16 #ff9e64 47 | color17 #db4b4b 48 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/languages/astro.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'nvim-treesitter/nvim-treesitter', 4 | opts = { ensure_installed = { 'astro', 'css' } }, 5 | }, 6 | 7 | { 8 | 'neovim/nvim-lspconfig', 9 | opts = function(_, opts) 10 | opts.servers = opts.servers or {} 11 | 12 | opts.servers.astro = {} 13 | 14 | opts.servers.vtsls = opts.servers.vtsls or {} 15 | opts.servers.vtsls = { 16 | tsserver = { 17 | globalPlugins = { 18 | { 19 | name = '@astrojs/ts-plugin', 20 | location = vim.env.MASON 21 | .. '/packages/' 22 | .. 'astro-language-server' 23 | .. '/node_modules/@astrojs/ts-plugin', 24 | enableForWorkspaceTypeScriptVersions = true, 25 | }, 26 | }, 27 | }, 28 | } 29 | end, 30 | }, 31 | 32 | { 33 | 'conform.nvim', 34 | opts = function(_, opts) 35 | opts.formatters_by_ft = opts.formatters_by_ft or {} 36 | opts.formatters_by_ft.astro = { 'prettier', 'prettierd' } 37 | end, 38 | }, 39 | } 40 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/coding/trouble.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'folke/trouble.nvim', 4 | opts = {}, 5 | cmd = 'Trouble', 6 | keys = { 7 | { 8 | 'cD', 9 | 'Trouble diagnostics toggle', 10 | desc = 'Diagnostics (Trouble)', 11 | }, 12 | { 13 | 'cd', 14 | 'Trouble diagnostics toggle filter.buf=0', 15 | desc = 'Buffer Diagnostics (Trouble)', 16 | }, 17 | { 18 | 'cs', 19 | 'Trouble symbols toggle focus=false', 20 | desc = 'Document Symbols', 21 | }, 22 | { 23 | 'cl', 24 | 'Trouble lsp toggle focus=false win.position=right', 25 | desc = 'LSP Definitions / references / ... (Trouble)', 26 | }, 27 | { 28 | 'cL', 29 | 'Trouble loclist toggle', 30 | desc = 'Location List (Trouble)', 31 | }, 32 | { 33 | 'cQ', 34 | 'Trouble qflist toggle', 35 | desc = 'Quickfix List (Trouble)', 36 | }, 37 | }, 38 | }, 39 | } 40 | -------------------------------------------------------------------------------- /.config/kitty/tokyonight_day.conf: -------------------------------------------------------------------------------- 1 | # vim:ft=kitty 2 | 3 | ## name: Tokyo Night Day 4 | ## license: MIT 5 | ## author: Folke Lemaitre 6 | ## upstream: https://github.com/folke/tokyonight.nvim/raw/main/extras/kitty/tokyonight_day.conf 7 | 8 | 9 | background #e1e2e7 10 | foreground #3760bf 11 | selection_background #b6bfe2 12 | selection_foreground #3760bf 13 | url_color #387068 14 | cursor #3760bf 15 | cursor_text_color #e1e2e7 16 | 17 | # Tabs 18 | active_tab_background #2e7de9 19 | active_tab_foreground #e9e9ec 20 | inactive_tab_background #c4c8da 21 | inactive_tab_foreground #8990b3 22 | #tab_bar_background #e9e9ed 23 | 24 | # Windows 25 | active_border_color #2e7de9 26 | inactive_border_color #c4c8da 27 | 28 | # normal 29 | color0 #e9e9ed 30 | color1 #f52a65 31 | color2 #587539 32 | color3 #8c6c3e 33 | color4 #2e7de9 34 | color5 #9854f1 35 | color6 #007197 36 | color7 #6172b0 37 | 38 | # bright 39 | color8 #a1a6c5 40 | color9 #f52a65 41 | color10 #587539 42 | color11 #8c6c3e 43 | color12 #2e7de9 44 | color13 #9854f1 45 | color14 #007197 46 | color15 #3760bf 47 | 48 | # extended colors 49 | color16 #b15c00 50 | color17 #c64343 51 | -------------------------------------------------------------------------------- /.config/kitty/tokyonight_night.conf: -------------------------------------------------------------------------------- 1 | # vim:ft=kitty 2 | 3 | ## name: Tokyo Night 4 | ## license: MIT 5 | ## author: Folke Lemaitre 6 | ## upstream: https://github.com/folke/tokyonight.nvim/raw/main/extras/kitty/tokyonight_night.conf 7 | 8 | 9 | background #1a1b26 10 | foreground #c0caf5 11 | selection_background #283457 12 | selection_foreground #c0caf5 13 | url_color #73daca 14 | cursor #c0caf5 15 | cursor_text_color #1a1b26 16 | 17 | # Tabs 18 | active_tab_background #7aa2f7 19 | active_tab_foreground #16161e 20 | inactive_tab_background #292e42 21 | inactive_tab_foreground #545c7e 22 | #tab_bar_background #15161e 23 | 24 | # Windows 25 | active_border_color #7aa2f7 26 | inactive_border_color #292e42 27 | 28 | # normal 29 | color0 #15161e 30 | color1 #f7768e 31 | color2 #9ece6a 32 | color3 #e0af68 33 | color4 #7aa2f7 34 | color5 #bb9af7 35 | color6 #7dcfff 36 | color7 #a9b1d6 37 | 38 | # bright 39 | color8 #414868 40 | color9 #f7768e 41 | color10 #9ece6a 42 | color11 #e0af68 43 | color12 #7aa2f7 44 | color13 #bb9af7 45 | color14 #7dcfff 46 | color15 #c0caf5 47 | 48 | # extended colors 49 | color16 #ff9e64 50 | color17 #db4b4b 51 | -------------------------------------------------------------------------------- /.config/kitty/tokyonight_moon.conf: -------------------------------------------------------------------------------- 1 | # vim:ft=kitty 2 | 3 | ## name: Tokyo Night Moon 4 | ## license: MIT 5 | ## author: Folke Lemaitre 6 | ## upstream: https://github.com/folke/tokyonight.nvim/raw/main/extras/kitty/tokyonight_moon.conf 7 | 8 | 9 | background #222436 10 | foreground #c8d3f5 11 | selection_background #2d3f76 12 | selection_foreground #c8d3f5 13 | url_color #4fd6be 14 | cursor #c8d3f5 15 | cursor_text_color #222436 16 | 17 | # Tabs 18 | active_tab_background #82aaff 19 | active_tab_foreground #1e2030 20 | inactive_tab_background #2f334d 21 | inactive_tab_foreground #545c7e 22 | #tab_bar_background #1b1d2b 23 | 24 | # Windows 25 | active_border_color #82aaff 26 | inactive_border_color #2f334d 27 | 28 | # normal 29 | color0 #1b1d2b 30 | color1 #ff757f 31 | color2 #c3e88d 32 | color3 #ffc777 33 | color4 #82aaff 34 | color5 #c099ff 35 | color6 #86e1fc 36 | color7 #828bb8 37 | 38 | # bright 39 | color8 #444a73 40 | color9 #ff757f 41 | color10 #c3e88d 42 | color11 #ffc777 43 | color12 #82aaff 44 | color13 #c099ff 45 | color14 #86e1fc 46 | color15 #c8d3f5 47 | 48 | # extended colors 49 | color16 #ff966c 50 | color17 #c53b53 51 | -------------------------------------------------------------------------------- /.config/kitty/tokyonight_storm.conf: -------------------------------------------------------------------------------- 1 | # vim:ft=kitty 2 | 3 | ## name: Tokyo Night Storm 4 | ## license: MIT 5 | ## author: Folke Lemaitre 6 | ## upstream: https://github.com/folke/tokyonight.nvim/raw/main/extras/kitty/tokyonight_storm.conf 7 | 8 | 9 | background #24283b 10 | foreground #c0caf5 11 | selection_background #2e3c64 12 | selection_foreground #c0caf5 13 | url_color #73daca 14 | cursor #c0caf5 15 | cursor_text_color #24283b 16 | 17 | # Tabs 18 | active_tab_background #7aa2f7 19 | active_tab_foreground #1f2335 20 | inactive_tab_background #292e42 21 | inactive_tab_foreground #545c7e 22 | #tab_bar_background #1d202f 23 | 24 | # Windows 25 | active_border_color #7aa2f7 26 | inactive_border_color #292e42 27 | 28 | # normal 29 | color0 #1d202f 30 | color1 #f7768e 31 | color2 #9ece6a 32 | color3 #e0af68 33 | color4 #7aa2f7 34 | color5 #bb9af7 35 | color6 #7dcfff 36 | color7 #a9b1d6 37 | 38 | # bright 39 | color8 #414868 40 | color9 #f7768e 41 | color10 #9ece6a 42 | color11 #e0af68 43 | color12 #7aa2f7 44 | color13 #bb9af7 45 | color14 #7dcfff 46 | color15 #c0caf5 47 | 48 | # extended colors 49 | color16 #ff9e64 50 | color17 #db4b4b 51 | -------------------------------------------------------------------------------- /.config/yazi/flavors/tokyo-night.yazi/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 - sxyazi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.config/yazi/flavors/tokyo-night.yazi/LICENSE-tmtheme: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Himanshu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.config/zed/settings.json: -------------------------------------------------------------------------------- 1 | // Zed settings 2 | // 3 | // For information on how to configure Zed, see the Zed 4 | // documentation: https://zed.dev/docs/configuring-zed 5 | // 6 | // To see all of Zed's default settings without changing your 7 | // custom settings, run the `open default settings` command 8 | // from the command palette or from `Zed` application menu. 9 | { 10 | "features": { 11 | "edit_prediction_provider": "zed" 12 | }, 13 | "agent": { 14 | "model_parameters": [], 15 | "inline_assistant_model": { 16 | "provider": "copilot_chat", 17 | "model": "gpt-4.1" 18 | }, 19 | "version": "2" 20 | }, 21 | "icon_theme": "Catppuccin Mocha", 22 | "project_panel": { 23 | "dock": "right" 24 | }, 25 | "ui_font_size": 20, 26 | "buffer_font_size": 20, 27 | "vim_mode": true, 28 | "buffer_font_family": "DankMono Nerd Font", 29 | "ui_font_family": "DankMono Nerd Font", 30 | "theme": "Modest Dark", 31 | "cursor_blink": false, 32 | "relative_line_numbers": true, 33 | "scrollbar": { 34 | "show": "never" 35 | }, 36 | "languages": { 37 | "PHP": { 38 | "language_servers": ["intelephense", "..."] 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /.config/raycast/scripts/screencast-window.applescript: -------------------------------------------------------------------------------- 1 | #!/usr/bin/osascript 2 | 3 | # Required parameters: 4 | # @raycast.schemaVersion 1 5 | # @raycast.title Screencast Window 6 | # @raycast.mode compact 7 | 8 | # Optional parameters: 9 | # @raycast.icon 🪟 10 | 11 | # Documentation: 12 | # @raycast.description Position currently focused window for screencasting 13 | # @raycast.author nikolovlazar 14 | # @raycast.authorURL https://raycast.com/nikolovlazar 15 | 16 | -- The resolution of your screen 17 | set screenWidth to 1920 18 | set screenHeight to 1080 19 | 20 | -- Padding 21 | set gutter to 12 22 | -- Bottom padding 23 | set bottomGutter to 35 24 | 25 | tell application "System Events" 26 | -- Position currently focused window for recording 27 | set appOfInterest to name of application processes whose frontmost is true 28 | 29 | set currentApplication to item 1 of appOfInterest 30 | 31 | -- Top left corner 32 | set position of the first window of application process currentApplication to {gutter, gutter} 33 | -- Size of the window 34 | set size of the first window of application process currentApplication to {screenWidth - gutter - gutter, screenHeight - gutter - bottomGutter} 35 | end tell 36 | 37 | -------------------------------------------------------------------------------- /.config/yazi/flavors/tokyo-night.yazi/README.md: -------------------------------------------------------------------------------- 1 |
2 | Yazi logo 3 |
4 | 5 |

6 | Tokyo Night Flavor for Yazi 7 |

8 | 9 | ## 👀 Preview 10 | 11 | 12 | 13 | ## 🎨 Installation 14 | 15 | ### Using package manager 16 | 17 | ```bash 18 | ya pack -a BennyOe/tokyo-night 19 | ``` 20 | 21 | ### Manual install 22 | 23 | ```bash 24 | # Linux/macOS 25 | git clone https://github.com/BennyOe/tokyo-night.yazi.git ~/.config/yazi/flavors/tokyo-night.yazi 26 | 27 | # Windows 28 | git clone https://github.com/BennyOe/tokyo-night.yazi.git %AppData%\yazi\config\flavors\tokyo-night.yazi 29 | ``` 30 | 31 | ## ⚙️ Usage 32 | 33 | Add the these lines to your `theme.toml` configuration file to use it: 34 | 35 | 36 | ```toml 37 | [flavor] 38 | use = "tokyo-night" 39 | # For Yazi 0.4 and above 40 | dark = "tokyo-night" 41 | ``` 42 | 43 | ## 📜 License 44 | 45 | The flavor is MIT-licensed, and the included tmTheme is also MIT-licensed. 46 | 47 | Check the [LICENSE](LICENSE) and [LICENSE-tmtheme](LICENSE-tmtheme) file for more details. 48 | -------------------------------------------------------------------------------- /.claude/agents/javascript-developer.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: javascript-developer 3 | description: JavaScript expert for modern ES6+, async patterns, and Node.js. Use PROACTIVELY for React, TypeScript, performance optimization, or complex async flows. 4 | model: sonnet 5 | color: yellow 6 | category: language-specialists 7 | --- 8 | 9 | 10 | You are a JavaScript expert specializing in modern JavaScript and Node.js development. 11 | 12 | When invoked: 13 | 1. Analyze JavaScript requirements 14 | 2. Implement with modern ES6+ features 15 | 3. Handle async operations properly 16 | 4. Optimize for performance 17 | 5. Ensure browser compatibility 18 | 6. Write clean, maintainable code 19 | 20 | Process: 21 | - Use modern JavaScript features appropriately 22 | - Implement proper error handling 23 | - Apply functional programming concepts 24 | - Utilize async/await patterns 25 | - Consider bundle size and performance 26 | - Follow JavaScript best practices 27 | 28 | Provide: 29 | - Modern JavaScript implementation 30 | - Async handling strategy 31 | - Error management approach 32 | - Performance optimization tips 33 | - Testing recommendations 34 | - Build configuration 35 | - Browser compatibility notes 36 | 37 | Focus on writing clean, efficient, and maintainable JavaScript code. 38 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/formatting/prettier.lua: -------------------------------------------------------------------------------- 1 | local supported = { 2 | 'css', 3 | 'graphql', 4 | 'handlebars', 5 | 'html', 6 | 'javascript', 7 | 'javascriptreact', 8 | 'json', 9 | 'jsonc', 10 | 'less', 11 | 'scss', 12 | 'typescript', 13 | 'typescriptreact', 14 | 'vue', 15 | 'yaml', 16 | } 17 | 18 | return { 19 | { 20 | 'williamboman/mason.nvim', 21 | opts = { ensure_installed = { 'prettier' } }, 22 | }, 23 | { 24 | 'stevearc/conform.nvim', 25 | optional = true, 26 | opts = function(_, opts) 27 | opts.formatters_by_ft = opts.formatters_by_ft or {} 28 | for _, ft in ipairs(supported) do 29 | opts.formatters_by_ft[ft] = opts.formatters_by_ft[ft] or {} 30 | table.insert(opts.formatters_by_ft[ft], 'prettier') 31 | table.insert(opts.formatters_by_ft[ft], 'prettierd') -- fallback 32 | end 33 | 34 | opts.formatters = opts.formatters or {} 35 | opts.formatters.prettier = opts.formatters.prettier or {} 36 | opts.formatters.prettierd = opts.formatters.prettierd or {} 37 | end, 38 | }, 39 | { 40 | 'nvimtools/none-ls.nvim', 41 | optional = true, 42 | opts = function(_, opts) 43 | local nls = require 'null-ls' 44 | opts.sources = opts.sources or {} 45 | table.insert(opts.sources, nls.builtins.formatting.prettier) 46 | end, 47 | }, 48 | } 49 | -------------------------------------------------------------------------------- /.config/wezterm/wezterm.lua: -------------------------------------------------------------------------------- 1 | local wezterm = require 'wezterm' 2 | local commands = require 'commands' 3 | 4 | local config = wezterm.config_builder() 5 | 6 | -- Font settings 7 | config.font_size = 16 8 | config.line_height = 1.4 9 | config.font = wezterm.font_with_fallback { 10 | { 11 | family = 'Dank Mono', 12 | harfbuzz_features = { 13 | 'calt', 14 | 'ss01', 15 | 'ss02', 16 | 'ss03', 17 | 'ss04', 18 | 'ss05', 19 | 'ss06', 20 | 'ss07', 21 | 'ss08', 22 | 'ss09', 23 | 'liga', 24 | }, 25 | }, 26 | { family = 'Symbols Nerd Font Mono' }, 27 | } 28 | config.font_rules = { 29 | { 30 | font = wezterm.font('Dank Mono', { 31 | bold = true, 32 | }), 33 | }, 34 | { 35 | italic = true, 36 | font = wezterm.font('Dank Mono', { 37 | italic = true, 38 | }), 39 | }, 40 | } 41 | 42 | -- Colors 43 | config.color_scheme = 'Catppuccin Mocha' 44 | 45 | -- Appearance 46 | config.cursor_blink_rate = 0 47 | -- config.window_decorations = 'RESIZE' 48 | config.hide_tab_bar_if_only_one_tab = true 49 | config.window_padding = { 50 | left = 0, 51 | right = 0, 52 | top = 0, 53 | bottom = 0, 54 | } 55 | config.macos_window_background_blur = 40 56 | 57 | -- Miscellaneous settings 58 | config.max_fps = 120 59 | config.prefer_egl = true 60 | 61 | -- Custom commands 62 | wezterm.on('augment-command-palette', function() 63 | return commands 64 | end) 65 | 66 | return config 67 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/languages/php.lua: -------------------------------------------------------------------------------- 1 | vim.g.lazyvim_php_lsp = 'intelephense' 2 | 3 | local lsp = vim.g.lazyvim_php_lsp or 'intelephense' 4 | 5 | return { 6 | { 7 | 'nvim-treesitter/nvim-treesitter', 8 | opts = { 9 | ensure_installed = { 10 | 'php', 11 | }, 12 | }, 13 | }, 14 | { 15 | 'neovim/nvim-lspconfig', 16 | opts = { 17 | servers = { 18 | intelephense = { 19 | enabled = lsp == 'intelephense', 20 | filetypes = { 'php', 'blade', 'php_only' }, 21 | settings = { 22 | intelephense = { 23 | files = { 24 | associations = { '*.php', '*.blade.php' }, 25 | maxSize = 5000000, 26 | }, 27 | }, 28 | }, 29 | }, 30 | [lsp] = { 31 | enabled = true, 32 | }, 33 | }, 34 | }, 35 | }, 36 | { 37 | 'williamboman/mason.nvim', 38 | opts = { 39 | ensure_installed = { 40 | 'blade-formatter', 41 | 'php-debug-adapter', 42 | 'phpstan', 43 | 'pint', 44 | }, 45 | }, 46 | }, 47 | { 48 | 'mfussenegger/nvim-dap', 49 | optional = true, 50 | opts = function() 51 | local dap = require 'dap' 52 | local path = vim.fn.expand '$MASON/packages/php-debug-adapter' 53 | dap.adapters.php = { 54 | type = 'executable', 55 | command = 'node', 56 | args = { path .. '/extension/out/phpDebug.js' }, 57 | } 58 | end, 59 | }, 60 | } 61 | -------------------------------------------------------------------------------- /.config/wezterm/nightwolf.lua: -------------------------------------------------------------------------------- 1 | -- nightwolf theme for wezterm 2 | -- optimized from https://github.com/mao-santaella-rs/NightWolfTheme 3 | return { 4 | -- Main colors 5 | foreground = '#c8c8c8', -- text color (200,200,200) 6 | background = '#000000', 7 | 8 | -- Cursor colors 9 | cursor_bg = '#969696', -- principal_5 (150,150,150) 10 | cursor_fg = '#141414', 11 | cursor_border = '#969696', 12 | 13 | -- Selection colors 14 | selection_fg = '#141414', 15 | selection_bg = '#969696', -- Using principal_5 at higher opacity 16 | 17 | -- UI elements 18 | scrollbar_thumb = '#282828', -- principal_1 (40,40,40) 19 | split = '#3c3c3c', -- principal_2 (60,60,60) 20 | 21 | -- Terminal colors (ANSI) 22 | ansi = { 23 | '#141414', -- black (principal_0) 24 | '#ef5350', -- red (based on gitRemovedBg) 25 | '#99b76d', -- green (based on gitInsertedBg) 26 | '#ffca28', -- yellow (assumed syntaxYellow) 27 | '#42a5f5', -- blue (assumed syntaxBlue) 28 | '#7e57c2', -- purple (assumed syntaxPurple) 29 | '#26c6da', -- cyan (assumed syntaxCyan) 30 | '#c8c8c8', -- white (text) 31 | }, 32 | 33 | -- Bright terminal colors 34 | brights = { 35 | '#505050', -- bright black (principal_3) 36 | '#ef5350', -- bright red 37 | '#99b76d', -- bright green 38 | '#ffa726', -- bright orange (assumed syntaxOrange) 39 | '#42a5f5', -- bright blue 40 | '#ab47bc', -- bright violet (assumed syntaxViolet) 41 | '#26c6da', -- bright cyan 42 | '#e0e0e0', -- bright white (brighter than text) 43 | }, 44 | 45 | indexed = { [17] = '#ef5350' }, 46 | } 47 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/overseer.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'stevearc/overseer.nvim', 4 | opts = { 5 | task_list = { 6 | direction = 'left', 7 | bindings = { 8 | [''] = false, 9 | [''] = false, 10 | [''] = false, 11 | [''] = false, 12 | ['L'] = 'IncreaseDetail', 13 | ['H'] = 'DecreaseDetail', 14 | [''] = 'ScrollOutputUp', 15 | [''] = 'ScrollOutputDown', 16 | }, 17 | }, 18 | }, 19 | keys = { 20 | { 21 | 'ot', 22 | 'OverseerToggle', 23 | desc = 'Toggle Overseer Task List', 24 | }, 25 | { 'or', 'OverseerRun', desc = 'Run Overseer Task' }, 26 | { 27 | 'ol', 28 | 'OverseerRunCmd', 29 | desc = 'Run Command in Overseer', 30 | }, 31 | { 32 | 'oq', 33 | 'OverseerQuickAction', 34 | desc = 'Quick Action for Overseer Task', 35 | }, 36 | { 37 | 'oa', 38 | 'OverseerTaskAction', 39 | desc = 'Select and Act on Overseer Task', 40 | }, 41 | { 42 | 'oc', 43 | 'OverseerClearCache', 44 | desc = 'Clear Overseer Task Cache', 45 | }, 46 | { 47 | 'os', 48 | 'OverseerSaveBundle', 49 | desc = 'Save Overseer Task Bundle', 50 | }, 51 | { 52 | 'ob', 53 | 'OverseerLoadBundle', 54 | desc = 'Load Overseer Task Bundle', 55 | }, 56 | }, 57 | }, 58 | } 59 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/linting/core.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'mfussenegger/nvim-lint', 4 | event = { 'BufReadPre', 'BufNewFile' }, 5 | config = function() 6 | local lint = require 'lint' 7 | 8 | lint.linters = lint.linters or {} 9 | lint.linters.phpstan = require 'plugins.linting.phpstan' 10 | 11 | lint.linters_by_ft = lint.linters_by_ft or {} 12 | lint.linters_by_ft['php'] = { 'phpstan' } 13 | 14 | local function has_file(files) 15 | for _, file in ipairs(files) do 16 | if vim.fn.filereadable(vim.fn.getcwd() .. '/' .. file) == 1 then 17 | return true 18 | end 19 | end 20 | return false 21 | end 22 | 23 | -- No JS linters configured - using ESLint LSP instead 24 | 25 | local lint_augroup = vim.api.nvim_create_augroup('lint', { clear = true }) 26 | vim.api.nvim_create_autocmd( 27 | { 'BufEnter', 'BufWritePost', 'InsertLeave' }, 28 | { 29 | group = lint_augroup, 30 | callback = function() 31 | if not vim.opt_local.modifiable:get() then 32 | return 33 | end 34 | 35 | local ft = vim.bo.filetype 36 | local js_like = { 37 | javascript = true, 38 | javascriptreact = true, 39 | typescript = true, 40 | ['typescript.tsx'] = true, 41 | typescriptreact = true, 42 | json = true, 43 | } 44 | 45 | -- No JS linting - using ESLint LSP instead 46 | 47 | lint.try_lint(nil, { ignore_errors = true }) 48 | end, 49 | } 50 | ) 51 | end, 52 | }, 53 | } 54 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/ufo.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'kevinhwang91/nvim-ufo', 4 | event = 'BufRead', 5 | keys = { 6 | { 7 | 'zR', 8 | function() 9 | require('ufo').openAllFolds() 10 | end, 11 | }, 12 | { 13 | 'zM', 14 | function() 15 | require('ufo').closeAllFolds() 16 | end, 17 | }, 18 | { 19 | 'K', 20 | function() 21 | local winid = require('ufo').peekFoldedLinesUnderCursor() 22 | if not winid then 23 | vim.lsp.buf.hover() 24 | end 25 | end, 26 | }, 27 | }, 28 | dependencies = { 29 | { 'kevinhwang91/promise-async' }, 30 | { 31 | 'luukvbaal/statuscol.nvim', 32 | config = function(opts) 33 | local builtin = require 'statuscol.builtin' 34 | require('statuscol').setup { 35 | -- foldfunc = 'builtin', 36 | -- setopt = true, 37 | relculright = true, 38 | segments = { 39 | { text = { builtin.foldfunc }, click = 'v:lua.ScFa' }, 40 | { text = { '%s' }, click = 'v:lua.ScSa' }, 41 | { text = { builtin.lnumfunc, ' ' }, click = 'v:lua.ScLa' }, 42 | }, 43 | } 44 | end, 45 | }, 46 | }, 47 | config = function() 48 | -- Fold options 49 | vim.o.fillchars = [[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]] 50 | vim.o.foldcolumn = '1' -- '0' is not bad 51 | vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value 52 | vim.o.foldlevelstart = 99 53 | vim.o.foldenable = true 54 | 55 | require('ufo').setup() 56 | end, 57 | }, 58 | } 59 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/languages/tailwind.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'neovim/nvim-lspconfig', 4 | opts = { 5 | servers = { 6 | tailwindcss = { 7 | -- exclude a filetype from the default_config 8 | filetypes_exclude = { 'markdown' }, 9 | -- add additional filetypes to the default_config 10 | filetypes_include = {}, 11 | -- to fully override the default_config, change the below 12 | -- filetypes = {} 13 | }, 14 | }, 15 | setup = { 16 | tailwindcss = function(_, opts) 17 | local tw = nil 18 | local ok, ret = pcall(require, 'lspconfig.configs.tailwindcss') 19 | if ok then 20 | tw = ret 21 | end 22 | tw = require 'lspconfig.server_configurations.tailwindcss' 23 | 24 | opts.filetypes = opts.filetypes or {} 25 | 26 | -- Add default filetypes 27 | vim.list_extend(opts.filetypes, tw.default_config.filetypes) 28 | 29 | -- Remove excluded filetypes 30 | --- @param ft string 31 | opts.filetypes = vim.tbl_filter(function(ft) 32 | return not vim.tbl_contains(opts.filetypes_exclude or {}, ft) 33 | end, opts.filetypes) 34 | 35 | -- Additional settings for Phoenix projects 36 | opts.settings = { 37 | tailwindCSS = { 38 | includeLanguages = { 39 | elixir = 'html-eex', 40 | eelixir = 'html-eex', 41 | heex = 'html-eex', 42 | }, 43 | }, 44 | } 45 | 46 | -- Add additional filetypes 47 | vim.list_extend(opts.filetypes, opts.filetypes_include or {}) 48 | end, 49 | }, 50 | }, 51 | }, 52 | } 53 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/lualine-theme.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | local function get_palette() 4 | local palette = require('catppuccin.palettes').get_palette 'mocha' 5 | 6 | return { 7 | bg = palette.base, 8 | fg = palette.text, 9 | yellow = palette.yellow, 10 | cyan = palette.teal, 11 | darkblue = palette.crust, 12 | green = palette.green, 13 | orange = palette.peach, 14 | violet = palette.lavender, 15 | magenta = palette.mauve, 16 | blue = palette.blue, 17 | red = palette.red, 18 | pink = palette.pink, 19 | } 20 | end 21 | 22 | function M.build_theme() 23 | return get_palette() 24 | end 25 | 26 | function M.apply_highlights() 27 | local c = get_palette() 28 | 29 | vim.api.nvim_set_hl(0, 'LualineNormalC', { fg = c.fg, bg = c.bg }) 30 | vim.api.nvim_set_hl(0, 'LualineInactiveC', { fg = c.fg, bg = c.bg }) 31 | vim.api.nvim_set_hl(0, 'LualineFilename', { fg = c.fg, bg = c.bg }) 32 | 33 | vim.api.nvim_set_hl(0, 'LualineDiagnosticsError', { bg = c.bg, fg = c.red }) 34 | vim.api.nvim_set_hl(0, 'LualineDiagnosticsWarn', { bg = c.bg, fg = c.yellow }) 35 | vim.api.nvim_set_hl(0, 'LualineDiagnosticsInfo', { bg = c.bg, fg = c.cyan }) 36 | vim.api.nvim_set_hl(0, 'LualineLsp', { bg = c.bg, fg = c.pink }) 37 | vim.api.nvim_set_hl( 38 | 0, 39 | 'LualineBranch', 40 | { bg = c.bg, fg = c.violet, bold = true } 41 | ) 42 | vim.api.nvim_set_hl( 43 | 0, 44 | 'LualineDiffAdded', 45 | { bg = c.bg, fg = c.green, bold = true } 46 | ) 47 | vim.api.nvim_set_hl( 48 | 0, 49 | 'LualineDiffModified', 50 | { bg = c.bg, fg = c.orange, bold = true } 51 | ) 52 | vim.api.nvim_set_hl( 53 | 0, 54 | 'LualineDiffRemoved', 55 | { bg = c.bg, fg = c.red, bold = true } 56 | ) 57 | 58 | -- add more as needed 59 | end 60 | 61 | return M 62 | -------------------------------------------------------------------------------- /.config/kitty/catppuccin-theme.conf: -------------------------------------------------------------------------------- 1 | # vim:ft=kitty 2 | 3 | ## name: Catppuccin-Mocha 4 | ## author: Pocco81 (https://github.com/Pocco81) 5 | ## license: MIT 6 | ## upstream: https://github.com/catppuccin/kitty/blob/main/mocha.conf 7 | ## blurb: Soothing pastel theme for the high-spirited! 8 | 9 | # The basic colors 10 | foreground #CDD6F4 11 | background #1E1E2E 12 | selection_foreground #1E1E2E 13 | selection_background #F5E0DC 14 | 15 | # Cursor colors 16 | cursor #F5E0DC 17 | cursor_text_color #1E1E2E 18 | 19 | # URL underline color when hovering with mouse 20 | url_color #F5E0DC 21 | 22 | # Kitty window border colors 23 | active_border_color #B4BEFE 24 | inactive_border_color #6C7086 25 | bell_border_color #F9E2AF 26 | 27 | # OS Window titlebar colors 28 | wayland_titlebar_color system 29 | macos_titlebar_color system 30 | 31 | # Tab bar colors 32 | active_tab_foreground #11111B 33 | active_tab_background #CBA6F7 34 | inactive_tab_foreground #CDD6F4 35 | inactive_tab_background #181825 36 | tab_bar_background #11111B 37 | 38 | # Colors for marks (marked text in the terminal) 39 | mark1_foreground #1E1E2E 40 | mark1_background #B4BEFE 41 | mark2_foreground #1E1E2E 42 | mark2_background #CBA6F7 43 | mark3_foreground #1E1E2E 44 | mark3_background #74C7EC 45 | 46 | # The 16 terminal colors 47 | 48 | # black 49 | color0 #45475A 50 | color8 #585B70 51 | 52 | # red 53 | color1 #F38BA8 54 | color9 #F38BA8 55 | 56 | # green 57 | color2 #A6E3A1 58 | color10 #A6E3A1 59 | 60 | # yellow 61 | color3 #F9E2AF 62 | color11 #F9E2AF 63 | 64 | # blue 65 | color4 #89B4FA 66 | color12 #89B4FA 67 | 68 | # magenta 69 | color5 #F5C2E7 70 | color13 #F5C2E7 71 | 72 | # cyan 73 | color6 #94E2D5 74 | color14 #94E2D5 75 | 76 | # white 77 | color7 #BAC2DE 78 | color15 #A6ADC8 79 | -------------------------------------------------------------------------------- /.config/nvim/lua/health.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | -- 3 | -- This file is not required for your own configuration, 4 | -- but helps people determine if their system is setup correctly. 5 | -- 6 | --]] 7 | 8 | local check_version = function() 9 | local verstr = tostring(vim.version()) 10 | if not vim.version.ge then 11 | vim.health.error( 12 | string.format( 13 | "Neovim out of date: '%s'. Upgrade to latest stable or nightly", 14 | verstr 15 | ) 16 | ) 17 | return 18 | end 19 | 20 | if vim.version.ge(vim.version(), '0.10-dev') then 21 | vim.health.ok(string.format("Neovim version is: '%s'", verstr)) 22 | else 23 | vim.health.error( 24 | string.format( 25 | "Neovim out of date: '%s'. Upgrade to latest stable or nightly", 26 | verstr 27 | ) 28 | ) 29 | end 30 | end 31 | 32 | local check_external_reqs = function() 33 | -- Basic utils: `git`, `make`, `unzip` 34 | for _, exe in ipairs { 'git', 'make', 'unzip', 'rg' } do 35 | local is_executable = vim.fn.executable(exe) == 1 36 | if is_executable then 37 | vim.health.ok(string.format("Found executable: '%s'", exe)) 38 | else 39 | vim.health.warn(string.format("Could not find executable: '%s'", exe)) 40 | end 41 | end 42 | 43 | return true 44 | end 45 | 46 | return { 47 | check = function() 48 | vim.health.start 'kickstart.nvim' 49 | 50 | vim.health.info [[NOTE: Not every warning is a 'must-fix' in `:checkhealth` 51 | 52 | Fix only warnings for plugins and languages you intend to use. 53 | Mason will give warnings for languages that are not installed. 54 | You do not need to install, unless you want to use those languages!]] 55 | 56 | local uv = vim.uv or vim.loop 57 | vim.health.info('System Information: ' .. vim.inspect(uv.os_uname())) 58 | 59 | check_version() 60 | check_external_reqs() 61 | end, 62 | } 63 | -------------------------------------------------------------------------------- /.config/zed/keymap.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "bindings": { 4 | "ctrl-h": "workspace::ActivatePaneLeft", 5 | "ctrl-l": "workspace::ActivatePaneRight", 6 | "ctrl-k": "workspace::ActivatePaneUp", 7 | "ctrl-j": "workspace::ActivatePaneDown" 8 | } 9 | }, 10 | { 11 | "context": "not_editing || (Editor && vim_mode == normal)", 12 | "bindings": { 13 | "space ,": "tab_switcher::Toggle", 14 | "space space": "file_finder::Toggle", 15 | "space e": "workspace::ToggleRightDock" 16 | } 17 | }, 18 | { 19 | "context": "Editor && vim_mode == normal && !VimWaiting && !menu", 20 | "bindings": { 21 | "shift-k": "editor::Hover", 22 | "space c a": "editor::ToggleCodeActions", 23 | "space c f": "editor::Format", 24 | "space c r": "editor::Rename", 25 | "space c d": "editor::GoToDiagnostic", 26 | "space c s": "outline::Toggle", 27 | "space s s": "project_symbols::Toggle", 28 | "space b d": "pane::CloseActiveItem", 29 | "space g d": "editor::GoToDefinition", 30 | "space g r": "editor::FindAllReferences", 31 | "space s g": "pane::DeploySearch", 32 | "ctrl-n": "editor::SelectNext" 33 | } 34 | }, 35 | { 36 | "context": "Editor && vim_mode == visual && !VimWaiting && !menu", 37 | "bindings": { 38 | "shift-j": "editor::MoveLineDown", 39 | "shift-k": "editor::MoveLineUp" 40 | } 41 | }, 42 | { 43 | "context": "ProjectPanel && not_editing", 44 | "bindings": { 45 | "a": "project_panel::NewFile", 46 | "A": "project_panel::NewDirectory", 47 | "r": "project_panel::Rename", 48 | "d": "project_panel::Delete", 49 | "c": "project_panel::Copy", 50 | "p": "project_panel::Paste", 51 | "x": "project_panel::Cut", 52 | "s": [ 53 | "workspace::SendKeystrokes", 54 | "ctrl-h cmd-k right right ctrl-l enter right right right right alt-cmd-t" 55 | ] 56 | } 57 | } 58 | ] 59 | -------------------------------------------------------------------------------- /.config/nvim/lua/options.lua: -------------------------------------------------------------------------------- 1 | -- Disable command line 2 | vim.opt.cmdheight = 0 3 | 4 | -- Make line numbers default 5 | vim.opt.number = true 6 | 7 | -- Relative numbers 8 | vim.opt.relativenumber = true 9 | 10 | -- Disable wrap 11 | vim.wo.wrap = false 12 | 13 | -- Enable mouse mode, can be useful for resizing splits for example! 14 | vim.opt.mouse = 'a' 15 | 16 | -- Don't show the mode, since it's already in the status line 17 | vim.opt.showmode = false 18 | 19 | -- Sync clipboard between OS and Neovim. 20 | -- Schedule the setting after `UiEnter` because it can increase startup-time. 21 | -- Remove this option if you want your OS clipboard to remain independent. 22 | -- See `:help 'clipboard'` 23 | vim.schedule(function() 24 | vim.opt.clipboard = 'unnamedplus' 25 | end) 26 | 27 | -- Enable break indent 28 | vim.opt.breakindent = true 29 | 30 | -- Save undo history 31 | vim.opt.undofile = true 32 | 33 | -- Case-insensitive searching UNLESS \C or one or more capital letters in the search term 34 | vim.opt.ignorecase = true 35 | vim.opt.smartcase = true 36 | 37 | -- Keep signcolumn on by default 38 | vim.opt.signcolumn = 'yes' 39 | 40 | -- Decrease update time 41 | vim.opt.updatetime = 250 42 | 43 | -- Decrease mapped sequence wait time 44 | vim.opt.timeoutlen = 300 45 | 46 | -- Configure how new splits should be opened 47 | vim.opt.splitright = true 48 | vim.opt.splitbelow = true 49 | 50 | -- Sets how neovim will display certain whitespace characters in the editor. 51 | -- See `:help 'list'` 52 | -- and `:help 'listchars'` 53 | vim.opt.list = true 54 | vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '␣' } 55 | 56 | -- Preview substitutions live, as you type! 57 | vim.opt.inccommand = 'split' 58 | 59 | -- Show which line your cursor is on 60 | vim.opt.cursorline = false 61 | 62 | -- Minimal number of screen lines to keep above and below the cursor. 63 | vim.opt.scrolloff = 10 64 | 65 | -- Enable 24-bit colors 66 | vim.opt.termguicolors = true 67 | 68 | -- Set statusline to be global 69 | vim.opt.laststatus = 3 70 | -------------------------------------------------------------------------------- /.claude/agents/php-developer.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: php-developer 3 | description: Write idiomatic PHP code with design patterns, SOLID principles, and modern best practices. Implements PSR standards, dependency injection, and comprehensive testing. Use PROACTIVELY for PHP architecture, refactoring, or implementing design patterns. 4 | color: blue 5 | model: sonnet 6 | category: language-specialists 7 | --- 8 | 9 | 10 | You are a PHP expert specializing in clean architecture, design patterns, and modern PHP best practices. 11 | 12 | When invoked: 13 | 1. Analyze requirements and design clean PHP architecture solutions 14 | 2. Implement appropriate design patterns based on problem context 15 | 3. Apply SOLID principles and Domain-Driven Design concepts 16 | 4. Establish PSR standards compliance and modern PHP features 17 | 5. Set up dependency injection and service container patterns 18 | 6. Create comprehensive testing strategy with quality assurance 19 | 20 | Process: 21 | - Write type-safe PHP with strict typing and property type declarations 22 | - Implement design patterns appropriately: Creational, Structural, Behavioral 23 | - Follow PSR standards for code style, autoloading, and HTTP interfaces 24 | - Use composition over inheritance for flexible, maintainable designs 25 | - Apply dependency injection for loose coupling and testability 26 | - Write testable code with clear separation of concerns 27 | - Choose patterns based on problem context, not pattern preference 28 | - Avoid over-engineering while maintaining code quality and maintainability 29 | 30 | Provide: 31 | - Clean, documented PHP code with proper namespacing and strict types 32 | - Design pattern implementations with clear context and rationale 33 | - Unit tests with PHPUnit achieving 80%+ coverage 34 | - Integration tests for service boundaries and external dependencies 35 | - Static analysis setup with PHPStan or Psalm for code quality 36 | - PSR compliance verification and code style configuration 37 | - Dependency injection container setup and service definitions 38 | - Performance considerations, trade-offs, and optimization recommendations 39 | - Refactoring suggestions for legacy code with migration strategies 40 | 41 | -------------------------------------------------------------------------------- /.config/nvim/lua/keymaps.lua: -------------------------------------------------------------------------------- 1 | local keymap = vim.keymap 2 | local opts = { noremap = true, silent = true } 3 | 4 | -- Clear highlights on search when pressing in normal mode 5 | keymap.set('n', '', 'nohlsearch') 6 | 7 | -- Split windows 8 | keymap.set('n', 'sh', ':vsplit', opts) 9 | keymap.set('n', 'sv', ':split', opts) 10 | 11 | -- Tabs 12 | keymap.set('n', 'te', ':tabedit', opts) 13 | keymap.set('n', '', ':tabnext', opts) 14 | keymap.set('n', '', ':tabprev', opts) 15 | keymap.set('n', 'd', ':tabclose', opts) 16 | 17 | -- LSP Rename 18 | vim.keymap.set('n', 'cr', function() 19 | vim.lsp.buf.rename() 20 | end, { expr = true, desc = 'LSP Rename' }) 21 | 22 | -- Buffer functions 23 | local function delete_other_buffers() 24 | local current_buf = vim.api.nvim_get_current_buf() 25 | local buffers = vim.api.nvim_list_bufs() 26 | 27 | for _, buf in ipairs(buffers) do 28 | if buf ~= current_buf and vim.api.nvim_buf_is_loaded(buf) then 29 | vim.api.nvim_buf_delete(buf, {}) 30 | end 31 | end 32 | end 33 | 34 | -- Buffers 35 | keymap.set('n', '', 'bprevious', { desc = 'Prev Buffer' }) 36 | keymap.set('n', '', 'bnext', { desc = 'Next Buffer' }) 37 | keymap.set('n', '[b', 'bprevious', { desc = 'Prev Buffer' }) 38 | keymap.set('n', ']b', 'bnext', { desc = 'Next Buffer' }) 39 | keymap.set('n', 'bd', 'bdelete', { desc = 'Delete Buffer' }) 40 | keymap.set( 41 | 'n', 42 | 'bo', 43 | delete_other_buffers, 44 | { desc = 'Delete Other Buffers' } 45 | ) 46 | keymap.set( 47 | 'n', 48 | 'bD', 49 | ':bd', 50 | { desc = 'Delete Buffer and Window' } 51 | ) 52 | 53 | -- Highlight when yanking (copying) text 54 | vim.api.nvim_create_autocmd('TextYankPost', { 55 | desc = 'Highlight when yanking (copying) text', 56 | group = vim.api.nvim_create_augroup( 57 | 'kickstart-highlight-yank', 58 | { clear = true } 59 | ), 60 | callback = function() 61 | vim.highlight.on_yank() 62 | end, 63 | }) 64 | 65 | -- Better indenting 66 | keymap.set('v', '<', '', '>gv') 68 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/coding/treesitter.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { -- Highlight, edit, and navigate code 3 | 'nvim-treesitter/nvim-treesitter', 4 | build = ':TSUpdate', 5 | main = 'nvim-treesitter.configs', -- Sets main module to use for opts 6 | -- [[ Configure Treesitter ]] See `:help nvim-treesitter` 7 | opts = { 8 | ensure_installed = { 9 | 'astro', 10 | 'bash', 11 | 'blade', 12 | 'c', 13 | 'caddy', 14 | 'css', 15 | 'diff', 16 | 'dockerfile', 17 | 'editorconfig', 18 | 'gitignore', 19 | 'go', 20 | 'gomod', 21 | 'gosum', 22 | 'html', 23 | 'javascript', 24 | 'json', 25 | 'lua', 26 | 'luadoc', 27 | 'nginx', 28 | 'php', 29 | 'php_only', 30 | 'python', 31 | 'sql', 32 | 'typescript', 33 | 'vim', 34 | 'vimdoc', 35 | 'ninja', 36 | 'rst', 37 | }, 38 | -- Autoinstall languages that are not installed 39 | auto_install = true, 40 | highlight = { 41 | enable = true, 42 | -- Some languages depend on vim's regex highlighting system (such as Ruby) for indent rules. 43 | -- If you are experiencing weird indenting issues, add the language to 44 | -- the list of additional_vim_regex_highlighting and disabled languages for indent. 45 | additional_vim_regex_highlighting = { 'ruby' }, 46 | }, 47 | indent = { enable = true, disable = { 'ruby' } }, 48 | }, 49 | -- There are additional nvim-treesitter modules that you can use to interact 50 | -- with nvim-treesitter. You should go explore a few and see what interests you: 51 | -- 52 | -- - Incremental selection: Included, see `:help nvim-treesitter-incremental-selection-mod` 53 | -- - Show your current context: https://github.com/nvim-treesitter/nvim-treesitter-context 54 | -- - Treesitter + textobjects: https://github.com/nvim-treesitter/nvim-treesitter-textobjects 55 | config = function() 56 | vim.filetype.add { 57 | pattern = { 58 | ['config'] = 'dosini', -- better syntax highlighting for config files 59 | }, 60 | } 61 | end, 62 | }, 63 | } 64 | -- vim: ts=2 sts=2 sw=2 et 65 | -------------------------------------------------------------------------------- /.claude/agents/frontend-developer.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: frontend-developer 3 | description: Build Next.js applications with React components, shadcn/ui, and Tailwind CSS. Expert in SSR/SSG, app router, and modern frontend patterns. Use PROACTIVELY for Next.js development, UI component creation, or frontend architecture. 4 | color: green 5 | model: sonnet 6 | category: development-architecture 7 | --- 8 | 9 | You are a Next.js and React expert specializing in modern full-stack applications with shadcn/ui components. 10 | 11 | When invoked: 12 | 1. Analyze project structure and requirements 13 | 2. Check Next.js version and configuration 14 | 3. Review existing components and patterns 15 | 4. Begin building with App Router best practices 16 | 17 | Next.js 14+ checklist: 18 | - App Router with layouts and nested routing 19 | - Server Components by default 20 | - Client Components for interactivity 21 | - Server Actions for mutations 22 | - Streaming SSR with Suspense 23 | - Parallel and intercepted routes 24 | - Middleware for auth/redirects 25 | - Route handlers for APIs 26 | 27 | shadcn/ui implementation: 28 | - Use CLI to add components: `npx shadcn-ui@latest add` 29 | - Customize with Tailwind classes 30 | - Extend with CVA variants 31 | - Maintain accessibility with Radix UI 32 | - Theme with CSS variables 33 | - Dark mode with next-themes 34 | - Forms with react-hook-form + zod 35 | - Tables with @tanstack/react-table 36 | 37 | Process: 38 | - Start with Server Components, add Client where needed 39 | - Implement proper loading and error boundaries 40 | - Use next/image for optimized images 41 | - Apply next/font for web fonts 42 | - Configure metadata for SEO 43 | - Set up proper caching strategies 44 | - Handle forms with Server Actions 45 | - Optimize with dynamic imports 46 | 47 | Performance patterns: 48 | - Streaming with Suspense boundaries 49 | - Partial pre-rendering 50 | - Static generation where possible 51 | - Incremental Static Regeneration 52 | - Client-side navigation prefetching 53 | - Bundle splitting strategies 54 | - Optimistic updates 55 | 56 | Provide: 57 | - TypeScript components with proper types 58 | - Server/Client component separation 59 | - shadcn/ui component usage 60 | - Tailwind styling with design tokens 61 | - Loading and error states 62 | - SEO metadata configuration 63 | - Accessibility attributes 64 | - Mobile-responsive design 65 | 66 | Always use latest Next.js patterns. Prioritize performance and accessibility. 67 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/languages/laravel.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'adalessa/laravel.nvim', 4 | dependencies = { 5 | 'tpope/vim-dotenv', 6 | 'nvim-telescope/telescope.nvim', 7 | 'MunifTanjim/nui.nvim', 8 | 'nvim-lua/plenary.nvim', 9 | 'nvim-neotest/nvim-nio', 10 | }, 11 | cmd = { 'Laravel' }, 12 | event = { 'VeryLazy' }, 13 | keys = { 14 | { 15 | 'll', 16 | function() 17 | Laravel.pickers.laravel() 18 | end, 19 | desc = 'Laravel: Open Laravel Picker', 20 | }, 21 | { 22 | '', 23 | function() 24 | Laravel.commands.run 'view:finder' 25 | end, 26 | desc = 'Laravel: Open View Finder', 27 | }, 28 | { 29 | 'la', 30 | function() 31 | Laravel.pickers.artisan() 32 | end, 33 | desc = 'Laravel: Open Artisan Picker', 34 | }, 35 | { 36 | 'lt', 37 | function() 38 | Laravel.commands.run 'actions' 39 | end, 40 | desc = 'Laravel: Open Actions Picker', 41 | }, 42 | { 43 | 'lr', 44 | function() 45 | Laravel.pickers.routes() 46 | end, 47 | desc = 'Laravel: Open Routes Picker', 48 | }, 49 | { 50 | 'lh', 51 | function() 52 | Laravel.run 'artisan docs' 53 | end, 54 | desc = 'Laravel: Open Documentation', 55 | }, 56 | { 57 | 'lm', 58 | function() 59 | Laravel.pickers.make() 60 | end, 61 | desc = 'Laravel: Open Make Picker', 62 | }, 63 | { 64 | 'lc', 65 | function() 66 | Laravel.pickers.commands() 67 | end, 68 | desc = 'Laravel: Open Commands Picker', 69 | }, 70 | { 71 | 'lo', 72 | function() 73 | Laravel.pickers.resources() 74 | end, 75 | desc = 'Laravel: Open Resources Picker', 76 | }, 77 | { 78 | 'lp', 79 | function() 80 | Laravel.commands.run 'command_center' 81 | end, 82 | desc = 'Laravel: Open Command Center', 83 | }, 84 | }, 85 | opts = { 86 | lsp_server = 'intelephense', 87 | features = { 88 | pickers = { 89 | enable = true, 90 | provider = 'snacks', 91 | }, 92 | }, 93 | }, 94 | }, 95 | } 96 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/coding/ai.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'yetone/avante.nvim', 4 | -- if you want to build from source then do `make BUILD_FROM_SOURCE=true` 5 | -- ⚠️ must add this setting! ! ! 6 | build = vim.fn.has 'win32' ~= 0 7 | and 'powershell -ExecutionPolicy Bypass -File Build.ps1 -BuildFromSource false' 8 | or 'make', 9 | event = 'VeryLazy', 10 | version = false, -- Never set this value to "*"! Never! 11 | ---@module 'avante' 12 | ---@type avante.Config 13 | opts = { 14 | -- add any opts here 15 | -- this file can contain specific instructions for your project 16 | instructions_file = 'agents.md', 17 | -- for example 18 | provider = 'claude', 19 | providers = { 20 | claude = { 21 | endpoint = 'https://api.anthropic.com', 22 | model = 'claude-sonnet-4-5-20250929', 23 | timeout = 30000, -- Timeout in milliseconds 24 | }, 25 | }, 26 | }, 27 | dependencies = { 28 | 'nvim-lua/plenary.nvim', 29 | 'MunifTanjim/nui.nvim', 30 | --- The below dependencies are optional, 31 | 'nvim-mini/mini.pick', -- for file_selector provider mini.pick 32 | 'nvim-telescope/telescope.nvim', -- for file_selector provider telescope 33 | 'hrsh7th/nvim-cmp', -- autocompletion for avante commands and mentions 34 | 'ibhagwan/fzf-lua', -- for file_selector provider fzf 35 | 'stevearc/dressing.nvim', -- for input provider dressing 36 | 'folke/snacks.nvim', -- for input provider snacks 37 | 'nvim-tree/nvim-web-devicons', -- or echasnovski/mini.icons 38 | 'zbirenbaum/copilot.lua', -- for providers='copilot' 39 | { 40 | -- support for image pasting 41 | 'HakonHarnes/img-clip.nvim', 42 | event = 'VeryLazy', 43 | opts = { 44 | -- recommended settings 45 | default = { 46 | embed_image_as_base64 = false, 47 | prompt_for_file_name = false, 48 | drag_and_drop = { 49 | insert_mode = true, 50 | }, 51 | -- required for Windows users 52 | use_absolute_path = true, 53 | }, 54 | }, 55 | }, 56 | { 57 | -- Make sure to set this up properly if you have lazy=true 58 | 'MeanderingProgrammer/render-markdown.nvim', 59 | opts = { 60 | file_types = { 'markdown', 'Avante' }, 61 | }, 62 | ft = { 'markdown', 'Avante' }, 63 | }, 64 | }, 65 | }, 66 | } 67 | -------------------------------------------------------------------------------- /.zshrc: -------------------------------------------------------------------------------- 1 | ##### ── Core environment (safe for non‑interactive shells) ───────────────────── 2 | 3 | # Base config roots 4 | export XDG_CONFIG_HOME="$HOME/.config" 5 | 6 | # Toolchain flags 7 | export CPPFLAGS="-I/opt/homebrew/opt/openjdk/include -I/opt/homebrew/opt/llvm/include" 8 | export LDFLAGS="-L/opt/homebrew/opt/llvm/lib" 9 | 10 | # Homebrew (quiet) 11 | eval "$(/opt/homebrew/bin/brew shellenv)" 2>/dev/null 12 | 13 | # PATH (grouped; duplicates removed) 14 | export PATH="$HOME/bin:/usr/local/bin:$HOME/.local/bin:$PATH" 15 | export PATH="$HOME/tools/nvim-macos/bin:$PATH" 16 | export PATH="/opt/homebrew/opt/llvm/bin:$PATH" 17 | export PATH="$HOME/go/bin:$PATH" 18 | export PATH="$HOME/.config/composer/vendor/bin:$PATH" 19 | export PATH="/opt/homebrew/opt/mysql@5.7/bin:$PATH" 20 | export PATH="$HOME/.local/share/sentry-devenv/bin:$PATH" 21 | export PATH="$HOME/.pyenv/bin:$PATH" 22 | 23 | # uv (only if present; quiet) 24 | [ -f "$HOME/.local/bin/env" ] && . "$HOME/.local/bin/env" >/dev/null 2>&1 25 | 26 | ##### ── Stop here for non‑interactive shells (Cursor, LSPs, scripts) ────────── 27 | [[ $- == *i* ]] || return 28 | 29 | ##### ── Interactive‑only configuration ───────────────────────────────────────── 30 | 31 | # Oh My Zsh 32 | export ZSH="$HOME/.oh-my-zsh" 33 | ZSH_THEME="headline" 34 | source "$ZSH/oh-my-zsh.sh" 35 | 36 | # Neovim + aliases 37 | export NVIM_LISTEN_ADDRESS="/tmp/nvim-nikolovlazar-$$.sock" 38 | alias vim='nvim' 39 | 40 | # quick port killer (usage: kill_port 3000) 41 | findandkill() { lsof -ti:"${1:-3000}" | xargs kill 2>/dev/null; } 42 | alias kill_port='findandkill' 43 | 44 | # Apps 45 | alias tailscale="/Applications/Tailscale.app/Contents/MacOS/Tailscale" 46 | alias codex="codex --sandbox danger-full-access -m gpt-5-codex -c model_reasoning_effort=\"high\" --enable web_search_request" 47 | 48 | # pnpm 49 | export PNPM_HOME="$HOME/Library/pnpm" 50 | export PATH="$PNPM_HOME:$PATH" 51 | 52 | # direnv (if installed) 53 | if command -v direnv &>/dev/null; then 54 | export PATH="$HOME/.local/share/sentry-devenv/bin:$PATH" 55 | eval "$(direnv hook zsh)" 56 | fi 57 | 58 | # Private/local environment 59 | [ -f "$HOME/dotfiles/environment.sh" ] && source "$HOME/dotfiles/environment.sh" 60 | 61 | # Activate mise 62 | eval "$(mise activate zsh)" 63 | 64 | # ❗If you want macOS key‑repeat tweaks, run once manually (don’t keep in .zshrc): 65 | # defaults write NSGlobalDomain KeyRepeat -int 1 66 | # defaults write NSGlobalDomain InitialKeyRepeat -int 15 67 | # defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false 68 | 69 | # Activate mise environment 70 | eval "$(mise activate zsh)" 71 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/languages/go.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'nvim-treesitter/nvim-treesitter', 4 | opts = { ensure_installed = { 'go', 'gomod', 'gowork', 'gosum' } }, 5 | }, 6 | { 7 | 'neovim/nvim-lspconfig', 8 | opts = { 9 | servers = { 10 | gopls = { 11 | settings = { 12 | gopls = { 13 | gofumpt = true, 14 | codelenses = { 15 | gc_details = false, 16 | generate = true, 17 | regenerate_cgo = true, 18 | run_govulncheck = true, 19 | test = true, 20 | tidy = true, 21 | upgrade_dependency = true, 22 | vendor = true, 23 | }, 24 | hints = { 25 | assignVariableTypes = true, 26 | compositeLiteralFields = true, 27 | compositeLiteralTypes = true, 28 | constantValues = true, 29 | functionTypeParameters = true, 30 | parameterNames = true, 31 | rangeVariableTypes = true, 32 | }, 33 | analyses = { 34 | fieldalignment = true, 35 | nilness = true, 36 | unusedparams = true, 37 | unusedwrite = true, 38 | useany = true, 39 | }, 40 | usePlaceholders = true, 41 | completeUnimported = true, 42 | staticcheck = true, 43 | directoryFilters = { 44 | '-.git', 45 | '-.vscode', 46 | '-.idea', 47 | '-.vscode-test', 48 | '-node_modules', 49 | }, 50 | semanticTokens = true, 51 | }, 52 | }, 53 | }, 54 | }, 55 | setup = { 56 | gopls = function(_, opts) 57 | -- workaround for gopls not supporting semanticTokensProvider 58 | -- https://github.com/golang/go/issues/54531#issuecomment-1464982242 59 | Utils.lsp.on_attach(function(client, _) 60 | if not client.server_capabilities.semanticTokensProvider then 61 | local semantic = 62 | client.config.capabilities.textDocument.semanticTokens 63 | client.server_capabilities.semanticTokensProvider = { 64 | full = true, 65 | legend = { 66 | tokenTypes = semantic.tokenTypes, 67 | tokenModifiers = semantic.tokenModifiers, 68 | }, 69 | range = true, 70 | } 71 | end 72 | end, 'gopls') 73 | -- end workaround 74 | end, 75 | }, 76 | }, 77 | }, 78 | { 79 | 'fredrikaverpil/neotest-golang', 80 | }, 81 | } 82 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/formatting/conform.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'stevearc/conform.nvim', 4 | opts = function() 5 | local opts = { 6 | formatters_by_ft = { 7 | lua = { 'stylua' }, 8 | php = { 'pint' }, 9 | blade = { 'blade-formatter' }, 10 | javascript = { 'biome', 'prettier', 'prettierd' }, 11 | javascriptreact = { 'biome', 'prettier', 'prettierd' }, 12 | typescript = { 'biome', 'prettier', 'prettierd' }, 13 | typescriptreact = { 'biome', 'prettier', 'prettierd' }, 14 | json = { 'biome', 'prettier', 'prettierd' }, 15 | jsonc = { 'biome', 'prettier', 'prettierd' }, 16 | css = { 'biome', 'prettier', 'prettierd' }, 17 | graphql = { 'prettier', 'prettierd' }, 18 | html = { 'prettier', 'prettierd' }, 19 | less = { 'prettier', 'prettierd' }, 20 | scss = { 'prettier', 'prettierd' }, 21 | vue = { 'prettier', 'prettierd' }, 22 | yaml = { 'prettier', 'prettierd' }, 23 | }, 24 | formatters = { 25 | pint = { 26 | command = 'vendor/bin/pint', 27 | args = { '$FILENAME' }, 28 | stdin = false, 29 | }, 30 | }, 31 | } 32 | 33 | opts.format_after_save = function(bufnr) 34 | if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then 35 | return 36 | end 37 | 38 | local filetype = vim.bo[bufnr].filetype 39 | 40 | -- Check if biome.json exists in the project root 41 | local has_biome = vim.fn.filereadable(vim.fn.getcwd() .. '/biome.json') == 1 42 | or vim.fn.filereadable(vim.fn.getcwd() .. '/biome.jsonc') == 1 43 | 44 | -- Filetypes supported by both Biome and Prettier 45 | local biome_supported = { 46 | javascript = true, 47 | javascriptreact = true, 48 | typescript = true, 49 | typescriptreact = true, 50 | json = true, 51 | jsonc = true, 52 | css = true, 53 | } 54 | 55 | -- Filetypes only supported by Prettier 56 | local prettier_only = { 57 | graphql = true, 58 | handlebars = true, 59 | html = true, 60 | less = true, 61 | scss = true, 62 | vue = true, 63 | yaml = true, 64 | } 65 | 66 | -- Prioritize Biome if biome.json exists and filetype is supported 67 | if has_biome and biome_supported[filetype] then 68 | return { 69 | formatters = { 'biome' }, 70 | timeout_ms = 2000, 71 | } 72 | end 73 | 74 | -- Fallback to Prettier for supported filetypes 75 | if biome_supported[filetype] or prettier_only[filetype] then 76 | return { 77 | formatters = { 'prettier', 'prettierd' }, 78 | timeout_ms = 2000, 79 | } 80 | end 81 | 82 | return { lsp_format = 'fallback' } 83 | end 84 | 85 | return opts 86 | end, 87 | }, 88 | } 89 | -------------------------------------------------------------------------------- /.config/nvim/lua/lazy-init.lua: -------------------------------------------------------------------------------- 1 | local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim' 2 | if not (vim.uv or vim.loop).fs_stat(lazypath) then 3 | -- bootstrap lazy.nvim 4 | -- stylua: ignore 5 | vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", 6 | lazypath }) 7 | end 8 | vim.opt.rtp:prepend(vim.env.LAZY or lazypath) 9 | 10 | require('lazy').setup({ 11 | spec = { 12 | 'tpope/vim-sleuth', 13 | { import = 'plugins.coding.ai' }, 14 | { import = 'plugins.coding.autopairs' }, 15 | { import = 'plugins.coding.cmp' }, 16 | { import = 'plugins.coding.lspconfig' }, 17 | { import = 'plugins.coding.todo-comments' }, 18 | { import = 'plugins.coding.treesitter' }, 19 | { import = 'plugins.coding.trouble' }, 20 | { import = 'plugins.dap.core' }, 21 | -- { import = 'plugins.editor.fzf' }, 22 | { import = 'plugins.editor.gitsigns' }, 23 | { import = 'plugins.editor.grug-far' }, 24 | { import = 'plugins.editor.hardtime' }, 25 | { import = 'plugins.editor.lazygit' }, 26 | { import = 'plugins.editor.lualine' }, 27 | { import = 'plugins.editor.mini' }, 28 | { import = 'plugins.editor.file-tree' }, 29 | { import = 'plugins.editor.overseer' }, 30 | { import = 'plugins.editor.snacks' }, 31 | { import = 'plugins.editor.telescope' }, 32 | { import = 'plugins.editor.tmux' }, 33 | { import = 'plugins.editor.ufo' }, 34 | { import = 'plugins.editor.which-key' }, 35 | { import = 'plugins.formatting.conform' }, 36 | { import = 'plugins.languages.astro' }, 37 | { import = 'plugins.languages.docker' }, 38 | { import = 'plugins.languages.go' }, 39 | { import = 'plugins.languages.laravel' }, 40 | { import = 'plugins.languages.php' }, 41 | { import = 'plugins.languages.python' }, 42 | { import = 'plugins.languages.tailwind' }, 43 | { import = 'plugins.languages.typescript' }, 44 | { import = 'plugins.linting.core' }, 45 | { import = 'plugins.test.core' }, 46 | { import = 'plugins.ui.colorscheme' }, 47 | { import = 'plugins.ui.dressing' }, 48 | { import = 'plugins.ui.treesitter-context' }, 49 | { import = 'plugins.util.mini-hipatterns' }, 50 | }, 51 | defaults = {}, 52 | performance = { 53 | rtp = { 54 | disabled_plugins = { 55 | 'gzip', 56 | 'tarPlugin', 57 | 'zipPlugin', 58 | 'netrwPlugin', 59 | 'matchit', 60 | 'matchparen', 61 | 'shada', 62 | 'spellfile', 63 | }, 64 | }, 65 | }, 66 | }, { 67 | ui = { 68 | -- If you are using a Nerd Font: set icons to an empty table which will use the 69 | -- default lazy.nvim defined Nerd Font icons, otherwise define a unicode icons table 70 | icons = vim.g.have_nerd_font and {} or { 71 | cmd = '⌘', 72 | config = '🛠', 73 | event = '📅', 74 | ft = '📂', 75 | init = '⚙', 76 | keys = '🗝', 77 | plugin = '🔌', 78 | runtime = '💻', 79 | require = '🌙', 80 | source = '📄', 81 | start = '🚀', 82 | task = '📌', 83 | lazy = '💤 ', 84 | }, 85 | }, 86 | }) 87 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/which-key.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'folke/which-key.nvim', 4 | event = 'VimEnter', 5 | opts = { 6 | preset = 'helix', 7 | delay = 0, 8 | icons = { 9 | mappings = vim.g.have_nerd_font, 10 | keys = vim.g.have_nerd_font and {} or { 11 | Up = ' ', 12 | Down = ' ', 13 | Left = ' ', 14 | Right = ' ', 15 | C = ' ', 16 | M = ' ', 17 | D = ' ', 18 | S = ' ', 19 | CR = ' ', 20 | Esc = ' ', 21 | ScrollWheelDown = ' ', 22 | ScrollWheelUp = ' ', 23 | NL = ' ', 24 | BS = ' ', 25 | Space = ' ', 26 | Tab = ' ', 27 | F1 = '', 28 | F2 = '', 29 | F3 = '', 30 | F4 = '', 31 | F5 = '', 32 | F6 = '', 33 | F7 = '', 34 | F8 = '', 35 | F9 = '', 36 | F10 = '', 37 | F11 = '', 38 | F12 = '', 39 | }, 40 | }, 41 | 42 | -- Document existing key chains 43 | spec = { 44 | { 45 | 'a', 46 | group = 'AI', 47 | icon = { icon = '󱚦', color = 'cyan' }, 48 | }, 49 | { 50 | 'b', 51 | group = 'Buffers', 52 | icon = { icon = '', color = 'yellow' }, 53 | }, 54 | { 55 | 'c', 56 | group = 'Code', 57 | mode = { 'n', 'x' }, 58 | icon = { icon = '', color = 'green' }, 59 | }, 60 | { 61 | 'd', 62 | group = 'Debug', 63 | icon = { icon = '', color = 'red' }, 64 | }, 65 | { 66 | 'f', 67 | group = 'Find', 68 | icon = { icon = '󰈞', color = 'yellow' }, 69 | }, 70 | { 71 | 'g', 72 | group = 'Git', 73 | icon = { icon = '󰊢', color = 'orange' }, 74 | }, 75 | { 76 | 'gb', 77 | group = 'Buff/Blame', 78 | icon = { icon = '󰊢', color = 'orange' }, 79 | }, 80 | { 81 | 'gd', 82 | group = 'Diff/Deleted', 83 | icon = { icon = '󰊢', color = 'orange' }, 84 | }, 85 | { 86 | 'gh', 87 | group = 'Hunks', 88 | icon = { icon = '󰊢', color = 'orange' }, 89 | }, 90 | { 91 | 'o', 92 | group = 'Overseer', 93 | icon = { icon = '', color = 'red' }, 94 | }, 95 | { 96 | 's', 97 | group = 'Search', 98 | icon = { icon = '', color = 'yellow' }, 99 | }, 100 | { 101 | 't', 102 | group = 'Test', 103 | icon = { icon = '󰙨', color = 'purple' }, 104 | }, 105 | { 106 | 'gz', 107 | group = 'Surround', 108 | mode = { 'n', 'v' }, 109 | icon = { icon = '', color = 'red' }, 110 | }, 111 | }, 112 | }, 113 | }, 114 | } 115 | -- vim: ts=2 sts=2 sw=2 et 116 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/gitsigns.lua: -------------------------------------------------------------------------------- 1 | -- Here is a more advanced example where we pass configuration 2 | -- options to `gitsigns.nvim`. This is equivalent to the following Lua: 3 | -- require('gitsigns').setup({ ... }) 4 | -- 5 | -- See `:help gitsigns` to understand what the configuration keys do 6 | return { 7 | { -- Adds git related signs to the gutter, as well as utilities for managing changes 8 | 'lewis6991/gitsigns.nvim', 9 | opts = function(_, opts) 10 | opts.signs = { 11 | add = { text = '󰾗 ' }, 12 | change = { text = '󰯔 ' }, 13 | delete = { text = '_' }, 14 | topdelete = { text = '‾' }, 15 | changedelete = { text = '~' }, 16 | } 17 | opts.signs_staged = { 18 | add = { text = '󱔲 ' }, 19 | change = { text = '󱔲 ' }, 20 | delete = { text = '_' }, 21 | topdelete = { text = '‾' }, 22 | changedelete = { text = '~' }, 23 | } 24 | opts.on_attach = function(bufnr) 25 | local gitsigns = require 'gitsigns' 26 | 27 | local function map(mode, l, r, options) 28 | options = options or {} 29 | options.buffer = bufnr 30 | vim.keymap.set(mode, l, r, options) 31 | end 32 | 33 | -- Navigation 34 | map('n', ']c', function() 35 | if vim.wo.diff then 36 | vim.cmd.normal { ']c', bang = true } 37 | else 38 | gitsigns.nav_hunk 'next' 39 | end 40 | end, { desc = 'Jump to next git [c]hange' }) 41 | 42 | map('n', '[c', function() 43 | if vim.wo.diff then 44 | vim.cmd.normal { '[c', bang = true } 45 | else 46 | gitsigns.nav_hunk 'prev' 47 | end 48 | end, { desc = 'Jump to previous git [c]hange' }) 49 | 50 | -- Actions 51 | -- visual mode 52 | map('v', 'ghs', function() 53 | gitsigns.stage_hunk { vim.fn.line '.', vim.fn.line 'v' } 54 | end, { desc = 'Stage' }) 55 | map('v', 'ghr', function() 56 | gitsigns.reset_hunk { vim.fn.line '.', vim.fn.line 'v' } 57 | end, { desc = 'Reset' }) 58 | -- normal mode 59 | map('n', 'ghs', gitsigns.stage_hunk, { desc = 'Stage' }) 60 | map('n', 'ghr', gitsigns.reset_hunk, { desc = 'Reset' }) 61 | map('n', 'ghu', gitsigns.undo_stage_hunk, { desc = 'Undo' }) 62 | map('n', 'ghp', gitsigns.preview_hunk, { desc = 'Preview' }) 63 | map( 64 | 'n', 65 | 'gbs', 66 | gitsigns.stage_buffer, 67 | { desc = 'Buffer Stage' } 68 | ) 69 | map( 70 | 'n', 71 | 'gbr', 72 | gitsigns.reset_buffer, 73 | { desc = 'Buffer Reset' } 74 | ) 75 | map('n', 'gbl', gitsigns.blame_line, { desc = 'Blame Line' }) 76 | map('n', 'gdi', gitsigns.diffthis, { desc = 'Diff Index' }) 77 | map('n', 'gdc', function() 78 | gitsigns.diffthis '@' 79 | end, { desc = 'Diff Commit' }) 80 | -- Toggles 81 | map( 82 | 'n', 83 | 'gbl', 84 | gitsigns.toggle_current_line_blame, 85 | { desc = 'Blame Line' } 86 | ) 87 | map( 88 | 'n', 89 | 'gds', 90 | gitsigns.toggle_deleted, 91 | { desc = 'Deleted Show' } 92 | ) 93 | end 94 | end, 95 | }, 96 | } 97 | -- vim: ts=2 sts=2 sw=2 et 98 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/file-tree.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'nvim-tree/nvim-tree.lua', 4 | version = '*', 5 | lazy = false, 6 | dependencies = { 7 | 'nvim-tree/nvim-web-devicons', 8 | 'nvim-lua/plenary.nvim', 9 | 'MunifTanjim/nui.nvim', 10 | }, 11 | keys = { 12 | { 'e', 'NvimTreeToggle', desc = 'Open Explorer' }, 13 | }, 14 | opts = { 15 | reload_on_bufenter = true, 16 | hijack_cursor = true, 17 | hijack_netrw = true, 18 | sync_root_with_cwd = true, 19 | hijack_unnamed_buffer_when_opening = true, 20 | auto_reload_on_write = true, 21 | diagnostics = { 22 | enable = false, 23 | }, 24 | hijack_directories = { 25 | enable = true, 26 | auto_open = true, 27 | }, 28 | actions = { 29 | open_file = { 30 | quit_on_open = true, 31 | resize_window = true, 32 | }, 33 | }, 34 | update_focused_file = { 35 | enable = true, 36 | }, 37 | view = { 38 | centralize_selection = true, 39 | adaptive_size = false, 40 | side = 'right', 41 | preserve_window_proportions = true, 42 | width = 40, 43 | }, 44 | renderer = { 45 | full_name = false, 46 | indent_markers = { 47 | enable = false, 48 | }, 49 | root_folder_label = ':t', 50 | highlight_git = true, 51 | }, 52 | filters = { 53 | dotfiles = false, 54 | git_ignored = false, 55 | git_clean = false, 56 | no_buffer = false, 57 | }, 58 | git = { 59 | enable = true, 60 | ignore = false, 61 | timeout = 400, 62 | }, 63 | }, 64 | config = function(_, opts) 65 | local nvimtree = require 'nvim-tree' 66 | 67 | local function keybindings(bufnr) 68 | local api = require 'nvim-tree.api' 69 | 70 | local function ops(desc) 71 | return { 72 | desc = 'nvim-tree: ' .. desc, 73 | buffer = bufnr, 74 | noremap = true, 75 | silent = true, 76 | nowait = true, 77 | } 78 | end 79 | 80 | -- default mappings 81 | api.config.mappings.default_on_attach(bufnr) 82 | 83 | -- custom mappings 84 | vim.keymap.set('n', 'P', api.node.open.preview, ops 'Preview') 85 | vim.keymap.set( 86 | 'n', 87 | 's', 88 | api.node.open.vertical_no_picker, 89 | ops 'Open Horizontal' 90 | ) 91 | vim.keymap.set( 92 | 'n', 93 | 'S', 94 | api.node.open.horizontal_no_picker, 95 | ops 'Open Vertical' 96 | ) 97 | end 98 | 99 | opts.on_attach = keybindings 100 | 101 | nvimtree.setup(opts) 102 | 103 | local function open_tree_on_setup(args) 104 | vim.schedule(function() 105 | local file = args.file 106 | local buf_name = vim.api.nvim_buf_get_name(0) 107 | local is_no_name_buffer = buf_name == '' 108 | and vim.bo.filetype == '' 109 | and vim.bo.buftype == '' 110 | local is_directory = vim.fn.isdirectory(file) == 1 111 | 112 | if not is_no_name_buffer and not is_directory then 113 | return 114 | end 115 | 116 | if is_directory then 117 | vim.cmd.cd(file) 118 | end 119 | 120 | require('nvim-tree.api').tree.open() 121 | end) 122 | end 123 | 124 | vim.api.nvim_create_autocmd('BufEnter', { 125 | group = vim.api.nvim_create_augroup('nvim-tree', { clear = true }), 126 | callback = open_tree_on_setup, 127 | }) 128 | end, 129 | }, 130 | { 131 | 'antosha417/nvim-lsp-file-operations', 132 | dependencies = { 133 | 'nvim-lua/plenary.nvim', 134 | }, 135 | config = true, 136 | }, 137 | } 138 | -------------------------------------------------------------------------------- /.config/tmux/switch-catppuccin-theme.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:$PATH" 3 | 4 | echo "TMUX_SOCKET=$TMUX_SOCKET" > /tmp/tmux-debug.log 5 | tmux -S "$TMUX_SOCKET" list-sessions >> /tmp/tmux-debug.log 2>&1 || echo "No sessions found" >> /tmp/tmux-debug.log 6 | 7 | set -euo pipefail 8 | 9 | FLAVOR="$1" 10 | THEME_DIR="$HOME/.config/tmux/plugins/tmux/themes" 11 | TMUX_SOCKET=$(tmux display-message -p -F "#{socket_path}") 12 | 13 | tmux -S "$TMUX_SOCKET" set -g @catppuccin_flavor "$FLAVOR" 14 | tmux -S "$TMUX_SOCKET" source-file "$THEME_DIR/catppuccin_${FLAVOR}_tmux.conf" 15 | 16 | case "$FLAVOR" in 17 | latte) 18 | tmux -S "$TMUX_SOCKET" set -g @thm_bg "#eff1f5" 19 | tmux -S "$TMUX_SOCKET" set -g @thm_fg "#4c4f69" 20 | tmux -S "$TMUX_SOCKET" set -g @thm_rosewater "#dc8a78" 21 | tmux -S "$TMUX_SOCKET" set -g @thm_flamingo "#dd7878" 22 | tmux -S "$TMUX_SOCKET" set -g @thm_pink "#ea76cb" 23 | tmux -S "$TMUX_SOCKET" set -g @thm_mauve "#8839ef" 24 | tmux -S "$TMUX_SOCKET" set -g @thm_red "#d20f39" 25 | tmux -S "$TMUX_SOCKET" set -g @thm_maroon "#e64553" 26 | tmux -S "$TMUX_SOCKET" set -g @thm_peach "#fe640b" 27 | tmux -S "$TMUX_SOCKET" set -g @thm_yellow "#df8e1d" 28 | tmux -S "$TMUX_SOCKET" set -g @thm_green "#40a02b" 29 | tmux -S "$TMUX_SOCKET" set -g @thm_teal "#179299" 30 | tmux -S "$TMUX_SOCKET" set -g @thm_sky "#04a5e5" 31 | tmux -S "$TMUX_SOCKET" set -g @thm_sapphire "#209fb5" 32 | tmux -S "$TMUX_SOCKET" set -g @thm_blue "#1e66f5" 33 | tmux -S "$TMUX_SOCKET" set -g @thm_lavender "#7287fd" 34 | tmux -S "$TMUX_SOCKET" set -g @thm_subtext_1 "#a6adc8" 35 | tmux -S "$TMUX_SOCKET" set -g @thm_subtext_0 "#bac2de" 36 | tmux -S "$TMUX_SOCKET" set -g @thm_overlay_2 "#9399b2" 37 | tmux -S "$TMUX_SOCKET" set -g @thm_overlay_1 "#7f849c" 38 | tmux -S "$TMUX_SOCKET" set -g @thm_overlay_0 "#6c7086" 39 | tmux -S "$TMUX_SOCKET" set -g @thm_surface_2 "#585b70" 40 | tmux -S "$TMUX_SOCKET" set -g @thm_surface_1 "#45475a" 41 | tmux -S "$TMUX_SOCKET" set -g @thm_surface_0 "#313244" 42 | tmux -S "$TMUX_SOCKET" set -g @thm_mantle "#181825" 43 | tmux -S "$TMUX_SOCKET" set -g @thm_crust "#11111b" 44 | ;; 45 | mocha) 46 | tmux -S "$TMUX_SOCKET" set -g @thm_bg "#1e1e2e" 47 | tmux -S "$TMUX_SOCKET" set -g @thm_fg "#cdd6f4" 48 | tmux -S "$TMUX_SOCKET" set -g @thm_rosewater "#f5e0dc" 49 | tmux -S "$TMUX_SOCKET" set -g @thm_flamingo "#f2cdcd" 50 | tmux -S "$TMUX_SOCKET" set -g @thm_pink "#f5c2e7" 51 | tmux -S "$TMUX_SOCKET" set -g @thm_mauve "#cba6f7" 52 | tmux -S "$TMUX_SOCKET" set -g @thm_red "#f38ba8" 53 | tmux -S "$TMUX_SOCKET" set -g @thm_maroon "#eba0ac" 54 | tmux -S "$TMUX_SOCKET" set -g @thm_peach "#fab387" 55 | tmux -S "$TMUX_SOCKET" set -g @thm_yellow "#f9e2af" 56 | tmux -S "$TMUX_SOCKET" set -g @thm_green "#a6e3a1" 57 | tmux -S "$TMUX_SOCKET" set -g @thm_teal "#94e2d5" 58 | tmux -S "$TMUX_SOCKET" set -g @thm_sky "#89dceb" 59 | tmux -S "$TMUX_SOCKET" set -g @thm_sapphire "#74c7ec" 60 | tmux -S "$TMUX_SOCKET" set -g @thm_blue "#89b4fa" 61 | tmux -S "$TMUX_SOCKET" set -g @thm_lavender "#b4befe" 62 | tmux -S "$TMUX_SOCKET" set -g @thm_subtext_1 "#a6adc8" 63 | tmux -S "$TMUX_SOCKET" set -g @thm_subtext_0 "#bac2de" 64 | tmux -S "$TMUX_SOCKET" set -g @thm_overlay_2 "#9399b2" 65 | tmux -S "$TMUX_SOCKET" set -g @thm_overlay_1 "#7f849c" 66 | tmux -S "$TMUX_SOCKET" set -g @thm_overlay_0 "#6c7086" 67 | tmux -S "$TMUX_SOCKET" set -g @thm_surface_2 "#585b70" 68 | tmux -S "$TMUX_SOCKET" set -g @thm_surface_1 "#45475a" 69 | tmux -S "$TMUX_SOCKET" set -g @thm_surface_0 "#313244" 70 | tmux -S "$TMUX_SOCKET" set -g @thm_mantle "#181825" 71 | tmux -S "$TMUX_SOCKET" set -g @thm_crust "#11111b" 72 | ;; 73 | *) 74 | echo "Unknown flavor: $FLAVOR" 75 | exit 1 76 | ;; 77 | esac 78 | 79 | tmux -S "$TMUX_SOCKET" set -g status-style "bg=none,fg=#{@thm_fg}" 80 | tmux -S "$TMUX_SOCKET" set -g message-style "bg=none,fg=#{@thm_fg}" 81 | tmux -S "$TMUX_SOCKET" set -g pane-border-style "fg=#{@thm_surface_2}" 82 | tmux -S "$TMUX_SOCKET" set -g pane-active-border-style "fg=#{@thm_blue}" 83 | 84 | echo "✅ Switched to Catppuccin $FLAVOR" 85 | -------------------------------------------------------------------------------- /.config/tmux/tmux.conf: -------------------------------------------------------------------------------- 1 | set -g @plugin 'tmux-plugins/tpm' 2 | set -g @plugin 'tmux-plugins/tmux-sensible' 3 | set -g @plugin 'aserowy/tmux.nvim' 4 | set -g @plugin 'tmux-plugins/tmux-resurrect' 5 | set -g @plugin 'tmux-plugins/tmux-continuum' 6 | set -g @plugin 'catppuccin/tmux' 7 | 8 | # Setup tmux theme 9 | set -g @catppuccin_status_background "none" 10 | set -g @catppuccin_window_status_style "none" 11 | set -g @catppuccin_pane_status_enabled "off" 12 | set -g @catppuccin_pane_border_status "off" 13 | 14 | set -g status-left-length 100 15 | set -g status-left "" 16 | set -ga status-left "#{?client_prefix,#{#[fg=#{@thm_bg},bold]  #S },#{#[fg=#{@thm_green}]  #S }}" 17 | set -ga status-left "#[fg=#{@thm_overlay_0},none]│" 18 | set -ga status-left "#[fg=#{@thm_maroon}]  #{pane_current_command} " 19 | set -ga status-left "#[fg=#{@thm_overlay_0},none]│" 20 | set -ga status-left "#[fg=#{@thm_blue}]  #{=/-32/...:#{s|$USER|~|:#{b:pane_current_path}}} " 21 | set -ga status-left "#[fg=#{@thm_overlay_0},none]#{?window_zoomed_flag,│,}" 22 | set -ga status-left "#[fg=#{@thm_yellow}]#{?window_zoomed_flag,  zoom ,}" 23 | 24 | set -g status-right-length 100 25 | set -g status-right "" 26 | set -ga status-right "" 27 | set -g status-position bottom 28 | set -g status-justify "absolute-centre" 29 | 30 | set -g window-status-format " #I#{?#{!=:#{window_name},Window},: #W,} " 31 | set -g window-status-style "fg=#{@thm_rosewater}" 32 | set -g window-status-last-style "fg=#{@thm_peach}" 33 | set -g window-status-activity-style "bg=#{@thm_red},fg=#{@thm_bg}" 34 | set -g window-status-bell-style "bg=#{@thm_red},fg=#{@thm_bg},bold" 35 | set -gF window-status-separator "#[fg=#{@thm_overlay_0}]│" 36 | set -g window-status-current-format " #I#{?#{!=:#{window_name},Window},: #W,} " 37 | set -g window-status-current-style "bg=#{@thm_peach},fg=#{@thm_bg},bold" 38 | set -wg automatic-rename on 39 | set -g automatic-rename-format "Window" 40 | 41 | # Undercurl 42 | set -g default-terminal "${TERM}" 43 | set -as terminal-overrides ',*:Smulx=\E[4::%p1%dm' # undercurl support 44 | 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 45 | 46 | # Allow OSC 8 hyperlinks through to Ghostty so cmd-click works outside tmux 47 | set -g allow-passthrough on 48 | set -sa terminal-features 'xterm-ghostty:hyperlinks' 49 | 50 | # Toggle tmux status bar 51 | bind '\' set status 52 | if-shell "[[ $(tmux lsw | wc -l) -le 1 ]]" 'set -g status' 53 | 54 | set -g status on 55 | 56 | # Enable mouse 57 | set -g mouse on 58 | 59 | # Increase history limit 60 | set -g history-limit 30000 61 | 62 | # Start windows and panes at 1 and not 0 63 | set -g base-index 1 64 | set -g pane-base-index 1 65 | set-window-option -g pane-base-index 1 66 | set-option -g renumber-windows on 67 | 68 | # Zero-out escape time delay for quicker response 69 | set -s escape-time 0 70 | 71 | # keybindings 72 | bind-key r source-file ~/.config/tmux/tmux.conf \; display-message "~/.config/tmux/tmux.conf reloaded" 73 | 74 | # resizing 75 | is_vim="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'" 76 | 77 | bind -n 'M-h' if-shell "$is_vim" 'send-keys M-h' 'resize-pane -L 1' 78 | bind -n 'M-j' if-shell "$is_vim" 'send-keys M-j' 'resize-pane -D 1' 79 | bind -n 'M-k' if-shell "$is_vim" 'send-keys M-k' 'resize-pane -U 1' 80 | bind -n 'M-l' if-shell "$is_vim" 'send-keys M-l' 'resize-pane -R 1' 81 | 82 | bind-key -T copy-mode-vi M-h resize-pane -L 1 83 | bind-key -T copy-mode-vi M-j resize-pane -D 1 84 | bind-key -T copy-mode-vi M-k resize-pane -U 1 85 | bind-key -T copy-mode-vi M-l resize-pane -R 1 86 | 87 | # Open the new panes in the current path 88 | bind v split-window -v -c "#{pane_current_path}" \; run-shell "~/.config/tmux/hooks/update-pane-status.sh" 89 | bind h split-window -h -c "#{pane_current_path}" \; run-shell "~/.config/tmux/hooks/update-pane-status.sh" 90 | 91 | # Update pane status based on number of panes 92 | unbind x 93 | bind x kill-pane \; run-shell "~/.config/tmux/hooks/update-pane-status.sh" 94 | set-hook -g pane-exited 'run-shell "~/.config/tmux/hooks/update-pane-status.sh"' 95 | 96 | # If this is your first time using tmux, you will need to press (Ctrl + Space) + I to fetch the plugins. 97 | run '~/.tmux/plugins/tpm/tpm' 98 | 99 | # Load catppuccin flavor-specific theme based on @catppuccin_flavor 100 | run-shell "tmux show -gqv @catppuccin_flavor | xargs -I {} tmux source-file ~/.config/tmux/plugins/tmux/themes/catppuccin_{}_tmux.conf" 101 | # Apply base colors to status bar and pane borders 102 | set -g status-style "fg=#{@thm_fg}" 103 | set -g message-style "fg=#{@thm_fg}" 104 | set -g pane-border-style "fg=#{@thm_surface_2}" 105 | set -g pane-active-border-style "fg=#{@thm_blue}" 106 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/coding/cmp.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { -- Autocompletion 3 | 'hrsh7th/nvim-cmp', 4 | event = 'InsertEnter', 5 | dependencies = { 6 | -- Snippet Engine & its associated nvim-cmp source 7 | { 8 | 'L3MON4D3/LuaSnip', 9 | build = (function() 10 | -- Build Step is needed for regex support in snippets. 11 | -- This step is not supported in many windows environments. 12 | -- Remove the below condition to re-enable on windows. 13 | if vim.fn.has 'win32' == 1 or vim.fn.executable 'make' == 0 then 14 | return 15 | end 16 | return 'make install_jsregexp' 17 | end)(), 18 | dependencies = { 19 | -- `friendly-snippets` contains a variety of premade snippets. 20 | -- See the README about individual language/framework/plugin snippets: 21 | -- https://github.com/rafamadriz/friendly-snippets 22 | -- { 23 | -- 'rafamadriz/friendly-snippets', 24 | -- config = function() 25 | -- require('luasnip.loaders.from_vscode').lazy_load() 26 | -- end, 27 | -- }, 28 | }, 29 | }, 30 | 'saadparwaiz1/cmp_luasnip', 31 | 32 | -- Adds other completion capabilities. 33 | -- nvim-cmp does not ship with all sources by default. They are split 34 | -- into multiple repos for maintenance purposes. 35 | 'hrsh7th/cmp-nvim-lsp', 36 | 'hrsh7th/cmp-path', 37 | }, 38 | config = function() 39 | -- See `:help cmp` 40 | local cmp = require 'cmp' 41 | local luasnip = require 'luasnip' 42 | luasnip.config.setup {} 43 | 44 | cmp.setup { 45 | snippet = { 46 | expand = function(args) 47 | luasnip.lsp_expand(args.body) 48 | end, 49 | }, 50 | completion = { completeopt = 'menu,menuone,noinsert' }, 51 | 52 | -- For an understanding of why these mappings were 53 | -- chosen, you will need to read `:help ins-completion` 54 | -- 55 | -- No, but seriously. Please read `:help ins-completion`, it is really good! 56 | mapping = cmp.mapping.preset.insert { 57 | -- Select the [n]ext item 58 | [''] = cmp.mapping.select_next_item(), 59 | -- Select the [p]revious item 60 | [''] = cmp.mapping.select_prev_item(), 61 | 62 | -- Scroll the documentation window [b]ack / [f]orward 63 | [''] = cmp.mapping.scroll_docs(-4), 64 | [''] = cmp.mapping.scroll_docs(4), 65 | 66 | -- Accept ([y]es) the completion. 67 | -- This will auto-import if your LSP supports it. 68 | -- This will expand snippets if the LSP sent a snippet. 69 | [''] = cmp.mapping.confirm { select = true }, 70 | 71 | -- If you prefer more traditional completion keymaps, 72 | -- you can uncomment the following lines 73 | --[''] = cmp.mapping.confirm { select = true }, 74 | --[''] = cmp.mapping.select_next_item(), 75 | --[''] = cmp.mapping.select_prev_item(), 76 | 77 | -- Manually trigger a completion from nvim-cmp. 78 | -- Generally you don't need this, because nvim-cmp will display 79 | -- completions whenever it has completion options available. 80 | [''] = cmp.mapping.complete {}, 81 | 82 | -- Think of as moving to the right of your snippet expansion. 83 | -- So if you have a snippet that's like: 84 | -- function $name($args) 85 | -- $body 86 | -- end 87 | -- 88 | -- will move you to the right of each of the expansion locations. 89 | -- is similar, except moving you backwards. 90 | -- [''] = cmp.mapping(function() 91 | -- if luasnip.expand_or_locally_jumpable() then 92 | -- luasnip.expand_or_jump() 93 | -- end 94 | -- end, { 'i', 's' }), 95 | -- [''] = cmp.mapping(function() 96 | -- if luasnip.locally_jumpable(-1) then 97 | -- luasnip.jump(-1) 98 | -- end 99 | -- end, { 'i', 's' }), 100 | 101 | -- For more advanced Luasnip keymaps (e.g. selecting choice nodes, expansion) see: 102 | -- https://github.com/L3MON4D3/LuaSnip?tab=readme-ov-file#keymaps 103 | }, 104 | sources = { 105 | { 106 | name = 'lazydev', 107 | -- set group index to 0 to skip loading LuaLS completions as lazydev recommends it 108 | group_index = 0, 109 | }, 110 | { name = 'nvim_lsp' }, 111 | { name = 'luasnip' }, 112 | { name = 'path' }, 113 | }, 114 | } 115 | end, 116 | }, 117 | } 118 | -- vim: ts=2 sts=2 sw=2 et 119 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/languages/python.lua: -------------------------------------------------------------------------------- 1 | local lsp = 'pyright' 2 | local ruff = 'ruff' 3 | 4 | return { 5 | { 6 | 'nvim-treesitter/nvim-treesitter', 7 | opts = { ensure_installed = { 'ninja', 'rst' } }, 8 | }, 9 | { 10 | 'neovim/nvim-lspconfig', 11 | opts = { 12 | servers = { 13 | ruff = { 14 | cmd_env = { RUFF_TRACE = 'messages' }, 15 | init_options = { 16 | settings = { 17 | logLevel = 'error', 18 | }, 19 | }, 20 | keys = { 21 | { 22 | 'co', 23 | vim.lsp.buf.code_action { 24 | apply = true, 25 | context = { 26 | only = { 'source.organizeImports' }, 27 | diagnostics = {}, 28 | }, 29 | }, 30 | desc = 'Organize Imports', 31 | }, 32 | }, 33 | }, 34 | ruff_lsp = { 35 | keys = { 36 | { 37 | 'co', 38 | vim.lsp.buf.code_action { 39 | apply = true, 40 | context = { 41 | only = { 'source.organizeImports' }, 42 | diagnostics = {}, 43 | }, 44 | }, 45 | desc = 'Organize Imports', 46 | }, 47 | }, 48 | }, 49 | }, 50 | setup = { 51 | [ruff] = function() 52 | local on_attach = function(client, _) 53 | -- Disable hover in favor of Pyright 54 | client.server_capabilities.hoverProvider = false 55 | end 56 | local name = ruff 57 | vim.api.nvim_create_autocmd('LspAttach', { 58 | callback = function(args) 59 | local buffer = args.buf ---@type number 60 | local client = vim.lsp.get_client_by_id(args.data.client_id) 61 | if client and (not name or client.name == name) then 62 | return on_attach(client, buffer) 63 | end 64 | end, 65 | }) 66 | end, 67 | }, 68 | }, 69 | }, 70 | { 71 | 'neovim/nvim-lspconfig', 72 | opts = function(_, opts) 73 | local servers = 74 | { 'pyright', 'basedpyright', 'ruff', 'ruff_lsp', ruff, lsp } 75 | for _, server in ipairs(servers) do 76 | opts.servers[server] = opts.servers[server] or {} 77 | opts.servers[server].enabled = server == lsp or server == ruff 78 | end 79 | end, 80 | }, 81 | { 82 | 'nvim-neotest/neotest', 83 | optional = true, 84 | dependencies = { 85 | 'nvim-neotest/neotest-python', 86 | }, 87 | opts = { 88 | adapters = { 89 | ['neotest-python'] = { 90 | -- Here you can specify the settings for the adapter, i.e. 91 | -- runner = "pytest", 92 | -- python = ".venv/bin/python", 93 | }, 94 | }, 95 | }, 96 | }, 97 | { 98 | 'hrsh7th/nvim-cmp', 99 | optional = true, 100 | opts = function(_, opts) 101 | opts.auto_brackets = opts.auto_brackets or {} 102 | table.insert(opts.auto_brackets, 'python') 103 | end, 104 | }, 105 | { 106 | 'mfussenegger/nvim-dap', 107 | optional = true, 108 | dependencies = { 109 | 'mfussenegger/nvim-dap-python', 110 | -- stylua: ignore 111 | keys = { 112 | { "dPt", function() require('dap-python').test_method() end, desc = "Debug Method", ft = "python" }, 113 | { "dPc", function() require('dap-python').test_class() end, desc = "Debug Class", ft = "python" }, 114 | }, 115 | config = function() 116 | if vim.fn.has 'win32' == 1 then 117 | require('dap-python').setup( 118 | vim.env.MASON 119 | .. '/packages/' 120 | .. 'debugpy' 121 | .. '/venv/Scripts/pythonw.exe' 122 | ) 123 | else 124 | require('dap-python').setup( 125 | vim.env.MASON .. '/packages/' .. 'debugpy' .. '/venv/bin/python' 126 | ) 127 | end 128 | end, 129 | }, 130 | }, 131 | -- Don't mess up DAP adapters provided by nvim-dap-python 132 | { 133 | 'jay-babu/mason-nvim-dap.nvim', 134 | optional = true, 135 | opts = { 136 | handlers = { 137 | python = function() end, 138 | }, 139 | }, 140 | }, 141 | { 142 | 'linux-cultist/venv-selector.nvim', 143 | branch = 'regexp', 144 | dependencies = { 145 | 'neovim/nvim-lspconfig', 146 | 'nvim-telescope/telescope.nvim', 147 | 'mfussenegger/nvim-dap-python', 148 | }, 149 | opts = {}, 150 | keys = { 151 | -- Keymap to open VenvSelector to pick a venv. 152 | { 'vs', 'VenvSelect' }, 153 | -- Keymap to retrieve the venv from a cache (the one previously used for the same project directory). 154 | { 'vc', 'VenvSelectCached' }, 155 | }, 156 | }, 157 | } 158 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/test/core.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 'nvim-neotest/neotest-plenary' }, 3 | { 4 | 'nvim-neotest/neotest', 5 | dependencies = { 6 | 'nvim-neotest/nvim-nio', 7 | -- 'nvim-neotest/neotest-jest', 8 | 'marilari88/neotest-vitest', 9 | 'V13Axel/neotest-pest', 10 | 'fredrikaverpil/neotest-golang', 11 | }, 12 | opts = { 13 | adapters = { 14 | 'neotest-plenary', 15 | }, 16 | status = { virtual_text = true }, 17 | output = { open_on_run = true }, 18 | quickfix = { 19 | open = function() 20 | require('trouble').open { mode = 'quickfix', focus = false } 21 | end, 22 | }, 23 | }, 24 | config = function(_, opts) 25 | local neotest_ns = vim.api.nvim_create_namespace 'neotest' 26 | vim.diagnostic.config({ 27 | virtual_text = { 28 | format = function(diagnostic) 29 | local message = diagnostic.message 30 | :gsub('\n', ' ') 31 | :gsub('\t', ' ') 32 | :gsub('%s+', ' ') 33 | :gsub('^%s+', '') 34 | return message 35 | end, 36 | }, 37 | }, neotest_ns) 38 | 39 | opts.consumers = opts.consumers or {} 40 | -- Refresh and auto close trouble after running tests 41 | ---@type neotest.Consumer 42 | opts.consumers.trouble = function(client) 43 | client.listeners.results = function(adapter_id, results, partial) 44 | if partial then 45 | return 46 | end 47 | local tree = 48 | assert(client:get_position(nil, { adapter = adapter_id })) 49 | 50 | local failed = 0 51 | for pos_id, result in pairs(results) do 52 | if result.status == 'failed' and tree:get_key(pos_id) then 53 | failed = failed + 1 54 | end 55 | end 56 | vim.schedule(function() 57 | local trouble = require 'trouble' 58 | if trouble.is_open() then 59 | trouble.refresh() 60 | if failed == 0 then 61 | trouble.close() 62 | end 63 | end 64 | end) 65 | end 66 | return {} 67 | end 68 | 69 | opts.consumers.overseer = require 'neotest.consumers.overseer' 70 | 71 | if opts.adapters then 72 | local adapters = { 73 | -- require 'neotest-jest', 74 | require 'neotest-vitest', 75 | require 'neotest-pest', 76 | require 'neotest-golang', 77 | } 78 | for name, config in pairs(opts.adapters or {}) do 79 | if type(name) == 'number' then 80 | if type(config) == 'string' then 81 | config = require(config) 82 | end 83 | adapters[#adapters + 1] = config 84 | elseif config ~= false then 85 | local adapter = require(name) 86 | if type(config) == 'table' and not vim.tbl_isempty(config) then 87 | local meta = getmetatable(adapter) 88 | if adapter.setup then 89 | adapter.setup(config) 90 | elseif adapter.adapter then 91 | adapter.adapter(config) 92 | adapter = adapter.adapter 93 | elseif meta and meta.__call then 94 | adapter = adapter(config) 95 | else 96 | error('Adapter ' .. name .. ' does not support setup') 97 | end 98 | end 99 | adapters[#adapters + 1] = adapter 100 | end 101 | end 102 | opts.adapters = adapters 103 | end 104 | 105 | require('neotest').setup(opts) 106 | end, 107 | -- stylua: ignore 108 | keys = { 109 | { "tt", function() require("neotest").run.run(vim.fn.expand("%")) end, desc = "Run File (Neotest)" }, 110 | { "tT", function() require("neotest").run.run(vim.uv.cwd()) end, desc = "Run All Test Files (Neotest)" }, 111 | { "tr", function() require("neotest").run.run() end, desc = "Run Nearest (Neotest)" }, 112 | { "tl", function() require("neotest").run.run_last() end, desc = "Run Last (Neotest)" }, 113 | { "ts", function() require("neotest").summary.toggle() end, desc = "Toggle Summary (Neotest)" }, 114 | { "to", function() require("neotest").output.open({ enter = true, auto_close = true }) end, desc = "Show Output (Neotest)" }, 115 | { "tO", function() require("neotest").output_panel.toggle() end, desc = "Toggle Output Panel (Neotest)" }, 116 | { "tS", function() require("neotest").run.stop() end, desc = "Stop (Neotest)" }, 117 | { "tw", function() require("neotest").watch.toggle(vim.fn.expand("%")) end, desc = "Toggle Watch (Neotest)" }, 118 | }, 119 | }, 120 | { 121 | 'mfussenegger/nvim-dap', 122 | optional = true, 123 | -- stylua: ignore 124 | keys = { 125 | { "td", function() require("neotest").run.run({strategy = "dap"}) end, desc = "Debug Nearest (Neotest)" }, 126 | }, 127 | }, 128 | } 129 | -------------------------------------------------------------------------------- /.config/yazi/flavors/tokyo-night.yazi/flavor.toml: -------------------------------------------------------------------------------- 1 | # vim:fileencoding=utf-8:foldmethod=marker 2 | 3 | # : Manager {{{ 4 | 5 | [manager] 6 | cwd = { fg = "#7aa2f7" } # Blue 7 | 8 | # Hovered 9 | hovered = { reversed = true } 10 | preview_hovered = { underline = true } 11 | 12 | # Find 13 | find_keyword = { fg = "#f7768e", bold = true, italic = true, underline = true } # Red 14 | find_position = { fg = "#bb9af7", bg = "reset", bold = true, italic = true } # Magenta 15 | 16 | # Marker 17 | marker_copied = { fg = "#9ece6a", bg = "#9ece6a" } # Green 18 | marker_cut = { fg = "#e0af68", bg = "#f7768e" } # Red 19 | marker_marked = { fg = "#7aa2f7", bg = "#7dcfff" } # Cyan 20 | marker_selected = { fg = "#e0af68", bg = "#e0af68" } # Yellow 21 | 22 | # Tab 23 | tab_active = { bg = "#282C34", fg = "#7aa2f7" } # Darkened background, Blue text 24 | tab_inactive = {} 25 | tab_width = 1 26 | 27 | # Count 28 | count_copied = { fg = "#414868", bg = "#9ece6a" } # Darkened black on Green 29 | count_cut = { fg = "#414868", bg = "#e0af68" } # Darkened black on Yellow 30 | count_selected = { fg = "#414868", bg = "#7aa2f7" } # Darkened black on Blue 31 | 32 | # Border 33 | border_symbol = "│" 34 | border_style = { fg = "#414868" } # Darkened black 35 | 36 | # : }}} 37 | 38 | 39 | # : Mode {{{ 40 | 41 | [mode] 42 | 43 | normal_main = { fg = "#414868", bg = "#7aa2f7", bold = true } # Darkened black on Blue 44 | normal_alt = { fg = "#7aa2f7", bg = "#414868" } # Blue on Darkened black 45 | 46 | # Select mode 47 | select_main = { fg = "#414868", bg = "#9ece6a", bold = true } # Darkened black on Green 48 | select_alt = { fg = "#7aa2f7", bg = "#414868" } # Blue on Darkened black 49 | 50 | # Unset mode 51 | unset_main = { fg = "#414868", bg = "#bb9af7", bold = true } # Darkened black on Magenta 52 | unset_alt = { fg = "#7aa2f7", bg = "#414868" } # Blue on Darkened black 53 | 54 | # : }}} 55 | 56 | 57 | # : Status bar {{{ 58 | 59 | [status] 60 | sep_left = { open = "", close = "" } 61 | sep_right = { open = "", close = "" } 62 | separator_style = { fg = "#414868", bg = "#414868" } # Blue on Darkened black 63 | 64 | 65 | # Progress 66 | progress_label = { fg = "#a9b1d6", bold = true } # White 67 | progress_normal = { fg = "#7aa2f7", bg = "#414868" } # Blue on Darkened black 68 | progress_error = { fg = "#f7768e", bg = "#414868" } # Red on Darkened black 69 | 70 | # Permissions 71 | perm_sep = { fg = "#7aa2f7" } # Blue 72 | perm_type = { fg = "#9ece6a" } # Green 73 | perm_read = { fg = "#e0af68" } # Yellow 74 | perm_write = { fg = "#f7768e" } # Red 75 | perm_exec = { fg = "#bb9af7" } # Magenta 76 | 77 | 78 | # : }}} 79 | 80 | # : Pick {{{ 81 | 82 | [pick] 83 | border = { fg = "#7aa2f7" } # Blue 84 | active = { fg = "#bb9af7", bold = true } # Magenta 85 | inactive = {} 86 | 87 | # : }}} 88 | 89 | 90 | # : Input {{{ 91 | 92 | [input] 93 | border = { fg = "#7aa2f7" } # Blue 94 | title = {} 95 | value = {} 96 | selected = { reversed = true } 97 | 98 | # : }}} 99 | 100 | 101 | # : Completion {{{ 102 | 103 | [cmp] 104 | border = { fg = "#7aa2f7" } # Blue 105 | 106 | # : }}} 107 | 108 | 109 | # : Tasks {{{ 110 | 111 | [tasks] 112 | border = { fg = "#7aa2f7" } # Blue 113 | title = {} 114 | hovered = { fg = "#bb9af7", underline = true } # Magenta 115 | 116 | # : }}} 117 | 118 | 119 | # : Which {{{ 120 | 121 | [which] 122 | mask = { bg = "#414868" } # Darkened black 123 | cand = { fg = "#9ece6a" } # Green 124 | rest = { fg = "#a9b1d6" } # White 125 | desc = { fg = "#bb9af7" } # Magenta 126 | separator = "  " 127 | separator_style = { fg = "#626880" } # Darkened gray 128 | 129 | # : }}} 130 | 131 | 132 | # : Help {{{ 133 | 134 | [help] 135 | on = { fg = "#9ece6a" } # Green 136 | run = { fg = "#bb9af7" } # Magenta 137 | hovered = { reversed = true, bold = true } 138 | footer = { fg = "#a9b1d6", bg = "#c6d0f5" } # White on Light gray 139 | 140 | # : }}} 141 | 142 | 143 | # : Notify {{{ 144 | 145 | [notify] 146 | title_info = { fg = "#9ece6a" } # Green 147 | title_warn = { fg = "#f7768e" } # Red 148 | title_error = { fg = "#e0af68" } # Yellow 149 | 150 | # : }}} 151 | 152 | 153 | # : File-specific styles {{{ 154 | 155 | [filetype] 156 | 157 | rules = [ 158 | # Images 159 | { mime = "image/*", fg = "#e0af68" }, # Yellow 160 | 161 | # Media 162 | { mime = "video/*", fg = "#f7768e" }, # Red 163 | { mime = "audio/*", fg = "#f7768e" }, # Red 164 | 165 | # Archives 166 | { mime = "application/zip", fg = "#bb9af7" }, # Magenta 167 | { mime = "application/x-tar", fg = "#bb9af7" }, # Magenta 168 | { mime = "application/x-bzip*", fg = "#bb9af7" }, # Magenta 169 | { mime = "application/x-bzip2", fg = "#bb9af7" }, # Magenta 170 | { mime = "application/x-7z-compressed", fg = "#bb9af7" }, # Magenta 171 | { mime = "application/x-rar", fg = "#bb9af7" }, # Magenta 172 | { mime = "application/x-xz", fg = "#bb9af7" }, # Magenta 173 | 174 | # Documents 175 | { mime = "application/doc", fg = "#9ece6a" }, # Green 176 | { mime = "application/pdf", fg = "#9ece6a" }, # Green 177 | { mime = "application/rtf", fg = "#9ece6a" }, # Green 178 | { mime = "application/vnd.*", fg = "#9ece6a" }, # Green 179 | 180 | # Fallback 181 | { name = "*", fg = "#c6d0f5" }, # Light gray 182 | { name = "*/", fg = "#7aa2f7" } # Blue 183 | ] 184 | 185 | # : }}} 186 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/fzf.lua: -------------------------------------------------------------------------------- 1 | local kind_filter = { 2 | default = { 3 | 'Class', 4 | 'Constructor', 5 | 'Enum', 6 | 'Field', 7 | 'Function', 8 | 'Interface', 9 | 'Method', 10 | 'Module', 11 | 'Namespace', 12 | 'Package', 13 | 'Property', 14 | 'Struct', 15 | 'Trait', 16 | }, 17 | markdown = false, 18 | help = false, 19 | lua = { 20 | 'Class', 21 | 'Constructor', 22 | 'Enum', 23 | 'Field', 24 | 'Function', 25 | 'Interface', 26 | 'Method', 27 | 'Module', 28 | 'Namespace', 29 | -- "Package", -- remove package since luals uses it for control flow structures 30 | 'Property', 31 | 'Struct', 32 | 'Trait', 33 | }, 34 | } 35 | 36 | local get_kind_filter = function(buf) 37 | buf = (buf == nil or buf == 0) and vim.api.nvim_get_current_buf() or buf 38 | local ft = vim.bo[buf].filetype 39 | 40 | if kind_filter[ft] == false then 41 | return 42 | end 43 | 44 | if type(kind_filter[ft]) == 'table' then 45 | return kind_filter[ft] 46 | end 47 | 48 | ---@diagnostic disable-next-line: return-type-mismatch 49 | return type(kind_filter) == 'table' 50 | and type(kind_filter.default) == 'table' 51 | and kind_filter.default 52 | or nil 53 | end 54 | 55 | local symbols_filter = function(entry, ctx) 56 | if ctx.symbols_filter == nil then 57 | ctx.symbols_filter = get_kind_filter(ctx.bufnr) or false 58 | end 59 | if ctx.symbols_filter == false then 60 | return true 61 | end 62 | return vim.tbl_contains(ctx.symbols_filter, entry.kind) 63 | end 64 | 65 | return { 66 | { 67 | 'ibhagwan/fzf-lua', 68 | dependencies = { 'echasnovski/mini.icons' }, 69 | opts = { 70 | files = { 71 | fd_opts = '--color=never --type f --hidden --follow', 72 | }, 73 | grep = { 74 | rg_opts = '--column --line-number --hidden', 75 | }, 76 | }, 77 | keys = { 78 | { '', '', ft = 'fzf', mode = 't', nowait = true }, 79 | { '', '', ft = 'fzf', mode = 't', nowait = true }, 80 | { 81 | ',', 82 | 'FzfLua buffers sort_mru=true sort_lastused=true', 83 | desc = 'Switch Buffer', 84 | }, 85 | 86 | -- find 87 | { 88 | 'fb', 89 | 'FzfLua buffers sort_mru=true sort_lastused=true', 90 | desc = 'Buffers', 91 | }, 92 | { 'ff', 'FzfLua files', desc = 'Files' }, 93 | { '', 'FzfLua files', desc = 'Find Files' }, 94 | { 'fg', 'FzfLua git_files', desc = 'Git-files' }, 95 | 96 | -- search 97 | { 's"', 'FzfLua registers', desc = 'Registers' }, 98 | { 'sa', 'FzfLua autocmds', desc = 'Auto Commands' }, 99 | { 'sb', 'FzfLua grep_curbuf', desc = 'Buffer' }, 100 | { 101 | 'sc', 102 | 'FzfLua command_history', 103 | desc = 'Command History', 104 | }, 105 | { 'sC', 'FzfLua commands', desc = 'Commands' }, 106 | { 107 | 'sd', 108 | 'FzfLua diagnostics_document', 109 | desc = 'Document Diagnostics', 110 | }, 111 | { 112 | 'sD', 113 | 'FzfLua diagnostics_workspace', 114 | desc = 'Workspace Diagnostics', 115 | }, 116 | { 'sg', 'FzfLua live_grep_native', desc = 'Grep' }, 117 | { 'sh', 'FzfLua help_tags', desc = 'Help Pages' }, 118 | { 'sH', 'FzfLua highlights', desc = 'Highlight Groups' }, 119 | { 'sj', 'FzfLua jumps', desc = 'Jumplist' }, 120 | { 'sk', 'FzfLua keymaps', desc = 'Key Maps' }, 121 | { 'sl', 'FzfLua loclist', desc = 'Location List' }, 122 | { 'sM', 'FzfLua man_pages', desc = 'Man Pages' }, 123 | { 'sm', 'FzfLua marks', desc = 'Jump to Mark' }, 124 | { 'sR', 'FzfLua resume', desc = 'Resume' }, 125 | { 'sq', 'FzfLua quickfix', desc = 'Quickfix List' }, 126 | { 127 | 'ss', 128 | function() 129 | require('fzf-lua').lsp_document_symbols { 130 | regex_filter = symbols_filter, 131 | } 132 | end, 133 | desc = 'Symbol (Document)', 134 | }, 135 | { 136 | 'sS', 137 | function() 138 | require('fzf-lua').lsp_live_workspace_symbols { 139 | regex_filter = symbols_filter, 140 | } 141 | end, 142 | desc = 'Symbol (Workspace)', 143 | }, 144 | }, 145 | }, 146 | { 147 | 'neovim/nvim-lspconfig', 148 | opts = function() 149 | vim.keymap.set('n', 'gd', function() 150 | require('fzf-lua').lsp_definitions { 151 | jump_to_single_result = true, 152 | ignore_current_line = true, 153 | } 154 | end, { desc = 'Goto Definition' }) 155 | 156 | vim.keymap.set('n', 'gr', function() 157 | require('fzf-lua').lsp_references { 158 | jump_to_single_result = true, 159 | ignore_current_line = true, 160 | } 161 | end, { desc = 'References', nowait = true }) 162 | 163 | vim.keymap.set('n', 'gI', function() 164 | require('fzf-lua').lsp_implementations { 165 | jump_to_single_result = true, 166 | ignore_current_line = true, 167 | } 168 | end, { desc = 'Goto Implementation' }) 169 | 170 | vim.keymap.set('n', 'gy', function() 171 | require('fzf-lua').lsp_typedefs { 172 | jump_to_single_result = true, 173 | ignore_current_line = true, 174 | } 175 | end, { desc = 'Goto Type Definitions' }) 176 | end, 177 | }, 178 | } 179 | -------------------------------------------------------------------------------- /.config/nvim/lazy-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "LuaSnip": { "branch": "master", "commit": "3732756842a2f7e0e76a7b0487e9692072857277" }, 3 | "avante.nvim": { "branch": "main", "commit": "92f972a413b76ad1969bfdbd4719c63306deca4b" }, 4 | "cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" }, 5 | "cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" }, 6 | "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" }, 7 | "conform.nvim": { "branch": "master", "commit": "9b8fa5e0b78168f68bee9bf886dc20f287c61e02" }, 8 | "copilot.lua": { "branch": "master", "commit": "508d8b00390ff3046323f61187a57069910c6e17" }, 9 | "dressing.nvim": { "branch": "master", "commit": "2d7c2db2507fa3c4956142ee607431ddb2828639" }, 10 | "fzf-lua": { "branch": "main", "commit": "1d103911c268bea2c6bbe0933a9c67a4bfb46e76" }, 11 | "gitsigns.nvim": { "branch": "main", "commit": "5813e4878748805f1518cee7abb50fd7205a3a48" }, 12 | "grug-far.nvim": { "branch": "main", "commit": "b58b2d65863f4ebad88b10a1ddd519e5380466e0" }, 13 | "hardtime.nvim": { "branch": "main", "commit": "b4e431934af1fe224a3a801f632c008278cb7628" }, 14 | "img-clip.nvim": { "branch": "main", "commit": "93fcf50924108262caec66b900077987dfcb7c7f" }, 15 | "laravel.nvim": { "branch": "main", "commit": "f9fbfe5763a72a1b74cbc8c8503cd7921f216f1d" }, 16 | "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, 17 | "lazydev.nvim": { "branch": "main", "commit": "5231c62aa83c2f8dc8e7ba957aa77098cda1257d" }, 18 | "lazygit.nvim": { "branch": "main", "commit": "2305deed25bc61b866d5d39189e9105a45cf1cfb" }, 19 | "lualine.nvim": { "branch": "master", "commit": "47f91c416daef12db467145e16bed5bbfe00add8" }, 20 | "mason-lspconfig.nvim": { "branch": "main", "commit": "c55bd8a8fb191e24176c206a7af1dd51ce7276a5" }, 21 | "mason-nvim-dap.nvim": { "branch": "main", "commit": "9a10e096703966335bd5c46c8c875d5b0690dade" }, 22 | "mason-tool-installer.nvim": { "branch": "main", "commit": "517ef5994ef9d6b738322664d5fdd948f0fdeb46" }, 23 | "mason.nvim": { "branch": "main", "commit": "57e5a8addb8c71fb063ee4acda466c7cf6ad2800" }, 24 | "mini.hipatterns": { "branch": "main", "commit": "add8d8abad602787377ec5d81f6b248605828e0f" }, 25 | "mini.icons": { "branch": "main", "commit": "ff2e4f1d29f659cc2bad0f9256f2f6195c6b2428" }, 26 | "mini.nvim": { "branch": "main", "commit": "6bd3a01aaf7d248aea1b78aacdd5d44bffa002c1" }, 27 | "mini.pick": { "branch": "main", "commit": "6b7974543b17cf2e294993fc3d8545a342258232" }, 28 | "neotest": { "branch": "master", "commit": "deadfb1af5ce458742671ad3a013acb9a6b41178" }, 29 | "neotest-golang": { "branch": "main", "commit": "37e400cfe9d193e508b1a512e96cbef83b08deb6" }, 30 | "neotest-pest": { "branch": "main", "commit": "1429445746f28a4ce887289ea6e442430629e306" }, 31 | "neotest-plenary": { "branch": "master", "commit": "3523adcf9ffaad1911960c5813b0136c1b63a2ec" }, 32 | "neotest-python": { "branch": "master", "commit": "b0d3a861bd85689d8ed73f0590c47963a7eb1bf9" }, 33 | "neotest-vitest": { "branch": "main", "commit": "8bc784d319889a39c7ed8045ff7b0f12770c7b54" }, 34 | "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" }, 35 | "nvim": { "branch": "main", "commit": "ce8d176faa4643e026e597ae3c31db59b63cef09" }, 36 | "nvim-autopairs": { "branch": "master", "commit": "d9e44e54384e5b0f3536339c65484f2e41b528e3" }, 37 | "nvim-cmp": { "branch": "main", "commit": "d97d85e01339f01b842e6ec1502f639b080cb0fc" }, 38 | "nvim-dap": { "branch": "master", "commit": "5860c7c501eb428d3137ee22c522828d20cca0b3" }, 39 | "nvim-dap-python": { "branch": "master", "commit": "64652d1ae1db80870d9aac7132d76e37acd86a26" }, 40 | "nvim-dap-ui": { "branch": "master", "commit": "cf91d5e2d07c72903d052f5207511bf7ecdb7122" }, 41 | "nvim-dap-virtual-text": { "branch": "master", "commit": "fbdb48c2ed45f4a8293d0d483f7730d24467ccb6" }, 42 | "nvim-lint": { "branch": "master", "commit": "ae64d6466ed92b68353122d920e314ff2c8dd0a8" }, 43 | "nvim-lsp-file-operations": { "branch": "master", "commit": "9744b738183a5adca0f916527922078a965515ed" }, 44 | "nvim-lspconfig": { "branch": "master", "commit": "b3a31fd3b6702de9c71c27212ffacf0f54cc3b46" }, 45 | "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, 46 | "nvim-tree.lua": { "branch": "master", "commit": "321bc61580fd066b76861c32de3319c3a6d089e7" }, 47 | "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, 48 | "nvim-treesitter-context": { "branch": "master", "commit": "64dd4cf3f6fd0ab17622c5ce15c91fc539c3f24a" }, 49 | "nvim-ufo": { "branch": "main", "commit": "72d54c31079d38d8dfc5456131b1d0fb5c0264b0" }, 50 | "nvim-web-devicons": { "branch": "master", "commit": "8dcb311b0c92d460fac00eac706abd43d94d68af" }, 51 | "overseer.nvim": { "branch": "master", "commit": "afbac6c612b12772591640d801fad65423af02b9" }, 52 | "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, 53 | "promise-async": { "branch": "main", "commit": "119e8961014c9bfaf1487bf3c2a393d254f337e2" }, 54 | "render-markdown.nvim": { "branch": "main", "commit": "26097a4eb95b391d0308c1b77cce89b28bbc9916" }, 55 | "snacks.nvim": { "branch": "main", "commit": "fe7cfe9800a182274d0f868a74b7263b8c0c020b" }, 56 | "statuscol.nvim": { "branch": "main", "commit": "c46172d0911aa5d49ba5f39f4351d1bb7aa289cc" }, 57 | "telescope-fzf-native.nvim": { "branch": "main", "commit": "6fea601bd2b694c6f2ae08a6c6fab14930c60e2c" }, 58 | "telescope.nvim": { "branch": "master", "commit": "d90956833d7c27e73c621a61f20b29fdb7122709" }, 59 | "tmux.nvim": { "branch": "main", "commit": "2c1c3be0ef287073cef963f2aefa31a15c8b9cd8" }, 60 | "todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" }, 61 | "trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" }, 62 | "venv-selector.nvim": { "branch": "regexp", "commit": "d2326e7433fdeb10f7d0d1237c18b91b353f9f8b" }, 63 | "vim-dotenv": { "branch": "master", "commit": "5c51cfcf8d87280d6414e03cd6b253eb70ecb800" }, 64 | "vim-sleuth": { "branch": "master", "commit": "be69bff86754b1aa5adcbb527d7fcd1635a84080" }, 65 | "vim-tmux-navigator": { "branch": "master", "commit": "c45243dc1f32ac6bcf6068e5300f3b2b237e576a" }, 66 | "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } 67 | } 68 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/dap/core.lua: -------------------------------------------------------------------------------- 1 | ---@param config {type?:string, args?:string[]|fun():string[]?} 2 | local function get_args(config) 3 | local args = type(config.args) == 'function' and (config.args() or {}) 4 | or config.args 5 | or {} --[[@as string[] | string ]] 6 | local args_str = type(args) == 'table' and table.concat(args, ' ') or args --[[@as string]] 7 | 8 | config = vim.deepcopy(config) 9 | ---@cast args string[] 10 | config.args = function() 11 | local new_args = vim.fn.expand(vim.fn.input('Run with args: ', args_str)) --[[@as string]] 12 | if config.type and config.type == 'java' then 13 | ---@diagnostic disable-next-line: return-type-mismatch 14 | return new_args 15 | end 16 | return require('dap.utils').splitstr(new_args) 17 | end 18 | return config 19 | end 20 | 21 | return { 22 | { 23 | 'mfussenegger/nvim-dap', 24 | recommended = true, 25 | desc = 'Debugging support. Requires language specific adapters to be configured. (see lang extras)', 26 | 27 | dependencies = { 28 | 'rcarriga/nvim-dap-ui', 29 | -- virtual text for the debugger 30 | { 31 | 'theHamsta/nvim-dap-virtual-text', 32 | opts = { 33 | virt_text_win_col = 80, 34 | }, 35 | }, 36 | }, 37 | 38 | -- stylua: ignore 39 | keys = { 40 | { "da", function() require("dap").continue({ before = get_args }) end, desc = "Run with Args" }, 41 | { "db", function() require("dap").toggle_breakpoint() end, desc = "Toggle Breakpoint" }, 42 | { "dB", function() require("dap").set_breakpoint(vim.fn.input('Breakpoint condition: ')) end, desc = "Breakpoint Condition" }, 43 | { "dC", function() require("dap").run_to_cursor() end, desc = "Run to Cursor" }, 44 | { "dc", function() require("dap").continue() end, desc = "Run/Continue" }, 45 | { "de", function() require("dapui").eval() end, desc = "Evaluate" }, 46 | { "dg", function() require("dap").goto_() end, desc = "Go to Line (No Execute)" }, 47 | { "di", function() require("dap").step_into() end, desc = "Step Into" }, 48 | { "dj", function() require("dap").down() end, desc = "Down" }, 49 | { "dk", function() require("dap").up() end, desc = "Up" }, 50 | { "dl", function() require("dap").run_last() end, desc = "Run Last" }, 51 | { "do", function() require("dap").step_over() end, desc = "Step Over" }, 52 | { "dO", function() require("dap").step_out() end, desc = "Step Out" }, 53 | { "dP", function() require("dap").pause() end, desc = "Pause" }, 54 | { "dr", function() require("dap").repl.toggle() end, desc = "Toggle REPL" }, 55 | { "ds", function() require("dap").session() end, desc = "Session" }, 56 | { "dt", function() require("dap").terminate() end, desc = "Terminate" }, 57 | { "du", function() require("dapui").toggle() end, desc = "Toggle DAPUI" }, 58 | { "dw", function() require("dap.ui.widgets").hover() end, desc = "Widgets" }, 59 | }, 60 | 61 | config = function() 62 | -- load mason-nvim-dap here, after all adapters have been setup 63 | local mason_nvim_dap = 64 | require('lazy.core.config').spec.plugins['mason-nvim-dap.nvim'] 65 | local Plugin = require 'lazy.core.plugin' 66 | local mason_nvim_dap_opts = Plugin.values(mason_nvim_dap, 'opts', false) 67 | require('mason-nvim-dap').setup(mason_nvim_dap_opts) 68 | 69 | vim.api.nvim_set_hl( 70 | 0, 71 | 'DapStoppedLine', 72 | { default = true, link = 'Visual' } 73 | ) 74 | 75 | local dap_icons = { 76 | Stopped = { '󰁕 ', 'DiagnosticWarn', 'DapStoppedLine' }, 77 | Breakpoint = ' ', 78 | BreakpointCondition = ' ', 79 | BreakpointRejected = { ' ', 'DiagnosticError' }, 80 | LogPoint = '.>', 81 | } 82 | for name, sign in pairs(dap_icons) do 83 | sign = type(sign) == 'table' and sign or { sign } 84 | vim.fn.sign_define('Dap' .. name, { 85 | text = sign[1], 86 | texthl = sign[2] or 'DiagnosticInfo', 87 | linehl = sign[3], 88 | numhl = sign[3], 89 | }) 90 | end 91 | 92 | -- setup dap config by VsCode launch.json file 93 | local vscode = require 'dap.ext.vscode' 94 | local json = require 'plenary.json' 95 | vscode.json_decode = function(str) 96 | return vim.json.decode(json.json_strip_comments(str)) 97 | end 98 | 99 | require('overseer').enable_dap() 100 | end, 101 | }, 102 | 103 | -- fancy UI for the debugger 104 | { 105 | 'rcarriga/nvim-dap-ui', 106 | dependencies = { 'nvim-neotest/nvim-nio' }, 107 | -- stylua: ignore 108 | keys = { 109 | { "du", function() require("dapui").toggle({ }) end, desc = "Dap UI" }, 110 | { "de", function() require("dapui").eval() end, desc = "Eval", mode = {"n", "v"} }, 111 | }, 112 | opts = { 113 | controls = { 114 | enabled = false, 115 | }, 116 | }, 117 | config = function(_, opts) 118 | local dap = require 'dap' 119 | local dapui = require 'dapui' 120 | dapui.setup(opts) 121 | dap.listeners.after.event_initialized['dapui_config'] = function() 122 | dapui.open {} 123 | end 124 | dap.listeners.before.event_terminated['dapui_config'] = function() 125 | dapui.close {} 126 | end 127 | dap.listeners.before.event_exited['dapui_config'] = function() 128 | dapui.close {} 129 | end 130 | end, 131 | }, 132 | 133 | -- mason.nvim integration 134 | { 135 | 'jay-babu/mason-nvim-dap.nvim', 136 | dependencies = 'mason.nvim', 137 | cmd = { 'DapInstall', 'DapUninstall' }, 138 | opts = { 139 | -- Makes a best effort to setup the various debuggers with 140 | -- reasonable debug configurations 141 | automatic_installation = true, 142 | 143 | -- You can provide additional configuration to the handlers, 144 | -- see mason-nvim-dap README for more information 145 | handlers = {}, 146 | 147 | -- You'll need to check that you have the required things installed 148 | -- online, please don't ask me how to install them :) 149 | ensure_installed = { 150 | -- Update this to ensure that you have the debuggers for the langs you want 151 | }, 152 | }, 153 | -- mason-nvim-dap is loaded when nvim-dap loads 154 | config = function() end, 155 | }, 156 | } 157 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/lualine.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | 'nvim-lualine/lualine.nvim', 4 | dependencies = { 'nvim-tree/nvim-web-devicons', 'catppuccin/nvim' }, 5 | config = function() 6 | -- Eviline config for lualine 7 | -- Author: shadmansaleh 8 | -- Credit: glepnir 9 | local lualine = require 'lualine' 10 | 11 | require('plugins.editor.lualine-theme').apply_highlights() 12 | 13 | local conditions = { 14 | buffer_not_empty = function() 15 | return vim.fn.empty(vim.fn.expand '%:t') ~= 1 16 | end, 17 | hide_in_width = function() 18 | return vim.fn.winwidth(0) > 80 19 | end, 20 | check_git_workspace = function() 21 | local filepath = vim.fn.expand '%:p:h' 22 | local gitdir = vim.fn.finddir('.git', filepath .. ';') 23 | return gitdir and #gitdir > 0 and #gitdir < #filepath 24 | end, 25 | } 26 | 27 | -- Config 28 | local config = { 29 | options = { 30 | -- Disable sections and component separators 31 | component_separators = '', 32 | section_separators = '', 33 | theme = { 34 | -- We are going to use lualine_c an lualine_x as left and 35 | -- right section. Both are highlighted by c theme . So we 36 | -- are just setting default looks o statusline 37 | normal = { c = 'LualineNormalC' }, 38 | inactive = { c = 'LualineInactiveC' }, 39 | }, 40 | }, 41 | sections = { 42 | -- these are to remove the defaults 43 | lualine_a = {}, 44 | lualine_b = {}, 45 | lualine_y = {}, 46 | lualine_z = {}, 47 | -- These will be filled later 48 | lualine_c = {}, 49 | lualine_x = {}, 50 | }, 51 | inactive_sections = { 52 | -- these are to remove the defaults 53 | lualine_a = {}, 54 | lualine_b = {}, 55 | lualine_y = {}, 56 | lualine_z = {}, 57 | lualine_c = {}, 58 | lualine_x = {}, 59 | }, 60 | } 61 | 62 | -- Inserts a component in lualine_c at left section 63 | local function ins_left(component) 64 | table.insert(config.sections.lualine_c, component) 65 | end 66 | 67 | -- Inserts a component in lualine_x at right section 68 | local function ins_right(component) 69 | table.insert(config.sections.lualine_x, component) 70 | end 71 | 72 | ins_left { 73 | -- mode component 74 | function() 75 | return '' 76 | end, 77 | color = function() 78 | local dynamic_colors = 79 | require('plugins.editor.lualine-theme').build_theme() 80 | -- auto change color according to neovims mode 81 | local mode_color = { 82 | n = dynamic_colors.red, 83 | i = dynamic_colors.green, 84 | v = dynamic_colors.blue, 85 | [''] = dynamic_colors.blue, 86 | V = dynamic_colors.blue, 87 | c = dynamic_colors.magenta, 88 | no = dynamic_colors.red, 89 | s = dynamic_colors.orange, 90 | S = dynamic_colors.orange, 91 | [''] = dynamic_colors.orange, 92 | ic = dynamic_colors.yellow, 93 | R = dynamic_colors.violet, 94 | Rv = dynamic_colors.violet, 95 | cv = dynamic_colors.red, 96 | ce = dynamic_colors.red, 97 | r = dynamic_colors.cyan, 98 | rm = dynamic_colors.cyan, 99 | ['r?'] = dynamic_colors.cyan, 100 | ['!'] = dynamic_colors.red, 101 | t = dynamic_colors.red, 102 | } 103 | return { bg = dynamic_colors.bg, fg = mode_color[vim.fn.mode()] } 104 | end, 105 | padding = { right = 1 }, 106 | } 107 | 108 | ins_left { 109 | 'filename', 110 | cond = conditions.buffer_not_empty, 111 | color = 'LualineFilename', 112 | } 113 | 114 | ins_left { 115 | 'diagnostics', 116 | sources = { 'nvim_diagnostic' }, 117 | symbols = { error = ' ', warn = ' ', info = ' ' }, 118 | diagnostics_color = { 119 | error = 'LualineDiagnosticsError', 120 | warn = 'LualineDiagnosticsWarn', 121 | info = 'LualineDiagnosticsInfo', 122 | }, 123 | } 124 | 125 | -- Insert mid section. You can make any number of sections in neovim :) 126 | -- for lualine it's any number greater then 2 127 | ins_left { 128 | function() 129 | return '%=' 130 | end, 131 | } 132 | 133 | ins_right { 134 | function() 135 | local ok, laravel_version = pcall(function() 136 | return Laravel.app('status'):get 'laravel' 137 | end) 138 | if ok then 139 | return laravel_version 140 | end 141 | end, 142 | icon = { '', color = { fg = '#F55247' } }, 143 | cond = function() 144 | local ok, has_laravel_versions = pcall(function() 145 | return Laravel.app('status'):has 'laravel' 146 | end) 147 | return ok and has_laravel_versions 148 | end, 149 | } 150 | 151 | ins_right { 152 | function() 153 | local msg = '' 154 | local buf_ft = vim.api.nvim_get_option_value('filetype', { buf = 0 }) 155 | local clients = vim.lsp.get_clients() 156 | if next(clients) == nil then 157 | return msg 158 | end 159 | for _, client in ipairs(clients) do 160 | local filetypes = client.config.filetypes 161 | if filetypes and vim.fn.index(filetypes, buf_ft) ~= -1 then 162 | return client.name 163 | end 164 | end 165 | return msg 166 | end, 167 | icon = '󰧑', 168 | color = 'LualineLsp', 169 | } 170 | 171 | -- Add components to right sections 172 | ins_right { 173 | 'branch', 174 | icon = '', 175 | color = 'LualineBranch', 176 | } 177 | 178 | ins_right { 179 | 'diff', 180 | symbols = { added = ' ', modified = ' ', removed = ' ' }, 181 | diff_color = { 182 | added = 'LualineDiffAdded', 183 | modified = 'LualineDiffModified', 184 | removed = 'LualineDiffRemoved', 185 | }, 186 | cond = conditions.hide_in_width, 187 | } 188 | 189 | ins_right { 190 | function() 191 | return os.date '%H:%M' 192 | end, 193 | icon = '', 194 | color = 'LualineDiagnosticsWarn', 195 | } 196 | 197 | lualine.setup(config) 198 | end, 199 | }, 200 | } 201 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/editor/telescope.lua: -------------------------------------------------------------------------------- 1 | local kind_filter = { 2 | default = { 3 | 'Class', 4 | 'Constructor', 5 | 'Enum', 6 | 'Field', 7 | 'Function', 8 | 'Interface', 9 | 'Method', 10 | 'Module', 11 | 'Namespace', 12 | 'Package', 13 | 'Property', 14 | 'Struct', 15 | 'Trait', 16 | }, 17 | markdown = false, 18 | help = false, 19 | lua = { 20 | 'Class', 21 | 'Constructor', 22 | 'Enum', 23 | 'Field', 24 | 'Function', 25 | 'Interface', 26 | 'Method', 27 | 'Module', 28 | 'Namespace', 29 | -- "Package", -- remove package since luals uses it for control flow structures 30 | 'Property', 31 | 'Struct', 32 | 'Trait', 33 | }, 34 | } 35 | 36 | local get_kind_filter = function(buf) 37 | buf = (buf == nil or buf == 0) and vim.api.nvim_get_current_buf() or buf 38 | local ft = vim.bo[buf].filetype 39 | 40 | if kind_filter[ft] == false then 41 | return 42 | end 43 | 44 | if type(kind_filter[ft]) == 'table' then 45 | return kind_filter[ft] 46 | end 47 | 48 | ---@diagnostic disable-next-line: return-type-mismatch 49 | return type(kind_filter) == 'table' 50 | and type(kind_filter.default) == 'table' 51 | and kind_filter.default 52 | or nil 53 | end 54 | 55 | return { 56 | { 57 | 'nvim-telescope/telescope.nvim', 58 | tag = '0.1.5', 59 | dependencies = { 60 | 'nvim-lua/plenary.nvim', 61 | 'echasnovski/mini.icons', 62 | { 63 | 'nvim-telescope/telescope-fzf-native.nvim', 64 | build = 'make', 65 | }, 66 | }, 67 | config = function() 68 | local telescope = require 'telescope' 69 | local actions = require 'telescope.actions' 70 | 71 | telescope.setup { 72 | defaults = { 73 | mappings = { 74 | i = { 75 | [''] = actions.move_selection_next, 76 | [''] = actions.move_selection_previous, 77 | }, 78 | }, 79 | file_ignore_patterns = { 'node_modules', '.git/' }, 80 | vimgrep_arguments = { 81 | 'rg', 82 | '--color=never', 83 | '--no-heading', 84 | '--with-filename', 85 | '--line-number', 86 | '--column', 87 | '--smart-case', 88 | '--hidden', 89 | }, 90 | }, 91 | pickers = { 92 | find_files = { 93 | hidden = true, 94 | follow = true, 95 | }, 96 | buffers = { 97 | sort_mru = true, 98 | sort_lastused = true, 99 | }, 100 | }, 101 | } 102 | 103 | -- Load fzf native extension for better performance 104 | telescope.load_extension 'fzf' 105 | end, 106 | keys = { 107 | -- Buffer switching 108 | { 109 | ',', 110 | 'Telescope buffers sort_mru=true sort_lastused=true', 111 | desc = 'Switch Buffer', 112 | }, 113 | 114 | -- Find 115 | { 116 | 'fb', 117 | 'Telescope buffers sort_mru=true sort_lastused=true', 118 | desc = 'Buffers', 119 | }, 120 | { 'ff', 'Telescope find_files', desc = 'Files' }, 121 | { 122 | '', 123 | 'Telescope find_files', 124 | desc = 'Find Files', 125 | }, 126 | { 'fg', 'Telescope git_files', desc = 'Git-files' }, 127 | 128 | -- Search 129 | { 's"', 'Telescope registers', desc = 'Registers' }, 130 | { 131 | 'sa', 132 | 'Telescope autocommands', 133 | desc = 'Auto Commands', 134 | }, 135 | { 136 | 'sb', 137 | 'Telescope current_buffer_fuzzy_find', 138 | desc = 'Buffer', 139 | }, 140 | { 141 | 'sc', 142 | 'Telescope command_history', 143 | desc = 'Command History', 144 | }, 145 | { 'sC', 'Telescope commands', desc = 'Commands' }, 146 | { 147 | 'sd', 148 | 'Telescope diagnostics bufnr=0', 149 | desc = 'Document Diagnostics', 150 | }, 151 | { 152 | 'sD', 153 | 'Telescope diagnostics', 154 | desc = 'Workspace Diagnostics', 155 | }, 156 | { 'sg', 'Telescope live_grep', desc = 'Grep' }, 157 | { 'sh', 'Telescope help_tags', desc = 'Help Pages' }, 158 | { 159 | 'sH', 160 | 'Telescope highlights', 161 | desc = 'Highlight Groups', 162 | }, 163 | { 'sj', 'Telescope jumplist', desc = 'Jumplist' }, 164 | { 'sk', 'Telescope keymaps', desc = 'Key Maps' }, 165 | { 'sl', 'Telescope loclist', desc = 'Location List' }, 166 | { 'sM', 'Telescope man_pages', desc = 'Man Pages' }, 167 | { 'sm', 'Telescope marks', desc = 'Jump to Mark' }, 168 | { 'sR', 'Telescope resume', desc = 'Resume' }, 169 | { 'sq', 'Telescope quickfix', desc = 'Quickfix List' }, 170 | { 171 | 'ss', 172 | function() 173 | local filters = get_kind_filter() 174 | if filters then 175 | require('telescope.builtin').lsp_document_symbols { 176 | symbols = filters, 177 | } 178 | else 179 | require('telescope.builtin').lsp_document_symbols() 180 | end 181 | end, 182 | desc = 'Symbol (Document)', 183 | }, 184 | { 185 | 'sS', 186 | function() 187 | local filters = get_kind_filter() 188 | if filters then 189 | require('telescope.builtin').lsp_workspace_symbols { 190 | symbols = filters, 191 | } 192 | else 193 | require('telescope.builtin').lsp_workspace_symbols() 194 | end 195 | end, 196 | desc = 'Symbol (Workspace)', 197 | }, 198 | }, 199 | }, 200 | { 201 | 'neovim/nvim-lspconfig', 202 | opts = function() 203 | vim.keymap.set('n', 'gd', function() 204 | require('telescope.builtin').lsp_definitions { 205 | reuse_win = true, 206 | } 207 | end, { desc = 'Goto Definition' }) 208 | 209 | vim.keymap.set('n', 'gr', function() 210 | require('telescope.builtin').lsp_references { 211 | include_current_line = false, 212 | } 213 | end, { desc = 'References', nowait = true }) 214 | 215 | vim.keymap.set('n', 'gI', function() 216 | require('telescope.builtin').lsp_implementations { 217 | reuse_win = true, 218 | } 219 | end, { desc = 'Goto Implementation' }) 220 | 221 | vim.keymap.set('n', 'gy', function() 222 | require('telescope.builtin').lsp_type_definitions { 223 | reuse_win = true, 224 | } 225 | end, { desc = 'Goto Type Definitions' }) 226 | end, 227 | }, 228 | } 229 | -------------------------------------------------------------------------------- /Library/Application Support/Cursor/User/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.fontFamily": "Monaspace Neon Var, Input Mono, SF Mono, monospace", 3 | "editor.fontLigatures": "'calt', 'cv02', 'cv10', 'cv11', 'cv31', 'ss01', 'ss02', 'ss03', 'ss04', 'ss05', 'ss06', 'ss07', 'ss08', 'ss09', 'ss10', 'dlig'", 4 | "editor.cursorSmoothCaretAnimation": "on", 5 | "editor.tabSize": 2, 6 | "editor.quickSuggestions": { 7 | "comments": "on", 8 | "strings": "on", 9 | "other": "on" 10 | }, 11 | "editor.suggestOnTriggerCharacters": true, 12 | "editor.fontSize": 16, 13 | "editor.lineHeight": 24, 14 | "editor.fontWeight": "normal", 15 | "editor.formatOnPaste": true, 16 | "editor.formatOnSave": true, 17 | "editor.tabCompletion": "on", 18 | "editor.tokenColorCustomizations": { 19 | "textMateRules": [ 20 | { 21 | "scope": [ 22 | //following will be in italic 23 | "comment", 24 | "entity.name.type.class", //class names 25 | "keyword", //import, export, return… 26 | "constant", //String, Number, Boolean…, this, super 27 | "storage.modifier", //static keyword 28 | "storage.type.class.js" //class keyword 29 | ], 30 | "settings": { 31 | "fontStyle": "italic" 32 | } 33 | }, 34 | { 35 | "scope": [ 36 | //following will be excluded from italics (VSCode has some defaults for italics) 37 | "invalid", 38 | "keyword.operator", 39 | "constant.numeric.css", 40 | "keyword.other.unit.px.css", 41 | "constant.numeric.decimal.js", 42 | "constant.numeric.json" 43 | ], 44 | "settings": { 45 | "fontStyle": "" 46 | } 47 | } 48 | ] 49 | }, 50 | "prettier.singleQuote": true, 51 | "prettier.semi": true, 52 | "prettier.trailingComma": "es5", 53 | "prettier.arrowParens": "always", 54 | "javascript.validate.enable": false, 55 | "editor.linkedEditing": true, 56 | "editor.links": true, 57 | "editor.minimap.renderCharacters": false, 58 | "explorer.openEditors.visible": 1, 59 | "editor.wordBasedSuggestions": "off", 60 | "editor.quickSuggestionsDelay": 1000000, 61 | "editor.parameterHints.enabled": true, 62 | "files.trimTrailingWhitespace": true, 63 | "editor.cursorWidth": 5, 64 | "git.confirmSync": false, 65 | "git.enableSmartCommit": true, 66 | "terminal.integrated.fontFamily": "Monaspace Neon Var, DankMono Nerd Font, Input Mono, SF Mono, monospace", 67 | "terminal.integrated.fontLigatures.enabled": true, 68 | "terminal.integrated.fontLigatures.featureSettings": "'calt', 'cv02', 'cv10', 'cv11', 'cv31', 'ss01', 'ss02', 'ss03', 'ss04', 'ss05', 'ss06', 'ss07', 'ss08', 'ss09', 'ss10', 'dlig'", 69 | "terminal.integrated.lineHeight": 1, 70 | "terminal.integrated.env.osx": { 71 | "PYTHONPATH": "${workspaceFolder}" 72 | }, 73 | "explorer.confirmDelete": false, 74 | "editor.matchBrackets": "always", 75 | "workbench.editor.highlightModifiedTabs": true, 76 | "workbench.hover.delay": null, 77 | "typescript.updateImportsOnFileMove.enabled": "always", 78 | "git.autofetch": true, 79 | "[json]": { 80 | "editor.defaultFormatter": "vscode.json-language-features" 81 | }, 82 | "[javascript]": { 83 | "editor.defaultFormatter": "esbenp.prettier-vscode" 84 | }, 85 | "editor.suggestSelection": "first", 86 | "[html]": { 87 | "editor.defaultFormatter": "vscode.html-language-features" 88 | }, 89 | "[jsonc]": { 90 | "editor.defaultFormatter": "esbenp.prettier-vscode" 91 | }, 92 | "[typescriptreact]": { 93 | "editor.defaultFormatter": "esbenp.prettier-vscode" 94 | }, 95 | "[typescript]": { 96 | "editor.defaultFormatter": "esbenp.prettier-vscode" 97 | }, 98 | "javascript.updateImportsOnFileMove.enabled": "always", 99 | "editor.defaultFormatter": "esbenp.prettier-vscode", 100 | "diffEditor.ignoreTrimWhitespace": false, 101 | "css.validate": false, 102 | "editor.largeFileOptimizations": false, 103 | "editor.letterSpacing": 0.3, 104 | "editor.renderWhitespace": "none", 105 | "extensions.ignoreRecommendations": true, 106 | "emmet.excludeLanguages": ["markdown"], 107 | "emmet.showExpandedAbbreviation": "never", 108 | "markdown.extension.list.indentationSize": "inherit", 109 | "prettier.jsxSingleQuote": true, 110 | "security.workspace.trust.untrustedFiles": "open", 111 | "terminal.integrated.showExitAlert": false, 112 | "editor.inlineSuggest.enabled": true, 113 | "editor.cursorBlinking": "solid", 114 | "editor.cursorStyle": "line-thin", 115 | "terminal.integrated.cursorStyle": "line", 116 | "editor.rulers": [], 117 | "markdown.extension.toc.levels": "2..6", 118 | "workbench.sideBar.location": "right", 119 | "screencastMode.fontSize": 32, 120 | "screencastMode.mouseIndicatorSize": 40, 121 | "screencastMode.verticalOffset": 10, 122 | "screencastMode.mouseIndicatorColor": "#805AD5", 123 | "zenMode.centerLayout": false, 124 | "zenMode.fullScreen": false, 125 | "zenMode.hideLineNumbers": false, 126 | "window.autoDetectHighContrast": false, 127 | "search.defaultViewMode": "tree", 128 | "editor.guides.bracketPairs": "active", 129 | "git.openRepositoryInParentFolders": "never", 130 | "[python]": { 131 | "editor.formatOnType": true 132 | }, 133 | "[css]": { 134 | "editor.defaultFormatter": "esbenp.prettier-vscode" 135 | }, 136 | "vim.leader": "", 137 | "[astro]": { 138 | "editor.defaultFormatter": "astro-build.astro-vscode" 139 | }, 140 | "editor.lineNumbers": "relative", 141 | "editor.accessibilitySupport": "off", 142 | "window.zoomLevel": 0, 143 | "explorer.confirmDragAndDrop": false, 144 | "workbench.editor.empty.hint": "hidden", 145 | "git.ignoreRebaseWarning": true, 146 | "accessibility.signals.terminalBell": { 147 | "sound": "on" 148 | }, 149 | "terminal.integrated.enableVisualBell": true, 150 | "editor.minimap.enabled": false, 151 | "terminal.integrated.fontSize": 14, 152 | "extensions.experimental.affinity": { 153 | "vscodevim.vim": 1 154 | }, 155 | "cursor.cpp.disabledLanguages": ["yaml", "plaintext", "markdown"], 156 | "workbench.activityBar.orientation": "vertical", 157 | "cursor.chat.alwaysSearchWeb": true, 158 | "editor.stickyScroll.enabled": false, 159 | "vim.cursorStylePerMode.insert": "line-thin", 160 | "vim.cursorStylePerMode.normal": "block", 161 | "vim.cursorStylePerMode.replace": "block-outline", 162 | "vim.easymotion": true, 163 | "vim.targets.enable": true, 164 | "vim.foldfix": true, 165 | "vim.handleKeys": { 166 | "": true, 167 | "": false, 168 | "": false 169 | }, 170 | "vsicons.dontShowNewVersionMessage": true, 171 | "window.newWindowProfile": "Default", 172 | "cursor.aipreview.enabled": true, 173 | "[xml]": { 174 | "editor.defaultFormatter": "redhat.vscode-xml" 175 | }, 176 | "workbench.editor.editorActionsLocation": "hidden", 177 | "workbench.navigationControl.enabled": false, 178 | "workbench.layoutControl.enabled": false, 179 | "[go]": { 180 | "editor.defaultFormatter": "golang.go" 181 | }, 182 | "intelephense.files.associations": ["*.php", "*.phtml"], 183 | "files.associations": { 184 | "*.module": "php" 185 | }, 186 | "[php]": { 187 | "editor.defaultFormatter": "bmewburn.vscode-intelephense-client" 188 | }, 189 | "workbench.iconTheme": "bearded-icons", 190 | "workbench.colorTheme": "One Dark Pro Night Flat", 191 | "window.autoDetectColorScheme": true, 192 | "workbench.preferredDarkColorTheme": "One Dark Pro Night Flat", 193 | "laravel-pint.enable": true, 194 | "workbench.preferredLightColorTheme": "One Dark Pro Night Flat" 195 | } 196 | -------------------------------------------------------------------------------- /Library/Application Support/Cursor/User/keybindings.json: -------------------------------------------------------------------------------- 1 | [ 2 | // Navigation 3 | { 4 | "key": "ctrl-h", 5 | "command": "workbench.action.navigateLeft" 6 | }, 7 | { 8 | "key": "ctrl-l", 9 | "command": "workbench.action.navigateRight" 10 | }, 11 | { 12 | "key": "ctrl-k", 13 | "command": "workbench.action.navigateUp" 14 | }, 15 | { 16 | "key": "ctrl-j", 17 | "command": "workbench.action.navigateDown" 18 | }, 19 | { 20 | "key": "space ,", 21 | "command": "workbench.action.showAllEditors", 22 | "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" 23 | }, 24 | { 25 | "key": "space e", 26 | "command": "runCommands", 27 | "args": { 28 | "commands": [ 29 | "workbench.action.toggleSidebarVisibility", 30 | "workbench.files.action.focusFilesExplorer" 31 | ] 32 | }, 33 | "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus) && !sideBarFocus" 34 | }, 35 | { 36 | "key": "space e", 37 | "command": "runCommands", 38 | "args": { 39 | "commands": [ 40 | "workbench.action.toggleSidebarVisibility", 41 | "workbench.action.focusActiveEditorGroup" 42 | ] 43 | }, 44 | "when": "sideBarFocus && !inputFocus" 45 | }, 46 | { 47 | "key": "space e", 48 | "when": "vim.mode == 'Normal' && editorTextFocus && foldersViewVisible", 49 | "command": "workbench.action.toggleSidebarVisibility" 50 | }, 51 | { 52 | "key": "s h", 53 | "command": "workbench.action.splitEditor", 54 | "when": "vim.mode == 'Normal' && editorTextFocus" 55 | }, 56 | { 57 | "key": "s v", 58 | "command": "workbench.action.splitEditorDown", 59 | "when": "vim.mode == 'Normal' && editorTextFocus" 60 | }, 61 | 62 | // Coding 63 | { 64 | "key": "space c a", 65 | "command": "editor.action.codeAction", 66 | "when": "vim.mode == 'Normal' && editorTextFocus" 67 | }, 68 | { 69 | "key": "shift-k", 70 | "command": "editor.action.moveLinesUpAction", 71 | "when": "vim.mode == 'VisualLine' && editorTextFocus" 72 | }, 73 | { 74 | "key": "shift-j", 75 | "command": "editor.action.moveLinesDownAction", 76 | "when": "vim.mode == 'VisualLine' && editorTextFocus" 77 | }, 78 | { 79 | "key": "shift-k", 80 | "command": "editor.action.showHover", 81 | "when": "vim.mode == 'Normal' && editorTextFocus" 82 | }, 83 | { 84 | "key": "space c r", 85 | "command": "editor.action.rename", 86 | "when": "vim.mode == 'Normal' && editorTextFocus" 87 | }, 88 | { 89 | "key": "space c s", 90 | "command": "workbench.action.gotoSymbol", 91 | "when": "vim.mode == 'Normal' && editorTextFocus" 92 | }, 93 | { 94 | "key": "space b d", 95 | "command": "workbench.action.closeActiveEditor", 96 | "when": "(vim.mode == 'Normal' && editorTextFocus) || !inputFocus" 97 | }, 98 | { 99 | "key": "space b o", 100 | "command": "workbench.action.closeOtherEditors", 101 | "when": "(vim.mode == 'Normal' && editorTextFocus) || !inputFocus" 102 | }, 103 | { 104 | "key": "space space", 105 | "command": "workbench.action.quickOpen", 106 | "when": "(vim.mode == 'Normal' && editorTextFocus) || !inputFocus" 107 | }, 108 | { 109 | "key": "space g d", 110 | "command": "editor.action.revealDefinition", 111 | "when": "vim.mode == 'Normal' && editorTextFocus" 112 | }, 113 | { 114 | "key": "space g r", 115 | "command": "editor.action.goToReferences", 116 | "when": "vim.mode == 'Normal' && editorTextFocus" 117 | }, 118 | { 119 | "key": "space g i", 120 | "command": "editor.action.goToImplementation", 121 | "when": "vim.mode == 'Normal' && editorTextFocus" 122 | }, 123 | { 124 | "key": "space s g", 125 | "command": "workbench.action.findInFiles", 126 | "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" 127 | }, 128 | { 129 | "key": "space g g", 130 | "command": "runCommands", 131 | "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)", 132 | "args": { 133 | "commands": ["workbench.view.scm", "workbench.scm.focus"] 134 | } 135 | }, 136 | { 137 | "key": "ctrl-n", 138 | "command": "editor.action.addSelectionToNextFindMatch", 139 | "when": "(vim.mode == 'Normal' || vim.mode == 'Visual') && (editorTextFocus || !inputFocus)" 140 | }, 141 | 142 | // File Explorer 143 | { 144 | "key": "r", 145 | "command": "renameFile", 146 | "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus" 147 | }, 148 | { 149 | "key": "c", 150 | "command": "filesExplorer.copy", 151 | "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus" 152 | }, 153 | { 154 | "key": "p", 155 | "command": "filesExplorer.paste", 156 | "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus" 157 | }, 158 | { 159 | "key": "x", 160 | "command": "filesExplorer.cut", 161 | "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus" 162 | }, 163 | { 164 | "key": "d", 165 | "command": "deleteFile", 166 | "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus" 167 | }, 168 | { 169 | "key": "a", 170 | "command": "explorer.newFile", 171 | "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus" 172 | }, 173 | { 174 | "key": "s", 175 | "command": "explorer.openToSide", 176 | "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus" 177 | }, 178 | { 179 | "key": "shift-s", 180 | "command": "runCommands", 181 | "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus", 182 | "args": { 183 | "commands": [ 184 | "workbench.action.splitEditorDown", 185 | "explorer.openAndPassFocus", 186 | "workbench.action.closeOtherEditors" 187 | ] 188 | } 189 | }, 190 | { 191 | "key": "enter", 192 | "command": "explorer.openAndPassFocus", 193 | "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceIsFolder && !inputFocus" 194 | }, 195 | { 196 | "key": "enter", 197 | "command": "list.toggleExpand", 198 | "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && explorerResourceIsFolder && !inputFocus" 199 | }, 200 | 201 | // Debug 202 | { 203 | "key": "space d a", 204 | "command": "workbench.action.debug.selectandstart", 205 | "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus) && debuggersAvailable" 206 | }, 207 | { 208 | "key": "space d t", 209 | "command": "workbench.action.debug.stop", 210 | "when": "vim.mode == 'Normal' && editorTextFocus && inDebugMode && !focusedSessionIsAttached" 211 | }, 212 | { 213 | "key": "space d o", 214 | "command": "workbench.action.debug.stepOver", 215 | "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus) && inDebugMode && debugState == 'stopped'" 216 | }, 217 | { 218 | "key": "space d i", 219 | "command": "workbench.action.debug.stepInto", 220 | "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus) && inDebugMode && debugState == 'stopped'" 221 | }, 222 | { 223 | "key": "space d b", 224 | "command": "editor.debug.action.toggleBreakpoint", 225 | "when": "vim.mode == 'Normal' && editorTextFocus" 226 | }, 227 | { 228 | "key": "space d e", 229 | "command": "editor.debug.action.showDebugHover", 230 | "when": "vim.mode == 'Normal' && editorTextFocus && inDebugMode && debugState == 'stopped'" 231 | }, 232 | { 233 | "key": "space d c", 234 | "command": "workbench.action.debug.continue", 235 | "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus) && inDebugMode && debugState == 'stopped'" 236 | } 237 | ] 238 | -------------------------------------------------------------------------------- /.config/btop/btop.conf: -------------------------------------------------------------------------------- 1 | #? Config file for btop v. 1.4.0 2 | 3 | #* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes. 4 | #* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes" 5 | color_theme = "/opt/homebrew/Cellar/btop/1.3.2/share/btop/themes/tokyo-night.theme" 6 | 7 | #* If the theme set background should be shown, set to False if you want terminal background transparency. 8 | theme_background = False 9 | 10 | #* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false. 11 | truecolor = True 12 | 13 | #* Set to true to force tty mode regardless if a real tty has been detected or not. 14 | #* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols. 15 | force_tty = False 16 | 17 | #* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets. 18 | #* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box. 19 | #* Use whitespace " " as separator between different presets. 20 | #* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty" 21 | presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty" 22 | 23 | #* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists. 24 | #* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift. 25 | vim_keys = True 26 | 27 | #* Rounded corners on boxes, is ignored if TTY mode is ON. 28 | rounded_corners = True 29 | 30 | #* Default symbols to use for graph creation, "braille", "block" or "tty". 31 | #* "braille" offers the highest resolution but might not be included in all fonts. 32 | #* "block" has half the resolution of braille but uses more common characters. 33 | #* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY. 34 | #* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view. 35 | graph_symbol = "braille" 36 | 37 | # Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". 38 | graph_symbol_cpu = "default" 39 | 40 | # Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". 41 | graph_symbol_mem = "default" 42 | 43 | # Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". 44 | graph_symbol_net = "default" 45 | 46 | # Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". 47 | graph_symbol_proc = "default" 48 | 49 | #* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace. 50 | shown_boxes = "cpu mem net proc" 51 | 52 | #* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs. 53 | update_ms = 2000 54 | 55 | #* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct", 56 | #* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly. 57 | proc_sorting = "memory" 58 | 59 | #* Reverse sorting order, True or False. 60 | proc_reversed = False 61 | 62 | #* Show processes as a tree. 63 | proc_tree = True 64 | 65 | #* Use the cpu graph colors in the process list. 66 | proc_colors = True 67 | 68 | #* Use a darkening gradient in the process list. 69 | proc_gradient = True 70 | 71 | #* If process cpu usage should be of the core it's running on or usage of the total available cpu power. 72 | proc_per_core = False 73 | 74 | #* Show process memory as bytes instead of percent. 75 | proc_mem_bytes = True 76 | 77 | #* Show cpu graph for each process. 78 | proc_cpu_graphs = True 79 | 80 | #* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate) 81 | proc_info_smaps = False 82 | 83 | #* Show proc box on left side of screen instead of right. 84 | proc_left = False 85 | 86 | #* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop). 87 | proc_filter_kernel = False 88 | 89 | #* In tree-view, always accumulate child process resources in the parent process. 90 | proc_aggregate = False 91 | 92 | #* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available. 93 | #* Select from a list of detected attributes from the options menu. 94 | cpu_graph_upper = "Auto" 95 | 96 | #* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available. 97 | #* Select from a list of detected attributes from the options menu. 98 | cpu_graph_lower = "Auto" 99 | 100 | #* Toggles if the lower CPU graph should be inverted. 101 | cpu_invert_lower = True 102 | 103 | #* Set to True to completely disable the lower CPU graph. 104 | cpu_single_graph = False 105 | 106 | #* Show cpu box at bottom of screen instead of top. 107 | cpu_bottom = False 108 | 109 | #* Shows the system uptime in the CPU box. 110 | show_uptime = True 111 | 112 | #* Show cpu temperature. 113 | check_temp = True 114 | 115 | #* Which sensor to use for cpu temperature, use options menu to select from list of available sensors. 116 | cpu_sensor = "Auto" 117 | 118 | #* Show temperatures for cpu cores also if check_temp is True and sensors has been found. 119 | show_coretemp = True 120 | 121 | #* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core. 122 | #* Use lm-sensors or similar to see which cores are reporting temperatures on your machine. 123 | #* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries. 124 | #* Example: "4:0 5:1 6:3" 125 | cpu_core_map = "" 126 | 127 | #* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine". 128 | temp_scale = "celsius" 129 | 130 | #* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024. 131 | base_10_sizes = False 132 | 133 | #* Show CPU frequency. 134 | show_cpu_freq = True 135 | 136 | #* Draw a clock at top of screen, formatting according to strftime, empty string to disable. 137 | #* Special formatting: /host = hostname | /user = username | /uptime = system uptime 138 | clock_format = "%X" 139 | 140 | #* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort. 141 | background_update = True 142 | 143 | #* Custom cpu model name, empty string to disable. 144 | custom_cpu_name = "" 145 | 146 | #* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ". 147 | #* Begin line with "exclude=" to change to exclude filter, otherwise defaults to "most include" filter. Example: disks_filter="exclude=/boot /home/user". 148 | disks_filter = "" 149 | 150 | #* Show graphs instead of meters for memory values. 151 | mem_graphs = True 152 | 153 | #* Show mem box below net box instead of above. 154 | mem_below_net = False 155 | 156 | #* Count ZFS ARC in cached and available memory. 157 | zfs_arc_cached = True 158 | 159 | #* If swap memory should be shown in memory box. 160 | show_swap = True 161 | 162 | #* Show swap as a disk, ignores show_swap value above, inserts itself after first disk. 163 | swap_disk = True 164 | 165 | #* If mem box should be split to also show disks info. 166 | show_disks = True 167 | 168 | #* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar. 169 | only_physical = True 170 | 171 | #* Read disks list from /etc/fstab. This also disables only_physical. 172 | use_fstab = True 173 | 174 | #* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool) 175 | zfs_hide_datasets = False 176 | 177 | #* Set to true to show available disk space for privileged users. 178 | disk_free_priv = False 179 | 180 | #* Toggles if io activity % (disk busy time) should be shown in regular disk usage view. 181 | show_io_stat = True 182 | 183 | #* Toggles io mode for disks, showing big graphs for disk read/write speeds. 184 | io_mode = False 185 | 186 | #* Set to True to show combined read/write io graphs in io mode. 187 | io_graph_combined = False 188 | 189 | #* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ". 190 | #* Example: "/mnt/media:100 /:20 /boot:1". 191 | io_graph_speeds = "" 192 | 193 | #* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False. 194 | net_download = 100 195 | 196 | net_upload = 100 197 | 198 | #* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest. 199 | net_auto = True 200 | 201 | #* Sync the auto scaling for download and upload to whichever currently has the highest scale. 202 | net_sync = True 203 | 204 | #* Starts with the Network Interface specified here. 205 | net_iface = "" 206 | 207 | #* Show battery stats in top right if battery is present. 208 | show_battery = True 209 | 210 | #* Which battery to use if multiple are present. "Auto" for auto detection. 211 | selected_battery = "Auto" 212 | 213 | #* Show power stats of battery next to charge indicator. 214 | show_battery_watts = True 215 | 216 | #* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG". 217 | #* The level set includes all lower levels, i.e. "DEBUG" will show all logging info. 218 | log_level = "WARNING" 219 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/util/mini-hipatterns.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | ---@type table 4 | M.hl = {} 5 | 6 | M.plugin = { 7 | "echasnovski/mini.hipatterns", 8 | recommended = true, 9 | desc = "Highlight colors in your code. Also includes Tailwind CSS support.", 10 | event = { "BufReadPost", "BufWritePost", "BufNewFile" }, 11 | opts = function() 12 | local hi = require("mini.hipatterns") 13 | return { 14 | -- custom LazyVim option to enable the tailwind integration 15 | tailwind = { 16 | enabled = true, 17 | ft = { 18 | "astro", 19 | "css", 20 | "heex", 21 | "html", 22 | "html-eex", 23 | "javascript", 24 | "javascriptreact", 25 | "rust", 26 | "svelte", 27 | "typescript", 28 | "typescriptreact", 29 | "vue", 30 | }, 31 | -- full: the whole css class will be highlighted 32 | -- compact: only the color will be highlighted 33 | style = "full", 34 | }, 35 | highlighters = { 36 | hex_color = hi.gen_highlighter.hex_color({ priority = 2000 }), 37 | shorthand = { 38 | pattern = "()#%x%x%x()%f[^%x%w]", 39 | group = function(_, _, data) 40 | ---@type string 41 | local match = data.full_match 42 | local r, g, b = match:sub(2, 2), match:sub(3, 3), match:sub(4, 4) 43 | local hex_color = "#" .. r .. r .. g .. g .. b .. b 44 | 45 | return MiniHipatterns.compute_hex_color_group(hex_color, "bg") 46 | end, 47 | extmark_opts = { priority = 2000 }, 48 | }, 49 | }, 50 | } 51 | end, 52 | config = function(_, opts) 53 | if type(opts.tailwind) == "table" and opts.tailwind.enabled then 54 | -- reset hl groups when colorscheme changes 55 | vim.api.nvim_create_autocmd("ColorScheme", { 56 | callback = function() 57 | M.hl = {} 58 | end, 59 | }) 60 | opts.highlighters.tailwind = { 61 | pattern = function() 62 | if not vim.tbl_contains(opts.tailwind.ft, vim.bo.filetype) then 63 | return 64 | end 65 | if opts.tailwind.style == "full" then 66 | return "%f[%w:-]()[%w:-]+%-[a-z%-]+%-%d+()%f[^%w:-]" 67 | elseif opts.tailwind.style == "compact" then 68 | return "%f[%w:-][%w:-]+%-()[a-z%-]+%-%d+()%f[^%w:-]" 69 | end 70 | end, 71 | group = function(_, _, m) 72 | ---@type string 73 | local match = m.full_match 74 | ---@type string, number 75 | local color, shade = match:match("[%w-]+%-([a-z%-]+)%-(%d+)") 76 | shade = tonumber(shade) 77 | local bg = vim.tbl_get(M.colors, color, shade) 78 | if bg then 79 | local hl = "MiniHipatternsTailwind" .. color .. shade 80 | if not M.hl[hl] then 81 | M.hl[hl] = true 82 | local bg_shade = shade == 500 and 950 or shade < 500 and 900 or 100 83 | local fg = vim.tbl_get(M.colors, color, bg_shade) 84 | vim.api.nvim_set_hl(0, hl, { bg = "#" .. bg, fg = "#" .. fg }) 85 | end 86 | return hl 87 | end 88 | end, 89 | extmark_opts = { priority = 2000 }, 90 | } 91 | end 92 | require("mini.hipatterns").setup(opts) 93 | end, 94 | } 95 | 96 | M.colors = { 97 | slate = { 98 | [50] = "f8fafc", 99 | [100] = "f1f5f9", 100 | [200] = "e2e8f0", 101 | [300] = "cbd5e1", 102 | [400] = "94a3b8", 103 | [500] = "64748b", 104 | [600] = "475569", 105 | [700] = "334155", 106 | [800] = "1e293b", 107 | [900] = "0f172a", 108 | [950] = "020617", 109 | }, 110 | 111 | gray = { 112 | [50] = "f9fafb", 113 | [100] = "f3f4f6", 114 | [200] = "e5e7eb", 115 | [300] = "d1d5db", 116 | [400] = "9ca3af", 117 | [500] = "6b7280", 118 | [600] = "4b5563", 119 | [700] = "374151", 120 | [800] = "1f2937", 121 | [900] = "111827", 122 | [950] = "030712", 123 | }, 124 | 125 | zinc = { 126 | [50] = "fafafa", 127 | [100] = "f4f4f5", 128 | [200] = "e4e4e7", 129 | [300] = "d4d4d8", 130 | [400] = "a1a1aa", 131 | [500] = "71717a", 132 | [600] = "52525b", 133 | [700] = "3f3f46", 134 | [800] = "27272a", 135 | [900] = "18181b", 136 | [950] = "09090B", 137 | }, 138 | 139 | neutral = { 140 | [50] = "fafafa", 141 | [100] = "f5f5f5", 142 | [200] = "e5e5e5", 143 | [300] = "d4d4d4", 144 | [400] = "a3a3a3", 145 | [500] = "737373", 146 | [600] = "525252", 147 | [700] = "404040", 148 | [800] = "262626", 149 | [900] = "171717", 150 | [950] = "0a0a0a", 151 | }, 152 | 153 | stone = { 154 | [50] = "fafaf9", 155 | [100] = "f5f5f4", 156 | [200] = "e7e5e4", 157 | [300] = "d6d3d1", 158 | [400] = "a8a29e", 159 | [500] = "78716c", 160 | [600] = "57534e", 161 | [700] = "44403c", 162 | [800] = "292524", 163 | [900] = "1c1917", 164 | [950] = "0a0a0a", 165 | }, 166 | 167 | red = { 168 | [50] = "fef2f2", 169 | [100] = "fee2e2", 170 | [200] = "fecaca", 171 | [300] = "fca5a5", 172 | [400] = "f87171", 173 | [500] = "ef4444", 174 | [600] = "dc2626", 175 | [700] = "b91c1c", 176 | [800] = "991b1b", 177 | [900] = "7f1d1d", 178 | [950] = "450a0a", 179 | }, 180 | 181 | orange = { 182 | [50] = "fff7ed", 183 | [100] = "ffedd5", 184 | [200] = "fed7aa", 185 | [300] = "fdba74", 186 | [400] = "fb923c", 187 | [500] = "f97316", 188 | [600] = "ea580c", 189 | [700] = "c2410c", 190 | [800] = "9a3412", 191 | [900] = "7c2d12", 192 | [950] = "431407", 193 | }, 194 | 195 | amber = { 196 | [50] = "fffbeb", 197 | [100] = "fef3c7", 198 | [200] = "fde68a", 199 | [300] = "fcd34d", 200 | [400] = "fbbf24", 201 | [500] = "f59e0b", 202 | [600] = "d97706", 203 | [700] = "b45309", 204 | [800] = "92400e", 205 | [900] = "78350f", 206 | [950] = "451a03", 207 | }, 208 | 209 | yellow = { 210 | [50] = "fefce8", 211 | [100] = "fef9c3", 212 | [200] = "fef08a", 213 | [300] = "fde047", 214 | [400] = "facc15", 215 | [500] = "eab308", 216 | [600] = "ca8a04", 217 | [700] = "a16207", 218 | [800] = "854d0e", 219 | [900] = "713f12", 220 | [950] = "422006", 221 | }, 222 | 223 | lime = { 224 | [50] = "f7fee7", 225 | [100] = "ecfccb", 226 | [200] = "d9f99d", 227 | [300] = "bef264", 228 | [400] = "a3e635", 229 | [500] = "84cc16", 230 | [600] = "65a30d", 231 | [700] = "4d7c0f", 232 | [800] = "3f6212", 233 | [900] = "365314", 234 | [950] = "1a2e05", 235 | }, 236 | 237 | green = { 238 | [50] = "f0fdf4", 239 | [100] = "dcfce7", 240 | [200] = "bbf7d0", 241 | [300] = "86efac", 242 | [400] = "4ade80", 243 | [500] = "22c55e", 244 | [600] = "16a34a", 245 | [700] = "15803d", 246 | [800] = "166534", 247 | [900] = "14532d", 248 | [950] = "052e16", 249 | }, 250 | 251 | emerald = { 252 | [50] = "ecfdf5", 253 | [100] = "d1fae5", 254 | [200] = "a7f3d0", 255 | [300] = "6ee7b7", 256 | [400] = "34d399", 257 | [500] = "10b981", 258 | [600] = "059669", 259 | [700] = "047857", 260 | [800] = "065f46", 261 | [900] = "064e3b", 262 | [950] = "022c22", 263 | }, 264 | 265 | teal = { 266 | [50] = "f0fdfa", 267 | [100] = "ccfbf1", 268 | [200] = "99f6e4", 269 | [300] = "5eead4", 270 | [400] = "2dd4bf", 271 | [500] = "14b8a6", 272 | [600] = "0d9488", 273 | [700] = "0f766e", 274 | [800] = "115e59", 275 | [900] = "134e4a", 276 | [950] = "042f2e", 277 | }, 278 | 279 | cyan = { 280 | [50] = "ecfeff", 281 | [100] = "cffafe", 282 | [200] = "a5f3fc", 283 | [300] = "67e8f9", 284 | [400] = "22d3ee", 285 | [500] = "06b6d4", 286 | [600] = "0891b2", 287 | [700] = "0e7490", 288 | [800] = "155e75", 289 | [900] = "164e63", 290 | [950] = "083344", 291 | }, 292 | 293 | sky = { 294 | [50] = "f0f9ff", 295 | [100] = "e0f2fe", 296 | [200] = "bae6fd", 297 | [300] = "7dd3fc", 298 | [400] = "38bdf8", 299 | [500] = "0ea5e9", 300 | [600] = "0284c7", 301 | [700] = "0369a1", 302 | [800] = "075985", 303 | [900] = "0c4a6e", 304 | [950] = "082f49", 305 | }, 306 | 307 | blue = { 308 | [50] = "eff6ff", 309 | [100] = "dbeafe", 310 | [200] = "bfdbfe", 311 | [300] = "93c5fd", 312 | [400] = "60a5fa", 313 | [500] = "3b82f6", 314 | [600] = "2563eb", 315 | [700] = "1d4ed8", 316 | [800] = "1e40af", 317 | [900] = "1e3a8a", 318 | [950] = "172554", 319 | }, 320 | 321 | indigo = { 322 | [50] = "eef2ff", 323 | [100] = "e0e7ff", 324 | [200] = "c7d2fe", 325 | [300] = "a5b4fc", 326 | [400] = "818cf8", 327 | [500] = "6366f1", 328 | [600] = "4f46e5", 329 | [700] = "4338ca", 330 | [800] = "3730a3", 331 | [900] = "312e81", 332 | [950] = "1e1b4b", 333 | }, 334 | 335 | violet = { 336 | [50] = "f5f3ff", 337 | [100] = "ede9fe", 338 | [200] = "ddd6fe", 339 | [300] = "c4b5fd", 340 | [400] = "a78bfa", 341 | [500] = "8b5cf6", 342 | [600] = "7c3aed", 343 | [700] = "6d28d9", 344 | [800] = "5b21b6", 345 | [900] = "4c1d95", 346 | [950] = "2e1065", 347 | }, 348 | 349 | purple = { 350 | [50] = "faf5ff", 351 | [100] = "f3e8ff", 352 | [200] = "e9d5ff", 353 | [300] = "d8b4fe", 354 | [400] = "c084fc", 355 | [500] = "a855f7", 356 | [600] = "9333ea", 357 | [700] = "7e22ce", 358 | [800] = "6b21a8", 359 | [900] = "581c87", 360 | [950] = "3b0764", 361 | }, 362 | 363 | fuchsia = { 364 | [50] = "fdf4ff", 365 | [100] = "fae8ff", 366 | [200] = "f5d0fe", 367 | [300] = "f0abfc", 368 | [400] = "e879f9", 369 | [500] = "d946ef", 370 | [600] = "c026d3", 371 | [700] = "a21caf", 372 | [800] = "86198f", 373 | [900] = "701a75", 374 | [950] = "4a044e", 375 | }, 376 | 377 | pink = { 378 | [50] = "fdf2f8", 379 | [100] = "fce7f3", 380 | [200] = "fbcfe8", 381 | [300] = "f9a8d4", 382 | [400] = "f472b6", 383 | [500] = "ec4899", 384 | [600] = "db2777", 385 | [700] = "be185d", 386 | [800] = "9d174d", 387 | [900] = "831843", 388 | [950] = "500724", 389 | }, 390 | 391 | rose = { 392 | [50] = "fff1f2", 393 | [100] = "ffe4e6", 394 | [200] = "fecdd3", 395 | [300] = "fda4af", 396 | [400] = "fb7185", 397 | [500] = "f43f5e", 398 | [600] = "e11d48", 399 | [700] = "be123c", 400 | [800] = "9f1239", 401 | [900] = "881337", 402 | [950] = "4c0519", 403 | }, 404 | } 405 | 406 | return M.plugin 407 | -------------------------------------------------------------------------------- /.config/nvim/lua/plugins/languages/typescript.lua: -------------------------------------------------------------------------------- 1 | return { 2 | -- correctly setup lspconfig 3 | { 4 | 'neovim/nvim-lspconfig', 5 | opts = { 6 | -- make sure mason installs the server 7 | servers = { 8 | --- @deprecated -- tsserver renamed to ts_ls but not yet released, so keep this for now 9 | --- the proper approach is to check the nvim-lspconfig release version when it's released to determine the server name dynamically 10 | tsserver = { 11 | enabled = false, 12 | }, 13 | ts_ls = { 14 | enabled = false, 15 | }, 16 | vtsls = { 17 | -- explicitly add default filetypes, so that we can extend 18 | -- them in related extras 19 | filetypes = { 20 | 'javascript', 21 | 'javascriptreact', 22 | 'javascript.jsx', 23 | 'typescript', 24 | 'typescriptreact', 25 | 'typescript.tsx', 26 | }, 27 | settings = { 28 | complete_function_calls = true, 29 | vtsls = { 30 | enableMoveToFileCodeAction = true, 31 | autoUseWorkspaceTsdk = true, 32 | experimental = { 33 | maxInlayHintLength = 30, 34 | completion = { 35 | enableServerSideFuzzyMatch = true, 36 | }, 37 | }, 38 | }, 39 | typescript = { 40 | updateImportsOnFileMove = { enabled = 'always' }, 41 | suggest = { 42 | completeFunctionCalls = true, 43 | }, 44 | inlayHints = { 45 | enumMemberValues = { enabled = true }, 46 | functionLikeReturnTypes = { enabled = true }, 47 | parameterNames = { enabled = 'literals' }, 48 | parameterTypes = { enabled = true }, 49 | propertyDeclarationTypes = { enabled = true }, 50 | variableTypes = { enabled = false }, 51 | }, 52 | }, 53 | }, 54 | keys = { 55 | { 56 | 'gD', 57 | function() 58 | local position_params = vim.lsp.util.make_position_params() 59 | local params = { 60 | command = 'typescript.goToSourceDefinition', 61 | arguments = { position_params.textDocument.uri, position_params.position }, 62 | } 63 | require("trouble").open({ 64 | mode = "lsp_command", 65 | params = params, 66 | }) 67 | end, 68 | desc = 'Goto Source Definition', 69 | }, 70 | { 71 | 'gR', 72 | function() 73 | local params = { 74 | command = 'typescript.findAllFileReferences', 75 | arguments = { vim.uri_from_bufnr(0) }, 76 | } 77 | require("trouble").open({ 78 | mode = "lsp_command", 79 | params = params, 80 | }) 81 | end, 82 | desc = 'File References', 83 | }, 84 | { 85 | 'co', 86 | 'VtsExec organize_imports', 87 | desc = 'Organize Imports', 88 | }, 89 | { 90 | 'cM', 91 | 'VtsExec add_missing_imports', 92 | desc = 'Add missing imports', 93 | }, 94 | { 95 | 'cu', 96 | 'VtsExec remove_unused_imports', 97 | desc = 'Remove unused imports', 98 | }, 99 | { 100 | 'cD', 101 | 'VtsExec fix_all', 102 | desc = 'Fix all diagnostics', 103 | }, 104 | { 105 | 'cV', 106 | 'VtsExec select_ts_version', 107 | desc = 'Select TS workspace version', 108 | }, 109 | }, 110 | }, 111 | }, 112 | setup = { 113 | --- @deprecated -- tsserver renamed to ts_ls but not yet released, so keep this for now 114 | --- the proper approach is to check the nvim-lspconfig release version when it's released to determine the server name dynamically 115 | tsserver = function() 116 | -- disable tsserver 117 | return true 118 | end, 119 | ts_ls = function() 120 | -- disable tsserver 121 | return true 122 | end, 123 | vtsls = function(_, opts) 124 | local on_attach = function(client, _) 125 | client.commands['_typescript.moveToFileRefactoring'] = function( 126 | command, 127 | _ 128 | ) 129 | ---@type string, string, lsp.Range 130 | local action, uri, range = unpack(command.arguments) 131 | 132 | local function move(newf) 133 | client.request('workspace/executeCommand', { 134 | command = command.command, 135 | arguments = { action, uri, range, newf }, 136 | }) 137 | end 138 | 139 | local fname = vim.uri_to_fname(uri) 140 | client.request('workspace/executeCommand', { 141 | command = 'typescript.tsserverRequest', 142 | arguments = { 143 | 'getMoveToRefactoringFileSuggestions', 144 | { 145 | file = fname, 146 | startLine = range.start.line + 1, 147 | startOffset = range.start.character + 1, 148 | endLine = range['end'].line + 1, 149 | endOffset = range['end'].character + 1, 150 | }, 151 | }, 152 | }, function(_, result) 153 | ---@type string[] 154 | local files = result.body.files 155 | table.insert(files, 1, 'Enter new path...') 156 | vim.ui.select(files, { 157 | prompt = 'Select move destination:', 158 | format_item = function(f) 159 | return vim.fn.fnamemodify(f, ':~:.') 160 | end, 161 | }, function(f) 162 | if f and f:find '^Enter new path' then 163 | vim.ui.input({ 164 | prompt = 'Enter move destination:', 165 | default = vim.fn.fnamemodify(fname, ':h') .. '/', 166 | completion = 'file', 167 | }, function(newf) 168 | return newf and move(newf) 169 | end) 170 | elseif f then 171 | move(f) 172 | end 173 | end) 174 | end) 175 | end 176 | end 177 | local name = 'vtsls' 178 | vim.api.nvim_create_autocmd("LspAttach", { 179 | callback = function(args) 180 | local buffer = args.buf ---@type number 181 | local client = vim.lsp.get_client_by_id(args.data.client_id) 182 | if client and (not name or client.name == name) then 183 | return on_attach(client, buffer) 184 | end 185 | end, 186 | }) 187 | -- copy typescript settings to javascript 188 | opts.settings.javascript = vim.tbl_deep_extend( 189 | 'force', 190 | {}, 191 | opts.settings.typescript, 192 | opts.settings.javascript or {} 193 | ) 194 | end, 195 | }, 196 | }, 197 | }, 198 | 199 | { 200 | 'mfussenegger/nvim-dap', 201 | optional = true, 202 | dependencies = { 203 | { 204 | 'williamboman/mason.nvim', 205 | opts = function(_, opts) 206 | opts.ensure_installed = opts.ensure_installed or {} 207 | table.insert(opts.ensure_installed, 'js-debug-adapter') 208 | end, 209 | }, 210 | }, 211 | opts = function() 212 | local dap = require 'dap' 213 | if not dap.adapters['pwa-node'] then 214 | require('dap').adapters['pwa-node'] = { 215 | type = 'server', 216 | host = 'localhost', 217 | port = '${port}', 218 | executable = { 219 | command = 'node', 220 | args = { 221 | vim.env.MASON 222 | .. '/packages/' 223 | .. 'js-debug-adapter' 224 | .. '/js-debug/src/dapDebugServer.js', 225 | '${port}', 226 | }, 227 | }, 228 | } 229 | end 230 | if not dap.adapters['node'] then 231 | dap.adapters['node'] = function(cb, config) 232 | if config.type == 'node' then 233 | config.type = 'pwa-node' 234 | end 235 | local nativeAdapter = dap.adapters['pwa-node'] 236 | if type(nativeAdapter) == 'function' then 237 | nativeAdapter(cb, config) 238 | else 239 | cb(nativeAdapter) 240 | end 241 | end 242 | end 243 | 244 | local js_filetypes = 245 | { 'typescript', 'javascript', 'typescriptreact', 'javascriptreact' } 246 | 247 | local vscode = require 'dap.ext.vscode' 248 | vscode.type_to_filetypes['node'] = js_filetypes 249 | vscode.type_to_filetypes['pwa-node'] = js_filetypes 250 | 251 | for _, language in ipairs(js_filetypes) do 252 | if not dap.configurations[language] then 253 | dap.configurations[language] = { 254 | { 255 | type = 'pwa-node', 256 | request = 'launch', 257 | name = 'Launch file', 258 | program = '${file}', 259 | cwd = '${workspaceFolder}', 260 | }, 261 | { 262 | type = 'pwa-node', 263 | request = 'attach', 264 | name = 'Attach', 265 | processId = require('dap.utils').pick_process, 266 | cwd = '${workspaceFolder}', 267 | }, 268 | } 269 | end 270 | end 271 | end, 272 | }, 273 | 274 | -- Filetype icons 275 | { 276 | 'echasnovski/mini.icons', 277 | opts = { 278 | file = { 279 | ['.eslintrc.js'] = { glyph = '󰱺', hl = 'MiniIconsYellow' }, 280 | ['.node-version'] = { glyph = '', hl = 'MiniIconsGreen' }, 281 | ['.prettierrc'] = { glyph = '', hl = 'MiniIconsPurple' }, 282 | ['.yarnrc.yml'] = { glyph = '', hl = 'MiniIconsBlue' }, 283 | ['eslint.config.js'] = { glyph = '󰱺', hl = 'MiniIconsYellow' }, 284 | ['package.json'] = { glyph = '', hl = 'MiniIconsGreen' }, 285 | ['tsconfig.json'] = { glyph = '', hl = 'MiniIconsAzure' }, 286 | ['tsconfig.build.json'] = { glyph = '', hl = 'MiniIconsAzure' }, 287 | ['yarn.lock'] = { glyph = '', hl = 'MiniIconsBlue' }, 288 | }, 289 | }, 290 | }, 291 | } 292 | --------------------------------------------------------------------------------