diff --git a/lua/core/autocmds.lua b/lua/core/autocmds.lua index b4213fc..e5f96c0 100644 --- a/lua/core/autocmds.lua +++ b/lua/core/autocmds.lua @@ -63,3 +63,28 @@ vim.cmd([[ -- end -- end -- }) + +local function set_timeoutlen_for_insert_mode() + if vim.bo.buftype == "terminal" or vim.bo.filetype == "codecompanion" then + vim.o.timeoutlen = 0 + else + vim.o.timeoutlen = 300 -- Default timeoutlen for other buffers + end +end + +-- Create an augroup for managing the autocmds +local augroup = vim.api.nvim_create_augroup("InsertModeTimeout", { clear = true }) + +-- Autocommand to adjust timeoutlen when entering insert mode +vim.api.nvim_create_autocmd("InsertEnter", { + group = augroup, + callback = set_timeoutlen_for_insert_mode, +}) + +-- Autocommand to reset timeoutlen when leaving insert mode +vim.api.nvim_create_autocmd("InsertLeave", { + group = augroup, + callback = function() + vim.o.timeoutlen = 300 + end, +}) diff --git a/lua/core/keymaps.lua b/lua/core/keymaps.lua index 1dea6a5..157e089 100644 --- a/lua/core/keymaps.lua +++ b/lua/core/keymaps.lua @@ -83,23 +83,35 @@ end map("v", "op", ":ToggleTerm name=ipython") map("v", "oP", ":ToggleTerm name=ipython-full") -map("t", "tp", ":FloatermToggle ipython", opts) -map("t", "tP", ":FloatermToggle ipython-full", opts) map("n", "", ":ToggleTerm name=toggleterm", opts) map("n", "tt", ":ToggleTerm name=toggleterm", opts) +map("n", "tT", ":ToggleTerm name=toggleterm-full direction=tab", opts) map("n", "ts", ":TermSelect", opts) map("n", "tv", ":ToggleTerm direction=vertical name=toggleterm-vert", opts) map("n", "th", ":ToggleTerm direction=horizontal name=toggleterm-hori", opts) map("n", "tf", ":ToggleTerm name=toggleterm", opts) +map("n", "-", ":ToggleTerm direction='horizontal'", opts) +map("n", "|", ":ToggleTerm direction='vertical'", opts) -map("t", "tt", ":ToggleTerm", opts) -map("t", "tf", ":ToggleTerm", opts) -map("t", "tv", ":ToggleTerm --name=toggleterm-vert", opts) -map("t", "th", ":ToggleTerm --name=toggleterm-hori", opts) -map("t", "", ":Toggleterm", opts) -map("t", "", "", opts) -map("t", "", "", opts) -- fix space in terminal +-- map("t", "tt", ":ToggleTerm", opts) +-- map("t", "tf", ":ToggleTerm", opts) +-- map("t", "-", ":ToggleTerm direction='horizontal'", opts) +-- map("t", "|", ":ToggleTerm direction='vertical'", opts) +-- map("t", "tv", ":ToggleTerm --name=toggleterm-vert", opts) +-- map("t", "th", ":ToggleTerm --name=toggleterm-hori", opts) +-- map("t", "", ":Toggleterm", opts) +-- map("t", "", "", opts) +-- map("n", "", "", opts) -- fix space in terminal +function _G.set_terminal_keymaps() + local opts = { buffer = 0 } + map("t", "", [[]], opts) + map("t", "", [[]], opts) + -- map("t", "", "", { buffer = 0, silent = true }) -- fix space in terminal +end + +-- if you only want these mappings for toggle term use term://*toggleterm#* instead +vim.cmd("autocmd! TermOpen term://* lua set_terminal_keymaps()") --}}} --{{{ LSP mappings @@ -140,7 +152,7 @@ map("v", "CT", ":CodeCompanion /tests", opts) map("n", "cd", ":Telescope diagnostics") map("n", "cDn", ":lua vim.diagnostic.goto_next()") map("n", "cDp", ":lua vim.diagnostic.goto_prev()") -map("n", "cd", ":lua vim.diagnostic.setloclist()") +map("n", "cl", ":lua vim.diagnostic.setloclist()") --}}} --{{{ Telescope mappings @@ -217,7 +229,7 @@ end, opts) --{{{ LSP map("n", "ld", ":Telescope lsp_definitions") map("n", "lD", ":Telescope diagnostic") -map("n", "la", ":lua vim.lsp.buf.code_action()") +map("n", "la", vim.lsp.buf.code_action) map("n", "lci", ":Telescope lsp_incoming_calls") map("n", "lco", ":Telescope lsp_outgoing_calls") map("n", "lh", ":lua vim.lsp.buf.signature_help()") diff --git a/lua/core/plugins.lua b/lua/core/plugins.lua index 0a52a92..c4b7db0 100644 --- a/lua/core/plugins.lua +++ b/lua/core/plugins.lua @@ -235,6 +235,35 @@ require("packer").startup(function(use) use({ "rcarriga/nvim-notify" }) use({ "stevearc/dressing.nvim" }) use({ "echasnovski/mini.nvim" }) + use({ + "windwp/nvim-autopairs", + event = "InsertEnter", + config = function() + local npairs = require("nvim-autopairs") + local Rule = require("nvim-autopairs.rule") + local cmp_autopairs = require("nvim-autopairs.completion.cmp") + local cmp = require("cmp") + cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done()) + + npairs.setup({ + disable_filetype = { "TelescopePrompt", "spectre_panel", "Terminal", "terminal" }, + check_ts = true, + ts_config = { + lua = { "string" }, -- it will not add a pair on that treesitter node + javascript = { "template_string" }, + java = false, -- don't check treesitter on java + }, + }) + + local ts_conds = require("nvim-autopairs.ts-conds") + + -- press % => %% only while inside a comment or string + npairs.add_rules({ + Rule("%", "%", "lua"):with_pair(ts_conds.is_ts_node({ "string", "comment" })), + Rule("$", "$", "lua"):with_pair(ts_conds.is_not_ts_node({ "function" })), + }) + end, + }) -- }}} @@ -258,7 +287,6 @@ require("packer").startup(function(use) }) end, }) - use("jiangmiao/auto-pairs") use("pechorin/any-jump.vim") use("tpope/vim-commentary") use("tpope/vim-dotenv") diff --git a/lua/plugins/lsp/null-ls.lua b/lua/plugins/lsp/null-ls.lua index 5c9745b..a576289 100644 --- a/lua/plugins/lsp/null-ls.lua +++ b/lua/plugins/lsp/null-ls.lua @@ -3,45 +3,45 @@ local helpers = require("null-ls.helpers") -- syncronous formatting local augroup = vim.api.nvim_create_augroup("LspFormatting", {}) require("null-ls").setup({ - -- you can reuse a shared lspconfig on_attach callback here - on_attach = function(client, bufnr) - if client.supports_method("textDocument/formatting") then - vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr }) - vim.api.nvim_create_autocmd("BufWritePre", { - group = augroup, - buffer = bufnr, - callback = function() - -- on 0.8, you should use vim.lsp.buf.format({ bufnr = bufnr }) instead - -- on later neovim version, you should use vim.lsp.buf.format({ async = false }) instead - -- vim.lsp.buf.formatting_sync() - vim.lsp.buf.format({ - async = false, - bufnr = bufnr, - filter = function(client) - return client.name == "null-ls" - end - }) - end, - }) - end - end, - sources = { - null_ls.builtins.completion.luasnip, - null_ls.builtins.formatting.black, - null_ls.builtins.formatting.isort, - null_ls.builtins.diagnostics.mypy, - null_ls.builtins.diagnostics.markdownlint, - null_ls.builtins.diagnostics.pylint, - null_ls.builtins.diagnostics.pydoclint, - null_ls.builtins.formatting.stylua, - null_ls.builtins.formatting.markdownlint, - null_ls.builtins.formatting.prettier, -- handled by lsp server - null_ls.builtins.formatting.shfmt.with({ - filetypes = { "sh", "bash" }, - extra_args = { "-i", "0", "-ci", "-sr" } - }), - -- null_ls.builtins.diagnostics.actionlint, - } + -- you can reuse a shared lspconfig on_attach callback here + on_attach = function(client, bufnr) + if client.supports_method("textDocument/formatting") then + vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr }) + vim.api.nvim_create_autocmd("BufWritePre", { + group = augroup, + buffer = bufnr, + callback = function() + -- on 0.8, you should use vim.lsp.buf.format({ bufnr = bufnr }) instead + -- on later neovim version, you should use vim.lsp.buf.format({ async = false }) instead + -- vim.lsp.buf.formatting_sync() + vim.lsp.buf.format({ + async = false, + bufnr = bufnr, + filter = function(client) + return client.name == "null-ls" + end, + }) + end, + }) + end + end, + sources = { + null_ls.builtins.completion.luasnip, + null_ls.builtins.formatting.black, + null_ls.builtins.formatting.isort, + null_ls.builtins.diagnostics.mypy, + null_ls.builtins.diagnostics.markdownlint, + null_ls.builtins.diagnostics.pylint, + -- null_ls.builtins.diagnostics.pydoclint, + null_ls.builtins.formatting.stylua, + null_ls.builtins.formatting.markdownlint, + null_ls.builtins.formatting.prettier, -- handled by lsp server + null_ls.builtins.formatting.shfmt.with({ + filetypes = { "sh", "bash" }, + extra_args = { "-i", "0", "-ci", "-sr" }, + }), + -- null_ls.builtins.diagnostics.actionlint, + }, }) -- null_ls.setup({ diff --git a/lua/plugins/ui/toggleterm.lua b/lua/plugins/ui/toggleterm.lua index deb9c83..6568e7b 100644 --- a/lua/plugins/ui/toggleterm.lua +++ b/lua/plugins/ui/toggleterm.lua @@ -1,79 +1,81 @@ -require("toggleterm").setup { - -- size can be a number or function which is passed the current terminal - size = function(term) - if term.direction == "horizontal" then - return 20 - elseif term.direction == "vertical" then - return vim.o.columns * 0.45 - end - end, - open_mapping = { [[]], [[tt]] }, -- or { [[]], [[]] } if you also use a Japanese keyboard. - -- on_create = fun(t: Terminal), -- function to run when the terminal is first created - -- on_open = fun(t: Terminal), -- function to run when the terminal opens - -- on_close = fun(t: Terminal), -- function to run when the terminal closes - -- on_stdout = fun(t: Terminal, job: number, data: string[], name: string) -- callback for processing output on stdout - -- on_stderr = fun(t: Terminal, job: number, data: string[], name: string) -- callback for processing output on stderr - -- on_exit = fun(t: Terminal, job: number, exit_code: number, name: string) -- function to run when terminal process exits - hide_numbers = true, -- hide the number column in toggleterm buffers - -- shade_filetypes = {}, - autochdir = false, -- when neovim changes it current directory the terminal will change it's own when next it's opened - highlights = { - -- highlights which map to a highlight group name and a table of it's values - -- NOTE: this is only a subset of values, any group placed here will be set for the terminal window split - Normal = { - guibg = "#24273A", - }, - NormalFloat = { - link = 'Normal' - }, - -- FloatBorder = { - -- guifg = "", - -- guibg = "", - -- }, - }, - shade_terminals = false, -- NOTE: this option takes priority over highlights specified so if you specify Normal highlights you should set this to false - -- shading_factor = '-10', -- the percentage by which to lighten dark terminal background, default: -30 - -- shading_ratio = '-3', -- the ratio of shading factor for light/dark terminal background, default: -3 - start_in_insert = true, - insert_mappings = true, -- whether or not the open mapping applies in insert mode - terminal_mappings = true, -- whether or not the open mapping applies in the opened terminals - persist_size = false, - persist_mode = true, -- if set to true (default) the previous terminal mode will be remembered - -- direction = 'vertical' | 'horizontal' | 'tab' | 'float', - direction = 'float', - -- close_on_exit = true, -- close the terminal window when the process exits - -- clear_env = false, -- use only environmental variables from `env`, passed to jobstart() - -- Change the default shell. Can be a string or a function returning a string - shell = vim.o.shell, - auto_scroll = true, -- automatically scroll to the bottom on terminal output - -- This field is only relevant if direction is set to 'float' - float_opts = { - -- The border key is *almost* the same as 'nvim_open_win' - -- see :h nvim_open_win for details on borders however - -- the 'curved' border is a custom border type - -- not natively supported but implemented in this plugin. - -- border = 'single' | 'double' | 'shadow' | 'curved' | ... other options supported by win open - border = 'curved', - -- like `size`, width, height, row, and col can be a number or function which is passed the current terminal - width = vim.o.columns * 0.8, - -- height = 75, - -- row = , - -- col = vim.o.columns * 0.8, - winblend = 3, - zindex = 10, - -- title_pos = 'left' | 'center' | 'right', position of the title of the floating window - title_pos = 'center', - }, - winbar = { - enabled = true, - name_formatter = function(term) -- term: Terminal - return term.name - end - }, - responsiveness = { - -- breakpoint in terms of `vim.o.columns` at which terminals will start to stack on top of each other - -- instead of next to each other - -- default = 0 which means the feature is turned off - horizontal_breakpoint = 135, - } -} +require("toggleterm").setup({ + -- size can be a number or function which is passed the current terminal + size = function(term) + if term.direction == "horizontal" then + return 20 + elseif term.direction == "vertical" then + return vim.o.columns * 0.45 + end + end, + open_mapping = { [[]] }, -- or { [[]], [[]] } if you also use a Japanese keyboard. + -- on_create = fun(t: Terminal), -- function to run when the terminal is first created + -- on_open = fun(t: Terminal), -- function to run when the terminal opens + -- on_close = fun(t: Terminal), -- function to run when the terminal closes + -- on_stdout = fun(t: Terminal, job: number, data: string[], name: string) -- callback for processing output on stdout + -- on_stderr = fun(t: Terminal, job: number, data: string[], name: string) -- callback for processing output on stderr + -- on_exit = fun(t: Terminal, job: number, exit_code: number, name: string) -- function to run when terminal process exits + hide_numbers = true, -- hide the number column in toggleterm buffers + -- shade_filetypes = {}, + autochdir = false, -- when neovim changes it current directory the terminal will change it's own when next it's opened + highlights = { + -- highlights which map to a highlight group name and a table of it's values + -- NOTE: this is only a subset of values, any group placed here will be set for the terminal window split + Normal = { + guibg = "#24273A", + }, + NormalFloat = { + link = "Normal", + }, + -- FloatBorder = { + -- guifg = "", + -- guibg = "", + -- }, + }, + shade_terminals = false, -- NOTE: this option takes priority over highlights specified so if you specify Normal highlights you should set this to false + -- shading_factor = '-10', -- the percentage by which to lighten dark terminal background, default: -30 + -- shading_ratio = '-3', -- the ratio of shading factor for light/dark terminal background, default: -3 + start_in_insert = true, + insert_mappings = true, -- whether or not the open mapping applies in insert mode + terminal_mappings = true, -- whether or not the open mapping applies in the opened terminals + persist_size = false, + persist_mode = true, -- if set to true (default) the previous terminal mode will be remembered + -- direction = 'vertical' | 'horizontal' | 'tab' | 'float', + direction = "float", + -- close_on_exit = true, -- close the terminal window when the process exits + -- clear_env = false, -- use only environmental variables from `env`, passed to jobstart() + -- Change the default shell. Can be a string or a function returning a string + shell = vim.o.shell, + auto_scroll = true, -- automatically scroll to the bottom on terminal output + -- This field is only relevant if direction is set to 'float' + float_opts = { + -- The border key is *almost* the same as 'nvim_open_win' + -- see :h nvim_open_win for details on borders however + -- the 'curved' border is a custom border type + -- not natively supported but implemented in this plugin. + -- border = 'single' | 'double' | 'shadow' | 'curved' | ... other options supported by win open + border = "curved", + -- like `size`, width, height, row, and col can be a number or function which is passed the current terminal + width = function() + return vim.o.columns - 35 + end, + -- height = 75, + -- row = , + -- col = vim.o.columns * 0.8, + winblend = 3, + zindex = 10, + -- title_pos = 'left' | 'center' | 'right', position of the title of the floating window + title_pos = "center", + }, + winbar = { + enabled = false, + name_formatter = function(term) -- term: Terminal + return term.name + end, + }, + responsiveness = { + -- breakpoint in terms of `vim.o.columns` at which terminals will start to stack on top of each other + -- instead of next to each other + -- default = 0 which means the feature is turned off + horizontal_breakpoint = 135, + }, +})