1require('gruvbox').setup { 2 terminal_colors = false, 3 transparent_mode = true, 4} 5vim.cmd "colorscheme gruvbox" 6 7vim.api.nvim_set_hl(0, "NormalFloat", { fg = require('gruvbox').palette.light1, bg = require('gruvbox').palette.dark1 }) 8 9vim.o.mouse = 'a' 10vim.o.mousemodel = 'extend' 11 12vim.o.shiftwidth = 4 13vim.o.tabstop = 4 14vim.o.softtabstop = 4 15vim.bo.autoindent = true 16vim.bo.smartindent = true 17 18vim.o.fixendofline = false 19 20vim.o.conceallevel = 0 21vim.o.concealcursor = 'n' 22vim.wo.signcolumn = 'yes' 23 24vim.o.smartcase = true 25 26vim.o.spelllang = 'en' 27vim.o.spellfile = os.getenv('HOME') .. '/.config/vim/spell.en.utf-8.add' 28vim.opt_local.spell = true 29vim.opt_local.spelllang = 'en_gb' 30 31vim.wo.number = true 32vim.api.nvim_create_augroup('numbertoggle', { clear = true }) 33vim.api.nvim_create_autocmd({ 'BufEnter', 'FocusGained', 'InsertLeave', 'WinEnter' }, { 34 group = 'numbertoggle', 35 pattern = '*', 36 callback = function() 37 if vim.wo.number and vim.fn.mode() ~= 'i' then 38 vim.wo.relativenumber = true 39 end 40 end, 41}) 42vim.api.nvim_create_autocmd({ 'BufLeave', 'FocusLost', 'InsertEnter', 'WinLeave' }, { 43 group = 'numbertoggle', 44 pattern = '*', 45 callback = function() 46 if vim.wo.number then 47 vim.wo.relativenumber = false 48 end 49 end, 50}) 51 52vim.g.mapleader = ' ' 53 54vim.opt.timeout = false 55-- remove warning delay 56vim.opt.readonly = false 57 58vim.opt.undodir = vim.fn.stdpath('data') .. 'undodir' 59vim.opt.undofile = true 60 61vim.opt.hlsearch = false 62 63vim.opt.updatetime = 500 64 65vim.o.foldlevel = 99 66 67vim.g.vim_markdown_follow_anchor = 1 68 69vim.o.cursorcolumn = true 70 71vim.keymap.set('n', '<leader>fs', ':w<CR>', { desc = 'Write file' }) 72vim.keymap.set('n', '<leader>qq', ':qa<CR>', { desc = 'Quit all' }) 73 74vim.keymap.set('n', 'ZA', ':cquit<Enter>', { desc = 'Quit and fail' }) 75 76vim.keymap.set('t', '<Esc>', '<C-\\><C-n>') 77 78vim.keymap.set('n', '<leader>id', [[<Cmd>lua vim.api.nvim_put({vim.fn.strftime('%Y-%m-%d')}, 'c', true, true)<CR>]], 79 { desc = 'insert date' }) 80 81vim.keymap.set('n', '!', ':term ', { desc = 'terminal' }) 82 83vim.keymap.set('n', '<leader>gg', ':Neogit<CR>', { desc = 'Neogit' }) 84 85vim.keymap.set('n', '<leader>om', ':make<Enter>', { desc = 'Make' }) 86 87vim.keymap.set('n', '<leader>w', '<C-w>', { desc = 'Window commands' }) 88 89-- go though spelling mistakes 90vim.keymap.set('n', '<C-s>', ']s1z=', { desc = 'correct next spelling mistake' }) 91 92vim.keymap.set('v', '<C-J>', ":m '>+1<CR>gv=gv", { desc = 'move up' }) 93vim.keymap.set('v', '<C-K>', ":m '<-2<CR>gv=gv", { desc = 'move down' }) 94 95vim.keymap.set('n', '<C-d>', '<C-d>zz') 96vim.keymap.set('n', '<C-u>', '<C-u>zz') 97vim.keymap.set('n', 'n', 'nzzzv') 98vim.keymap.set('n', 'N', 'Nzzzv') 99 100vim.keymap.set({ 'n', 'v' }, '<leader>y', [["+y]]) 101vim.keymap.set({ 'n', 'v' }, '<leader>p', [["+p]]) 102vim.keymap.set({ 'n', 'v' }, '<leader>P', [["+P]]) 103vim.keymap.set({ 'n', 'v' }, '<leader>d', [["+d]]) 104vim.keymap.set({ 'n', 'v' }, '<leader>D', [["+D]]) 105vim.keymap.set('n', '<leader>Y', [["+Y]]) 106 107vim.keymap.set('x', '<leader><C-p>', [["_dP]]) 108vim.keymap.set({ 'n', 'v' }, '<leader><C-d>', [["_d]]) 109 110vim.keymap.set('n', '<leader>S', [[:%s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>]]) 111 112vim.keymap.set('n', '<leader>tc', ':tabnew<CR>') 113vim.keymap.set('n', '<leader>te', ':tabedit ') 114vim.keymap.set('n', '<leader>tn', ':tabnext<CR>') 115vim.keymap.set('n', '<leader>tp', ':tabprevious<CR>') 116vim.keymap.set('n', '<leader>tN', ':tabmove +1<CR>') 117vim.keymap.set('n', '<leader>tP', ':tabmove -1<CR>') 118vim.keymap.set('n', '<leader>tq', ':tabclose<CR>') 119 120vim.keymap.set('n', '<leader>bn', ':bnext<CR>') 121vim.keymap.set('n', '<leader>bp', ':bprevious<CR>') 122vim.keymap.set('n', '<leader>bd', ':bdelete<CR>') 123 124-- if in an SSH session enable OSC 52 system clipboard 125-- required as neovim can't detect alacritty capabilities as it doesn't support XTGETTCAP 126if os.getenv('SSH_TTY') then 127 vim.g.clipboard = { 128 name = 'OSC 52', 129 copy = { 130 ['+'] = require('vim.ui.clipboard.osc52').copy('+'), 131 ['*'] = require('vim.ui.clipboard.osc52').copy('*'), 132 }, 133 paste = { 134 ['+'] = require('vim.ui.clipboard.osc52').paste('+'), 135 ['*'] = require('vim.ui.clipboard.osc52').paste('*'), 136 }, 137 } 138end 139 140vim.api.nvim_create_autocmd('TermOpen', { 141 pattern = '*', 142 command = 'startinsert', 143}) 144 145-- session management 146 147local session_dir = vim.fn.stdpath('data') .. '/sessions/' 148 149local function ensure_dir_exists(dir) 150 if vim.fn.isdirectory(dir) == 0 then 151 vim.fn.mkdir(dir, 'p') 152 end 153end 154 155local function sanitize_path(path) 156 return path:gsub('[\\/]+', '_'):gsub('^_*', ''):gsub('_*$', '') 157end 158 159local function session_file_name(name) 160 local cwd = vim.fn.getcwd() 161 local sanitized_cwd = sanitize_path(cwd) 162 if name and #name > 0 then 163 return session_dir .. 'session:' .. sanitized_cwd .. ':' .. sanitize_path(name) .. '.vim' 164 else 165 return session_dir .. 'session:' .. sanitized_cwd .. '.vim' 166 end 167end 168 169local function save_session(args) 170 ensure_dir_exists(session_dir) 171 local session_file = session_file_name(args.args) 172 vim.cmd('mksession! ' .. vim.fn.fnameescape(session_file)) 173end 174 175local function load_session(args) 176 local session_file = session_file_name(args.args) 177 if vim.fn.filereadable(session_file) == 1 then 178 vim.cmd('source ' .. vim.fn.fnameescape(session_file)) 179 else 180 print('No session file found for ' .. (args.args == '' and 'this directory' or args.args)) 181 end 182end 183 184local function session_completion(arg_lead, cmd_line, cursor_pos) 185 local files = vim.fn.globpath(session_dir, 'session:' .. sanitize_path(vim.fn.getcwd()) .. ':*', 0, 1) 186 local sessions = {} 187 for _, file in ipairs(files) do 188 local session = file:match('session:' .. sanitize_path(vim.fn.getcwd()) .. ':(.+)%.vim$') 189 if session and session:find(arg_lead, 1, true) == 1 then 190 table.insert(sessions, session) 191 end 192 end 193 return sessions 194end 195 196-- vim.api.nvim_create_autocmd('VimLeave', { 197-- pattern = '*', 198-- callback = function() save_session({ args = '' }) end, 199-- }) 200 201vim.api.nvim_create_user_command('SaveSession', save_session, { nargs = '?', complete = session_completion }) 202vim.api.nvim_create_user_command('LoadSession', load_session, { nargs = '?', complete = session_completion }) 203 204vim.keymap.set('n', '<leader>qs', ':SaveSession<CR>', { desc = 'Save session' }) 205vim.keymap.set('n', '<leader>ql', ':LoadSession<CR>', { desc = 'Load session' }) 206 207-- free real-estate 208-- <leader>n 209-- <leader>; 210-- <leader>e 211-- <leader>v 212-- <leader>l 213-- <leader>j 214-- <leader>k 215-- <leader>z 216 217vim.cmd([[ 218augroup RememberView 219 autocmd! 220 autocmd BufWinLeave * let b:win_view = winsaveview() 221 autocmd BufWinEnter * if exists('b:win_view') | call winrestview(b:win_view) | endif 222augroup END 223]])