-- This is a mega file. Rather than make each plugin have its own config file, -- which is how I managed my packer-based nvim config prior to Nix, I'm -- putting everything in here in sections and themed functions. It just makes it -- easier for me to quickly update things and it's cleaner when there's -- interdependencies between plugins. We'll see how it goes. local M = {} local signs = require("pwnvim.signs") ----------------------- UI -------------------------------- -- Tree, GitSigns, Indent markers, Colorizer, bufferline, lualine, treesitter M.ui = function() -- following options are the default -- each of these are documented in `:help nvim-tree.OPTION_NAME` -- local nvim_tree_config = require("nvim-tree.config") -- local tree_cb = nvim_tree_config.nvim_tree_callback require("pwnvim.plugins.nvim-tree") require("nvim-surround").setup({ aliases = { ["e"] = "**" -- e for emphasis -- bold in markdown } }) require("pwnvim.plugins.todo-comments") require("pwnvim.plugins.gitsigns") require("diffview").setup {} if not SimpleUI then require("colorizer").setup({}) end require("pwnvim.plugins.lualine") require("pwnvim.plugins.treesitter") require("pwnvim.plugins.bufferline") end -- UI setup ----------------------- DIAGNOSTICS -------------------------------- M.diagnostics = function() -- IMPORTANT: make sure to setup neodev BEFORE lspconfig require("neodev").setup({ -- help for neovim lua api override = function(root_dir, library) if string.match(root_dir, "neovim") or string.match(root_dir, "pwnvim") or string.match(root_dir, "lua") then library.enabled = true library.plugins = true library.types = true library.runtime = true end end, lspconfig = true }) require "fidget".setup {} -- shows status of lsp clients as they issue updates vim.diagnostic.config({ virtual_text = false, signs = { active = { signs.signs } }, update_in_insert = true, underline = true, severity_sort = true, float = { focusable = false, style = "minimal", border = "rounded", source = "always", header = "", prefix = "" } }) vim.lsp.handlers["textDocument/hover"] = vim.lsp.with( vim.lsp.handlers.hover, { border = "rounded" }) vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, { border = "rounded" }) require("trouble").setup { group = true, -- group results by file icons = true, auto_preview = true, signs = { error = signs.error, warning = signs.warn, hint = signs.hint, information = signs.info, other = "﫠" } } local function attached(client, bufnr) local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end local opts = { noremap = true, silent = false } if client.name == "tsserver" or client.name == "jsonls" or client.name == "nil" or client.name == "eslint" or client.name == "html" or client.name == "cssls" or client.name == "tailwindcss" then -- Most of these are being turned off because prettier handles the use case better client.server_capabilities.documentFormattingProvider = false client.server_capabilities.documentRangeFormattingProvider = false else client.server_capabilities.documentFormattingProvider = true client.server_capabilities.documentRangeFormattingProvider = true require("lsp-format").on_attach(client) end print("LSP attached " .. client.name) vim.api.nvim_buf_set_option(bufnr, "formatexpr", "v:lua.vim.lsp.formatexpr()") vim.api.nvim_buf_set_option(bufnr, "omnifunc", "v:lua.vim.lsp.omnifunc") vim.api.nvim_buf_set_option(bufnr, "tagfunc", "v:lua.vim.lsp.tagfunc") local which_key = require("which-key") local local_leader_opts = { mode = "n", -- NORMAL mode prefix = "", buffer = bufnr, -- Local mappings. silent = true, -- use `silent` when creating keymaps noremap = true, -- use `noremap` when creating keymaps nowait = true -- use `nowait` when creating keymaps } local local_leader_opts_visual = { mode = "v", -- VISUAL mode prefix = "", buffer = bufnr, -- Local mappings. silent = true, -- use `silent` when creating keymaps noremap = true, -- use `noremap` when creating keymaps nowait = true -- use `nowait` when creating keymaps } require("symbols-outline").setup({ keymaps = { close = { "", "q", "#7" } } }) local leader_mappings = { ["q"] = { "TroubleToggle", "Show Trouble list" }, l = { name = "Local LSP", s = { "SymbolsOutline", "Show Symbols" }, d = { "lua vim.lsp.buf.definition()", "Go to definition" }, D = { "lua vim.lsp.buf.implementation()", "Implementation" }, i = { "lua vim.lsp.buf.hover()", "Info hover" }, I = { "Telescope lsp_implementations", "Implementations" }, r = { "Telescope lsp_references", "References" }, f = { "Lspsaga code_action", "Fix Code Actions" }, t = { "lua vim.lsp.buf.signature_help()", "Signature" }, e = { "lua vim.diagnostic.open_float()", "Show Line Diags" } }, f = { ["sd"] = { "Telescope lsp_document_symbols", "Find symbol in document" }, ["sw"] = { "Telescope lsp_workspace_symbols", "Find symbol in workspace" } } } which_key.register(leader_mappings, local_leader_opts) -- Create a new note after asking for its title. buf_set_keymap('', "#7", "SymbolsOutline", opts) buf_set_keymap('!', "#7", "SymbolsOutline", opts) buf_set_keymap('', 'K', 'lua vim.lsp.buf.hover()', opts) -- override standard tag jump buf_set_keymap('', 'C-]', 'lua vim.lsp.buf.definition()', opts) buf_set_keymap('!', 'C-]', 'lua vim.lsp.buf.definition()', opts) -- Set some keybinds conditional on server capabilities if client.server_capabilities.document_formatting then which_key.register({ l = { ["="] = { "lua vim.lsp.buf.formatting_sync()", "Format" } } }, local_leader_opts) -- vim.cmd([[ -- augroup LspFormatting -- autocmd! * -- autocmd BufWritePre lua vim.lsp.buf.formatting_sync() -- augroup END -- ]]) end if client.server_capabilities.implementation then which_key.register({ l = { ["I"] = { "Telescope lsp_implementations", "Implementations" } } }, local_leader_opts) end if client.server_capabilities.document_range_formatting then which_key.register({ l = { ["="] = { "lua vim.lsp.buf.range_formatting()", "Format Range" } } }, local_leader_opts_visual) end if client.server_capabilities.rename then which_key.register({ l = { ["R"] = { "lua vim.lsp.buf.rename()", "Rename" } } }, local_leader_opts) end end -- LSP stuff - minimal with defaults for now local null_ls = require("null-ls") -- https://github.com/jose-elias-alvarez/null-ls.nvim/tree/main/lua/null-ls/builtins/formatting local formatting = null_ls.builtins.formatting -- https://github.com/jose-elias-alvarez/null-ls.nvim/tree/main/lua/null-ls/builtins/diagnostics local diagnostics = null_ls.builtins.diagnostics local codeactions = null_ls.builtins.code_actions require("lsp-format").setup {} null_ls.setup { debug = false, sources = { -- formatting.lua_format, formatting.alejandra, -- for nix formatting.prismaFmt, -- for node prisma db orm formatting.prettier.with { -- extra_args = { -- "--use-tabs", "--single-quote", "--jsx-single-quote" -- }, -- Disable markdown because formatting on save conflicts in weird ways -- with the taskwiki (roam-task) stuff. filetypes = { "javascript", "javascriptreact", "typescript", "typescriptreact", "vue", "scss", "less", "html", "css", "json", "jsonc", "yaml", "graphql", "handlebars", "svelte" }, disabled_filetypes = { "markdown" } }, diagnostics.eslint_d.with { args = { "-f", "json", "--stdin", "--stdin-filename", "$FILENAME" } }, -- diagnostics.vale, codeactions.eslint_d, codeactions.gitsigns, codeactions.statix, -- for nix diagnostics.statix, -- for nix null_ls.builtins.hover.dictionary, codeactions.shellcheck, diagnostics.shellcheck -- removed formatting.rustfmt since rust_analyzer seems to do the same thing }, on_attach = attached } local lspconfig = require("lspconfig") local cmp_nvim_lsp = require("cmp_nvim_lsp") local capabilities = vim.tbl_extend('keep', vim.lsp.protocol .make_client_capabilities(), cmp_nvim_lsp.default_capabilities()); -- require('rust-tools').setup({ -- server = { -- on_attach = attached, -- capabilities = capabilities, -- standalone = false -- }, -- tools = { -- autoSetHints = true, -- inlay_hints = { auto = true, only_current_line = true }, -- runnables = { use_telescope = true } -- } -- }) require('crates').setup {} require('cmp-npm').setup({}) lspconfig.tsserver.setup { capabilities = capabilities, on_attach = attached } lspconfig.lua_ls.setup { on_attach = attached, capabilities = capabilities, filetypes = { "lua" }, settings = { Lua = { runtime = { -- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim) version = 'LuaJIT' }, diagnostics = { -- Get the language server to recognize the `vim` global globals = { 'vim', "string", "require" } }, workspace = { -- Make the server aware of Neovim runtime files library = vim.api.nvim_get_runtime_file("", true), checkThirdParty = false }, -- Do not send telemetry data containing a randomized but unique identifier telemetry = { enable = false }, completion = { enable = true, callSnippet = "Replace" } } } } lspconfig.tailwindcss.setup { on_attach = attached, capabilities = capabilities, settings = { files = { exclude = { "**/.git/**", "**/node_modules/**", "**/*.md" } } } } -- nil_ls is a nix lsp lspconfig.nil_ls.setup { on_attach = attached, capabilities = capabilities } lspconfig.cssls.setup { on_attach = attached, capabilities = capabilities, settings = { css = { lint = { unknownAtRules = "ignore" } } } } lspconfig.eslint.setup { on_attach = attached, capabilities = capabilities } lspconfig.html.setup { on_attach = attached, capabilities = capabilities } lspconfig.bashls.setup { on_attach = attached, capabilities = capabilities } -- TODO: investigate nvim-metals and remove line below lspconfig.metals.setup { on_attach = attached, capabilities = capabilities } -- for scala lspconfig.pylsp.setup { on_attach = attached, capabilities = capabilities } -- for python lspconfig.jsonls.setup { on_attach = attached, settings = { json = { schemas = require('schemastore').json.schemas(), validate = { enable = true } } }, setup = { commands = { Format = { function() vim.lsp.buf.range_formatting({}, { 0, 0 }, { vim.fn.line "$", 0 }) end } } }, capabilities = capabilities } lspconfig.terraformls.setup { on_attach = attached, capabilities = capabilities } -- terraform lsp lspconfig.tflint.setup { on_attach = attached, capabilities = capabilities } -- terraform lsp require 'lspsaga'.init_lsp_saga({ use_saga_diagnostic_sign = not SimpleUI, use_diagnostic_virtual_text = false, code_action_prompt = { enable = true, sign = false, sign_priority = 20, virtual_text = true } -- TODO: re-enable this at next update - getting error 2022-08-02 -- code_action_lightbulb = { -- enable = false, -- sign = true, -- enable_in_insert = true, -- sign_priority = 20, -- virtual_text = false, -- }, }) end -- Diagnostics setup ----------------------- TELESCOPE -------------------------------- M.telescope = function() local actions = require('telescope.actions') local action_state = require('telescope.actions.state') local function quicklook_selected_entry(prompt_bufnr) local entry = action_state.get_selected_entry() -- actions.close(prompt_bufnr) vim.cmd("silent !qlmanage -p '" .. entry.value .. "'") end local function yank_selected_entry(prompt_bufnr) local entry = action_state.get_selected_entry() actions.close(prompt_bufnr) -- Put it in the unnamed buffer and the system clipboard both vim.api.nvim_call_function("setreg", { '"', entry.value }) vim.api.nvim_call_function("setreg", { "*", entry.value }) end local function system_open_selected_entry(prompt_bufnr) local entry = action_state.get_selected_entry() actions.close(prompt_bufnr) os.execute("open '" .. entry.value .. "'") end require('telescope').setup { file_ignore_patterns = { "*.bak", ".git/", "node_modules", ".zk/", "Caches/" }, prompt_prefix = SimpleUI and ">" or " ", selection_caret = SimpleUI and "↪" or " ", -- path_display = { "smart" }, defaults = { path_display = function(_, path) local tail = require("telescope.utils").path_tail(path) return string.format("%s (%s)", tail, require("telescope.utils").path_smart( path:gsub("/Users/[^/]*/", "~/"):gsub( "/[^/]*$", ""):gsub( "/Library/Containers/co.noteplan.NotePlan3/Data/Library/Application Support/co.noteplan.NotePlan3", "/NotePlan"))) end, -- path_display = { "truncate" }, mappings = { n = { [""] = yank_selected_entry, [""] = system_open_selected_entry, [""] = quicklook_selected_entry, ["q"] = require("telescope.actions").close }, i = { [""] = yank_selected_entry, [""] = quicklook_selected_entry, [""] = system_open_selected_entry } }, vimgrep_arguments = { "rg", "--color=never", "--no-heading", "--with-filename", "--line-number", "--column", "--smart-case" }, -- Telescope smart history history = { path = '~/.local/share/nvim/databases/telescope_history.sqlite3', limit = 100 }, layout_strategy = "flex", layout_config = { horizontal = { prompt_position = "bottom", preview_width = 0.55 }, vertical = { mirror = false }, width = 0.87, height = 0.80, preview_cutoff = 1 }, color_devicons = not SimpleUI, set_env = { ["COLORTERM"] = "truecolor" }, -- default = nil, file_previewer = require("telescope.previewers").vim_buffer_cat.new, grep_previewer = require("telescope.previewers").vim_buffer_vimgrep .new, qflist_previewer = require("telescope.previewers").vim_buffer_qflist .new }, extensions = { fzy_native = { override_generic_sorter = true, override_file_sorter = true } } } require 'telescope'.load_extension('fzy_native') require("telescope").load_extension("zk") if vim.fn.has('mac') ~= 1 then -- doesn't currently work on mac require 'telescope'.load_extension('media_files') end end -- telescope ----------------------- COMPLETIONS -------------------------------- -- cmp, luasnip M.completions = function() require("luasnip/loaders/from_vscode").lazy_load() local luasnip = require("luasnip") local check_backspace = function() local col = vim.fn.col "." - 1 return col == 0 or vim.fn.getline(vim.fn.line(".")):sub(col, col):match "%s" end local cmp = require 'cmp' cmp.setup { enabled = function() local context = require 'cmp.config.context' local buftype = vim.api.nvim_buf_get_option(0, "buftype") -- prevent completions in prompts like telescope prompt if buftype == "prompt" then return false end -- allow completions in command mode if vim.api.nvim_get_mode().mode == 'c' then return true end -- forbid completions in comments return not context.in_treesitter_capture("comment") and not context.in_syntax_group("Comment") end, mapping = { [''] = cmp.mapping.select_prev_item(), [''] = cmp.mapping.select_next_item(), [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete({}), [''] = cmp.mapping.close(), [''] = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = false }, [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip.expandable() then luasnip.expand({}) elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() elseif check_backspace() then fallback() else cmp.mapping.complete({}) -- fallback() end end, { "i", "s" }), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() elseif luasnip.jumpable(-1) then luasnip.jump(-1) else fallback() end end, { "i", "s" }) }, window = { documentation = cmp.config.window.bordered() }, sources = { { name = 'nvim_lsp' }, { name = 'nvim_lsp_signature_help' }, { name = 'nvim_lua' }, { name = 'emoji' }, { name = 'luasnip' }, { name = 'path' }, { name = "crates" }, { name = 'npm', keyword_length = 3 }, { name = "buffer", keyword_length = 3 } }, formatting = { fields = { "kind", "abbr", "menu" }, format = function(entry, vim_item) -- Kind icons vim_item.kind = string.format("%s", signs.kind_icons[vim_item.kind]) vim_item.menu = ({ nvim_lsp = "[LSP]", nvim_lsp_signature_help = "[LSPS]", luasnip = "[Snippet]", buffer = "[Buffer]", path = "[Path]" })[entry.source.name] return vim_item end }, snippet = { expand = function(args) luasnip.lsp_expand(args.body) end } } cmp.setup.cmdline('/', { mapping = cmp.mapping.preset.cmdline(), sources = { { name = 'buffer' } } }) cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline', option = { ignore_cmds = { 'Man', '!' } } } }) }) end -- completions ----------------------- NOTES -------------------------------- -- zk (zettelkasten lsp), taskwiki, focus mode, grammar M.notes = function() require("zk").setup({ picker = "telescope", -- automatically attach buffers in a zk notebook that match the given filetypes lsp = { auto_attach = { enabled = true, filetypes = { "markdown", "vimwiki", "md" } }, config = { on_attach = function(_, bufnr) print("ZK attached") local which_key = require("which-key") local local_leader_opts = { mode = "n", -- NORMAL mode prefix = "", buffer = bufnr, -- Local mappings. silent = true, -- use `silent` when creating keymaps noremap = true, -- use `noremap` when creating keymaps nowait = true -- use `nowait` when creating keymaps } local local_leader_opts_visual = { mode = "v", -- VISUAL mode prefix = "", buffer = bufnr, -- Local mappings. silent = true, -- use `silent` when creating keymaps noremap = true, -- use `noremap` when creating keymaps nowait = true -- use `nowait` when creating keymaps } local leader_mappings = { K = { "lua vim.lsp.buf.hover()", "Info preview" }, n = { -- Create the note in the same directory as the current buffer after asking for title p = { "ZkNew { dir = vim.fn.expand('%:p:h'), title = vim.fn.input('Title: ') }", "New peer note (same dir)" }, l = { "ZkLinks", "Show note links" }, -- the following duplicate with the ,l_ namespace on purpose because of programming muscle memory r = { "Telescope lsp_references", "References to this note" } }, l = { name = "Local LSP", -- Open notes linking to the current buffer. r = { "Telescope lsp_references", "References to this note" }, i = { "lua vim.lsp.buf.hover()", "Info preview" }, f = { "Lspsaga code_action", "Fix Code Actions" }, e = { "lua vim.diagnostic.open_float()", "Show Line Diags" } } } which_key.register(leader_mappings, local_leader_opts) local leader_mappings_visual = { n = { p = { ":'<,'>ZkNewFromTitleSelection { dir = vim.fn.expand('%:p:h') }", "New peer note (same dir) selection for title" } -- Create a new note in the same directory as the current buffer, using the current selection for title. } } which_key.register(leader_mappings_visual, local_leader_opts_visual) local opts = { noremap = true, silent = true } -- TODO: Make magic... -- in normal mode, if on a link, it should open the link (note or url) -- in visual mode, it should prompt for folder, create a note, and make a link -- Meanwhile, just go to definition vim.api.nvim_buf_set_keymap(bufnr, "n", "", "lua vim.lsp.buf.definition()", opts) -- Preview a linked note. vim.api.nvim_buf_set_keymap(bufnr, "", "K", "lua vim.lsp.buf.hover()", opts) require('pwnvim.options').tabindent() end } } }) -- Focus mode dimming of text out of current block --[[ require("twilight").setup { dimming = { alpha = 0.25, -- amount of dimming -- we try to get the foreground from the highlight groups or fallback color color = { "Normal", "#ffffff" }, term_bg = "#000000", -- if guibg=NONE, this will be used to calculate text color inactive = true -- when true, other windows will be fully dimmed (unless they contain the same buffer) }, context = 12, -- amount of lines we will try to show around the current line treesitter = true, -- use treesitter when available for the filetype -- treesitter is used to automatically expand the visible text, -- but you can further control the types of nodes that should always be fully expanded expand = { -- for treesitter, we we always try to expand to the top-most ancestor with these types "function", "method", "table", "if_statement" }, exclude = {} -- exclude these filetypes } ]] -- Focus mode / centering require("true-zen").setup { -- your config goes here -- or just leave it empty :) modes = { -- configurations per mode ataraxis = { shade = "dark", -- if `dark` then dim the padding windows, otherwise if it's `light` it'll brighten said windows backdrop = 0, -- percentage by which padding windows should be dimmed/brightened. Must be a number between 0 and 1. Set to 0 to keep the same background color minimum_writing_area = { -- minimum size of main window width = 70, height = 44 }, quit_untoggles = true, -- type :q or :qa to quit Ataraxis mode padding = { -- padding windows left = 52, right = 52, top = 0, bottom = 0 }, callbacks = { -- run functions when opening/closing Ataraxis mode open_pre = function() vim.opt.scrolloff = 999 -- keep cursor in vertical middle of screen end, open_pos = nil, close_pre = nil, close_pos = function() vim.opt.scrolloff = 8 end } }, minimalist = { ignored_buf_types = { "nofile" }, -- save current options from any window except ones displaying these kinds of buffers options = { -- options to be disabled when entering Minimalist mode number = false, relativenumber = false, showtabline = 0, signcolumn = "no", statusline = "", cmdheight = 1, laststatus = 0, showcmd = false, showmode = false, ruler = false, numberwidth = 1 }, callbacks = { -- run functions when opening/closing Minimalist mode open_pre = nil, open_pos = nil, close_pre = nil, close_pos = nil } }, narrow = { --- change the style of the fold lines. Set it to: --- `informative`: to get nice pre-baked folds --- `invisible`: hide them --- function() end: pass a custom func with your fold lines. See :h foldtext folds_style = "informative", run_ataraxis = true, -- display narrowed text in a Ataraxis session callbacks = { -- run functions when opening/closing Narrow mode open_pre = nil, open_pos = nil, close_pre = nil, close_pos = nil } }, focus = { callbacks = { -- run functions when opening/closing Focus mode open_pre = nil, open_pos = nil, close_pre = nil, close_pos = nil } } }, integrations = { tmux = false, -- hide tmux status bar in (minimalist, ataraxis) kitty = { -- increment font size in Kitty. Note: you must set `allow_remote_control socket-only` and `listen_on unix:/tmp/kitty` in your personal config (ataraxis) enabled = false, -- disabled 2023-03-20 because it doesn't reset the font size on exit font = "+2" }, twilight = false, -- enable twilight text dimming outside cursor block lualine = true -- hide nvim-lualine (ataraxis) } } -- Grammar vim.g["grammarous#disabled_rules"] = { ['*'] = { 'WHITESPACE_RULE', 'EN_QUOTES', 'ARROWS', 'SENTENCE_WHITESPACE', 'WORD_CONTAINS_UNDERSCORE', 'COMMA_PARENTHESIS_WHITESPACE', 'EN_UNPAIRED_BRACKETS', 'UPPERCASE_SENTENCE_START', 'ENGLISH_WORD_REPEAT_BEGINNING_RULE', 'DASH_RULE', 'PLUS_MINUS', 'PUNCTUATION_PARAGRAPH_END', 'MULTIPLICATION_SIGN', 'PRP_CHECKOUT', 'CAN_CHECKOUT', 'SOME_OF_THE', 'DOUBLE_PUNCTUATION', 'HELL', 'CURRENCY', 'POSSESSIVE_APOSTROPHE', 'ENGLISH_WORD_REPEAT_RULE', 'NON_STANDARD_WORD' } } -- Grammar stuff vim.cmd( [[command StartGrammar2 lua require('pwnvim.plugins').grammar_check()]]) end -- notes M.grammar_check = function() vim.cmd('packadd vim-grammarous') local opts = { noremap = false, silent = true } local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(0, ...) end buf_set_keymap('', 'gf', '(grammarous-fixit)', opts) buf_set_keymap('', 'gx', '(grammarous-remove-error)', opts) buf_set_keymap('', ']g', '(grammarous-move-to-next-error)', opts) buf_set_keymap('', '[g', '(grammarous-move-to-previous-error)', opts) vim.cmd('GrammarousCheck') end ----------------------- MISC -------------------------------- -- rooter, kommentary, autopairs, tmux, toggleterm M.misc = function() vim.g.lf_map_keys = 0 -- lf.vim disable default keymapping -- Change project directory using local cd only -- vim.g.rooter_cd_cmd = 'lcd' -- Look for these files/dirs as hints -- vim.g.rooter_patterns = { -- '.git', '_darcs', '.hg', '.bzr', '.svn', 'Makefile', 'package.json', -- '.zk', 'Cargo.toml', 'build.sbt', 'Package.swift', 'Makefile.in' -- } require('project_nvim').setup({ active = true, on_config_done = nil, manual_mode = false, detection_methods = { "pattern", "lsp" }, patterns = { ".git", "_darcs", ".hg", ".bzr", ".svn", "Makefile", "package.json", ".zk", "build.sbt", "Package.swift", "Makefile.in", "README.md", "flake.nix" }, show_hidden = false, silent_chdir = true, ignore_lsp = {} }) require('telescope').load_extension('projects') require('Comment').setup() require("which-key").register({ ["c"] = { '(comment_toggle_linewise_current)', "Toggle comments" }, ["g/"] = { '(comment_toggle_linewise_current)', "Toggle comments" } }, { mode = "n", silent = true, norewrap = true }) require("which-key").register({ ["c"] = { '(comment_toggle_linewise_visual)', "Toggle comments" }, ["g/"] = { '(comment_toggle_linewise_visual)', "Toggle comments" } }, { mode = "v", silent = true, norewrap = true }) require('nvim-autopairs').setup({}) vim.g.tmux_navigator_no_mappings = 1 require("toggleterm").setup { open_mapping = [[]], insert_mappings = true, -- from normal or insert mode start_in_insert = true, hide_numbers = true, direction = 'vertical', size = function(_) return vim.o.columns * 0.3 end, close_on_exit = true } vim.api.nvim_set_keymap('t', [[ToggleTermToggleAll", { noremap = true }) end -- misc return M