diff --git a/config/nvim/lua/keymaps.lua b/config/nvim/lua/keymaps.lua index d108c2c..5b9fbde 100644 --- a/config/nvim/lua/keymaps.lua +++ b/config/nvim/lua/keymaps.lua @@ -42,6 +42,18 @@ K.nl('o', function() require('snacks').gitbrowse() end, 'Open repo in browser') K.n('', ':w!', { desc = 'Save', noremap = true }) K.n('', ':nohlsearch', { desc = 'Clear Search Highlighting' }) +-- ── ToggleTerm ────────────────────────────────────────────────────── +K.d('', 'n', ':FloatermToggle', 'Toggle Floaterm') +K.d('', 'i', ':FloatermToggle', 'Toggle Floaterm') +K.d('', 't', ':FloatermToggle', 'Toggle Floaterm') + +-- ── Test operations ───────────────────────────────────────────────── +K.nl('an', ':silent TestNearest', 'Test Nearest') +K.nl('af', ':silent TestFile', 'Test File') +K.nl('as', ':silent TestSuite', 'Test Suite') +K.nl('al', ':silent TestLast', 'Test Last') +K.nl('av', ':silent TestVisit', 'Test Visit') + -- ── Buffer operations ─────────────────────────────────────────────── -- Mappings for buffer management operations like switching, deleting, etc. -- Convention: All mappings start with 'b' followed by the operation @@ -90,7 +102,7 @@ K.nl('cbt', 'CBllline', 'CB: Titled Line') -- Mappings for Telescope operations like finding files, buffers, etc. -- Convention: All mappings start with 's' followed by the operation -- unless it's a generic operation like searching or finding buffers -K.nl('f', ':Telescope find_files', 'Find Files') +K.nl('f', ':Telescope fd --hidden=true', 'Find Files') K.nl(',', ':Telescope buffers', 'Find existing buffers') K.nl( '/', @@ -105,6 +117,11 @@ K.nl( 'Fuzzily search in current buffer' ) +K.nl('pm', ':PhpactorContextMenu', 'PHPactor: Context Menu') +K.nl('pn', ':PhpactorClassNew', 'PHPactor: Class New') +K.nl('ps', ':PhpactorClassSearch', 'PHPactor: Class Search') +K.nl('pt', ':PhpactorTransform', 'PHPactor: Transform') + K.nl('sc', ':Telescope commands', 'Commands') K.nl('sd', ':Telescope diagnostics', 'Search Diagnostics') K.nl('sg', ':Telescope live_grep', 'Search by Grep') @@ -119,7 +136,6 @@ K.nl( ) K.nl('sq', ':Telescope quickfix', 'Quickfix') K.nl('ss', ':Telescope treesitter', 'Treesitter') -K.nl('st', ':TodoTelescope', 'Search Todos') K.nl('sw', ':Telescope grep_string', 'Grep String') K.nl('sx', ':Telescope import', 'Telescope: Import') diff --git a/config/nvim/lua/options.lua b/config/nvim/lua/options.lua index 87deef8..3c0fa88 100644 --- a/config/nvim/lua/options.lua +++ b/config/nvim/lua/options.lua @@ -24,13 +24,15 @@ g.loaded_java_provider = 0 -- Disable java provider -- vim.options -- Most of the good defaults are provided by `mini.basics` -- See: lua/plugins/mini.lua +o.confirm = true -- Confirm before closing unsaved buffers o.ignorecase = true -- Ignore case in search patterns o.inccommand = 'split' -- Preview substitutions live, as you type! o.number = true -- Show line numbers o.numberwidth = 3 -- Set the width of the number column o.relativenumber = true -- Show relative line numbers -o.scrolloff = 15 -- Show context around cursor -o.signcolumn = 'yes:3' -- Keep signcolumn on by default +o.scrolloff = 8 -- Show context around cursor +o.sidescrolloff = 8 -- Show context around cursor +o.signcolumn = 'yes' -- Keep signcolumn on by default o.spell = true -- Enable spell checking o.spelllang = 'en_us' -- Set the spell checking language o.splitbelow = true -- split to the bottom @@ -41,6 +43,8 @@ o.updatetime = 250 -- 250 ms = 2,5 seconds o.sessionoptions = 'buffers,curdir,folds,tabpages,winsize,winpos,terminal,localoptions' +o.wildmode = 'longest:full,full' -- Command-line completion mode + -- Enable the colorcolumn vim.api.nvim_set_option_value('colorcolumn', '+1', { scope = 'global' }) diff --git a/config/nvim/lua/plugins/code.lua b/config/nvim/lua/plugins/code.lua index 8b02a7a..93e2f0a 100644 --- a/config/nvim/lua/plugins/code.lua +++ b/config/nvim/lua/plugins/code.lua @@ -8,6 +8,47 @@ return { opts = { enabled = true, snippet_engine = 'luasnip' }, }, + -- Terminal manager for (neo)vim + -- https://github.com/voldikss/vim-floaterm + { + 'voldikss/vim-floaterm', + cmd = { 'FloatermToggle' }, + init = function() + vim.g.floaterm_width = 0.8 + vim.g.floaterm_height = 0.8 + end, + }, + + -- Run your tests at the speed of thought + -- https://github.com/vim-test/vim-test + { + 'vim-test/vim-test', + dependencies = { 'voldikss/vim-floaterm' }, + config = function() + vim.cmd [[ + function! PhpUnitTransform(cmd) abort + return join(map(split(a:cmd), 'v:val == "--colors" ? "--colors=always" : v:val')) + endfunction + + let g:test#custom_transformations = {'phpunit': function('PhpUnitTransform')} + let g:test#transformation = 'phpunit' + + " let test#php#phpunit#options = '--colors=always' + let test#php#pest#options = '-v' + let test#javascript#jest#options = '--color' + + function! FloatermStrategy(cmd) + execute 'silent FloatermSend q' + execute 'silent FloatermKill' + execute 'FloatermNew! '.a:cmd.' | less -X' + endfunction + + let g:test#custom_strategies = {'floaterm': function('FloatermStrategy')} + let g:test#strategy = 'floaterm' + ]] + end, + }, + -- Cloak allows you to overlay *'s over defined patterns in defined files. -- https://github.com/laytan/cloak.nvim { @@ -36,6 +77,82 @@ return { }, }, + -- projectionist.vim: Granular project configuration + -- https://github.com/tpope/vim-projectionist + { + 'tpope/vim-projectionist', + dependencies = 'tpope/vim-dispatch', + config = function() + vim.g.projectionist_heuristics = { + artisan = { + ['*'] = { + start = 'php artisan serve', + console = 'php artisan tinker', + }, + ['app/*.php'] = { + type = 'source', + alternate = { + 'tests/Unit/{}Test.php', + 'tests/Feature/{}Test.php', + }, + }, + ['tests/Feature/*Test.php'] = { + type = 'test', + alternate = 'app/{}.php', + }, + ['tests/Unit/*Test.php'] = { + type = 'test', + alternate = 'app/{}.php', + }, + ['app/Models/*.php'] = { + type = 'model', + }, + ['app/Http/Controllers/*.php'] = { + type = 'controller', + }, + ['routes/*.php'] = { + type = 'route', + }, + ['database/migrations/*.php'] = { + type = 'migration', + }, + }, + ['src/&composer.json'] = { + ['src/*.php'] = { + type = 'source', + alternate = { + 'tests/{}Test.php', + }, + }, + ['tests/*Test.php'] = { + type = 'test', + alternate = 'src/{}.php', + }, + }, + ['app/&composer.json'] = { + ['app/*.php'] = { + type = 'source', + alternate = { + 'tests/{}Test.php', + }, + }, + ['tests/*Test.php'] = { + type = 'test', + alternate = 'app/{}.php', + }, + }, + } + end, + }, + + -- A vim text object for XML/HTML attributes. + -- https://github.com/whatyouhide/vim-textobj-xmlattr + { + 'whatyouhide/vim-textobj-xmlattr', + dependencies = { 'kana/vim-textobj-user' }, + opts = {}, + }, + -- Describe the regexp under the cursor -- https://github.com/bennypowers/nvim-regexplainer { @@ -84,4 +201,12 @@ return { ft = { 'go', 'gomod' }, build = ':lua require("go.install").update_all_sync()', -- if you need to install/update all binaries }, + + -- Mainly a PHP Language Server with more features than you can shake a stick at + -- https://github.com/phpactor/phpactor + { + 'phpactor/phpactor', + build = 'composer install --no-dev --optimize-autoloader', + ft = 'php', + }, } diff --git a/config/nvim/lua/plugins/lsp.lua b/config/nvim/lua/plugins/lsp.lua index a53a5c7..cded711 100644 --- a/config/nvim/lua/plugins/lsp.lua +++ b/config/nvim/lua/plugins/lsp.lua @@ -26,7 +26,15 @@ local lsp_servers = { }, }, html = {}, - intelephense = {}, + intelephense = { + commands = { + IntelephenseIndex = { + function() + vim.lsp.buf.execute_command { command = 'intelephense.index.workspace' } + end, + }, + }, + }, jsonls = {}, lua_ls = { settings = { @@ -236,12 +244,12 @@ return { config = function(_, opts) require('lazydev').setup() require('lsp-setup').setup(opts) + local cmp = require 'blink.cmp' local lspconfig = require 'lspconfig' for server, config in pairs(opts.servers) do -- passing config.capabilities to blink.cmp merges with the capabilities in your -- `opts[server].capabilities, if you've defined it - config.capabilities = - require('blink.cmp').get_lsp_capabilities(config.capabilities) + config.capabilities = cmp.get_lsp_capabilities(config.capabilities) lspconfig[server].setup(config) end @@ -289,6 +297,32 @@ return { }, } + -- Diagnostic configuration + vim.diagnostic.config { + virtual_text = false, + float = { + source = true, + }, + } + + -- Sign configuration + vim.fn.sign_define( + 'DiagnosticSignError', + { text = '', texthl = 'DiagnosticSignError' } + ) + vim.fn.sign_define( + 'DiagnosticSignWarn', + { text = '', texthl = 'DiagnosticSignWarn' } + ) + vim.fn.sign_define( + 'DiagnosticSignInfo', + { text = '', texthl = 'DiagnosticSignInfo' } + ) + vim.fn.sign_define( + 'DiagnosticSignHint', + { text = '', texthl = 'DiagnosticSignHint' } + ) + -- end of junnplus/lsp-setup config end, }, diff --git a/config/nvim/lua/plugins/neotree.lua b/config/nvim/lua/plugins/neotree.lua index 78d15fb..c97c831 100644 --- a/config/nvim/lua/plugins/neotree.lua +++ b/config/nvim/lua/plugins/neotree.lua @@ -31,9 +31,43 @@ return { cmd = 'Neotree', opts = { close_if_last_window = true, + hide_root_node = true, popup_border_style = 'rounded', enable_git_status = true, enable_diagnostics = true, + sources = { + 'filesystem', + 'buffers', + 'document_symbols', + }, + source_selector = { + winbar = true, + statusline = false, + separator = { left = '', right = '' }, + show_separator_on_edge = true, + highlight_tab = 'SidebarTabInactive', + highlight_tab_active = 'SidebarTabActive', + highlight_background = 'StatusLine', + highlight_separator = 'SidebarTabInactiveSeparator', + highlight_separator_active = 'SidebarTabActiveSeparator', + }, + event_handlers = { + { + event = 'file_opened', + handler = function(file_path) + require('neo-tree.command').execute { action = 'close' } + end, + }, + }, + default_component_configs = { + indent = { + padding = 0, + }, + name = { + use_git_status_colors = true, + highlight_opened_files = true, + }, + }, git_status = { symbols = { -- Change type @@ -54,59 +88,18 @@ return { mappings = { [''] = 'close_window', ['q'] = 'close_window', + [''] = 'open_with_window_picker', }, }, filtered_items = { - hide_dotfiles = true, - hide_gitignored = true, + hide_dotfiles = false, hide_hidden = true, -- only works on Windows for hidden files/directories never_show = { '.DS_Store', }, hide_by_name = { 'node_modules', - }, - always_show = { - '.actrc', - '.browserslistrc', - '.commitlintrc.json', - '.editorconfig', - '.env', - '.env.example', - '.envrc', - '.eslintrc.json', - '.github', - '.gitignore', - '.gitkeep', - '.ignore', - '.markdownlint.json', - '.markdownlint.yaml', - '.markdownlintignore', - '.nvmrc', - '.prettierignore', - '.prettierrc.js', - '.prettierrc.json', - '.prettierrc.yaml', - '.python-version', - '.releaserc.json', - '.shellcheckrc', - '.simple-git-hooks.json', - '.stylelintrc.json', - '.stylua.toml', - '.yamlignore', - '.yamllint.yaml', - }, - always_show_by_pattern = { - '.*.json', - '.*.toml', - '.*.yaml', - '.*.yml', - '.*rc', - '.*rc.*', - '.env*', - '.prettierrc*', - '.markdownlint*', - '.stylua.*', + '.git', }, }, }, diff --git a/config/nvim/lua/plugins/ui.lua b/config/nvim/lua/plugins/ui.lua index 57d6f77..a19c4a3 100644 --- a/config/nvim/lua/plugins/ui.lua +++ b/config/nvim/lua/plugins/ui.lua @@ -7,6 +7,121 @@ return { init = function() vim.cmd.colorscheme(vim.g.colors_theme) end, opts = { transparent = true, + on_colors = function(colors) + colors.gitSigns = { + add = colors.teal, + change = colors.purple, + delete = colors.red, + } + end, + on_highlights = function(hl, c) + local util = require 'tokyonight.util' + local prompt = '#2d3149' + + hl.NeoTreeFileNameOpened = { + fg = c.orange, + } + + hl.GitSignsCurrentLineBlame = { + fg = c.fg_gutter, + } + + hl.StatusLine = { + bg = util.darken(c.bg_dark, 0.98, '#000000'), + fg = c.fg_dark, + } + hl.StatusLineComment = { + bg = util.darken(c.bg_dark, 0.85, '#000000'), + fg = c.comment, + } + + hl.LineNrAbove = { + fg = c.fg_gutter, + } + hl.LineNr = { + fg = util.lighten(c.fg_gutter, 0.7), + } + hl.LineNrBelow = { + fg = c.fg_gutter, + } + + hl.MsgArea = { + bg = util.darken(c.bg_dark, 0.85, '#000000'), + } + + -- Spelling + hl.SpellBad = { + undercurl = true, + sp = '#7F3A43', + } + + -- Telescope + hl.TelescopeNormal = { + bg = c.bg_dark, + fg = c.fg_dark, + } + hl.TelescopeBorder = { + bg = c.bg_dark, + fg = c.bg_dark, + } + hl.TelescopePromptNormal = { + bg = prompt, + } + hl.TelescopePromptBorder = { + bg = prompt, + fg = prompt, + } + hl.TelescopePromptTitle = { + bg = c.bg, + fg = c.fg_dark, + } + hl.TelescopePreviewTitle = { + bg = c.bg_dark, + fg = c.bg_dark, + } + hl.TelescopeResultsTitle = { + bg = c.bg_dark, + fg = c.bg_dark, + } + + -- Indent + hl.MiniIndentscopeSymbol = { + fg = util.darken(c.bg_highlight, 0.30), + } + hl.IblScope = { + fg = util.darken(c.bg_highlight, 0.80), + } + + -- Floaterm + hl.Floaterm = { + bg = prompt, + } + hl.FloatermBorder = { + bg = prompt, + fg = prompt, + } + + -- Copilot + hl.CopilotSuggestion = { + fg = c.comment, + } + + -- NeoTree + hl.NeoTreeFileNameOpened = { + fg = c.fg, + bold = true, + } + hl.NvimTreeNormal = { + bg = util.darken(c.bg_dark, 0.85, '#000000'), + } + hl.NvimTreeNormalNC = { + bg = util.darken(c.bg_dark, 0.85, '#000000'), + } + hl.NvimTreeWinSeparator = { + fg = util.darken(c.bg_dark, 0.85, '#000000'), + bg = util.darken(c.bg_dark, 0.85, '#000000'), + } + end, }, }, @@ -27,6 +142,17 @@ return { }, }, + -- The fastest Neovim colorizer + -- https://github.com/catgoose/nvim-colorizer.lua + { + 'catgoose/nvim-colorizer.lua', + opts = { + user_default_options = { + names = false, + }, + }, + }, + -- A neovim plugin that shows colorcolumn dynamically -- https://github.com/Bekaboo/deadcolumn.nvim { 'Bekaboo/deadcolumn.nvim' }, diff --git a/docs/nvim-keybindings.md b/docs/nvim-keybindings.md index 4453e84..98f8093 100644 --- a/docs/nvim-keybindings.md +++ b/docs/nvim-keybindings.md @@ -60,8 +60,6 @@ n sx * :Telescope import Telescope: Import n sw * :Telescope grep_string Grep String -n st * :TodoTelescope - Search Todos n ss * :Telescope treesitter Treesitter n sq * :Telescope quickfix @@ -82,11 +80,19 @@ n sd * :Telescope diagnostics Search Diagnostics n sc * :Telescope commands Commands +n pt * :PhpactorTransform + PHPactor: Transform +n ps * :PhpactorClassSearch + PHPactor: Class Search +n pn * :PhpactorClassNew + PHPactor: Class New +n pm * :PhpactorContextMenu + PHPactor: Context Menu n / * ~/.config/nvim/lua/keymaps.lua Fuzzily search in current buffer n , * :Telescope buffers Find existing buffers -n f * :Telescope find_files +n f * :Telescope fd --hidden=true Find Files n cbt * CBllline CB: Titled Line @@ -144,6 +150,16 @@ n bd * :lua MiniBufremove.delete() Delete n ba * :%bd|e#|bd# Close all except current +n av * :silent TestVisit + Test Visit +n al * :silent TestLast + Test Last +n as * :silent TestSuite + Test Suite +n af * :silent TestFile + Test File +n an * :silent TestNearest + Test Nearest n o * ~/.config/nvim/lua/keymaps.lua Open repo in browser n tmw * setlocal wrap! wrap? @@ -177,6 +193,10 @@ x % (MatchitVisualForward) n % (MatchitNormalForward) n & * :&& :help &-default +n '? & :echo ":Start" dispatch#start_focus(v:count > 1 ? 0 : v:count ? line(".") : -1) +n '! & 30_:.Start! +n ' & 30_:.Start +n ' & 30_:.Start x * * vim/_defaults.lua :help v_star-default o ; * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/jump.lua @@ -195,7 +215,7 @@ n > * >gv Indent Right n @ * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua Execute macro without 'mini.clue' triggers -x @ * mode() == 'V' ? ':normal! @'.getcharstr().'' : '@' +x @ * mode() ==# 'V' ? ':normal! @'.getcharstr().'' : '@' :help v_@-default o F * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/jump.lua Jump backward @@ -207,7 +227,7 @@ n K * :Lspsaga hover_doc Hover Documentation n Q * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua Execute macro without 'mini.clue' triggers -x Q * mode() == 'V' ? ':normal! @=reg_recorded()' : 'Q' +x Q * mode() ==# 'V' ? ':normal! @=reg_recorded()' : 'Q' :help v_Q-default o T * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/jump.lua Jump backward till @@ -269,7 +289,13 @@ n ]h * lua MiniDiff.goto_hunk('next') Next hunk n ]d * vim/_defaults.lua Jump to the next diagnostic +n `? & 30_:.FocusDispatch +n `! & 30_:.Dispatch! +n ` & 30_:.Dispatch +n ` & 30_:.Dispatch x a% (MatchitVisualTextObject) +o ax (textobj-xmlattr-attr-a) +x ax (textobj-xmlattr-attr-a) o ai * lua MiniIndentscope.textobject(true) Object scope with border x ai * lua MiniIndentscope.textobject(true) @@ -285,6 +311,14 @@ n gR * :RegexplainerToggle o g% (MatchitOperationBackward) x g% (MatchitVisualBackward) n g% (MatchitNormalBackward) +n g`? & :echo ":Spawn" dispatch#spawn_focus(v:count > 1 ? 0 : v:count ? line(".") : -1) +n g`! & 30_:.Spawn! +n g` & 30_:.Spawn +n g` & 30_:.Spawn +n g'? & :echo ":Spawn" dispatch#spawn_focus(v:count > 1 ? 0 : v:count ? line(".") : -1) +n g'! & 30_:.Spawn! +n g' & 30_:.Spawn +n g' & 30_:.Spawn x gS * :lua MiniSplitjoin.toggle({ region = MiniSplitjoin.get_visual_region() }) Toggle arguments n gS * v:lua.MiniSplitjoin.operator("toggle") . " " @@ -353,6 +387,8 @@ x gx * lua MiniOperators.exchange('visual') Exchange selection n gx * v:lua.MiniOperators.exchange() Exchange operator +o ix (textobj-xmlattr-attr-i) +x ix (textobj-xmlattr-attr-i) o ii * lua MiniIndentscope.textobject(false) Object scope x ii * lua MiniIndentscope.textobject(false) @@ -363,6 +399,10 @@ n j * v:count == 0 ? 'gj' : 'j' x k * v:count == 0 ? 'gk' : 'k' n k * v:count == 0 ? 'gk' : 'k' Move up +n m? & :echo ":Dispatch" dispatch#make_focus(v:count > 1 ? 0 : v:count ? line(".") : -1) +n m! & 30_:.Make! +n m & 30_:.Make +n m & 30_:.Make n shn * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua Highlight next surrounding n sFn * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua @@ -405,12 +445,14 @@ x t * lua MiniJump.smart_jump(false, true) Jump forward till n t * lua MiniJump.smart_jump(false, true) Jump forward till -x zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua - Flash o zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua Flash +x zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua + Flash n zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua Flash +n * :FloatermToggle + Toggle Floaterm v * :m '>+1gv=gv Move Block Down n * :m '>+1gv=gv @@ -450,6 +492,13 @@ x (MatchitVisualBackward) * :call matchit#Match_wrapper('',0,'v')(MatchitVisualForward) * :call matchit#Match_wrapper('',1,'v'):if col("''") != col("$") | exe ":normal! m'" | endifgv`` n (MatchitNormalBackward) * :call matchit#Match_wrapper('',0,'n') n (MatchitNormalForward) * :call matchit#Match_wrapper('',1,'n') +n 30_:. & :=getcmdline() =~ ',' ? "\0250" : "" +o (textobj-xmlattr-attr-i) & 26_(save-cursor-pos):call g:__textobj_xmlattr.do_by_pattern("select","attr-i","o") +v (textobj-xmlattr-attr-i) & 26_(save-cursor-pos):call g:__textobj_xmlattr.do_by_pattern("select","attr-i","v") +o (textobj-xmlattr-attr-a) & 26_(save-cursor-pos):call g:__textobj_xmlattr.do_by_pattern("select","attr-a","o") +v (textobj-xmlattr-attr-a) & 26_(save-cursor-pos):call g:__textobj_xmlattr.do_by_pattern("select","attr-a","v") +n 26_ * 26_ + 26_(save-cursor-pos) * 26_save_cursor_pos() n PlenaryTestFile * :lua require('plenary.test_harness').test_file(vim.fn.expand("%:p")) n * lua MiniMove.move_line('up') Move line up @@ -479,4 +528,4 @@ n * :lua vim.lsp.buf.signature_help() Signature ``` -- Generated on Thu 2 Jan 2025 17:41:13 EET +- Generated on Tue 7 Jan 2025 21:37:18 EET