--[[ To install everything run `:PackerSync` LspInfo to check if the language servers are working ]]-- -- https://dev.to/voyeg3r/writing-useful-lua-functions-to-my-neovim-14ki -- function to remove whitespace and preserve spot on save function _G.preserve(cmd) cmd = string.format('keepjumps keeppatterns execute %q', cmd) local original_cursor = vim.fn.winsaveview() vim.api.nvim_command(cmd) vim.fn.winrestview(original_cursor) end vim.cmd([[autocmd BufWritePre,FileWritePre,FileAppendPre,FilterWritePre * :lua preserve('%s/\\s\\+$//ge')]]) -- Bootstrap packer if not installed local fn = vim.fn local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim' if fn.empty(fn.glob(install_path)) > 0 then fn.system({'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path}) vim.cmd 'packadd packer.nvim' end -- https://old.reddit.com/r/neovim/comments/lrz18i/how_to_change_colorscheme_in_lua_without_any/ vim.g.colors_name = "nord" vim.g.SuperTabDefaultCompletionType = "" -- Shortcut the map function local map = vim.api.nvim_set_keymap -- Set up spacebar as leader -- https://icyphox.sh/blog/nvim-lua/ map('n', '', '', {}) vim.g.mapleader = ' ' -- Set spaces > tabs, 4 as default vim.o.expandtab = true vim.o.tabstop = 4 vim.o.shiftwidth = 0 vim.o.relativenumber = true vim.o.wrap = false vim.o.history = 1000 -- Wildmode show list, complete to first result vim.o.wildignore = "*/app/cache,*/vendor,*/env,*.pyc,*/venv,*/__pycache__,*/venv" vim.o.splitright = true vim.o.splitbelow = true vim.o.spelllang = "en_ca" local highlights = { "Search ctermfg=166", "DiffAdd cterm=BOLD ctermfg=NONE ctermbg=22", "DiffDelete cterm=BOLD ctermfg=NONE ctermbg=52", "DiffChange cterm=BOLD ctermfg=NONE ctermbg=23", "DiffText cterm=BOLD ctermfg=NONE ctermbg=23", "Normal guibg=NONE ctermbg=NONE", "Search ctermbg=None ctermfg=166", "PrimaryBlock ctermfg=06 ctermbg=NONE", "SecondaryBlock ctermfg=06 ctermbg=NONE", "Blanks ctermfg=07 ctermbg=NONE", "ColorColumn ctermbg=cyan", "IndentBlanklineIndent1 ctermbg=234 ctermfg=NONE", "IndentBlanklineIndent2 ctermbg=235 ctermfg=NONE", } for i, highlight in ipairs(highlights) do vim.cmd('au VimEnter * hi ' .. highlight) end -- Along with the highlight definition for ColorColumn above, these options -- will set colored marks at certain line lengths vim.cmd [[ au BufEnter *.py let w:m1=matchadd('ColorColumn', '\%81v', 100) au BufEnter *.py let w:m2=matchadd('Error', '\%121v', 100) au BufLeave *.py call clearmatches() ]] -- Custom commands vim.cmd [[ command! MakeTagsPython !ctags --exclude=venv --languages=python --python-kinds=-i -R . ]] options = { noremap = true } map('n', '', ':noh', options) map('i', 'jj', '', options) -- Visually select last copied text map('n', 'gp', "`[v`]", options) map('n', 'ps', 'source ~/.config/nvim/init.luaPackerSync', options) map('n', 'ff', 'Telescope find_files', options) map('n', 'fb', 'Telescope buffers', options) map('n', 'fj', 'Telescope jumplist', options) map('n', 'f/', 'Telescope live_grep', options) map('n', 'fa', 'Telescope grep_string', options) map('n', 'fg', "lua require('telescope.builtin').git_status()", options) map('n', 'ft', "lua require('telescope.builtin').tags({layout_strategy='center', only_sort_tags=true, show_line=true})", options) map('n', 'du', 'diffupdate', options) map('n', 'dd', 'diffget', options) map('n', 'df', 'diffput', options) map('n', '_', '[c', options) map('n', '=', ']c', options) -- Visually select line without ending map('n', 'v', '^v$h', options) -- Ledger Shortcuts -- Copy the last entry map('n', 'll', 'G{jV}y}p10l', options) -- Copy the current entry to the bottom, copy date from last entry map('n', 'lb', '{jV}yGp10l{{jvEy}jvEpl', options) -- Copy the current entry to the next position map('n', 'ln', '{jV}y}p10l', options) -- Jump down from line to replace dollar ammount map('n', 'ld', 'j^f$lC', options) -- After searching pull entry to current position map('n', 'ly', 'vapyp{{jvEy}jvEpl', options) map('n', 'ep', 'ofrom pudb import set_trace; set_trace()', options) map('n', 't', "tabnew", options) map('n', '', 'fT', options) map('n', '', 'vT', options) map('n', '', 'vT', options) map('n', 'ee', 'e!', options) map('n', ' k', [[(v:count > 1 ? "m'" . v:count : '') . 'k']], options) map('n', ' j', [[(v:count > 1 ? "m'" . v:count : '') . 'j']], options) map('n', 'co', 'copen', options) map('n', 'cc', 'cclose', options) map('n', 'ew', 'ArgWrap', options) map('n', 'gs', 'Git', options) map('n', 'm', 'Ranger', options) map('n', 'n', 'RangerWorkingDirectory', options) map('', 's', 'HopChar2', options) local status_line = { '%#PrimaryBlock#', '%#SecondaryBlock#', '%#Blanks#', '%f', '%m', '%=', '%#SecondaryBlock#', '%l,%c ', '%#PrimaryBlock#', '%{&filetype}', } vim.o.statusline = table.concat(status_line) return require('packer').startup(function() use 'wbthomason/packer.nvim' use 'Thornycrackers-Forks/nord-vim' use 'p00f/nvim-ts-rainbow' use { 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate', config = function() require('nvim-treesitter.configs').setup { ensure_installed = { "python", "lua", "nix", "json", "bash", "html", }, highlight = { enable = true, }, indent = { enable = true, }, rainbow = { enable = true, -- I use termcolors but this errors if left blank colors = { "#000000", "#000000", "#000000", "#000000", }, termcolors = { 'darkblue', 'magenta', 'yellow', 'darkcyan', } } } end, } use { "neovim/nvim-lspconfig", config = function() nvim_lsp = require('lspconfig') -- Use an on_attach function to only map the following keys -- after the language server attaches to the current buffer local on_attach = function(client, bufnr) local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end -- Enable completion triggered by buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') -- Mappings. local opts = { noremap=true, silent=true } -- See `:help vim.lsp.*` for documentation on any of the below functions buf_set_keymap('n', 'gD', 'lua vim.lsp.buf.declaration()', opts) buf_set_keymap('n', 'gd', 'lua vim.lsp.buf.definition()', opts) buf_set_keymap('n', 'K', 'lua vim.lsp.buf.hover()', opts) buf_set_keymap('n', 'gi', 'lua vim.lsp.buf.implementation()', opts) buf_set_keymap('n', '', 'lua vim.lsp.buf.signature_help()', opts) buf_set_keymap('n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', opts) buf_set_keymap('n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', opts) buf_set_keymap('n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', opts) buf_set_keymap('n', 'D', 'lua vim.lsp.buf.type_definition()', opts) buf_set_keymap('n', 'rn', 'lua vim.lsp.buf.rename()', opts) buf_set_keymap('n', 'ca', 'lua vim.lsp.buf.code_action()', opts) buf_set_keymap('n', 'gr', 'lua vim.lsp.buf.references()', opts) buf_set_keymap('n', 'e', 'lua vim.lsp.diagnostic.show_line_diagnostics()', opts) buf_set_keymap('n', '[d', 'lua vim.lsp.diagnostic.goto_prev()', opts) buf_set_keymap('n', ']d', 'lua vim.lsp.diagnostic.goto_next()', opts) buf_set_keymap('n', 'q', 'lua vim.lsp.diagnostic.set_loclist()', opts) buf_set_keymap('n', 'f', 'lua vim.lsp.buf.formatting()', opts) end -- Use a loop to conveniently call 'setup' on multiple servers and -- map buffer local keybindings when the language server attaches -- local servers = { 'pyls', 'rust_analyzer', 'tsserver' } local servers = { 'pyright' } for _, lsp in ipairs(servers) do nvim_lsp[lsp].setup { on_attach = on_attach, flags = { debounce_text_changes = 150, }, } end end, } use 'nvim-treesitter/playground' use 'tpope/vim-commentary' use 'tpope/vim-surround' use 'tpope/vim-repeat' use { 'nvim-telescope/telescope.nvim', requires = { {'nvim-lua/plenary.nvim'}, {'glepnir/lspsaga.nvim'}, {'nvim-telescope/telescope-fzf-native.nvim', run = 'make' }, }, config = function() actions = require("telescope.actions") require("telescope").setup{ extensions = { fzf = { fuzzy = false, -- false will only do exact matching override_generic_sorter = true, -- override the generic sorter override_file_sorter = true, -- override the file sorter case_mode = "smart_case", -- or "ignore_case" or "respect_case" -- the default case_mode is "smart_case" } }, defaults = { mappings = { i = { [""] = actions.close, [''] = false, }, }, vimgrep_arguments = { 'rg', '--color=never', '--no-heading', '--with-filename', '--line-number', '--column', '--smart-case' }, prompt_prefix = "> ", selection_caret = "> ", entry_prefix = " ", initial_mode = "insert", selection_strategy = "reset", sorting_strategy = "descending", layout_strategy = "horizontal", layout_config = { horizontal = { mirror = false, }, vertical = { mirror = false, }, }, file_sorter = require'telescope.sorters'.get_fuzzy_file, file_ignore_patterns = {}, generic_sorter = require'telescope.sorters'.get_generic_fuzzy_sorter, winblend = 0, border = {}, borderchars = { '─', '│', '─', '│', '╭', '╮', '╯', '╰' }, color_devicons = true, use_less = true, path_display = {}, 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, -- Developer configurations: Not meant for general override buffer_previewer_maker = require'telescope.previewers'.buffer_previewer_maker } } require('telescope').load_extension('fzf') end, } use 'FooSoft/vim-argwrap' use 'tpope/vim-fugitive' use { 'lukas-reineke/indent-blankline.nvim', config = function() require("indent_blankline").setup { char = " ", char_highlight_list = { "IndentBlanklineIndent1", "IndentBlanklineIndent2", }, show_trailing_blankline_indent = false, } end, } use { 'francoiscabrol/ranger.vim', -- bclose gets rid of "[Process exited 0]" annoyance requires = { {'rbgrouleff/bclose.vim'} }, } use 'bkad/CamelCaseMotion' use { 'phaazon/hop.nvim', as = 'hop', config = function() -- you can configure Hop the way you like here; see :h hop-config require'hop'.setup { keys = 'etovxqpdygfblzhckisuran' } end } use 'ervandew/supertab' end)