diff --git a/init.lua b/init.lua index eef4e99..b45ec61 100644 --- a/init.lua +++ b/init.lua @@ -50,7 +50,25 @@ vim.opt.expandtab = true vim.opt.tw = 100 vim.opt.colorcolumn = "+1" vim.opt.termguicolors = true +vim.opt.pumheight = 5 + +-- Disable semantic tokens +vim.api.nvim_create_autocmd("LspAttach", { + callback = function(args) + local client = vim.lsp.get_client_by_id(args.data.client_id) + client.server_capabilities.semanticTokensProvider = nil + end, +}) +-- Function to get work count in status line +local function getWords() + -- the third string here is the string for visual-block mode (^V) + if vim.fn.mode() == "v" or vim.fn.mode() == "V" or vim.fn.mode() == "" then + return vim.fn.wordcount().visual_words .. "" + else + return vim.fn.wordcount().words .. "" + end +end -- [[ Basic Keymaps ]] -- See `:help vim.keymap.set()` @@ -72,10 +90,27 @@ vim.keymap.set("n", "", "", { desc = "Move focus to the left wind vim.keymap.set("n", "", "", { desc = "Move focus to the right window" }) vim.keymap.set("n", "", "", { desc = "Move focus to the lower window" }) vim.keymap.set("n", "", "", { desc = "Move focus to the upper window" }) - -- [[ Basic Autocommands ]] --- See :help lua-guide-autocommands - +-- Go back to last edited line when reopening file +vim.api.nvim_create_autocmd("BufRead", { + callback = function(opts) + vim.api.nvim_create_autocmd("BufWinEnter", { + once = true, + buffer = opts.buf, + callback = function() + local ft = vim.bo[opts.buf].filetype + local last_known_line = vim.api.nvim_buf_get_mark(opts.buf, '"')[1] + if + not (ft:match("gitcommit") and ft:match("gitrebase")) + and last_known_line > 1 + and last_known_line <= vim.api.nvim_buf_line_count(opts.buf) + then + vim.api.nvim_feedkeys([[g`"]], "nx", false) + end + end, + }) + end, +}) -- [[ Install `lazy.nvim` plugin manager ]] -- See `:help lazy.nvim.txt` or https://github.com/folke/lazy.nvim for more info local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" @@ -157,9 +192,16 @@ require("lazy").setup({ npairs.remove_rule("`") end, }, - "kana/vim-textobj-user", "christoomey/vim-tmux-navigator", + "kana/vim-textobj-user", + { + "GCBallesteros/vim-textobj-hydrogen", + dependencies = { + "kana/vim-textobj-user", + }, + }, "godlygeek/tabular", + "tpope/vim-sleuth", { "Vigemus/iron.nvim", config = function() @@ -200,8 +242,6 @@ require("lazy").setup({ }, ignore_blank_lines = true, -- ignore blank lines when sending visual select lines }) - - -- iron also has a list of commands, see :h iron-commands for all available commands vim.keymap.set("n", ";rs", "IronRepl") vim.keymap.set("n", ";rr", "IronRestart") vim.keymap.set("n", ";rf", "IronFocus") @@ -211,7 +251,7 @@ require("lazy").setup({ end, }, "tpope/vim-markdown", - + "christoomey/vim-tmux-navigator", -- NOTE: Plugins can specify dependencies. -- -- The dependencies are proper plugin specifications as well - anything @@ -265,10 +305,21 @@ require("lazy").setup({ pcall(require("telescope").load_extension("live_grep_args")) local builtin = require("telescope.builtin") vim.keymap.set("n", "", require("telescope").extensions.live_grep_args.live_grep_args) - vim.keymap.set("n", "", require("telescope").extensions.live_grep_args.live_grep_args) + vim.keymap.set( + "x", + "", + "\"zy:lua require('telescope').extensions.live_grep_args.live_grep_args(require('telescope.themes').get_ivy({}))z" + ) vim.keymap.set("n", "", builtin.find_files) end, }, + { -- grammar checking + "rhysd/vim-grammarous", + ft = { "markdown", "latex" }, + config = function() + vim.g["grammarous#jar_url"] = "https://www.languagetool.org/download/LanguageTool-5.9.zip" + end, + }, { -- LSP Configuration & Plugins "neovim/nvim-lspconfig", dependencies = { @@ -305,7 +356,7 @@ require("lazy").setup({ -- Jump to the implementation of the word under your cursor. -- Useful when your language has ways of declaring types without an actual implementation. - map("gI", require("telescope.builtin").lsp_implementations, "[G]oto [I]mplementation") + map("I", require("telescope.builtin").lsp_implementations, "[G]oto [I]mplementation") -- Jump to the type of the word under your cursor. -- Useful when you're not sure what type a variable is and you want to see @@ -377,8 +428,14 @@ require("lazy").setup({ -- - settings (table): Override the default settings passed when initializing the server. -- For example, to see the options for `lua_ls`, you could go to: https://luals.github.io/wiki/settings/ local servers = { - clangd = {}, + clangd = { + filetypes = { + "c", + "cpp", + }, + }, -- gopls = {}, + hls = {}, jdtls = {}, pyright = {}, rust_analyzer = { @@ -430,6 +487,7 @@ require("lazy").setup({ "black", "isort", "clang-format", + "ormolu", }) require("mason-tool-installer").setup({ ensure_installed = ensure_installed }) @@ -467,6 +525,7 @@ require("lazy").setup({ rust = { "rustfmt" }, cpp = { "clang-format" }, c = { "clang-format" }, + haskell = { "ormolu" }, }, }, }, @@ -487,6 +546,35 @@ require("lazy").setup({ end return "make install_jsregexp" end)(), + config = function() + require("luasnip.loaders.from_snipmate").lazy_load({ paths = "./snippets" }) + local ls = require("luasnip") + -- some shorthands... + local snip = ls.snippet + local node = ls.snippet_node + local text = ls.text_node + local insert = ls.insert_node + local func = ls.function_node + local choice = ls.choice_node + local dynamicn = ls.dynamic_node + + ls.add_snippets(nil, { + python = { + snip({ + trig = "imp", + namr = "Imports", + dscr = "Comments for imports", + }, { + text({ "# Core modules", "" }), + insert(1), + text({ "", "# Non-core modules", "" }), + insert(2), + text({ "", "# SEI modules", "" }), + insert(3), + }), + }, + }) + end, }, "saadparwaiz1/cmp_luasnip", "hrsh7th/cmp-nvim-lsp", @@ -520,10 +608,16 @@ require("lazy").setup({ -- This will expand snippets if the LSP sent a snippet. [""] = cmp.mapping.confirm({ select = true }), - -- Manually trigger a completion from nvim-cmp. - -- Generally you don't need this, because nvim-cmp will display - -- completions whenever it has completion options available. - [""] = cmp.mapping.complete({}), + ["j"] = cmp.mapping(function() + if luasnip.expand_or_locally_jumpable() then + luasnip.expand_or_jump() + end + end, { "i", "s" }), + ["k"] = cmp.mapping(function() + if luasnip.locally_jumpable(-1) then + luasnip.jump(-1) + end + end, { "i", "s" }), }), sources = { { name = "nvim_lsp" }, @@ -532,6 +626,15 @@ require("lazy").setup({ }, }) end, + snippet = { + expand = function(args) + local luasnip = require("luasnip") + if not luasnip then + return + end + luasnip.lsp_expand(args.body) + end, + }, }, { -- You can easily change to a different colorscheme. @@ -557,7 +660,31 @@ require("lazy").setup({ -- and try some other statusline plugin "echasnovski/mini.nvim", config = function() - require("mini.statusline").setup() + require("mini.statusline").setup({ + content = { + active = function() + local mode, mode_hl = MiniStatusline.section_mode({ trunc_width = 120 }) + local git = MiniStatusline.section_git({ trunc_width = 75 }) + local diagnostics = MiniStatusline.section_diagnostics({ trunc_width = 75 }) + local filename = MiniStatusline.section_filename({ trunc_width = 140 }) + local fileinfo = MiniStatusline.section_fileinfo({ trunc_width = 120 }) + local location = MiniStatusline.section_location({ trunc_width = 75 }) + local search = MiniStatusline.section_searchcount({ trunc_width = 75 }) + local words = getWords() + return MiniStatusline.combine_groups({ + + { hl = mode_hl, strings = { mode } }, + { hl = "MiniStatuslineDevinfo", strings = { git, diagnostics } }, + "%<", -- Mark general truncate point + { hl = "MiniStatuslineFilename", strings = { filename } }, + "%=", -- End left alignment + { hl = "MiniStatuslineFileinfo", strings = { fileinfo } }, + { hl = "MiniStatuslineFileinfo", strings = { words } }, + { hl = mode_hl, strings = { search, location } }, + }) + end, + }, + }) end, },