diff options
Diffstat (limited to 'init.lua')
-rw-r--r-- | init.lua | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..374aecc --- /dev/null +++ b/init.lua @@ -0,0 +1,374 @@ +--[[ +How to install + +1. Run `PackerSync` +2. Run TSInstall <langauge> 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 = "<c-n>" + + +-- Set up spacebar as leader +-- https://icyphox.sh/blog/nvim-lua/ +map('n', '<Space>', '', {}) +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', '<leader><leader>', ':noh<cr>', options) +map('i', 'jj', '<esc>', options) + +-- Visually select last copied text +map('n', 'gp', "`[v`]", options) +map('n', '<leader>ps', '<cmd>PackerSync<cr>', options) +map('n', '<leader>ff', '<cmd>Telescope find_files<cr>', options) +map('n', '<leader>fb', '<cmd>Telescope buffers<cr>', options) +map('n', '<leader>fj', '<cmd>Telescope jumplist<cr>', options) +map('n', '<leader>f/', '<cmd>Telescope live_grep<cr>', options) +map('n', '<leader>fa', '<cmd>Telescope grep_string<cr>', options) +map('n', '<leader>fg', "<cmd>lua require('telescope.builtin').git_status()<cr>", options) + +map('n', '<leader>du', '<cmd>diffupdate<cr>', options) +map('n', '<leader>dd', '<cmd>diffget<cr>', options) +map('n', '<leader>df', '<cmd>diffput<cr>', options) +map('n', '_', '[c', options) +map('n', '=', ']c', options) +-- Visually select line without ending +map('n', '<leader>v', '^v$h', options) + +-- Ledger Shortcuts +-- Copy the last entry +map('n', '<leader>ll', 'G{jV}y}p10l', options) +-- Copy the current entry to the bottom, copy date from last entry +map('n', '<leader>lb', '{jV}yGp10l{{jvEy}jvEpl', options) +-- Copy the current entry to the next position +map('n', '<leader>ln', '{jV}y}p10l', options) +-- Jump down from line to replace dollar ammount +map('n', '<leader>ld', 'j^f$lC', options) +-- After searching pull entry to current position +map('n', '<leader>ly', 'vapy<C-o>p{{jvEy}jvEpl', options) + + +map('n', '<leader>ep', 'ofrom pudb import set_trace; set_trace()<esc>', options) + + + + +map('n', '<c-w>t', "<cmd>tabnew<cr>", options) +map('n', '<c-w><c-f>', '<c-w>f<c-w>T', options) +map('n', '<c-w><c-]>', '<c-w>v<c-]><c-w>T', options) +map('n', '<c-w><c-t>', '<c-w>v<c-w>T', options) +map('n', '<leader>ee', '<cmd>e!<cr>', options) +map('n', '<expr> k', [[(v:count > 1 ? "m'" . v:count : '') . 'k']], options) +map('n', '<expr> j', [[(v:count > 1 ? "m'" . v:count : '') . 'j']], options) + + +map('n', '<leader>co', '<cmd>copen<cr>', options) +map('n', '<leader>cc', '<cmd>cclose<cr>', options) + +map('n', '<leader>ew', '<cmd>ArgWrap<cr>', options) + +map('n', '<leader>gs', '<cmd>Git<cr>', options) + +map('n', '<leader>m', '<cmd>Ranger<cr>', options) +map('n', '<leader>n', '<cmd>RangerWorkingDirectory<cr>', options) + +map('', '<leader>s', '<cmd>HopChar2<cr>', 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 <c-x><c-o> + 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', '<cmd>lua vim.lsp.buf.declaration()<CR>', opts) + buf_set_keymap('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<CR>', opts) + buf_set_keymap('n', 'K', '<cmd>lua vim.lsp.buf.hover()<CR>', opts) + buf_set_keymap('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<CR>', opts) + buf_set_keymap('n', '<C-k>', '<cmd>lua vim.lsp.buf.signature_help()<CR>', opts) + buf_set_keymap('n', '<spnce>wa', '<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>', opts) + buf_set_keymap('n', '<space>wr', '<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>', opts) + buf_set_keymap('n', '<space>wl', '<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>', opts) + buf_set_keymap('n', '<space>D', '<cmd>lua vim.lsp.buf.type_definition()<CR>', opts) + buf_set_keymap('n', '<space>rn', '<cmd>lua vim.lsp.buf.rename()<CR>', opts) + buf_set_keymap('n', '<space>ca', '<cmd>lua vim.lsp.buf.code_action()<CR>', opts) + buf_set_keymap('n', 'gr', '<cmd>lua vim.lsp.buf.references()<CR>', opts) + buf_set_keymap('n', '<space>e', '<cmd>lua vim.lsp.diagnostic.show_line_diagnostics()<CR>', opts) + buf_set_keymap('n', '[d', '<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>', opts) + buf_set_keymap('n', ']d', '<cmd>lua vim.lsp.diagnostic.goto_next()<CR>', opts) + buf_set_keymap('n', '<space>q', '<cmd>lua vim.lsp.diagnostic.set_loclist()<CR>', opts) + buf_set_keymap('n', '<space>f', '<cmd>lua vim.lsp.buf.formatting()<CR>', 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 = { + ["<esc>"] = actions.close, + ['<C-u>'] = 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) |