--[[ How to install 1. Run `PackerSync` 2. Run TSInstall for treesitter grammar 3. LspInfo to check if the language servers are working Todo https://dev.to/voyeg3r/writing-useful-lua-functions-to-my-neovim-14ki function to remove whitespace and preserve spot on save ]]-- -- 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 local o = vim.o local g = vim.g local cmd = vim.cmd local map = vim.api.nvim_set_keymap -- https://old.reddit.com/r/neovim/comments/lrz18i/how_to_change_colorscheme_in_lua_without_any/ g.colors_name = "nord" g.SuperTabDefaultCompletionType = "" -- Set up spacebar as leader -- https://icyphox.sh/blog/nvim-lua/ map('n', '', '', {}) vim.g.mapleader = ' ' -- Set spaces > tabs, 4 as default o.expandtab = true o.tabstop = 4 o.shiftwidth = 0 o.relativenumber = true o.wrap = false o.history = 1000 -- Wildmode show list, complete to first result o.wildignore = "*/app/cache,*/vendor,*/env,*.pyc,*/venv,*/__pycache__,*/venv" o.splitright = true o.splitbelow = true 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 cmd('au VimEnter * hi ' .. highlight) end -- Along with the highlight definition for ColorColumn above, these options -- will set colored marks at certain line lengths cmd([[au BufEnter *.py let w:m1=matchadd('ColorColumn', '\%81v', 100)]]) cmd([[au BufEnter *.py let w:m2=matchadd('Error', '\%121v', 100)]]) cmd([[au BufLeave *.py call clearmatches()"]]) options = { noremap = true } map('n', '', ':noh', options) map('i', 'jj', '', options) -- Visually select last copied text map('n', 'gp', "`[v`]", options) map('n', 'ps', 'PackerSync', 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', '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) -- Status Line -- https://icyphox.sh/blog/nvim-lua/ local mode_map = { ['n'] = 'normal', ['no'] = 'n·operator pending', ['v'] = 'visual', ['V'] = 'v·line', [''] = 'v·block', ['s'] = 'select', ['S'] = 's·line', [''] = 's·block', ['i'] = 'insert', ['R'] = 'replace', ['Rv'] = 'v·replace', ['c'] = 'command', ['cv'] = 'vim ex', ['ce'] = 'ex', ['r'] = 'prompt', ['rm'] = 'more', ['r?'] = 'confirm', ['!'] = 'shell', ['t'] = 'terminal' } local function mode() local m = vim.api.nvim_get_mode().mode if mode_map[m] == nil then return m end return '[' .. mode_map[m] .. '] ' end local stl = { '%#PrimaryBlock#', mode(), '%#SecondaryBlock#', '%#Blanks#', '%f', '%m', '%=', '%#SecondaryBlock#', '%l,%c ', '%#PrimaryBlock#', '%{&filetype}', } o.statusline = table.concat(stl) 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'} }, config = function() actions = require("telescope.actions") require("telescope").setup{ 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 } } 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)