aboutsummaryrefslogtreecommitdiff
path: root/init.lua
diff options
context:
space:
mode:
Diffstat (limited to 'init.lua')
-rw-r--r--init.lua374
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)