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>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]])