vim.o.sessionoptions="blank,buffers,curdir,folds,help,tabpages,winsize,winpos,terminal,localoptions" local otter = require'otter' otter.setup{} vim.api.nvim_create_autocmd({"BufEnter", "BufWinEnter"}, { pattern = {"*.md"}, callback = function() otter.activate({'python', 'rust', 'c', 'lua', 'bash' }, true, true, nil) end, }) vim.filetype.add({ extension = { mdx = "markdown", } }) local cmp = require("cmp") cmp.setup { snippet = { expand = function(args) vim.fn["vsnip#anonymous"](args.body) end, }, window = { completion = cmp.config.window.bordered(), documentation = cmp.config.window.bordered(), }, view = { docs = { auto_open = false } }, mapping = cmp.mapping.preset.insert({ [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete(), [''] = cmp.mapping.abort(), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. [''] = cmp.mapping.confirm({ select = true }), [''] = function() if cmp.visible_docs() then cmp.close_docs() else cmp.open_docs() end end }), sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = "otter" }, { name = 'path' }, { name = 'vsnip' }, { name = 'spell' }, }, { { name = 'buffer' }, }), comparators = { -- compare.score_offset, -- not good at all cmp.config.compare.locality, cmp.config.compare.recently_used, cmp.config.compare.score, cmp.config.compare.offset, cmp.config.compare.order, }, } -- key mapping local keymap = vim.api.nvim_set_keymap local opts = { noremap = true, silent = true } local builtin = require('telescope.builtin') -- comment local esc = vim.api.nvim_replace_termcodes( '', true, false, true ) local api = require('Comment.api') vim.keymap.set("n", "", ":lua require('Comment.api').toggle.linewise.current() j", { remap = true }) vim.keymap.set("i", "", ":lua require('Comment.api').toggle.linewise.current()", { remap = true }) vim.keymap.set("x", "", function() vim.api.nvim_feedkeys(esc, 'nx', false) api.toggle.linewise(vim.fn.visualmode()) end, { remap = true }) vim.keymap.set('n', 'gr', (function() builtin.lsp_references({jump_type="vsplit"}) end), {}) vim.keymap.set('n', 'gd', (function() builtin.lsp_definitions({jump_type="vsplit"}) end), {}) vim.keymap.set('n', 'gt', (function() builtin.lsp_type_definitions({jump_type="vsplit"}) end), {}) local barbar_state = require("barbar.state") function find_windows_with_buffer(bufnum) windows = {} local window_list = vim.api.nvim_list_wins() for _, window in ipairs(window_list) do local win_info = vim.fn.getwininfo(window) if win_info ~= nil then for _, buf in ipairs(win_info) do if buf.bufnr == bufnum then table.insert(windows, window) end end end end return windows end function num_useful_windows() local window_list = vim.api.nvim_tabpage_list_wins(0) local num = 0 for _, window in ipairs(window_list) do local win_info = vim.fn.getwininfo(window) if win_info ~= nil then for _, win_info in ipairs(win_info) do if buf_is_useful(win_info.bufnr) then num = num + 1 end end end end return num end function buf_is_useful(bufnr) local bufname = vim.api.nvim_buf_get_name(bufnr) -- if the window's buffer has no name, it's not useful if bufname == '' then return false end -- print("bufname: ", bufname) -- if the window's buffer is read only, it's not useful local readonly = vim.api.nvim_buf_get_option(bufnr, 'readonly') if readonly then -- print("=readonly") return false end -- -- if the buffer is not listed, it's not useful local listed = vim.api.nvim_buf_get_option(bufnr, 'buflisted') if not listed then -- print("=unlisted") return false end local buftype = vim.api.nvim_buf_get_option(bufnr, 'buftype') if buftype == "quickfix" then -- print("=readonly") return false end local lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false) if #lines > 1 or (#lines == 1 and #lines[1] > 0) then return true -- If the buffer has content, return false else return false end -- the window contains a useful buffer return true end function quit_window(window) vim.api.nvim_win_call(window, function() vim.cmd "quit" end) end vim.api.nvim_create_user_command('CloseBuffer', function (opts) if num_useful_windows() > 1 then vim.cmd { cmd = "quit", bang = opts.bang, } else vim.cmd { cmd = "BufferDelete", bang = opts.bang, } if not buf_is_useful(vim.api.nvim_get_current_buf()) then vim.cmd { cmd = "quit", bang = opts.bang, } end end end, { desc = "Close Current Buffer", bang = true, }) vim.keymap.set("ca", "W", "w") vim.keymap.set("ca", "X", "x") vim.keymap.set("ca", "Q", "q") vim.keymap.set("ca", "q", "CloseBuffer") vim.keymap.set("ca", "qw", "quit") -- format on wq and x and replace X, W and Q with x, w and q -- vim.cmd [[cnoreabbrev w execute "Format sync" w]] -- vim.cmd [[cnoreabbrev x execute "Format sync" w CustomCloseBuffer ]] -- vim.cmd [[cabbrev W w]] -- vim.cmd [[cabbrev X execute "Format sync" x]] -- vim.cmd [[cabbrev Q CustomCloseBuffer]] -- vim.cmd [[cnoreabbrev q CustomCloseBuffer ]] -- vim.cmd [[cnoreabbrev qa q]] -- vim.cmd [[nnoremap ; :]] local builtin = require('telescope.builtin') vim.keymap.set('n', 's', "vertical sb", {}) vim.keymap.set('n', '', builtin.find_files, {}) vim.keymap.set('n', 'f', builtin.live_grep, {}) vim.keymap.set('n', 'h', builtin.pickers, {}) -- vim.keymap.set('n', 'h', builtin.search_history, {}) vim.keymap.set('n', 'b', function() builtin.buffers({sort_mru = true}) end, {}) vim.keymap.set('n', 'd', function() require('telescope.builtin').diagnostics({ severity_bound = 0, bufnr = 0 }) end, {}) vim.keymap.set('n', 'ad', function() require('telescope.builtin').diagnostics({ severity_bound = 0 }) end, {}) vim.keymap.set('n', 'em', "RustLsp expandMacro") vim.keymap.set("n", "]d", vim.diagnostic.goto_next) vim.keymap.set("n", "[d", vim.diagnostic.goto_prev) vim.keymap.set('n', 'ct', "CustomCloseBuffer") vim.keymap.set('n', 'co', "silent! BufferCloseAllButCurrent") vim.keymap.set('n', 'cl', "silent! BufferCloseBuffersLeft") vim.keymap.set('n', 'cr', "silent! BufferCloseBuffersRight") -- like quit but for a single tab vim.keymap.set('n', 'q', "BufferClose", {}) vim.keymap.set('n', 'oq', "BufOnly", {}) vim.keymap.set("n", "x", require("telescope.builtin").resume, { noremap = true, silent = true, desc = "Resume", }) -- local gitsigns = require('gitsigns') -- vim.keymap.set('n', 'gr', gitsigns.reset_hunk) -- vim.keymap.set('n', 'gd', gitsigns.diffthis) -- vim.keymap.set({'o', 'x'}, 'ig', ':Gitsigns select_hunk') -- better search vim.cmd([[ " Better search set incsearch set ignorecase set smartcase set gdefault nnoremap n n:call BlinkNextMatch() nnoremap N N:call BlinkNextMatch() function! BlinkNextMatch() abort highlight JustMatched ctermfg=white ctermbg=magenta cterm=bold let pat = '\c\%#' . @/ let id = matchadd('JustMatched', pat) redraw exec 'sleep 150m' call matchdelete(id) redraw endfunction nnoremap :silent nohecho nnoremap :silent nohecho nnoremap n nzz nnoremap N Nzz nnoremap * *zz nnoremap # #zz nnoremap g* g*zz ]]) vim.cmd([[ inoremap FloatermToggle nnoremap FloatermToggle tnoremap FloatermToggle ]]) vim.cmd([[ let g:suda_smart_edit = 1 filetype plugin indent on ]]) -- multicursor vim.g.VM_default_mappings = 1 vim.g.VM_reselect_first = 1 vim.g.VM_notify_previously_selected = 1 vim.g.VM_theme = "iceblue"