btw i use nix
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', { 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]])