aboutsummaryrefslogtreecommitdiff
path: root/.config/nvim/lua/user
diff options
context:
space:
mode:
Diffstat (limited to '.config/nvim/lua/user')
-rw-r--r--.config/nvim/lua/user/keys.lua651
-rw-r--r--.config/nvim/lua/user/mods.lua138
-rw-r--r--.config/nvim/lua/user/opts.lua237
-rw-r--r--.config/nvim/lua/user/pack.lua404
-rw-r--r--.config/nvim/lua/user/utils.lua85
5 files changed, 1515 insertions, 0 deletions
diff --git a/.config/nvim/lua/user/keys.lua b/.config/nvim/lua/user/keys.lua
new file mode 100644
index 0000000..2c07a5a
--- /dev/null
+++ b/.config/nvim/lua/user/keys.lua
@@ -0,0 +1,651 @@
+--[[ key.lua ]]
+
+-- Shorten function name
+--local keymap = vim.api.nvim_set_keymap
+local keymap = vim.keymap
+
+--local function new_desc(d)
+-- return { desc = d }
+--end
+--
+--local d = new_desc
+
+--local opts = { noremap = true, silent = true }
+local term_opts = { noremap = true, silent = false }
+ local map = function(mode, l, r, opts)
+ opts = opts or {}
+ opts.silent = true
+ opts.noremap = true
+ keymap.set(mode, l, r, opts)
+ end
+
+
+--------------- Standard Operations ---------------
+-- Semi-colon as leader key
+vim.g.mapleader = ";"
+--vim.g.maplocalleader = ";"
+
+-- "jj" to exit insert-mode
+map("i", "jj", "<esc>")
+
+map("n", "<leader>m", ":messages<CR>")
+map("n", "<leader>cd", ":cd %:p:h<CR>:pwd<CR>")
+-- Print last error message or use these commands | v:errmsgv | :statusmsg | :h execute() |
+--nnoremap <silent><leader>x :put =trim(execute(input(':', '', 'command')))<CR>
+-- Press <leader>x, then enter your command, such as 5mess and press <Enter>. The last five message lines will be added to the current buffer.
+-- useful to copy error message when vim start
+
+-- save quickly
+--map("n", ";w", ":w<CR>", d("Save buffer"))
+
+--map("n", "<leader>so", ":luafile %<CR>")
+
+--vim.cmd([[
+--let $my_vimrc = $localappdata.'/nvim/init.lua'
+--nnoremap <leader>so :source $my_vimrc<cr>
+--]])
+
+-- Toggle between folds
+--utils.map("n", "<F2>", "&foldlevel ? 'zM' : 'zR'", { expr = true })
+
+-- Move to the next and previous item in the quickfixlist
+--utils.map("n", "]c", "<Cmd>cnext<CR>")
+--utils.map("n", "[c", "<Cmd>cprevious<CR>")
+
+-- Use space to toggle fold
+--utils.map("n", "<Space>", "za")
+
+-- Hitting ESC when inside a terminal to get into normal mode
+--utils.map("t", "<Esc>", [[<C-\><C-N>]])
+
+-- select last change
+--nnoremap gV `[v`]
+
+--map("n", "<esc>", function()
+-- notify.dismiss()
+-- vim.cmd.noh()
+--end)
+
+--"nnore fast [e]dit and [s]ourcing .[v]imrc
+--nnoremap <leader>ev :edit $MYVIMRC<CR>
+--"fast macro
+--nnoremap @ <cmd>set lazyredraw <bar> execute 'noautocmd norm! ' . v:count1 . '@' . getcharstr() <bar> set nolazyredraw<cr>
+--xnoremap @ :<C-U>set lazyredraw <bar> execute "noautocmd '<,'>norm! " . v:count1 . "@" . getcharstr()<bar> set nolazyredraw<cr>
+
+--map("n", "<leader><CR>", ":runtime! /lua/plugins/*.lua<CR> | :runtime! /lua/user/*.lua<CR> | :luafile ~/.config/nvim/init.lua<CR>", print ("Nvim reloaded"))
+--map("n", "<leader><CR>", ":lua require('init').unload_lua_namespace()<CR>", print ("Nvim reloaded"))
+--map("n", "<leader><CR>", "<cmd>luafile ~/.config/nvim/init.lua<CR>", vim.notify("Nvim configuration reloaded!", vim.log.levels.INFO))
+--map("n", "<leader><CR>", "<cmd>luafile ~/.config/nvim/init.lua<CR> | :lua require("notify")("completion off")")
+--map("n", "<leader><CR>", "<cmd>luafile ~/.config/nvim/init.lua<CR>", vim.api.nvim_echo({{'first chunk and ', 'None'}, {'second chunk to echo', 'None'}}, false, {}))
+--map("n", "<leader><CR>", "<cmd>luafile ~/.config/nvim/init.lua<CR>", print ("Nvim config loading..."))
+--map("n", "<leader><CR>", "<cmd>luafile ~/.config/nvim/init.lua<CR> | :echo ('hello') | <C-l><CR>")
+map("n", "<leader><CR>", "<cmd>luafile ~/.config/nvim/init.lua<CR> | :echom ('Nvim config loading...') | :sl! | echo ('')<CR>")
+map("n", "<leader>u", ":echo '' | redraw<CR>") --clear messages
+--map("n", "<leader><CR>", "<cmd>luafile ~/.config/nvim/init.lua<CR>")
+--vim.api.nvim_set_keymap("n", "<leader><CR>", "<cmd>lua ReloadConfig()<CR>", { noremap = true, silent = false })
+
+map("n", "<Leader>tc", ":lua require('user.utils').toggle_completion()<CR>")
+-- vim.notify("Nvim configuration reloaded!", vim.log.levels.INFO)
+
+--vim.api.nvim_set_keymap('n', '<Leader>qr', '<cmd>:lua require("plugins.telescope").reload()<CR>', { noremap = true, silent = true })
+
+--Easier split navigations, just ctrl-j instead of ctrl-w then j
+map("n", "<C-J>", "<C-W><C-J>")
+map("n", "<C-K>", "<C-W><C-K>")
+map("n", "<C-L>", "<C-W><C-L>")
+map("n", "<C-H>", "<C-W><C-H>")
+
+-- Combine buffers list with buffer name
+map("n", "<Leader>b", ":buffers<CR>:buffer<Space>")
+--map("n", "<leader>b", ":ls<cr>:b<space>")
+
+-- Map buffer next, prev and delete to <leader+(n/p/d)>
+map("n", "<leader>n", ":bn<cr>")
+map("n", "<leader>p", ":bp<cr>")
+map("n", "<leader>d", ":bd<cr>")
+
+-- Disable default completion.
+map('i', '<C-n>', '<Nop>')
+map('i', '<C-p>', '<Nop>')
+
+-- Set alt + j/k to switch lines of texts or simply move them
+map("n", "<A-k>", ':let save_a=@a<Cr><Up>"add"ap<Up>:let @a=save_a<Cr>')
+map("n", "<A-j>", ':let save_a=@a<Cr>"add"ap:let @a=save_a<Cr>')
+
+map("i", "<C-l>", "<Del>")
+
+map("n", "<leader><C-l>", "<Cmd>!clear<CR>")
+
+map("n", "<leader>y", ":BufferPick<CR>")
+
+vim.cmd([[
+ inoremap <A-h> <left>
+ inoremap <A-j> <down>
+ inoremap <A-k> <up>
+ inoremap <A-l> <right>
+]])
+
+vim.cmd([[
+ cnoremap <A-h> <left>
+ cnoremap <A-j> <down>
+ cnoremap <A-k> <up>
+ cnoremap <A-l> <right>
+]])
+
+--vim.cmd([[
+-- cnoremap <C-A> <Home>
+-- cnoremap <C-F> <Right>
+-- cnoremap <C-B> <Left>
+-- cnoremap <C-E> <End>
+--]])
+
+vim.cmd([[
+ snoremap <A-h> <left>
+ snoremap <A-j> <down>
+ snoremap <A-k> <up>
+ snoremap <A-l> <right>
+]])
+
+-- move block easily
+map("n", "<", "<<", term_opts)
+map("n", ">", ">>", term_opts)
+map("x", "<", "<gv", term_opts)
+map("x", ">", ">gv", term_opts)
+
+-- Resize Panes
+map("n", "<Leader>+", ":resize +5<CR>")
+map("n", "<Leader>-", ":resize -5<CR>")
+map("n", "<Leader><", ":vertical resize +5<CR>")
+map("n", "<Leader>>", ":vertical resize -5<CR>")
+map("n", "<Leader>=", "<C-w>=")
+
+-- New tab
+map("n", "<C-T>e", ":tabedit")
+
+-- create tab like window
+map("n", "<C-T>h", ":tabprevious<CR>")
+map("n", "<C-T>l", ":tabnext<CR>")
+map("n", "<C-T>n", ":tabnew<CR>")
+
+-- Vim TABs
+map("n", "<leader>1", "1gt<CR>")
+map("n", "<leader>2", "2gt<CR>")
+map("n", "<leader>3", "3gt<CR>")
+map("n", "<leader>4", "4gt<CR>")
+map("n", "<leader>5", "5gt<CR>")
+map("n", "<leader>6", "6gt<CR>")
+map("n", "<leader>7", "7gt<CR>")
+map("n", "<leader>8", "8gt<CR>")
+map("n", "<leader>9", "9gt<CR>")
+map("n", "<leader>0", "10gt<CR>")
+
+-- Split window
+map("n", "<leader>h", ":split<CR>")
+map("n", "<leader>v", ":vsplit<CR>")
+map("n", "<leader>c", "<C-w>c")
+
+-- Toggle set number
+map("n", "<leader>$", ":NumbersToggle<CR>")
+map("n", "<leader>%", ":NumbersOnOff<CR>")
+
+-- Change mode to executable
+map("n", "<leader>x", ":!chmod +x %<CR>")
+
+-- Paste without replace clipboard
+map("v", "p", '"_dP')
+
+-- Paste end of line
+--map("n", ",", "$p")
+--vim.cmd([[
+-- nmap , $p
+--]])
+
+-- Select entire buffer
+--map("v", "<aa>", "gg<S-v>G")
+
+-- Delete without changing the registers
+--map('n', 'x', '"_x')
+
+-- Select all text in current buffer
+--map('n', '<leader>a', ':keepjumps normal! ggVG<cr>')
+
+-- Swap two pieces of text, use x to cut in visual mode, then use Ctrl-x in
+-- visual mode to select text to swap with
+map("v", "<C-X>", "<Esc>`.``gvP``P")
+
+-- Keep Visual mode selection when indenting text
+--utils.map("x", ">", ">gv")
+--utils.map("x", "<", "<gv")
+
+-- Make visual pasting a word to not update the unnamed register
+-- Thus, allowing us to repeatedly paste the word. {"_ : black-hole register}
+--utils.map("v", "p", [["_dP]])
+
+-- Whole-word search
+--utils.map("n", "<leader>/", ":/\\<\\><Left><Left>", { silent = false })
+
+-- EasyAlign keybindings
+-- 'vipga' starts interactive EasyAlign in visual mode
+-- 'gaip' starts interactive EasyAlign for text/motion object
+--utils.map({ "n", "x" }, "ga", "<Plug>(EasyAlign)")
+--utils.map({ "n", "x" }, "<leader>ga", "<Plug>(LiveEasyAlign)")
+
+-- Set a mark when moving more than 5 lines upwards/downards
+-- this will populate the jumplist enabling us to jump back with Ctrl-O
+--utils.map("n", "k", [[(v:count > 5 ? "m'" . v:count : "") . 'k']], { expr = true })
+--utils.map("n", "j", [[(v:count > 5 ? "m'" . v:count : "") . 'j']], { expr = true })
+
+-- Zoom toggle a buffer in a new tab
+--utils.map("n", "<leader>z", function()
+-- require("tt.helper").zoomToggleNewTab()
+--end, { desc = "Zoom toggle a buffer in a new tab" })
+
+-- Hitting ESC when inside a terminal to get into normal mode
+--utils.map("t", "<Esc>", [[<C-\><C-N>]])
+
+-- markdown-preview
+map("n", "<leader>md", "<Plug>MarkdownPreviewToggle")
+
+
+-- Search and replace
+map("v", "<leader>sr", 'y:%s/<C-r><C-r>"//g<Left><Left>c')
+--vnoremap ; :call Get_visual_selection()<cr>
+--
+--function! Get_visual_selection()
+-- " Why is this not a built-in Vim script function?!
+-- let [lnum1, col1] = getpos("'<")[1:2]
+-- let [lnum2, col2] = getpos("'>")[1:2]
+-- let lines = getline(lnum1, lnum2)
+-- let lines[-1] = lines[-1][: col2 - (&selection == 'inclusive' ? 1 : 2)]
+-- let lines[0] = lines[0][col1 - 1:]
+-- let selection = join(lines,'\n')
+-- let change = input('Change the selection with: ')
+-- execute ":%s/".selection."/".change."/g"
+--endfunction
+vim.cmd([[
+let s:hidden_all = 0
+function! ToggleHiddenAll()
+ if s:hidden_all == 0
+ let s:hidden_all = 1
+ set noshowmode
+ set noruler
+ set laststatus=0
+ set noshowcmd
+ else
+ let s:hidden_all = 0
+ set showmode
+ set ruler
+ set laststatus=2
+ set showcmd
+ endif
+endfunction
+nnoremap <S-h> :call ToggleHiddenAll()<CR>
+]])
+
+vim.cmd([[
+ map <leader>s :up \| saveas! %:p:r-<C-R>=strftime("%y.%m.%d-%H:%M")<CR>-bak.<C-R>=expand("%:e")<CR> \| 3sleep \| e #<CR>
+]])
+
+-- Execute this file
+--map("n", "<leader><leader>x", ":call scripts#save_and_exec()<CR>", print("save & exec"))
+vim.cmd([[
+ " Execute this file
+ nnoremap <leader><leader>x :call scripts#save_and_exec()<CR>\|:echom "save & exec . . ."<CR>
+
+]])
+
+-------------- FZF --------------
+map("n", "<leader>fz", "<cmd>lua require('fzf-lua').files()<CR>")
+
+-------------- Telescope --------------
+--Telescope find_files cwd=..
+map("n", "<leader>fc", "<cmd>lua require('telescope.builtin').commands()<cr>")
+map("n", "<leader>cf", "<cmd>Telescope changed_files<cr>")
+map("n", "<leader>fk", "<cmd>lua require('telescope.builtin').keymaps()<cr>")
+map("n", "<leader>fh", "<cmd>lua require('telescope.builtin').help_tags()<cr>")
+--map(
+-- "n",
+-- "<leader>ft",
+-- "<cmd>lua require('telescope.builtin').builtin(require('telescope.themes').get_dropdown({}))<cr>")
+
+-- maps.n["<leader>fF"] = {
+-- function() require("telescope.builtin").find_files { hidden = true, no_ignore = true } end,
+-- desc = "Search all files",
+-- <cmd>Telescope find_files hidden=true<cr>
+--map("n", "<leader>fh", "<cme>lua require('telecsope.builtin').file_files hidden=true<cr>")
+map("n", "<leader>ff", function() require("telescope.builtin").find_files { hidden = true, no_ignore = true } end)
+--map("n", "<leader>fe", ":lua require('telescope.builtin').file_browser({cwd = '.'})<CR>")
+map("n", "<leader>fg", "<cmd>lua require('telescope.builtin').live_grep()<cr>")
+map("n", "<leader>fb", "<cmd>lua require('telescope.builtin').current_buffer_fuzzy_find()<cr>")
+map("n", "<leader>fd", "<cmd>lua require('telescope.builtin').diagnostics()<cr>")
+map("n", "<leader>fp", "<cmd>Telescope pickers<cr>")
+
+-- find notes
+map("n", "<leader>fn", [[<Cmd>lua require'plugins.telescope'.find_notes()<CR>]])
+-- search notes
+map("n", "<leader>fgn", [[<Cmd>lua require'plugins.telescope'.grep_notes()<CR>]])
+-- Find files in config dirs
+map("n", "<leader>f.", [[<Cmd>lua require'plugins.telescope'.find_configs()<CR>]])
+--map("n", "<leader>fz", ":FZF<CR>")
+--map("t", [[<Esc><Esc>]], [[<C-\><C-N>]])
+--map("n", "ff", ":NvimTreeToggle<CR>", {})
+map("n", "<leader>f", ":NvimTreeToggle<CR>", {})
+-- This <Esc><Esc> avoids crashing fzf menu running in TERMINAL MODE (:q if you do)
+-- Find files in config dirs
+--key_map("n", "<leader>e", ":lua require('plugins.telescope').find_configs()<CR>", opts)
+--map("n", "<leader>f.", "<cmd>lua require('plugins.telescope').find_configs({})<cr>")
+--map("n", "<leader>ft", "<cmd>lua require('plugins.telescope').file_explorer({})<cr>")
+--map("n", "<leader>fd", "<cmd>lua require('plugins.telescope').find_notes({})<cr>")
+map("n", "<leader>fm", "<cmd>lua require('telescope').extensions.media_files.media_files({})<cr>")
+-- registers picker
+map("n", "<leader>r", "<cmd>lua require('telescope.builtin').registers({})<CR>")
+-- find files including gitignored
+--keymap(
+-- "n",
+-- "<leader>fg",
+-- "<cmd>lua require('telescope.builtin').find_files({find_command={'fd','--no-ignore-vcs'}})<CR>")
+-- open available commands & run it
+--map("n", "<leader>fc", "<cmd>lua require('telescope.builtin').commands({results_title='Commands Results'})<CR>")
+
+-------------- Autopairs --------------
+Toggle_autopairs = function()
+ local ok, autopairs = pcall(require, "nvim-autopairs")
+ if ok then
+ if autopairs.state.disabled then
+ autopairs.enable()
+ print("autopairs on")
+ else
+ autopairs.disable()
+ print("autopairs off")
+ end
+ else
+ print("autopairs not available")
+ end
+end
+map("n", "<leader>ww", ":lua Toggle_autopairs()<CR>", term_opts)
+
+-------------- Functions --------------
+-- Toggle transparency
+vim.cmd([[
+ let t:is_transparent = 0
+ function! Toggle_transparent_background()
+ if t:is_transparent == 0
+ hi Normal guibg=#111111 ctermbg=black
+ let t:is_transparent = 1
+ else
+ hi Normal guibg=NONE ctermbg=NONE
+ let t:is_transparent = 0
+ endif
+ endfunction
+ nnoremap <leader>tb :call Toggle_transparent_background()<CR>
+]])
+--keymap('n', '<leader>tb', ':Toggle_transparent_background<CR>')
+
+-- Toggle zoom
+vim.cmd([[
+ function! s:ZoomToggle() abort
+ if exists('t:zoomed') && t:zoomed
+ execute t:zoom_winrestcmd
+ let t:zoomed = 0
+ else
+ let t:zoom_winrestcmd = winrestcmd()
+ resize
+ vertical resize
+ let t:zoomed = 1
+ endif
+ endfunction
+ command! ZoomToggle call s:ZoomToggle()
+ ]])
+map("n", "<leader>z", ":ZoomToggle<CR>")
+-- "Zoom" a split window into a tab and/or close it
+--keymap('n', '<Leader>,', ':tabnew %<CR>')
+--keymap('n', '<Leader>.', ':tabclose<CR>')
+
+-- Open last closed buffer
+vim.cmd([[
+ function! OpenLastClosed()
+ let last_buf = bufname('#')
+ if empty(last_buf)
+ echo "No recently closed buffer found"
+ return
+ endif
+ let result = input("Open ". last_buf . " in (n)ormal (v)split, (t)ab or (s)plit ? (n/v/t/s) : ")
+ if empty(result) || (result !=# 'v' && result !=# 't' && result !=# 's' && result !=# 'n')
+ return
+ endif
+ if result ==# 't'
+ execute 'tabnew'
+ elseif result ==# 'v'
+ execute "vsplit"
+ elseif result ==# 's'
+ execute "split"
+ endif
+ execute 'b ' . last_buf
+ endfunction
+ ]])
+map("n", "<C-t>", ":call OpenLastClosed() <CR>")
+
+-- Tabularize
+vim.cmd([[
+ vnoremap <expr> <Leader>mm ':Tabularize /^\s*\S.*\zs' . split(&commentstring, '%s')[0] . "<CR>"
+ nnoremap <expr> <Leader>mm ':Tabularize /^\s*\S.*\zs' . split(&commentstring, '%s')[0] . "<CR>"
+ "nnoremap <leader>i mc40A <esc>080lDgelD`cP
+ "vnoremap <leader>ii mc0f-20i<Space><Esc>`cdt=j
+]])
+
+vim.cmd([[
+ " Start interactive EasyAlign in visual mode (e.g. vipga)
+ xmap ga <Plug>(EasyAlign)
+ " Start interactive EasyAlign for a motion/text object (e.g. gaip)
+ nmap ga <Plug>(EasyAlign)
+ if !exists('g:easy_align_delimiters')
+ let g:easy_align_delimiters = {}
+ endif
+ let g:easy_align_delimiters['--'] = { 'pattern': '--', 'ignore_groups': ['String'] }
+ nnoremap <F1> 21A <Esc>d21\|
+ imap <F1> <Esc><F1>a
+]])
+--:'<,'>EasyAlign /--/
+--EasyAlign /--/
+--:'<,'>Tabularize /--
+
+--map("n", "<leader>,", ":hide<CR>")
+--map("n", "<leader>.", ":unhide<CR>")
+
+--" Clean trailing whitespace
+--nnoremap <leader>ww mz:%s/\s\+$//<cr>:let @/=''<cr>`z
+
+-- Save with root permission (not working for now)
+--vim.api.nvim_create_user_command('W', 'w !sudo tee > /dev/null %', {})
+
+-- Copy and Paste with <C-c> and <C-v>
+--keymap('n', '<expr> p', (v:register =--= '"' && &clipboard =~ 'unnamed' ? '"*p' : '"' . v:register . 'p')'')
+-- Use command :Vb for Visual Block or <C-q> since <C-v> is used for Copy
+--command! Vb normal! <C-v>
+-- Map <w!!> to save/edit a root permission/read-only file, only works in
+-- traditional vim and not neovim
+--keymap('c', 'w!! %!sudo tee > /dev/null')
+--" Copying text to the system clipboard.
+--"
+--" For some reason Vim no longer wants to talk to the OS X pasteboard through "*.
+--" Computers are bullshit.
+--function! g:FuckingCopyTheTextPlease()
+-- let old_z = @z
+-- normal! gv"zy
+-- call system('pbcopy', @z)
+-- let @z = old_z
+--endfunction
+--noremap <leader>p :silent! set paste<CR>"*p:set nopaste<CR>
+--" noremap <leader>p mz:r!pbpaste<cr>`z
+--vnoremap <leader>y :<c-u>call g:FuckingCopyTheTextPlease()<cr>
+
+--" Indent/dedent/autoindent what you just pasted.
+--nnoremap <lt>> V`]<
+--nnoremap ><lt> V`]>
+--nnoremap =- V`]=
+
+--" Keep the cursor in place while joining lines
+--nnoremap J mzJ`z
+
+--" Toggle [i]nvisible characters
+--nnoremap <leader>i :set list!<cr>
+--
+--" Unfuck my screen
+--nnoremap U :syntax sync fromstart<cr>:redraw!<cr>
+
+--" Ranger
+--nnoremap <leader>r :silent !ranger %:h<cr>:redraw!<cr>
+--nnoremap <leader>R :silent !ranger<cr>:redraw!<cr>
+--
+--" Insert Mode Completion {{{
+--
+--inoremap <c-f> <c-x><c-f>
+--inoremap <c-]> <c-x><c-]>
+--inoremap <c-l> <c-x><c-l>
+---- Open the current file in the default program (on Mac this should just be just `open`)
+--keymap('n', '<leader>x', ':!xdg-open %<cr><cr>')
+
+map("n", "<leader>fF", "<cmd>lua require('telescope.builtin').find_files()<cr>")
+--keymap("n", "<leader>ff", "<cmd>lua require('telescope.builtin').find_files cwd=..()<cr>")
+--keymap('n', '<leader>k', ':nohlsearch<CR>')
+--
+--"This unsets the "last search pattern" register by hitting return
+vim.cmd([[
+ nnoremap <silent> <CR> :noh<CR><CR>
+]])
+
+--keymap('n', '<leader>Q', ':bufdo bdelete<CR>')
+--
+---- Allow gf to open non-existent files
+--keymap('', 'gf', ':edit <cfile><CR>')
+--
+---- Reselect visual selection after indenting
+--keymap('v', '<', '<gv')
+--keymap('v', '>', '>gv')
+--
+---- Maintain the cursor position when yanking a visual selection
+---- http://ddrscott.github.io/blog/2016/yank-without-jank/
+--keymap('v', 'y', 'myy`y')
+--keymap('v', 'Y', 'myY`y')
+--keymap("n", "<C-q>", ":q<cr>")
+--keymap("n", "<C-M-q>", ":qa!<cr>")
+
+--" Sort lines
+--nnoremap <leader>s vip:!sort<cr>
+--vnoremap <leader>s :!sort<cr>
+--
+--" Tabs
+--nnoremap <leader>( :tabprev<cr>
+--nnoremap <leader>) :tabnext<cr>
+--
+--" Wrap
+--nnoremap <leader>W :set wrap!<cr>
+
+--set foldlevelstart=0
+--
+--" Space to toggle folds.
+--nnoremap <Space> za
+--vnoremap <Space> za
+--" Make zO recursively open whatever fold we're in, even if it's partially open.
+--nnoremap zO zczO
+
+-- Packer
+--maps.n["<leader>pc"] = { "<cmd>PackerCompile<cr>", desc = "Packer Compile" }
+--maps.n["<leader>pi"] = { "<cmd>PackerInstall<cr>", desc = "Packer Install" }
+--maps.n["<leader>ps"] = { "<cmd>PackerSync<cr>", desc = "Packer Sync" }
+--maps.n["<leader>pS"] = { "<cmd>PackerStatus<cr>", desc = "Packer Status" }
+--maps.n["<leader>pu"] = { "<cmd>PackerUpdate<cr>", desc = "Packer Update" }
+-- NeoTree
+--if is_available "neo-tree.nvim" then
+-- keymaps.n["<leader>e"] = { "<cmd>Neotree toggle<cr>", desc = "Toggle Explorer" }
+-- keymaps.n["<leader>o"] = { "<cmd>Neotree focus<cr>", desc = "Focus Explorer" }
+--end
+-- Alpha
+--if is_available "alpha-nvim" then maps.n["<leader>d"] = { "<cmd>Alpha<cr>", desc = "Alpha Dashboard" } end
+
+-- Package Manager
+-- TODO: v2 rework these key bindings to be more general
+--if is_available "mason.nvim" then maps.n["<leader>lI"] = { "<cmd>Mason<cr>", desc = "LSP installer" } end
+-- Telescope
+--if is_available "telescope.nvim" then
+-- maps.n["<leader>fw"] = { function() require("telescope.builtin").live_grep() end, desc = "Search words" }
+-- maps.n["<leader>fW"] = {
+-- function()
+-- require("telescope.builtin").live_grep {
+-- additional_args = function(args) return vim.list_extend(args, { "--hidden", "--no-ignore" }) end,
+-- }
+-- end,
+-- desc = "Search words in all files",
+-- }
+-- maps.n["<leader>gt"] = { function() require("telescope.builtin").git_status() end, desc = "Git status" }
+-- maps.n["<leader>gb"] = { function() require("telescope.builtin").git_branches() end, desc = "Git branches" }
+-- maps.n["<leader>gc"] = { function() require("telescope.builtin").git_commits() end, desc = "Git commits" }
+-- maps.n["<leader>ff"] = { function() require("telescope.builtin").find_files() end, desc = "Search files" }
+-- maps.n["<leader>fF"] = {
+-- function() require("telescope.builtin").find_files { hidden = true, no_ignore = true } end,
+-- desc = "Search all files",
+-- }
+-- maps.n["<leader>fb"] = { function() require("telescope.builtin").buffers() end, desc = "Search buffers" }
+-- maps.n["<leader>fh"] = { function() require("telescope.builtin").help_tags() end, desc = "Search help" }
+-- maps.n["<leader>fm"] = { function() require("telescope.builtin").marks() end, desc = "Search marks" }
+-- maps.n["<leader>fo"] = { function() require("telescope.builtin").oldfiles() end, desc = "Search history" }
+-- maps.n["<leader>fc"] =
+-- { function() require("telescope.builtin").grep_string() end, desc = "Search for word under cursor" }
+-- maps.n["<leader>sb"] = { function() require("telescope.builtin").git_branches() end, desc = "Git branches" }
+-- maps.n["<leader>sh"] = { function() require("telescope.builtin").help_tags() end, desc = "Search help" }
+-- maps.n["<leader>sm"] = { function() require("telescope.builtin").man_pages() end, desc = "Search man" }
+-- maps.n["<leader>sn"] =
+-- { function() require("telescope").extensions.notify.notify() end, desc = "Search notifications" }
+-- maps.n["<leader>sr"] = { function() require("telescope.builtin").registers() end, desc = "Search registers" }
+-- maps.n["<leader>sk"] = { function() require("telescope.builtin").keymaps() end, desc = "Search keymaps" }
+-- maps.n["<leader>sc"] = { function() require("telescope.builtin").commands() end, desc = "Search commands" }
+-- maps.n["<leader>ls"] = {
+-- function()
+-- local aerial_avail, _ = pcall(require, "aerial")
+-- if aerial_avail then
+-- require("telescope").extensions.aerial.aerial()
+-- else
+-- require("telescope.builtin").lsp_document_symbols()
+-- end
+-- end,
+-- desc = "Search symbols",
+-- }
+-- maps.n["<leader>lR"] = { function() require("telescope.builtin").lsp_references() end, desc = "Search references" }
+--end
+--
+---- Terminal
+--if is_available "toggleterm.nvim" then
+-- local toggle_term_cmd = astronvim.toggle_term_cmd
+-- maps.n["<C-\\>"] = { "<cmd>ToggleTerm<cr>", desc = "Toggle terminal" }
+-- maps.n["<leader>gg"] = { function() toggle_term_cmd "lazygit" end, desc = "ToggleTerm lazygit" }
+-- maps.n["<leader>tn"] = { function() toggle_term_cmd "node" end, desc = "ToggleTerm node" }
+-- maps.n["<leader>tu"] = { function() toggle_term_cmd "ncdu" end, desc = "ToggleTerm NCDU" }
+-- maps.n["<leader>tt"] = { function() toggle_term_cmd "htop" end, desc = "ToggleTerm htop" }
+-- maps.n["<leader>tp"] = { function() toggle_term_cmd "python" end, desc = "ToggleTerm python" }
+-- maps.n["<leader>tl"] = { function() toggle_term_cmd "lazygit" end, desc = "ToggleTerm lazygit" }
+-- maps.n["<leader>tf"] = { "<cmd>ToggleTerm direction=float<cr>", desc = "ToggleTerm float" }
+-- maps.n["<leader>th"] = { "<cmd>ToggleTerm size=10 direction=horizontal<cr>", desc = "ToggleTerm horizontal split" }
+-- maps.n["<leader>tv"] = { "<cmd>ToggleTerm size=80 direction=vertical<cr>", desc = "ToggleTerm vertical split" }
+--end
+--
+---- Stay in indent mode
+--maps.v["<"] = { "<gv", desc = "unindent line" }
+--maps.v[">"] = { ">gv", desc = "indent line" }
+--
+---- Improved Terminal Mappings
+--maps.t["<esc>"] = { "<C-\\><C-n>", desc = "Terminal normal mode" }
+--maps.t["jk"] = { "<C-\\><C-n>", desc = "Terminal normal mode" }
+--maps.t["<C-h>"] = { "<c-\\><c-n><c-w>h", desc = "Terminal left window navigation" }
+--maps.t["<C-j>"] = { "<c-\\><c-n><c-w>j", desc = "Terminal down window navigation" }
+--maps.t["<C-k>"] = { "<c-\\><c-n><c-w>k", desc = "Terminal up window navigation" }
+--maps.t["<C-l>"] = { "<c-\\><c-n><c-w>l", desc = "Terminal right window naviation" }
+-- LSP Installer
+--if is_available "mason-lspconfig.nvim" then maps.n["<leader>li"] = { "<cmd>LspInfo<cr>", desc = "LSP information" } end
+
+-- ALE: toggle _ALE activity
+--keymap('n', '<leader>a',[[:ALEToggle<CR>]])
+
+--keymap('n', '<Leader>cd', ':call fzf#run({'source': 'fd -t d -H . ~', 'sink': 'cd'})<CR>')
+-- ":lua require('neogen').generate()<CR>")
+--keymap("n", "<leader>ww", ":set wrap!<CR>")
+--
diff --git a/.config/nvim/lua/user/mods.lua b/.config/nvim/lua/user/mods.lua
new file mode 100644
index 0000000..ec77173
--- /dev/null
+++ b/.config/nvim/lua/user/mods.lua
@@ -0,0 +1,138 @@
+--vim.cmd([[
+-- function RandomColorScheme()
+-- let mycolors = split(globpath(&rtp,"**/colors/*.vim"),"\n")
+-- exe 'so ' . mycolors[localtime() % len(mycolors)]
+-- unlet mycolors
+-- endfunction
+--
+-- call RandomColorScheme()
+--
+-- :command NewColor call RandomColorScheme()
+--]])
+
+--vim.cmd([[
+-- function RandomColorSchemeMyPicks()
+-- let mypicks = ["pyte", "fokus", "github", "peachpuff", "morning", "simple256", "xcode", "gruvbox"]
+-- let mypick = mypicks[localtime() % len(mypicks)]
+-- echom mypick
+-- execute 'colo' mypick
+-- endfunction
+--
+-- command NewColor call RandomColorSchemeMyPicks()
+--
+-- let s:use_gui = exists('g:neovide') || has('gui_running') || (has('termguicolors') && &termguicolors)
+-- if (s:use_gui)
+-- call RandomColorSchemeMyPicks()
+-- endif
+--]])
+
+vim.cmd([[
+ let g:fzf_history_dir = '~/.local/share/fzf-history'
+ map <leader>z :FZF<CR>
+ map <leader>a :Files<CR>
+ map <leader>l :Lines<CR>
+ map <leader>L :BLines<CR>
+ map <leader>B :Buffers<CR>
+ map <leader>h :History:<CR>
+ nnoremap <leader>g :Rg<CR>
+ "nnoremap <leader>t :Tags<CR>
+ nnoremap <leader>m :Marks<CR>
+ " This is the default extra key bindings
+ let g:fzf_action = {
+ \ 'ctrl-t': 'tab split',
+ \ 'ctrl-x': 'split',
+ \ 'ctrl-y': 'vsplit' }
+ let g:fzf_tags_command = 'ctags -R'
+ " Border color
+ let g:fzf_layout = {'up':'~90%', 'window': { 'width': 0.8, 'height': 0.8,'yoffset':0.5,'xoffset': 0.5, 'highlight': 'Todo', 'border': 'sharp' } }
+ let $FZF_DEFAULT_OPTS = '--layout=reverse --info=inline'
+ let $FZF_DEFAULT_COMMAND="rg --files --hidden"
+ " Customize fzf colors to match your color scheme
+ let g:fzf_colors =
+ \ { 'fg': ['fg', 'Normal'],
+ \ 'bg': ['bg', 'Normal'],
+ \ 'hl': ['fg', 'Comment'],
+ \ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'],
+ \ 'bg+': ['bg', 'CursorLine', 'CursorColumn'],
+ \ 'hl+': ['fg', 'Statement'],
+ \ 'info': ['fg', 'PreProc'],
+ \ 'border': ['fg', 'Ignore'],
+ \ 'prompt': ['fg', 'Conditional'],
+ \ 'pointer': ['fg', 'Exception'],
+ \ 'marker': ['fg', 'Keyword'],
+ \ 'spinner': ['fg', 'Label'],
+ \ 'header': ['fg', 'Comment'] }
+ " Get Files
+ command! -bang -nargs=? -complete=dir Files
+ \ call fzf#vim#files(<q-args>, fzf#vim#with_preview({'options': ['--layout=reverse', '--info=inline']}), <bang>0)
+ " Get text in files with Rg
+ command! -bang -nargs=* Rg
+ \ call fzf#vim#grep(
+ \ 'rg --column --line-number --no-heading --color=always --smart-case '.shellescape(<q-args>), 1,
+ \ fzf#vim#with_preview(), <bang>0)
+ " Ripgrep advanced
+ function! RipgrepFzf(query, fullscreen)
+ let command_fmt = 'rg --column --line-number --no-heading --color=always --smart-case %s || true'
+ let initial_command = printf(command_fmt, shellescape(a:query))
+ let reload_command = printf(command_fmt, '{q}')
+ let spec = {'options': ['--phony', '--query', a:query, '--bind', 'change:reload:'.reload_command]}
+ call fzf#vim#grep(initial_command, 1, fzf#vim#with_preview(spec), a:fullscreen)
+ endfunction
+ command! -nargs=* -bang RG call RipgrepFzf(<q-args>, <bang>0)
+ " Git grep
+ command! -bang -nargs=* GGrep
+ \ call fzf#vim#grep(
+ \ 'git grep --line-number '.shellescape(<q-args>), 0,
+ \ fzf#vim#with_preview({'dir': systemlist('git rev-parse --show-toplevel')[0]}), <bang>0)
+ command! -bang FM call fzf#run(fzf#wrap({'source': 'cat ~/.fzf-marks | sed "s/.*: \(.*\)$/\1/" | sed "s#~#${HOME}#"', 'sink': 'lcd'}, <bang>0))
+]])
+
+vim.cmd([[
+ " Enable mouse scrollback
+ set mouse=a
+ tnoremap <Esc> <C-\><C-n>
+ tnoremap <c-b> <c-\><c-n>
+ function! ClearTerminal()
+ set scrollback=1
+ let &g:scrollback=1
+ echo &scrollback
+ call feedkeys("\i")
+ call feedkeys("clear\<CR>")
+ call feedkeys("\<C-\>\<C-n>")
+ call feedkeys("\i")
+ sleep 100m
+ let &scrollback=s:scroll_value
+ endfunction
+]])
+
+vim.cmd([[
+ " :Rename {newname}
+ function! RenameFile()
+ let old_name = expand('%')
+ let new_name = input('New file name: ', expand('%'), 'file')
+ if new_name != '' && new_name != old_name
+ exec ':saveas ' . new_name
+ exec ':silent !rm ' . old_name
+ redraw!
+ endif
+ endfunction
+ map <leader>re :call RenameFile()<cr>
+]])
+
+--vim.cmd([[
+-- " Markdown Settings
+-- autocmd BufNewFile,BufReadPost *.md set filetype=markdown
+-- let g:markdown_fenced_languages = ['html', 'python', 'bash=sh', 'sql', 'pug']
+-- let g:markdown_minlines = 100
+-- let g:instant_markdown_autostart = 0
+--]])
+--
+--vim.cmd([[
+-- " On The Fly Table mode
+-- function! s:isAtStartOfLine(mapping)
+-- let text_before_cursor = getline('.')[0 : col('.')-1]
+-- let mapping_pattern = '\V' . escape(a:mapping, '\')
+-- let comment_pattern = '\V' . escape(substitute(&l:commentstring, '%s.*$', '', ''), '\')
+-- return (text_before_cursor =~? '^' . ('\v(' . comment_pattern . '\v)?') . '\s*\v' . mapping_pattern . '\v$')
+-- endfunction
+--]])
diff --git a/.config/nvim/lua/user/opts.lua b/.config/nvim/lua/user/opts.lua
new file mode 100644
index 0000000..6da4234
--- /dev/null
+++ b/.config/nvim/lua/user/opts.lua
@@ -0,0 +1,237 @@
+--[[ opts.lua ]]
+
+vim.cmd([[
+ "filetype plugin indent on " Load indent files, to automatically do language-dependent indenting.
+ "autocmd BufEnter * :syntax sync fromstart
+ "syntax enable
+ let g:clipbrdDefaultReg = '+'
+ "set nocompatible
+ "autocmd FileType lua set comments=s1:---,m:--,ex:--
+ nnoremap @ <cmd>execute "noautocmd norm! " . v:count1 . "@" . getcharstr()<cr> " Fast macros without lazyredraw
+ xnoremap @ :<C-U>execute "noautocmd '<,'>norm! " . v:count1 . "@" . getcharstr()<cr>
+]])
+
+-- Environment
+--vim.opt.shell = "zsh" --
+vim.o.shell = "/bin/zsh"
+vim.scriptencoding = "utf-8" --
+vim.opt.encoding = "utf-8" --
+vim.opt.fileencoding = "utf-8" --
+vim.g.python3_host_prog = "/usr/bin/python3" --
+vim.g.loaded_python3_provider = 1 --
+vim.g.sh_noisk = 1 -- iskeyword word boundaries when editing a 'sh' file
+vim.o.autochdir = true
+--vim.opt.sessionoptions = "buffers,curdir,folds,help,tabpages,winsize,resize,winpos,terminal,globals" --
+
+-- Colors
+vim.opt.termguicolors = true
+
+-- Behaviour
+vim.opt.clipboard:append({ "unnamedplus" }) -- Install xclip or this will slowdown startup
+vim.opt.backspace = { "start", "eol", "indent" } -- Make backspace work as you would expect.
+vim.opt.hidden = true -- Switch between buffers without having to save first.
+vim.opt.splitbelow = true -- make split put the new buffer below the current buffer
+vim.opt.splitright = true -- make vsplit put the new buffer on the right of the current buffer
+vim.opt.scrolloff = 8 --
+vim.opt.sidescrolloff = 8 -- how many lines to scroll when using the scrollbar
+vim.opt.autoread = true -- reload files if changed externally
+vim.opt.display = "lastline" -- Show as much as possible of the last line.
+vim.opt.inccommand = "split" --
+vim.opt.ttyfast = true -- Faster redrawing.
+--vim.opt.lazyredraw = true -- Only redraw when necessary
+vim.opt.keywordprg = ":help" -- :help options
+vim.opt.ruler = true --
+vim.opt.errorbells = false --
+vim.opt.list = true -- Show non-printable characters.
+vim.opt.showmatch = true --
+vim.opt.matchtime = 3 --
+vim.opt.showbreak = "↪ " --
+vim.opt.linebreak = true --
+vim.opt.exrc = true --
+--vim.opt.autochdir = true -- or use this to use <:e> to create a file in current directory
+vim.opt.autoread = true -- if a file is changed outside of vim, automatically reload it without asking
+--vim.opt.notimeout = true -- Timeout on keycodes and not mappings
+vim.opt.ttimeout = true -- Makes terminal vim work sanely
+vim.opt.ttimeoutlen = 10 --
+--vim.opt.timeoutlen = 100 -- time to wait for a mapped sequence to complete (in milliseconds)
+--vim.cmd([[set diffopt = vertical = true]]) -- diffs are shown side-by-side not above/below
+
+-- Indent/tab
+vim.opt.breakindent = true --
+vim.opt.autoindent = true -- Indent according to previous line.
+vim.opt.copyindent = true -- Copy indent from the previous line
+vim.opt.smarttab = false --
+vim.opt.tabstop = 2 --
+vim.opt.expandtab = true -- Indent according to previous line.
+--vim.opt.expandtab = true -- Use spaces instead of tabs.
+vim.opt.softtabstop = 2 -- Tab key indents by 2 spaces.
+vim.opt.shiftwidth = 2 -- >> indents by 2 spaces.
+vim.opt.shiftround = true -- >> indents to next multiple of 'shiftwidth'.
+vim.opt.smartindent = true -- smart indent
+
+-- Column/statusline/Cl
+vim.opt.number = true --
+vim.opt.title = true --
+--vim.opt.colorcolumn = "+1" --
+vim.opt.signcolumn = "yes:1" -- always show the sign column
+--vim.opt.signcolumn = "yes:" .. vim.o.numberwidth
+--vim.opt.signcolumn = "number"
+--vim.opt.signcolumn = "no" --
+vim.opt.laststatus = 3 -- " Always show statusline.
+vim.opt.showmode = true -- Show current mode in command-line, example: -- INSERT -- mode
+vim.opt.showcmd = true -- Show the command in the status bar
+vim.opt.cmdheight = 1 --
+--vim.opt.cmdheight = 0 --
+vim.opt.report = 0 -- Always report changed lines.
+--local autocmd = vim.api.nvim_create_autocmd
+--autocmd("bufenter", {
+-- pattern = "*",
+-- callback = function()
+-- if vim.bo.ft ~= "terminal" then
+-- vim.opt.statusline = "%!v:lua.require'ui.statusline'.run()"
+-- else
+-- vim.opt.statusline = "%#normal# "
+-- end
+-- end,
+--})
+---- With vertical splits, the statusline would still show up at the
+---- bottom of the split. A quick fix is to just set the statusline
+---- to empty whitespace (it can't be an empty string because then
+---- it'll get replaced by the default stline).
+--vim.opt.stl = " "
+
+-- Backup/undo
+vim.opt.backup = false --
+--vim.opt.noswapfile = true --
+--vim.opt.undofile = true --
+vim.opt.backupskip = { "/tmp/*", "/private/tmp/*" } --
+
+-- Format
+vim.opt.textwidth = 80 --
+vim.cmd([[let &t_Cs = "\e[4:3m"]]) -- Undercurl
+vim.cmd([[let &t_Ce = "\e[4:0m"]]) --
+vim.opt.path:append({ "**" }) -- Finding files - Search down into subfolder
+vim.cmd("set whichwrap+=<,>,[,],h,l") --
+vim.cmd([[set iskeyword+=-]]) --
+--vim.cmd([[set formatoptions-=cro]]) -- TODO: this doesn't seem to work
+vim.opt.formatoptions = vim.opt.formatoptions
+ - "t" -- wrap with text width
+ + "c" -- wrap comments
+ + "r" -- insert comment after enter
+ - "o" -- insert comment after o/O
+ - "q" -- allow formatting of comments with gq
+ - "a" -- format paragraphs
+ + "n" -- recognized numbered lists
+ - "2" -- use indent of second line for paragraph
+ + "l" -- long lines are not broken
+ + "j" -- remove comment when joining lines
+vim.opt.wrapscan = true -- " Searches wrap around end-of-file.
+--vim.wo.number = true --
+--vim.opt.wrap = false -- No Wrap lines
+--vim.opt.foldmethod = 'manual' --
+--vim.opt.foldmethod = "expr" --
+vim.opt.foldmethod = "manual"
+vim.opt.foldlevel = 3
+vim.opt.confirm = true
+vim.opt.shortmess:append("sI")
+--vim.opt.shortmess = "a"
+--vim.opt.shortmess = "sI"
+--vim.o.shortmess = vim.o.shortmess:gsub('s', '')
+vim.opt.fillchars = {
+ horiz = "━",
+ horizup = "┻",
+ horizdown = "┳",
+ vert = "┃",
+ vertleft = "┨",
+ vertright = "┣",
+ verthoriz = "╋",
+ fold = "⠀",
+ eob = " ",
+ diff = "┃",
+ msgsep = "‾",
+ foldopen = "▾",
+ foldsep = "│",
+ foldclose = "▸",
+}
+vim.opt.listchars = { tab = "▸ ", trail = "·" } --
+--vim.opt.fillchars:append({ eob = " " }) -- remove the ~ from end of buffer
+vim.opt.modeline = true --
+vim.opt.modelines = 3 -- modelines (comments that set vim options on a per-file basis)
+--vim.opt.modelineexpr = true
+--vim.opt.nofoldenable = true -- turn folding off
+--vim.opt.foldenable = false -- turn folding off
+vim.o.showtabline = 2
+
+-- Highlights
+vim.opt.incsearch = true -- Highlight while searching with / or ?.
+vim.opt.hlsearch = true -- Keep matches highlighted.
+vim.opt.ignorecase = true -- ignore case in search patterns UNLESS /C or capital in search
+vim.opt.smartcase = true -- smart case
+vim.opt.synmaxcol = 200 -- Only highlight the first 200 columns.
+vim.opt.winblend = 30
+--vim.opt.winblend = 5
+vim.opt.wildoptions = "pum" --
+--vim.opt.pumblend = 5 --
+vim.opt.pumblend = 12 --
+--vim.opt.pumblend=15
+vim.opt.pumheight = 10 -- pop up menu height
+
+-- Better Completion
+vim.opt.complete = { ".", "w", "b", "u", "t" } --
+--vim.opt.completeopt = { "longest,menuone,preview" } --
+vim.opt.completeopt = {'menu', 'menuone', 'noselect'}
+--vim.opt.completeopt = { "menuone", "noselect" } -- mostly just for cmp
+--vim.opt.completeopt = { "menu", "menuone", "noselect" } --
+
+-- Wildmenu completion --
+vim.opt.wildmenu = true --
+vim.opt.wildmode = { "list:longest" } --
+vim.opt.wildignore:append({ ".hg", ".git", ".svn" }) -- Version control
+vim.opt.wildignore:append({ "*.aux", "*.out", "*.toc" }) -- LaTeX intermediate files
+vim.opt.wildignore:append({ "*.jpg", "*.bmp", "*.gif", "*.png", "*.jpeg" }) -- binary images
+vim.opt.wildignore:append({ "*.o", "*.obj", "*.exe", "*.dll", "*.manifest" }) -- compiled object files
+vim.opt.wildignore:append({ "*.spl" }) -- compiled spelling word lists
+vim.opt.wildignore:append({ "*.sw?" }) -- Vim swap files
+vim.opt.wildignore:append({ "*.DS_Store" }) -- OSX bullshit
+vim.opt.wildignore:append({ "*.luac" }) -- Lua byte code
+vim.opt.wildignore:append({ "migrations" }) -- Django migrations
+vim.opt.wildignore:append({ "*.pyc" }) -- Python byte code
+vim.opt.wildignore:append({ "*.orig" }) -- Merge resolution files
+vim.opt.wildignore:append({ "*/node_modules/*" }) --
+
+-- Shada
+vim.opt.shada = "!,'1000,f1,<1000,s100,:1000,/1000,h"
+
+-- Sessions
+vim.opt.sessionoptions = "blank,buffers,curdir,folds,help,tabpages,winsize,winpos,terminal"
+
+-- Cursorline
+vim.cmd([[ " Only show cursorline in the current window and in normal mode
+ augroup cline
+ au!
+ au WinLeave,InsertEnter * set nocursorline
+ au WinEnter,InsertLeave * set cursorline
+ augroup END
+]])
+vim.opt.cursorline = true --
+vim.opt.guicursor = "i:ver100,r:hor100" --
+
+-- Trailing whitespace
+vim.cmd([[ " Only show in insert mode
+ augroup trailing
+ au!
+ au InsertEnter * :set listchars-=trail:⌴
+ au InsertLeave * :set listchars+=trail:⌴
+ augroup END
+]])
+
+-- Line Return
+vim.cmd([[ " Return to the same line when we reopen a file
+ augroup line_return
+ au!
+ au BufReadPost *
+ \ if line("'\"") > 0 && line("'\"") <= line("$") |
+ \ execute 'normal! g`"zvzz' |
+ \ endif
+ augroup END
+]])
diff --git a/.config/nvim/lua/user/pack.lua b/.config/nvim/lua/user/pack.lua
new file mode 100644
index 0000000..ba309e6
--- /dev/null
+++ b/.config/nvim/lua/user/pack.lua
@@ -0,0 +1,404 @@
+local fn = vim.fn
+
+-- Automatically install packer
+local install_path = fn.stdpath("data") .. "/site/pack/packer/start/packer.nvim"
+if fn.empty(fn.glob(install_path)) > 0 then
+ PACKER_BOOTSTRAP = fn.system({
+ "git",
+ "clone",
+ "--depth",
+ "1",
+ "https://github.com/wbthomason/packer.nvim",
+ install_path,
+ })
+ print("Installing packer close and reopen Neovim...")
+ vim.cmd([[packadd packer.nvim]])
+end
+
+-- Autocommand that reloads neovim whenever you save the plugins.lua file
+vim.cmd([[
+ augroup packer_user_config
+ autocmd!
+ autocmd BufWritePost pack.lua source <afile> | PackerSync
+ augroup end
+]])
+
+-- Use a protected call so we don't error out on first use
+local status_ok, packer = pcall(require, "packer")
+if not status_ok then
+ return
+end
+
+-- Have packer use a popup window
+packer.init({
+ auto_reload_compiled = true,
+ display = {
+ open_fn = function()
+ return require("packer.util").float({ border = "rounded" })
+ end,
+ },
+})
+
+-- Install your plugins here
+return packer.startup(function(use)
+ use("wbthomason/packer.nvim") -- Have packer manage itself
+
+ use("lewis6991/impatient.nvim")
+ use("nvim-lua/plenary.nvim") -- Useful lua functions used ny lots of plugins
+ --use("jose-elias-alvarez/null-ls.nvim")
+
+ -- lsp
+ use {
+ "williamboman/mason.nvim",
+ "williamboman/mason-lspconfig.nvim",
+ "neovim/nvim-lspconfig",
+ }
+ require("mason").setup()
+ local mason_lspconfig = require("mason-lspconfig")
+ mason_lspconfig.setup({
+ ensure_installed = {
+ "pylsp",
+ "pyright",
+ "clangd",
+ --"vim-language-server",
+ --"bash-language-server",
+ --"lua-language-server",
+ "sumneko_lua",
+ }
+ })
+ use({ "j-hui/fidget.nvim",
+ config = function()
+ require("fidget").setup()
+ end
+ })
+ --use({ "folke/trouble.nvim",
+ -- config = function()
+ -- require("trouble").setup({ position = "right", })
+ -- end
+ --})
+ --use({
+ --"folke/trouble.nvim",
+ --requires = "kyazdani42/nvim-web-devicons",
+ --config = function()
+ -- require("trouble").setup({
+ -- --postion = "top",
+ -- postion = "right",
+ -- -- your configuration comes here
+ -- -- or leave it empty to use the default settings
+ -- -- refer to the configuration section below
+ -- })
+ --end,
+ --})
+
+ --use({
+ -- "https://git.sr.ht/~whynothugo/lsp_lines.nvim", -- See also: https://github.com/Maan2003/lsp_lines.nvim
+ -- config = function()
+ -- require("lsp_lines").setup()
+
+ -- -- disable virtual_text since it's redundant due to lsp_lines.
+ -- vim.diagnostic.config({
+ -- virtual_text = false,
+ -- })
+ -- end,
+ --})
+ use { "simrat39/symbols-outline.nvim",
+ config = function()
+ require("symbols-outline").setup({
+ auto_close = true,
+ })
+ end
+ }
+ use "antoinemadec/FixCursorHold.nvim"
+ use { "kosayoda/nvim-lightbulb", requires = { "antoinemadec/FixCursorHold.nvim" } }
+ --use("folke/lsp-colors.nvim")
+ use "mfussenegger/nvim-lint"
+ use "weilbith/nvim-code-action-menu"
+ use "simrat39/rust-tools.nvim"
+ use { "saecki/crates.nvim",
+ requires = { "nvim-lua/plenary.nvim" },
+ config = function()
+ require("crates").setup()
+ end,
+ }
+ --use "lvimuser/lsp-inlayhints.nvim" -- rust-tools already provides this feature, but gopls doesn't
+
+ -- null-ls
+ --use({ "jose-elias-alvarez/null-ls.nvim",
+ -- config = function()
+ -- require("null-ls").setup({
+ -- sources = {
+ -- require("null-ls").builtins.diagnostics.checkmake, -- https://github.com/mrtazz/checkmake
+ -- }
+ -- })
+ -- end
+ --})
+ use({
+ "jose-elias-alvarez/null-ls.nvim",
+ config = function()
+ require("null-ls").setup()
+ end,
+ requires = { "nvim-lua/plenary.nvim" },
+ })
+ use({
+ "SmiteshP/nvim-navic",
+ requires = "neovim/nvim-lspconfig",
+ })
+
+ -- nvimlsp plugins
+ --use({
+ -- "williamboman/mason.nvim",
+ -- config = function()
+ -- require("mason").setup()
+ -- require("mason-lspconfig").setup({
+ -- ensure_installed = { "sumneko_lua", "clangd", "rust_analyzer" },
+ -- })
+ -- end,
+ --})
+ --use("williamboman/mason.nvim")
+ --use("williamboman/mason-lspconfig.nvim")
+ --use("neovim/nvim-lspconfig")
+ --use("williamboman/nvim-lsp-installer")
+ --use("glepnir/lspsaga.nvim")
+ --use("nvim-lua/lsp-status.nvim")
+ --use({
+ -- "glepnir/lspsaga.nvim",
+ -- branch = "main",
+ -- config = function()
+ -- local saga = require("lspsaga")
+
+ -- saga.init_lsp_saga({
+ -- -- your configuration
+ -- })
+ -- end,
+ --})
+ -- use("nvim-lua/popup.nvim")
+ --use("SmiteshP/nvim-gps")
+ -- autocomplete plugins
+ use("hrsh7th/nvim-cmp")
+ use("hrsh7th/cmp-nvim-lsp")
+ use("hrsh7th/cmp-buffer")
+ use("hrsh7th/cmp-path")
+ use("hrsh7th/cmp-cmdline")
+ use("petertriho/cmp-git")
+ use("tamago324/cmp-zsh")
+ use("f3fora/cmp-spell")
+ use("hrsh7th/cmp-calc")
+ use("saadparwaiz1/cmp_luasnip")
+ use("hrsh7th/cmp-nvim-lsp-signature-help")
+ use("onsails/lspkind-nvim")
+
+ -- snippets
+ --use("L3MON4D3/LuaSnip") --snippet engine
+ use("L3MON4D3/LuaSnip")
+ use("rafamadriz/friendly-snippets") -- a bunch of snippets to use
+ --use("github/copilot.vim")
+ --use({
+ --"zbirenbaum/copilot.lua",
+ --event = { "VimEnter" },
+ --config = function()
+ --vim.defer_fn(function()
+ --require("plugins.copilot")
+ --end, 100)
+ --end,
+ --})
+ --use({
+ --"zbirenbaum/copilot-cmp",
+ --module = "copilot_cmp",
+ --})
+
+ -- treesitter plugins
+ use({ "nvim-treesitter/nvim-treesitter", run = ":TSUpdate" }) --folding, jumping, refactoring...
+ use("nvim-treesitter/nvim-treesitter-refactor")
+ use("nvim-treesitter/nvim-treesitter-context")
+ --use({
+ -- "danymat/neogen",
+ -- config = function()
+ -- require("neogen").setup({ snippet_engine = "luasnip" })
+ -- end,
+ -- requires = "nvim-treesitter/nvim-treesitter",
+ --})
+ --use({ "junegunn/fzf", run = ":call fzf#install()" })
+ use('ibhagwan/fzf-lua')
+ -- telescope plugins
+ use("nvim-telescope/telescope.nvim")
+ use({ "nvim-telescope/telescope-fzf-native.nvim", run = "make" })
+ use("tami5/sqlite.lua")
+ --use("nvim-telescope/telescope-frecency.nvim")
+ use("nvim-telescope/telescope-ui-select.nvim")
+ use("nvim-telescope/telescope-media-files.nvim")
+ use("nvim-telescope/telescope-file-browser.nvim")
+ -- search emoji and other symbols
+ use({ "nvim-telescope/telescope-symbols.nvim", after = "telescope.nvim" })
+ use("axkirillov/telescope-changed-files")
+ --use({
+ --"princejoogie/dir-telescope.nvim",
+ --requires = {"nvim-telescope/telescope.nvim"},
+ --config = function()
+ -- require("dir-telescope").setup({
+ -- hidden = true,
+ -- respect_gitignore = true,
+ -- })
+ --end,
+ --})
+ use("airblade/vim-rooter")
+ -- statusline plugins
+ --use("nvim-lualine/lualine.nvim")
+ --use({
+ -- "nvim-lualine/lualine.nvim",
+ -- requires = { "kyazdani42/nvim-web-devicons", opt = true },
+ --})
+ --use({
+ -- "folke/trouble.nvim",
+ -- requires = "kyazdani42/nvim-web-devicons",
+ -- config = function()
+ -- require("trouble").setup({
+ -- -- your configuration comes here
+ -- -- or leave it empty to use the default settings
+ -- -- refer to the configuration section below
+ -- })
+ -- end,
+ --})
+ use("rebelot/heirline.nvim")
+ --use({ "akinsho/bufferline.nvim", tag = "v2.*", requires = "kyazdani42/nvim-web-devicons" })
+ --use("itchyny/lightline.vim")
+ -- debug plugins
+ --use("puremourning/vimspector")
+ use("mfussenegger/nvim-dap")
+ use("rcarriga/nvim-dap-ui")
+ --use({
+ -- "rcarriga/neotest",
+ -- requires = {
+ -- "nvim-lua/plenary.nvim",
+ -- "nvim-treesitter/nvim-treesitter",
+ -- "antoinemadec/FixCursorHold.nvim",
+ -- "rcarriga/neotest-python",
+ -- "rcarriga/neotest-vim-test",
+ -- "rcarriga/neotest-plenary",
+ -- "vim-test/vim-test",
+ -- },
+ -- config = function()
+ -- require("plugins.neotest")
+ -- end,
+ --})
+ --use("vim-test/vim-test")
+ --use({
+ -- "rcarriga/vim-ultest",
+ -- requires = { "vim-test/vim-test" },
+ -- run = ":UpdateRemotePlugins",
+ -- config = function()
+ -- require("plugins.ultest")
+ -- end,
+ --})
+ -- UI
+ use("karb94/neoscroll.nvim")
+ use("folke/which-key.nvim")
+ use("MunifTanjim/prettier.nvim") -- Prettier plugin for Neovim's built-in LSP client
+ use("norcalli/nvim-colorizer.lua")
+ use("folke/zen-mode.nvim")
+ use("romainl/vim-cool")
+ --use("p00f/nvim-ts-rainbow")
+ --use("goolord/alpha-nvim")
+ --use("feline-nvim/feline.nvim")
+ --use({ "fgheng/winbar.nvim" })
+ --use("vim-airline/vim-airline")
+ --use("kdheepak/tabline.nvim")
+ -- use({
+ -- "kdheepak/tabline.nvim",
+ -- config = function()
+ -- require("tabline").setup({ enable = false })
+ -- end,
+ -- requires = { "hoob3rt/lualine.nvim", "kyazdani42/nvim-web-devicons" },
+ -- notification plugin
+ use("rcarriga/nvim-notify")
+ --use("lukas-reineke/indent-blankline.nvim")
+ use("kyazdani42/nvim-web-devicons")
+ -- Colorschemes
+ use("gruvbox-community/gruvbox")
+ use("srcery-colors/srcery-vim")
+ use("tomasr/molokai")
+ use("ayu-theme/ayu-vim")
+ --use("sjl/badwolf")
+ use("joshdick/onedark.vim")
+ use("everblush/everblush.nvim")
+ use("EdenEast/nightfox.nvim")
+ use("bluz71/vim-nightfly-guicolors")
+ --use({ "shaunsingh/oxocarbon.nvim", run = "./install.sh" })
+ use("jacoborus/tender.vim")
+ use("sainnhe/sonokai")
+ use("NTBBloodbath/doom-one.nvim")
+
+ -- Utilities
+ use("nathom/filetype.nvim")
+ use("christoomey/vim-tmux-navigator")
+ use("preservim/vimux")
+ use("myusuf3/numbers.vim")
+ use("windwp/nvim-autopairs")
+ use("lewis6991/gitsigns.nvim")
+ use("dinhhuy258/git.nvim") -- For git blame & browse
+ use("kyazdani42/nvim-tree.lua")
+ use("numToStr/Comment.nvim")
+ --use("akinsho/toggleterm.nvim")
+ --use("godlygeek/tabular")
+ --use("Vonr/align.nvim")
+ --use("junegunn/vim-easy-align")
+ --use("dstein64/vim-startuptime")
+ use("tweekmonster/startuptime.vim")
+ -- use("luukvbaal/stabilize.nvim")
+ --use("rhysd/clever-f.vim")
+ --use("ggandor/lightspeed.nvim") -- use 'cl' and 'cc' instead of 's' and 'S' respectively
+ --use("ggandor/leap.nvim")
+ use({
+ "ggandor/leap.nvim",
+ config = function()
+ require('leap').add_default_mappings()
+ --require("leap").set_default_keymaps()
+ --vim.keymap.set('n', '-', '<Plug>(leap-forward)', {})
+ --vim.keymap.set('n', '_', '<Plug>(leap-backward)', {})
+ end,
+ })
+ use({ "ggandor/flit.nvim",
+ config = function()
+ require("flit").setup()
+ end,
+ })
+
+ --use("Shatur/neovim-session-manager")
+ --use("rmagatti/auto-session")
+ --use("rmagatti/session-lens")
+ --use("ahmedkhalf/project.nvim")
+ --use("aserowy/tmux.nvim")
+ --use("wakatime/vim-wakatime")
+ --use("tpope/vim-eunuch")
+ -- Handy unix command inside Vim (Rename, Move etc.)
+ use({ "tpope/vim-eunuch", cmd = { "Rename", "Delete" } })
+ --use("tpope/vim-fugitive")
+ --use("tpope/vim-surround")
+ --use("tpope/vim-obsession")
+ --use("tpope/vim-unimpaired")
+ --use("voldikss/vim-floaterm")
+ --use("vimpostor/vim-tpipeline")
+ --use({
+ -- "vimwiki/vimwiki",
+ -- config = function()
+ -- vim.g.vimwiki_list = {
+ -- {
+ -- path = "~/",
+ -- syntax = "markdown",
+ -- ext = ".md",
+ -- },
+ -- }
+ -- vim.g.vimwiki_ext2syntax = {
+ -- [".md"] = "markdown",
+ -- [".markdown"] = "markdown",
+ -- [".mdown"] = "markdown",
+ use({
+ "iamcco/markdown-preview.nvim",
+ run = function() vim.fn["mkdp#util#install"]() end,
+ })
+
+ -- Automatically set up your configuration after cloning packer.nvim
+ -- Put this at the end after all plugins
+ if PACKER_BOOTSTRAP then
+ require("packer").sync()
+ end
+end)
diff --git a/.config/nvim/lua/user/utils.lua b/.config/nvim/lua/user/utils.lua
new file mode 100644
index 0000000..bfb5faa
--- /dev/null
+++ b/.config/nvim/lua/user/utils.lua
@@ -0,0 +1,85 @@
+local fn = vim.fn
+
+local M = {}
+
+function M.executable(name)
+ if fn.executable(name) > 0 then
+ return true
+ end
+
+ return false
+end
+
+--- check whether a feature exists in Nvim
+--- @feat: string
+--- the feature name, like `nvim-0.7` or `unix`.
+--- return: bool
+M.has = function(feat)
+ if fn.has(feat) == 1 then
+ return true
+ end
+
+ return false
+end
+
+--- Create a dir if it does not exist
+function M.may_create_dir(dir)
+ local res = fn.isdirectory(dir)
+
+ if res == 0 then
+ fn.mkdir(dir, "p")
+ end
+end
+
+M['unload_lua_namespace'] = function(prefix)
+ local prefix_with_dot = prefix .. '.'
+ for key, value in pairs(package.loaded) do
+ if key == prefix or key:sub(1, #prefix_with_dot) == prefix_with_dot then
+ package.loaded[key] = nil
+ end
+ end
+end
+
+-- toggle cmp completion
+vim.g.cmp_toggle_flag = false -- initialize
+local normal_buftype = function()
+ return vim.api.nvim_buf_get_option(0, "buftype") ~= "prompt"
+end
+M.toggle_completion = function()
+ local ok, cmp = pcall(require, "cmp")
+ if ok then
+ local next_cmp_toggle_flag = not vim.g.cmp_toggle_flag
+ if next_cmp_toggle_flag then
+ print("completion on")
+ else
+ print("completion off")
+ end
+ cmp.setup({
+ enabled = function()
+ vim.g.cmp_toggle_flag = next_cmp_toggle_flag
+ if next_cmp_toggle_flag then
+ return normal_buftype
+ else
+ return next_cmp_toggle_flag
+ end
+ end,
+ })
+ else
+ print("completion not available")
+ end
+end
+
+function M.get_nvim_version()
+ local actual_ver = vim.version()
+
+ local nvim_ver_str = string.format("%d.%d.%d", actual_ver.major, actual_ver.minor, actual_ver.patch)
+ return nvim_ver_str
+end
+
+function M.add_pack(name)
+ local status, error = pcall(vim.cmd, "packadd " .. name)
+
+ return status
+end
+
+return M