From 9fe1fed8e884ef4e789470e53df93cf728b1dccb Mon Sep 17 00:00:00 2001 From: RiverMatsumoto Date: Wed, 24 Dec 2025 00:16:51 -1000 Subject: [PATCH] neotree stuff, more similar to my zed workflow --- init.lua | 190 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 152 insertions(+), 38 deletions(-) diff --git a/init.lua b/init.lua index 08867b60..d2e25efe 100644 --- a/init.lua +++ b/init.lua @@ -43,8 +43,23 @@ require('lazy').setup({ 'voldikss/vim-floaterm', 'tpope/vim-fugitive', -- Git wrapper for vim 'rhysd/conflict-marker.vim', -- weapon to fight against merge conflicts + { 'kylechui/nvim-surround', config = true }, { 'numToStr/Comment.nvim', opts = {} }, 'rhysd/git-messenger.vim', -- Shows commit message under cursor + { + 'jackMort/ChatGPT.nvim', + event = 'VeryLazy', + dependencies = { + 'nvim-lua/plenary.nvim', + 'MunifTanjim/nui.nvim', + 'nvim-telescope/telescope.nvim', + }, + config = function() + require('chatgpt').setup { + api_key_cmd = 'echo $OPENAI_API_KEY', + } + end, + }, { 'lewis6991/gitsigns.nvim', -- Similar to fugitive, but adds additiona functionality event = 'VeryLazy', @@ -74,7 +89,12 @@ require('lazy').setup({ 'nvim-telescope/telescope.nvim', }, }, - + { + 'windwp/nvim-autopairs', + config = function() + require('nvim-autopairs').setup {} + end, + }, -- INFO: Enhance Editor Experience { 'iamcco/markdown-preview.nvim', -- Markdown previewer @@ -124,14 +144,44 @@ require('lazy').setup({ }, 'mg979/vim-visual-multi', -- Enable multicursor { - "nvim-neo-tree/neo-tree.nvim", - branch = "v3.x", - dependencies = { - "nvim-lua/plenary.nvim", - "nvim-tree/nvim-web-devicons", -- not strictly required, but recommended - "MunifTanjim/nui.nvim", - -- "3rd/image.nvim", -- Optional image support in preview window: See `# Preview Mode` for more information - } + 'nvim-neo-tree/neo-tree.nvim', + branch = 'v3.x', + dependencies = { + 'nvim-lua/plenary.nvim', + 'nvim-tree/nvim-web-devicons', + 'MunifTanjim/nui.nvim', + }, + opts = { + filesystem = { + filtered_items = { + visible = false, -- fully hide + hide_dotfiles = true, + hide_gitignored = true, + + hide_by_name = { + '.git', + '.elc', + }, + + hide_by_pattern = { + '*.uid', -- ✅ correct + 'node_modules', + }, + }, + }, + }, + }, + { + 'akinsho/bufferline.nvim', + version = '*', + dependencies = 'nvim-tree/nvim-web-devicons', + opts = { + options = { + diagnostics = 'nvim_lsp', + show_buffer_close_icons = false, + show_close_icon = false, + }, + }, }, 'nvim-tree/nvim-web-devicons', -- Add fancy icons -- { @@ -167,22 +217,22 @@ require('lazy').setup({ ---@type Flash.Config opts = {}, keys = { - { - 's', - mode = { 'n', 'x', 'o' }, - function() - require('flash').jump() - end, - desc = 'Flash', - }, - { - 'S', - mode = { 'n', 'x', 'o' }, - function() - require('flash').treesitter() - end, - desc = 'Flash Treesitter', - }, + -- { + -- 's', + -- mode = { 'n', 'x', 'o' }, + -- function() + -- require('flash').jump() + -- end, + -- desc = 'Flash', + -- }, + -- { + -- 'S', + -- mode = { 'n', 'x', 'o' }, + -- function() + -- require('flash').treesitter() + -- end, + -- desc = 'Flash Treesitter', + -- }, { 'r', mode = 'o', @@ -247,7 +297,7 @@ require('lazy').setup({ require('lualine').setup { options = { icons_enabled = true, - theme = 'onedark', + theme = 'gruvbox-material', component_separators = '|', section_separators = '', ignore_focus = { @@ -481,6 +531,7 @@ require('lazy').setup({ 'nvim-telescope/telescope-live-grep-args.nvim', -- Enable passing arguments to ripgrep }, config = function() + local actions = require 'telescope.actions' require('telescope').setup { defaults = { prompt_prefix = '🔍 ', @@ -497,6 +548,18 @@ require('lazy').setup({ path_display = { truncate = 3, }, + mappings = { + i = { + [''] = actions.select_tab, -- open in new tab + [''] = actions.select_vertical, -- open in vsplit + [''] = actions.select_horizontal, -- open in split + }, + n = { + [''] = actions.select_tab, + [''] = actions.select_vertical, + [''] = actions.select_horizontal, + }, + }, }, pickers = { find_files = { @@ -670,7 +733,6 @@ require('lazy').setup({ lua_ls = { settings = { Lua = { - diagnostics = { globals = { 'vim' } }, runtime = { version = 'LuaJIT' }, workspace = { checkThirdParty = false, @@ -682,9 +744,17 @@ require('lazy').setup({ completion = { callSnippet = 'Replace', }, + diagnostics = { + -- Get the language server to recognize the `vim` global + globals = { + 'vim', + 'require', + }, + }, }, }, }, + rust_analyzer = {}, } -- PERF: @@ -966,9 +1036,9 @@ require('lazy').setup({ end require('conform').format { async = true, lsp_fallback = true, range = range } end, { range = true }) - vim.keymap.set('', 'f', function() + vim.keymap.set('', 'fa', function() require('conform').format { async = true, lsp_fallback = true } - end) + end, { desc = '[F]ormat [a]ll' }) end, }, { @@ -1028,6 +1098,8 @@ require('lazy').setup({ 'vimdoc', 'xml', 'yaml', + 'rust', -- add this if you want it for Rust + -- add any others: 'javascript', 'typescript', etc }, -- Autoinstall languages that are not installed. Defaults to false (but you can change for yourself!) @@ -1043,10 +1115,10 @@ require('lazy').setup({ incremental_selection = { enable = true, keymaps = { - init_selection = '', - node_incremental = '', - scope_incremental = '', - node_decremental = '', + init_selection = '', + node_incremental = '', + -- scope_incremental = '', + node_decremental = '', }, }, textobjects = { @@ -1334,8 +1406,8 @@ vim.opt.cursorline = true vim.opt.colorcolumn = '100' -- Prefer spaces of 2 over tabs -vim.opt.tabstop = 2 -vim.opt.shiftwidth = 2 +vim.opt.tabstop = 4 +vim.opt.shiftwidth = 4 vim.opt.expandtab = true -- Render trailing spaces @@ -1664,12 +1736,54 @@ vim.api.nvim_create_autocmd('FileType', { -- Remap copy line vim.api.nvim_set_keymap('n', 'Y', 'yy', { noremap = true, silent = true }) -- Open Neo-tree automatically on startup -vim.cmd('Neotree show') +-- vim.cmd 'Neotree show' vim.api.nvim_set_keymap('i', '{', '{}', { noremap = true, silent = true }) -vim.keymap.set("n", "", "wq") +vim.keymap.set('n', '', 'wqa') -- Quick splits vim.keymap.set('n', 'sv', 'vsplit', { desc = 'Vertical split' }) -vim.keymap.set('n', 'sh', 'split', { desc = 'Horizontal split' }) +vim.keymap.set('n', 'sh', 'split', { desc = 'Horizontal split' }) +local ai_enabled = true + +-- AI toggle +local ai_enabled = true +vim.keymap.set('n', 'at', function() + ai_enabled = not ai_enabled + print(ai_enabled and 'AI enabled' or 'AI disabled') +end, { desc = 'Toggle AI' }) + +-- Safe wrapper +local function ai_safe(cmd) + return function() + if not ai_enabled then + print 'AI is disabled' + return + end + vim.cmd(cmd) + end +end + +-- Keymaps using safe wrapper +vim.keymap.set('n', 'ai', ai_safe 'ChatGPT', { desc = 'Open ChatGPT UI' }) +vim.keymap.set('v', 'ac', ai_safe 'ChatGPTEditWithInstruction', { desc = 'AI edit code' }) +vim.keymap.set('v', 'ae', ai_safe 'ChatGPTExplain', { desc = 'Explain code' }) + +-- creates a new tab +vim.keymap.set('n', 'tn', ':tabnew', { desc = 'New tab' }) +-- closes a tab +vim.keymap.set('n', 'tc', ':tabclose', { desc = 'Close tab' }) + +-- kills floaterms +vim.keymap.set('n', 'fk', ':FloatermKill!', { desc = 'Kill all floaterms' }) + +vim.keymap.set('x', 'S', '(nvim-surround-visual)', { remap = true }) + +-- delete by word with ctrl backspace +vim.keymap.set('i', '', '', { noremap = true }) +vim.keymap.set('c', '', '', { noremap = true }) + +-- switch buffers quicker with shift+tab +vim.keymap.set('n', '', 'BufferLineCycleNext') +vim.keymap.set('n', '', 'BufferLineCyclePrev')