From c6356a5d0831ea2291cf7634e8d3abe6cdd81d57 Mon Sep 17 00:00:00 2001 From: morfize <233522679+morfize@users.noreply.github.com> Date: Fri, 26 Dec 2025 11:35:19 +0900 Subject: [PATCH] update --- init.lua | 94 +++++- lua/custom/plugins/copilot.lua | 15 + lua/custom/plugins/init.lua | 35 +-- lua/custom/plugins/snacks.lua | 1 + lua/custom/plugins/tree-sitter-d2.lua | 2 + lua/kickstart/plugins/lint.lua | 12 + lua/kickstart/plugins/neo-tree.lua | 410 +++++++++++++++++++++++++- 7 files changed, 531 insertions(+), 38 deletions(-) diff --git a/init.lua b/init.lua index a649fe90..94f04d74 100644 --- a/init.lua +++ b/init.lua @@ -699,6 +699,80 @@ require('lazy').setup({ }, }, }, + bashls = { + -- cmd = {}, + filetypes = { 'bash', 'zsh', 'sh' }, + -- capabilities = {}, + -- settings = {}, + }, + yamlls = {}, + taplo = { -- for TOML + cmd = { 'taplo', 'lsp', 'stdio' }, + filetypes = { 'toml' }, + capabilities = {}, + settings = {}, + }, + rust_analyzer = { + cmd = {}, + filetypes = {}, + capabilities = {}, + settings = { + ['rust-analyzer'] = { + checkOnSave = { + enable = true, + }, + diagnostics = { + enable = true, + underline = false, + }, + imports = { + granularity = { + group = 'module', + }, + prefix = 'self', + }, + cargo = { + buildScripts = { + enable = true, + }, + }, + procMacro = { + enable = true, + }, + }, + }, + }, + hls = { + cmd = { 'haskell-language-server-wrapper', '--lsp' }, + filetypes = { 'haskell', 'lhaskell', 'cabal' }, + capabilities = {}, + root_dir = function(bufnr, on_dir) + local fname = vim.api.nvim_buf_get_name(bufnr) + local util = require 'neovim.util' + on_dir(util.root_pattern('hie.yaml', 'stack.yaml', 'cabal.project', '*.cabal', 'package.yaml')(fname)) + end, + settings = { + haskell = { + cabalFormattingProvider = 'cabalfmt', + formattingProvider = 'ormolu', + }, + }, + }, + tinymist = { + cmd = { 'tinymist' }, + filetypes = { 'typ' }, + settings = { + formatterMode = 'typStyle', + exportPdf = 'onType', + semanticTokens = 'disable', + }, + }, + -- vale_ls = { + -- cmd = { 'vale', 'lsp' }, + -- filetypes = { 'markdown', 'mdx' }, + -- capabilities = {}, + -- settings = {}, + -- }, } -- Ensure the servers and tools above are installed @@ -717,6 +791,10 @@ require('lazy').setup({ local ensure_installed = vim.tbl_keys(servers or {}) vim.list_extend(ensure_installed, { 'stylua', -- Used to format Lua code + 'beautysh', + 'markdownlint', + 'hlint', + 'tinymist', }) require('mason-tool-installer').setup { ensure_installed = ensure_installed } @@ -769,6 +847,7 @@ require('lazy').setup({ end, formatters_by_ft = { lua = { 'stylua' }, + markdown = { 'markdownlint' }, -- Conform can also run multiple formatters sequentially -- python = { "isort", "black" }, -- @@ -946,7 +1025,20 @@ require('lazy').setup({ config = function() local ts = require 'nvim-treesitter' ts.setup {} - ts.install({ 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' }):wait(30000) + ts.install({ + 'bash', + 'c', + 'diff', + 'html', + 'lua', + 'luadoc', + 'markdown', + 'markdown_inline', + 'query', + 'vim', + 'vimdoc', + 'd2', + }):wait(30000) end, -- There are additional nvim-treesitter modules that you can use to interact diff --git a/lua/custom/plugins/copilot.lua b/lua/custom/plugins/copilot.lua index 39d90bed..c46af996 100644 --- a/lua/custom/plugins/copilot.lua +++ b/lua/custom/plugins/copilot.lua @@ -92,5 +92,20 @@ return { }, server_opts_overrides = {}, } + -- CopilotChat.nvim + local map = vim.keymap.set + local opts = { noremap = true, silent = true } + + map('n', 'cci', 'CopilotChat ', { desc = ':CopilotChat', unpack(opts) }) + map('n', 'cco', 'CopilotChatOpen', { desc = ':CopilotChatOpen', unpack(opts) }) + map('n', 'ccq', 'CopilotChatClose', { desc = ':CopilotChatClose', unpack(opts) }) + map('n', 'cct', 'CopilotChatToggle', { desc = ':CopilotChatToggle', unpack(opts) }) + map('n', 'ccs', 'CopilotChatStop', { desc = ':CopilotChatStop', unpack(opts) }) + map('n', 'ccr', 'CopilotChatReset', { desc = ':CopilotChatReset', unpack(opts) }) + map('n', 'ccS', 'CopilotChatSave ', { desc = 'Save Copilot Chat history', noremap = true, silent = false }) + map('n', 'ccL', 'CopilotChatLoad ', { desc = 'Load Copilot Chat history', noremap = true, silent = false }) + map('n', 'ccp', 'CopilotChatPrompts', { desc = 'Copilot Chat prompt templates', unpack(opts) }) + map('n', 'ccm', 'CopilotChatModels', { desc = 'Copilot Chat models', unpack(opts) }) + map('n', 'ccE', 'CopilotChat', { desc = 'Copilot Chat prompt template', noremap = true, silent = false }) end, } diff --git a/lua/custom/plugins/init.lua b/lua/custom/plugins/init.lua index 489beffa..3e8dfe53 100644 --- a/lua/custom/plugins/init.lua +++ b/lua/custom/plugins/init.lua @@ -46,30 +46,19 @@ map('n', 'V', 'ToggleTerm size=80 direction=vertical', { desc = map('n', '', 'ToggleTerm direction=float', { desc = 'Open Terminal floating' }) map('t', '', 'ToggleTerm direction=float', { desc = 'Open Terminal floating' }) --- CopilotChat.nvim -map('n', 'cci', 'CopilotChat ', { desc = ':CopilotChat', unpack(opts) }) -map('n', 'cco', 'CopilotChatOpen', { desc = ':CopilotChatOpen', unpack(opts) }) -map('n', 'ccq', 'CopilotChatClose', { desc = ':CopilotChatClose', unpack(opts) }) -map('n', 'cct', 'CopilotChatToggle', { desc = ':CopilotChatToggle', unpack(opts) }) -map('n', 'ccs', 'CopilotChatStop', { desc = ':CopilotChatStop', unpack(opts) }) -map('n', 'ccr', 'CopilotChatReset', { desc = ':CopilotChatReset', unpack(opts) }) -map('n', 'ccS', 'CopilotChatSave ', { desc = 'Save Copilot Chat history', noremap = true, silent = false }) -map('n', 'ccL', 'CopilotChatLoad ', { desc = 'Load Copilot Chat history', noremap = true, silent = false }) -map('n', 'ccp', 'CopilotChatPrompts', { desc = 'Copilot Chat prompt templates', unpack(opts) }) -map('n', 'ccm', 'CopilotChatModels', { desc = 'Copilot Chat models', unpack(opts) }) -map('n', 'ccE', 'CopilotChat', { desc = 'Copilot Chat prompt template', noremap = true, silent = false }) +-- NOTE: macos like keybindings for text editing in insert mode + +-- map('i', '', '^', opts) +-- map('i', '', '$', opts) +-- map('i', '', 'D', opts) +-- map('i', '', 'd0', opts) +-- map('i', '', '', opts) +-- map('i', '', '', opts) +-- map('i', '', '', opts) +-- map('i', '', '', opts) +-- map('i', '', '', opts) +-- map('i', '', '', opts) --- macos like keybindings for text editing in insert mode -map('i', '', '^', opts) -map('i', '', '$', opts) -map('i', '', 'D', opts) -map('i', '', 'd0', opts) -map('i', '', '', opts) -map('i', '', '', opts) -map('i', '', '', opts) -map('i', '', '', opts) -map('i', '', '', opts) -map('i', '', '', opts) -- NOTE: keymaps end -- NOTE: neovide diff --git a/lua/custom/plugins/snacks.lua b/lua/custom/plugins/snacks.lua index d1c190f1..618edd6a 100644 --- a/lua/custom/plugins/snacks.lua +++ b/lua/custom/plugins/snacks.lua @@ -10,6 +10,7 @@ return { bigfile = { enabled = true }, dashboard = { enabled = true }, explorer = { enabled = true }, + image = { enabled = false }, indent = { enabled = true }, input = { enabled = true }, picker = { enabled = true }, diff --git a/lua/custom/plugins/tree-sitter-d2.lua b/lua/custom/plugins/tree-sitter-d2.lua index 312d1201..c7ea87b7 100644 --- a/lua/custom/plugins/tree-sitter-d2.lua +++ b/lua/custom/plugins/tree-sitter-d2.lua @@ -1,7 +1,9 @@ return { 'ravsii/tree-sitter-d2', + lazy = 'VeryLazy', enable = true, ft = { 'd2', 'md' }, + version = '*', dependencies = { 'nvim-treesitter/nvim-treesitter' }, build = 'make nvim-install', } diff --git a/lua/kickstart/plugins/lint.lua b/lua/kickstart/plugins/lint.lua index dec42f09..5abd000f 100644 --- a/lua/kickstart/plugins/lint.lua +++ b/lua/kickstart/plugins/lint.lua @@ -7,6 +7,18 @@ return { local lint = require 'lint' lint.linters_by_ft = { markdown = { 'markdownlint' }, + mdx = { 'markdownlint' }, + haskell = { 'hlint' }, + typ = { 'tinymist' }, + } + local markdownlint = require 'lint.linters.markdownlint' + markdownlint.args = { + '--disable', + 'MD013', -- Line length + 'MD024', -- Multiple headers with the same content + 'MD025', -- Multiple top level headers in the same document + 'MD033', -- Inline HTML + -- 'MD041', -- First line in file should be a top level header } -- To allow other plugins to add linters to require('lint').linters_by_ft, diff --git a/lua/kickstart/plugins/neo-tree.lua b/lua/kickstart/plugins/neo-tree.lua index c7067891..cf4ddfd2 100644 --- a/lua/kickstart/plugins/neo-tree.lua +++ b/lua/kickstart/plugins/neo-tree.lua @@ -2,24 +2,406 @@ -- https://github.com/nvim-neo-tree/neo-tree.nvim return { - 'nvim-neo-tree/neo-tree.nvim', - version = '*', - dependencies = { - 'nvim-lua/plenary.nvim', - 'nvim-tree/nvim-web-devicons', -- not strictly required, but recommended - 'MunifTanjim/nui.nvim', - }, - lazy = false, - keys = { - { '\\', ':Neotree reveal', desc = 'NeoTree reveal', silent = true }, - }, - opts = { - filesystem = { + { + 'nvim-neo-tree/neo-tree.nvim', + lazy = false, + branch = 'v3.x', + dependencies = { + 'nvim-lua/plenary.nvim', + 'nvim-tree/nvim-web-devicons', -- not strictly required, but recommended + 'MunifTanjim/nui.nvim', + }, + cmd = 'Neotree', + ---@module 'neo-tree' + ---@type neotree.Config + opts = { + close_if_last_window = true, -- Close Neo-tree if it is the last window left in the tab + popup_border_style = 'NC', -- or "" to use 'winborder' on Neovim v0.11+ + clipboard = { + sync = 'none', -- or "global"/"universal" to share a clipboard for each/all Neovim instance(s), respectively + }, + enable_git_status = true, + enable_diagnostics = true, + open_files_do_not_replace_types = { 'terminal', 'trouble', 'qf' }, -- when opening files, do not use windows containing these filetypes or buftypes + open_files_using_relative_paths = false, + sort_case_insensitive = false, -- used when sorting files and directories in the tree + sort_function = nil, -- use a custom function for sorting files and directories in the tree + -- sort_function = function (a,b) + -- if a.type == b.type then + -- return a.path > b.path + -- else + -- return a.type > b.type + -- end + -- end , -- this sorts files and directories descendantly + default_component_configs = { + container = { + enable_character_fade = true, + }, + indent = { + indent_size = 2, + padding = 1, -- extra padding on left hand side + -- indent guides + with_markers = true, + indent_marker = '│', + last_indent_marker = '└', + highlight = 'NeoTreeIndentMarker', + -- expander config, needed for nesting files + with_expanders = nil, -- if nil and file nesting is enabled, will enable expanders + expander_collapsed = '', + expander_expanded = '', + expander_highlight = 'NeoTreeExpander', + }, + icon = { + folder_closed = '', + folder_open = '', + folder_empty = '󰜌', + provider = function(icon, node, state) -- default icon provider utilizes nvim-web-devicons if available + if node.type == 'file' or node.type == 'terminal' then + local success, web_devicons = pcall(require, 'nvim-web-devicons') + local name = node.type == 'terminal' and 'terminal' or node.name + if success then + local devicon, hl = web_devicons.get_icon(name) + icon.text = devicon or icon.text + icon.highlight = hl or icon.highlight + end + end + end, + -- The next two settings are only a fallback, if you use nvim-web-devicons and configure default icons there + -- then these will never be used. + default = '*', + highlight = 'NeoTreeFileIcon', + use_filtered_colors = true, -- Whether to use a different highlight when the file is filtered (hidden, dotfile, etc.). + }, + modified = { + symbol = '[+]', + highlight = 'NeoTreeModified', + }, + name = { + trailing_slash = false, + use_filtered_colors = true, -- Whether to use a different highlight when the file is filtered (hidden, dotfile, etc.). + use_git_status_colors = true, + highlight = 'NeoTreeFileName', + }, + git_status = { + symbols = { + -- Change type + added = '', -- or "✚" + modified = '', -- or "" + deleted = '✖', -- this can only be used in the git_status source + renamed = '󰁕', -- this can only be used in the git_status source + -- Status type + untracked = '', + ignored = '', + unstaged = '󰄱', + staged = '', + conflict = '', + }, + }, + -- If you don't want to use these columns, you can set `enabled = false` for each of them individually + file_size = { + enabled = true, + width = 12, -- width of the column + required_width = 64, -- min width of window required to show this column + }, + type = { + enabled = true, + width = 10, -- width of the column + required_width = 122, -- min width of window required to show this column + }, + last_modified = { + enabled = true, + width = 20, -- width of the column + required_width = 88, -- min width of window required to show this column + }, + created = { + enabled = true, + width = 20, -- width of the column + required_width = 110, -- min width of window required to show this column + }, + symlink_target = { + enabled = false, + }, + }, + -- A list of functions, each representing a global custom command + -- that will be available in all sources (if not overridden in `opts[source_name].commands`) + -- see `:h neo-tree-custom-commands-global` + commands = {}, window = { + position = 'left', + width = 40, + mapping_options = { + noremap = true, + nowait = true, + }, mappings = { - ['\\'] = 'close_window', + [''] = { + 'toggle_node', + nowait = false, -- disable `nowait` if you have existing combos starting with this char that you want to use + }, + ['<2-LeftMouse>'] = 'open', + [''] = 'open', + [''] = 'cancel', -- close preview or floating neo-tree window + ['P'] = { + 'toggle_preview', + config = { + use_float = true, + use_snacks_image = true, + use_image_nvim = true, + }, + }, + -- Read `# Preview Mode` for more information + ['l'] = 'focus_preview', + ['S'] = 'open_split', + ['s'] = 'open_vsplit', + -- ["S"] = "split_with_window_picker", + -- ["s"] = "vsplit_with_window_picker", + ['t'] = 'open_tabnew', + -- [""] = "open_drop", + -- ["t"] = "open_tab_drop", + ['w'] = 'open_with_window_picker', + --["P"] = "toggle_preview", -- enter preview mode, which shows the current node without focusing + ['C'] = 'close_node', + -- ['C'] = 'close_all_subnodes', + ['z'] = 'close_all_nodes', + --["Z"] = "expand_all_nodes", + --["Z"] = "expand_all_subnodes", + ['a'] = { + 'add', + -- this command supports BASH style brace expansion ("x{a,b,c}" -> xa,xb,xc). see `:h neo-tree-file-actions` for details + -- some commands may take optional config options, see `:h neo-tree-mappings` for details + config = { + show_path = 'none', -- "none", "relative", "absolute" + }, + }, + ['A'] = 'add_directory', -- also accepts the optional config.show_path option like "add". this also supports BASH style brace expansion. + ['d'] = 'delete', + ['r'] = 'rename', + ['b'] = 'rename_basename', + ['y'] = 'copy_to_clipboard', + ['x'] = 'cut_to_clipboard', + ['p'] = 'paste_from_clipboard', + [''] = 'clear_clipboard', + ['c'] = 'copy', -- takes text input for destination, also accepts the optional config.show_path option like "add": + -- ["c"] = { + -- "copy", + -- config = { + -- show_path = "none" -- "none", "relative", "absolute" + -- } + --} + ['m'] = 'move', -- takes text input for destination, also accepts the optional config.show_path option like "add". + ['q'] = 'close_window', + ['R'] = 'refresh', + ['?'] = 'show_help', + ['<'] = 'prev_source', + ['>'] = 'next_source', + ['i'] = 'show_file_details', + -- ["i"] = { + -- "show_file_details", + -- -- format strings of the timestamps shown for date created and last modified (see `:h os.date()`) + -- -- both options accept a string or a function that takes in the date in seconds and returns a string to display + -- -- config = { + -- -- created_format = "%Y-%m-%d %I:%M %p", + -- -- modified_format = "relative", -- equivalent to the line below + -- -- modified_format = function(seconds) return require('neo-tree.utils').relative_date(seconds) end + -- -- } + -- }, + }, + }, + nesting_rules = {}, + filesystem = { + filtered_items = { + visible = false, -- when true, they will just be displayed differently than normal items + hide_dotfiles = true, + hide_gitignored = true, + hide_ignored = true, -- hide files that are ignored by other gitignore-like files + -- other gitignore-like files, in descending order of precedence. + ignore_files = { + '.neotreeignore', + '.ignore', + -- ".rgignore" + }, + hide_hidden = true, -- only works on Windows for hidden files/directories + hide_by_name = { + --"node_modules" + }, + hide_by_pattern = { -- uses glob style patterns + --"*.meta", + --"*/src/*/tsconfig.json", + }, + always_show = { -- remains visible even if other settings would normally hide it + --".gitignored", + }, + always_show_by_pattern = { -- uses glob style patterns + --".env*", + }, + never_show = { -- remains hidden even if visible is toggled to true, this overrides always_show + --".DS_Store", + --"thumbs.db" + }, + never_show_by_pattern = { -- uses glob style patterns + --".null-ls_*", + }, + }, + follow_current_file = { + enabled = false, -- This will find and focus the file in the active buffer every time + -- -- the current file is changed while the tree is open. + leave_dirs_open = false, -- `false` closes auto expanded dirs, such as with `:Neotree reveal` + }, + group_empty_dirs = false, -- when true, empty folders will be grouped together + hijack_netrw_behavior = 'open_default', -- netrw disabled, opening a directory opens neo-tree + -- in whatever position is specified in window.position + -- "open_current", -- netrw disabled, opening a directory opens within the + -- window like netrw would, regardless of window.position + -- "disabled", -- netrw left alone, neo-tree does not handle opening dirs + use_libuv_file_watcher = false, -- This will use the OS level file watchers to detect changes + -- instead of relying on nvim autocmd events. + hide_by_name = { + 'node_modules', + '.DS_Store', + }, + window = { + mappings = { + [''] = 'navigate_up', + ['.'] = 'set_root', + ['H'] = 'toggle_hidden', + ['/'] = 'fuzzy_finder', + ['D'] = 'fuzzy_finder_directory', + ['#'] = 'fuzzy_sorter', -- fuzzy sorting using the fzy algorithm + -- ["D"] = "fuzzy_sorter_directory", + ['f'] = 'filter_on_submit', + [''] = 'clear_filter', + ['[g'] = 'prev_git_modified', + [']g'] = 'next_git_modified', + ['o'] = { + 'show_help', + nowait = false, + config = { title = 'Order by', prefix_key = 'o' }, + }, + ['oc'] = { 'order_by_created', nowait = false }, + ['od'] = { 'order_by_diagnostics', nowait = false }, + ['og'] = { 'order_by_git_status', nowait = false }, + ['om'] = { 'order_by_modified', nowait = false }, + ['on'] = { 'order_by_name', nowait = false }, + ['os'] = { 'order_by_size', nowait = false }, + ['ot'] = { 'order_by_type', nowait = false }, + -- [''] = function(state) ... end, + ['\\'] = 'close_window', + ['e'] = 'close_window', + }, + fuzzy_finder_mappings = { -- define keymaps for filter popup window in fuzzy_finder_mode + [''] = 'move_cursor_down', + [''] = 'move_cursor_down', + [''] = 'move_cursor_up', + [''] = 'move_cursor_up', + [''] = 'close', + [''] = 'close_keep_filter', + [''] = 'close_clear_filter', + [''] = { '', raw = true }, + { + -- normal mode mappings + n = { + ['j'] = 'move_cursor_down', + ['k'] = 'move_cursor_up', + [''] = 'close_keep_filter', + [''] = 'close_clear_filter', + [''] = 'close', + }, + }, + -- [""] = "noop", -- if you want to use normal mode + -- ["key"] = function(state, scroll_padding) ... end, + }, + }, + + commands = {}, -- Add a custom command or override a global one using the same function name + }, + buffers = { + follow_current_file = { + enabled = true, -- This will find and focus the file in the active buffer every time + -- -- the current file is changed while the tree is open. + leave_dirs_open = false, -- `false` closes auto expanded dirs, such as with `:Neotree reveal` + }, + group_empty_dirs = true, -- when true, empty folders will be grouped together + show_unloaded = true, + window = { + mappings = { + ['d'] = 'buffer_delete', + ['bd'] = 'buffer_delete', + [''] = 'navigate_up', + ['.'] = 'set_root', + ['o'] = { + 'show_help', + nowait = false, + config = { title = 'Order by', prefix_key = 'o' }, + }, + ['oc'] = { 'order_by_created', nowait = false }, + ['od'] = { 'order_by_diagnostics', nowait = false }, + ['om'] = { 'order_by_modified', nowait = false }, + ['on'] = { 'order_by_name', nowait = false }, + ['os'] = { 'order_by_size', nowait = false }, + ['ot'] = { 'order_by_type', nowait = false }, + }, + }, + }, + git_status = { + window = { + position = 'float', + mappings = { + ['A'] = 'git_add_all', + ['gu'] = 'git_unstage_file', + ['gU'] = 'git_undo_last_commit', + ['ga'] = 'git_add_file', + ['gt'] = 'git_toggle_file_stage', + ['gr'] = 'git_revert_file', + ['gc'] = 'git_commit', + ['gp'] = 'git_push', + ['gg'] = 'git_commit_and_push', + ['o'] = { + 'show_help', + nowait = false, + config = { title = 'Order by', prefix_key = 'o' }, + }, + ['oc'] = { 'order_by_created', nowait = false }, + ['od'] = { 'order_by_diagnostics', nowait = false }, + ['om'] = { 'order_by_modified', nowait = false }, + ['on'] = { 'order_by_name', nowait = false }, + ['os'] = { 'order_by_size', nowait = false }, + ['ot'] = { 'order_by_type', nowait = false }, + }, }, }, }, + keys = { + { '\\', ':Neotree reveal position=right', desc = 'NeoTree reveal', silent = true }, + { 'e', ':Neotree reveal position=right', desc = 'NeoTree reveal', silent = true }, + }, + }, + { + 'antosha417/nvim-lsp-file-operations', + dependencies = { + 'nvim-lua/plenary.nvim', + 'nvim-neo-tree/neo-tree.nvim', -- makes sure that this loads after Neo-tree. + }, + config = function() + require('lsp-file-operations').setup() + end, + }, + { + 's1n7ax/nvim-window-picker', + version = '2.*', + config = function() + require('window-picker').setup { + filter_rules = { + include_current_win = false, + autoselect_one = true, + -- filter using buffer options + bo = { + -- if the file type is one of following, the window will be ignored + filetype = { 'neo-tree', 'neo-tree-popup', 'notify' }, + -- if the buffer type is one of following, the window will be ignored + buftype = { 'terminal', 'quickfix' }, + }, + }, + } + end, }, }