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>w', ':w<CR>', { desc = 'Write file' }) 72vim.keymap.set('n', '<leader>q', ':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>gn', ':Neogit', { desc = 'Neogit' }) 84 85vim.keymap.set('n', '<leader>m', ':make<Enter>', { desc = 'Make' }) 86 87-- go though spelling mistakes 88vim.keymap.set('n', '<C-s>', ']s1z=', { desc = 'correct next spelling mistake' }) 89 90vim.keymap.set('v', '<C-J>', ":m '>+1<CR>gv=gv", { desc = 'move up' }) 91vim.keymap.set('v', '<C-K>', ":m '<-2<CR>gv=gv", { desc = 'move down' }) 92 93vim.keymap.set('n', '<C-d>', '<C-d>zz') 94vim.keymap.set('n', '<C-u>', '<C-u>zz') 95vim.keymap.set('n', 'n', 'nzzzv') 96vim.keymap.set('n', 'N', 'Nzzzv') 97 98vim.keymap.set({ 'n', 'v' }, '<leader>y', [["+y]]) 99vim.keymap.set({ 'n', 'v' }, '<leader>p', [["+p]]) 100vim.keymap.set({ 'n', 'v' }, '<leader>P', [["+P]]) 101vim.keymap.set({ 'n', 'v' }, '<leader>d', [["+d]]) 102vim.keymap.set({ 'n', 'v' }, '<leader>D', [["+D]]) 103vim.keymap.set('n', '<leader>Y', [["+Y]]) 104 105vim.keymap.set('x', '<leader><C-p>', [["_dP]]) 106vim.keymap.set({ 'n', 'v' }, '<leader><C-d>', [["_d]]) 107 108vim.keymap.set('n', '<leader>S', [[:%s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>]]) 109 110vim.keymap.set('n', '<leader>tc', ':tabnew<CR>') 111vim.keymap.set('n', '<leader>te', ':tabedit ') 112vim.keymap.set('n', '<leader>tn', ':tabnext<CR>') 113vim.keymap.set('n', '<leader>tp', ':tabprevious<CR>') 114vim.keymap.set('n', '<leader>tN', ':tabmove +1<CR>') 115vim.keymap.set('n', '<leader>tP', ':tabmove -1<CR>') 116vim.keymap.set('n', '<leader>tq', ':tabclose<CR>') 117 118vim.keymap.set('n', '<leader>bn', ':bnext<CR>') 119vim.keymap.set('n', '<leader>bp', ':bprevious<CR>') 120vim.keymap.set('n', '<leader>bd', ':bdelete<CR>') 121 122-- if in an SSH session enable OSC 52 system clipboard 123-- required as neovim can't detect alacritty capabilities as it doesn't support XTGETTCAP 124if os.getenv('SSH_TTY') then 125 vim.g.clipboard = { 126 name = 'OSC 52', 127 copy = { 128 ['+'] = require('vim.ui.clipboard.osc52').copy('+'), 129 ['*'] = require('vim.ui.clipboard.osc52').copy('*'), 130 }, 131 paste = { 132 ['+'] = require('vim.ui.clipboard.osc52').paste('+'), 133 ['*'] = require('vim.ui.clipboard.osc52').paste('*'), 134 }, 135 } 136end 137 138vim.api.nvim_create_autocmd('TermOpen', { 139 pattern = '*', 140 command = 'startinsert', 141}) 142 143-- session management 144 145local session_dir = vim.fn.stdpath('data') .. '/sessions/' 146 147local function ensure_dir_exists(dir) 148 if vim.fn.isdirectory(dir) == 0 then 149 vim.fn.mkdir(dir, 'p') 150 end 151end 152 153local function sanitize_path(path) 154 return path:gsub('[\\/]+', '_'):gsub('^_*', ''):gsub('_*$', '') 155end 156 157local function session_file_name(name) 158 local cwd = vim.fn.getcwd() 159 local sanitized_cwd = sanitize_path(cwd) 160 if name and #name > 0 then 161 return session_dir .. 'session:' .. sanitized_cwd .. ':' .. sanitize_path(name) .. '.vim' 162 else 163 return session_dir .. 'session:' .. sanitized_cwd .. '.vim' 164 end 165end 166 167local function save_session(args) 168 ensure_dir_exists(session_dir) 169 local session_file = session_file_name(args.args) 170 vim.cmd('mksession! ' .. vim.fn.fnameescape(session_file)) 171end 172 173local function load_session(args) 174 local session_file = session_file_name(args.args) 175 if vim.fn.filereadable(session_file) == 1 then 176 vim.cmd('source ' .. vim.fn.fnameescape(session_file)) 177 else 178 print('No session file found for ' .. (args.args == '' and 'this directory' or args.args)) 179 end 180end 181 182local function session_completion(arg_lead, cmd_line, cursor_pos) 183 local files = vim.fn.globpath(session_dir, 'session:' .. sanitize_path(vim.fn.getcwd()) .. ':*', 0, 1) 184 local sessions = {} 185 for _, file in ipairs(files) do 186 local session = file:match('session:' .. sanitize_path(vim.fn.getcwd()) .. ':(.+)%.vim$') 187 if session and session:find(arg_lead, 1, true) == 1 then 188 table.insert(sessions, session) 189 end 190 end 191 return sessions 192end 193 194-- vim.api.nvim_create_autocmd('VimLeave', { 195-- pattern = '*', 196-- callback = function() save_session({ args = '' }) end, 197-- }) 198 199vim.api.nvim_create_user_command('SaveSession', save_session, { nargs = '?', complete = session_completion }) 200vim.api.nvim_create_user_command('LoadSession', load_session, { nargs = '?', complete = session_completion }) 201 202vim.keymap.set('n', '<leader>ss', ':SaveSession<CR>') 203vim.keymap.set('n', '<leader>sl', ':LoadSession<CR>') 204 205-- free real-estate 206-- <leader>n 207-- <leader>; 208-- <leader>e 209-- <leader>v 210-- <leader>c 211-- <leader>h 212-- <leader>j 213-- <leader>k 214-- <leader>z 215 216vim.cmd([[ 217augroup RememberView 218 autocmd! 219 autocmd BufWinLeave * let b:win_view = winsaveview() 220 autocmd BufWinEnter * if exists('b:win_view') | call winrestview(b:win_view) | endif 221augroup END 222]])