aboutsummaryrefslogtreecommitdiffstats
path: root/init.lua
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--init.lua373
1 files changed, 135 insertions, 238 deletions
diff --git a/init.lua b/init.lua
index 9942d1b..5eae671 100644
--- a/init.lua
+++ b/init.lua
@@ -1,6 +1,7 @@
1--@diagnostic disable: undefined-global, 1--@diagnostic disable: undefined-global
2vim.loader.enable() 2vim.loader.enable()
3 3
4
4vim.g.netrw_banner = 0 5vim.g.netrw_banner = 0
5vim.g.netrw_liststyle = 3 6vim.g.netrw_liststyle = 3
6vim.g.netrw_altv = 0 7vim.g.netrw_altv = 0
@@ -25,7 +26,6 @@ vim.opt.hlsearch = true
25vim.opt.incsearch = true 26vim.opt.incsearch = true
26vim.opt.updatetime = 50 27vim.opt.updatetime = 50
27vim.opt.laststatus = 0 28vim.opt.laststatus = 0
28-- vim.opt.termguicolors = true
29vim.opt.signcolumn = "number" 29vim.opt.signcolumn = "number"
30vim.opt.clipboard = "unnamedplus" 30vim.opt.clipboard = "unnamedplus"
31vim.opt.fillchars = "eob: " 31vim.opt.fillchars = "eob: "
@@ -34,90 +34,44 @@ vim.opt.lazyredraw = false
34vim.opt.updatetime = 300 34vim.opt.updatetime = 300
35vim.opt.timeoutlen = 500 35vim.opt.timeoutlen = 500
36 36
37-- -- Format on save if any attached LSP supports formatting 37vim.api.nvim_create_autocmd("BufWritePre", {
38vim.api.nvim_create_autocmd( 38 callback = function()
39 "BufWritePre", 39 local buf = vim.api.nvim_get_current_buf()
40 { 40 local clients = vim.lsp.get_clients({bufnr = buf})
41 callback = function() 41 for _, client in ipairs(clients) do
42 local buf = vim.api.nvim_get_current_buf() 42 if client.server_capabilities.documentFormattingProvider then
43 local clients = vim.lsp.get_clients({bufnr = buf}) 43 vim.lsp.buf.format({async = false})
44 44 return
45 for _, client in ipairs(clients) do
46 if client.server_capabilities.documentFormattingProvider then
47 vim.lsp.buf.format({silent = true})
48 return
49 end
50 end 45 end
51 -- No formatting-capable client: do nothing
52 end 46 end
53 } 47 end
54) 48})
55 49
56local run_on_save = vim.api.nvim_create_augroup("RunPfOnSave", {clear = true}) 50local run_on_save = vim.api.nvim_create_augroup("RunPfOnSave", {clear = true})
57local formatters = { 51local formatters = {
58 { 52 {
59 patterns = { 53 patterns = {"*.js","*.ts","*.jsx","*.json","*.tsx","*.css","*.html","*.yaml","*.md","*.svelte","*.lua"},
60 "*.js", 54 command = function(file) vim.fn.system({"prettier", "--write", file}) end
61 "*.ts",
62 "*.jsx",
63 "*.json",
64 "*.tsx",
65 "*.css",
66 "*.html",
67 "*.yaml",
68 "*.md",
69 "*.svelte",
70 "*.lua"
71 },
72 command = function(file)
73 vim.fn.system({"prettier", "--write", file})
74 end
75 }, 55 },
76 { 56 {patterns = {"*.tex"}, command = function(file) vim.fn.system({"pdflatex", "--shell-escape", file}) end},
77 patterns = {"*.tex"}, 57 {patterns = {"*.c","*.h"}, command = function(file) vim.fn.system({"clang-format", "-i", file}) end}
78 command = function(file)
79 vim.fn.system({"pdflatex", "--shell-escape", file})
80 end
81 },
82 {
83 patterns = {"*.c", "*.h"},
84 command = function(file)
85 vim.fn.system({"clang-format", "-i", file})
86 end
87 }
88} 58}
89for _, fmt in ipairs(formatters) do 59for _, fmt in ipairs(formatters) do
90 vim.api.nvim_create_autocmd( 60 vim.api.nvim_create_autocmd("BufWritePost", {
91 "BufWritePost", 61 group = run_on_save, pattern = fmt.patterns,
92 { 62 callback = function(args) pcall(fmt.command, args.match or args.file) end
93 group = run_on_save, 63 })
94 pattern = fmt.patterns,
95 callback = function(args)
96 local filepath = args.match or args.file
97 pcall(fmt.command, filepath)
98 end
99 }
100 )
101end 64end
102 65
103-- Auto-delete Netrw hidden buffers
104vim.api.nvim_create_augroup("AutoDeleteNetrwHiddenBuffers", {clear = true}) 66vim.api.nvim_create_augroup("AutoDeleteNetrwHiddenBuffers", {clear = true})
105vim.api.nvim_create_autocmd( 67vim.api.nvim_create_autocmd("FileType", {
106 "FileType", 68 group = "AutoDeleteNetrwHiddenBuffers", pattern = "netrw",
107 { 69 callback = function() vim.opt_local.bufhidden = "wipe"; vim.opt_local.buflisted = false end
108 group = "AutoDeleteNetrwHiddenBuffers", 70})
109 pattern = "netrw",
110 callback = function()
111 vim.opt_local.bufhidden = "wipe"
112 vim.opt_local.buflisted = false
113 end
114 }
115)
116 71
117function ToggleVExplorer() 72function ToggleVExplorer()
118 local expl_buf = vim.t.expl_buf_num 73 local expl_buf = vim.t.expl_buf_num
119 local expl_win = expl_buf and vim.fn.bufwinnr(expl_buf) or -1 74 local expl_win = expl_buf and vim.fn.bufwinnr(expl_buf) or -1
120
121 if expl_win ~= -1 then 75 if expl_win ~= -1 then
122 vim.cmd(expl_win .. "wincmd c") 76 vim.cmd(expl_win .. "wincmd c")
123 vim.t.expl_buf_num = nil 77 vim.t.expl_buf_num = nil
@@ -128,58 +82,26 @@ function ToggleVExplorer()
128 end 82 end
129end 83end
130 84
131local autopairs = { 85local autopairs = { ["("]=")", ["["]="]", ["{"]="}", ["<"]=">" }
132 ["("] = ")",
133 ["["] = "]",
134 ["{"] = "}",
135 ["<"] = ">"
136}
137
138for open, close in pairs(autopairs) do 86for open, close in pairs(autopairs) do
139 vim.api.nvim_set_keymap("i", open, open .. close .. "<Left>", {noremap = true, silent = true}) 87 vim.api.nvim_set_keymap("i", open, open..close.."<Left>", {noremap=true, silent=true})
140end 88end
141 89
142function set_highlights() 90function set_highlights()
143 local highlights = { 91 local highlights = {
144 {"GitGutterAdd", {bg = "none"}}, 92 {"GitGutterAdd",{bg="none"}},{"GitGutterDelete",{bg="none"}},{"GitGutterChange",{bg="none"}},
145 {"GitGutterDelete", {bg = "none"}}, 93 {"NonText",{fg="none"}},{"EndOfBuffer",{fg="none",bg="none"}},{"SignColumn",{bg="none"}},
146 {"GitGutterChange", {bg = "none"}}, 94 {"StatusLine",{bg="none",fg="none"}},{"StatusLineNc",{bg="none",fg="none"}},
147 {"GitGutterChangeAdd", {bg = "none"}}, 95 {"CursorColumn",{fg="none"}},{"CursorLine",{bg="none"}},{"VertSplit",{bg="none"}},
148 {"GitGutterChangeDelete", {bg = "none"}}, 96 {"DiagnosticError",{bg="none"}},{"DiagnosticWarn",{bg="none"}},{"DiagnosticInfo",{bg="none"}},
149 {"NonText", {fg = "none"}}, 97 {"DiagnosticHint",{bg="none"}},{"Pmenu",{bg="none"}},{"LspFloatWinNormal",{bg="none"}},
150 {"EndOfBuffer", {fg = "none", bg = "none"}}, 98 {"NormalFloat",{bg="none"}},{"LineNr",{bg="none"}}
151 {"SignColumn", {bg = "none"}},
152 {"StatusLine", {bg = "none", fg = "none"}},
153 {"StatusLineNc", {bg = "none", fg = "none"}},
154 {"CursorColumn", {fg = "none"}},
155 {"CursorLine", {bg = "none"}},
156 {"VertSplit", {bg = "none"}},
157 {"DiagnosticError", {bg = "none"}},
158 {"DiagnosticWarn", {bg = "none"}},
159 {"DiagnosticInfo", {bg = "none"}},
160 {"DiagnosticHint", {bg = "none"}},
161 {"Pmenu", {bg = "none"}},
162 {"DiagnosticVirtualTextError", {bg = "none"}},
163 {"DiagnosticVirtualTextWarn", {bg = "none"}},
164 {"DiagnosticVirtualTextInfo", {bg = "none"}},
165 {"DiagnosticVirtualTextHint", {bg = "none"}},
166 {"LspFloatWinNormal", {bg = "none"}},
167 {"NormalFloat", {bg = "none"}},
168 {"LineNr", {bg = "none"}},
169 {"DiagnosticVirtualError", {bg = "none"}},
170 {"DiagnosticVirtualWarn", {bg = "none"}},
171 {"DiagnosticVirtualInfo", {bg = "none"}},
172 {"DiagnosticVirtualHint", {bg = "none"}}
173 } 99 }
174 100 for _, hl in ipairs(highlights) do vim.api.nvim_set_hl(0, hl[1], hl[2]) end
175 for _, hl in ipairs(highlights) do
176 vim.api.nvim_set_hl(0, hl[1], hl[2])
177 end
178end 101end
179 102
180vim.cmd("colorscheme quiet") 103vim.cmd("colorscheme quiet")
181vim.o.background = "dark" 104vim.o.background = "dark"
182
183function color_mode() 105function color_mode()
184 if vim.o.background == "dark" then 106 if vim.o.background == "dark" then
185 vim.o.background = "light" 107 vim.o.background = "light"
@@ -193,109 +115,107 @@ end
193 115
194local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" 116local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
195if not vim.loop.fs_stat(lazypath) then 117if not vim.loop.fs_stat(lazypath) then
196 vim.fn.system( 118 vim.fn.system({"git","clone","--filter=blob:none","https://github.com/folke/lazy.nvim.git","--branch=stable",lazypath})
197 {
198 "git",
199 "clone",
200 "--filter=blob:none",
201 "https://github.com/folke/lazy.nvim.git",
202 "--branch=stable",
203 lazypath
204 }
205 )
206end 119end
207
208vim.opt.rtp:prepend(lazypath) 120vim.opt.rtp:prepend(lazypath)
209 121
210require("lazy").setup( 122require("lazy").setup({
123 {"ibhagwan/fzf-lua", opts = {}},
124 {"airblade/vim-gitgutter"},
125
211 { 126 {
212 { 127 "neovim/nvim-lspconfig",
213 "ibhagwan/fzf-lua", 128 config = function()
214 opts = {} 129 local capabilities = require("cmp_nvim_lsp").default_capabilities()
215 }, 130 local function get_root(patterns)
216 {"airblade/vim-gitgutter"}, 131 local root = vim.fs.dirname(vim.fs.find(patterns, { upward = true })[1])
217 { 132 return root or vim.fn.getcwd()
218 "neovim/nvim-lspconfig", 133 end
219 lazy = false, 134 local on_attach = function(_, bufnr)
220 dependencies = { 135 local opts = {buffer = bufnr, silent = true}
221 {"ms-jpq/coq_nvim", branch = "coq"}, 136 vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts)
222 {"ms-jpq/coq.artifacts", branch = "artifacts"} 137 vim.keymap.set("n", "K", vim.lsp.buf.hover, opts)
223 }, 138 vim.keymap.set("n", "gr", vim.lsp.buf.references, opts)
224 init = function() 139 vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, opts)
225 vim.g.coq_settings = {
226 auto_start = "shut-up",
227 display = {
228 icons = {
229 mode = "none"
230 },
231 ghost_text = {
232 enabled = false
233 }
234 }
235 }
236 end 140 end
237 }
238 }
239)
240
241local lsp_servers = {
242 clangd = {filetypes = {"c", "h"}},
243 svelte = {filetypes = {"svelte"}},
244 ts_ls = {filetypes = {
245 "typescript",
246 "typescriptreact",
247 "javascript",
248 "javascriptreact"}
249 },
250 rust_analyzer = {
251 filetypes = {"rust"},
252 imports = {
253 granularity = {
254 group = "module",
255 },
256 prefix = "self",
257 },
258 cargo = {
259 buildScripts = {
260 enable = true,
261 },
262 },
263 procMacro = {
264 enable = true
265 },
266 }
267}
268
269local function server_maps(opts)
270 local buf = opts.buffer
271end
272
273
274
275local capabilities = vim.lsp.protocol.make_client_capabilities()
276capabilities = require("coq").lsp_ensure_capabilities(capabilities)
277 141
278for server_name, config in pairs(lsp_servers) do 142 vim.lsp.config.clangd = {
279 vim.api.nvim_create_autocmd("FileType", { 143 cmd = {"clangd"},
280 pattern = config.filetypes, 144 root_dir = get_root({"compile_commands.json", ".git", "Makefile"}),
281 callback = function() 145 capabilities = capabilities,
282 vim.lsp.start({ 146 on_attach = on_attach,
283 name = server_name, 147 }
284 cmd = vim.lsp.get_server_capabilities(server_name).cmd or { server_name }, 148 vim.lsp.config.rust_analyzer = {
285 root_dir = vim.fs.dirname(vim.api.nvim_buf_get_name(0)), 149 cmd = {"rust-analyzer"},
150 root_dir = get_root({"Cargo.toml", ".git"}),
151 capabilities = capabilities,
152 on_attach = on_attach,
153 }
154 vim.lsp.config.ts_ls = {
155 cmd = {"typescript-language-server","--stdio"},
156 root_dir = get_root({"package.json", ".git"}),
286 capabilities = capabilities, 157 capabilities = capabilities,
287 settings = config.settings, 158 on_attach = on_attach,
288 on_attach = function(client, bufnr) 159 }
289 server_maps({buffer = bufnr}) 160
161 vim.api.nvim_create_autocmd("FileType", {
162 pattern = {"c","cpp","h","rs","typescript","javascript"},
163 callback = function()
164 local ft = vim.bo.filetype
165 if ft == "c" or ft == "cpp" or ft == "h" then
166 vim.lsp.start(vim.lsp.config.clangd)
167 elseif ft == "rust" then
168 vim.lsp.start(vim.lsp.config.rust_analyzer)
169 elseif ft == "typescript" or ft == "javascript" then
170 vim.lsp.start(vim.lsp.config.ts_ls)
171 end
290 end 172 end
291 }) 173 })
292 end 174 end
293 }) 175 },
294end
295
296
297set_highlights()
298 176
177 {
178 "hrsh7th/nvim-cmp",
179 dependencies = {
180 "hrsh7th/cmp-nvim-lsp","hrsh7th/cmp-buffer","hrsh7th/cmp-path",
181 "L3MON4D3/LuaSnip","saadparwaiz1/cmp_luasnip","onsails/lspkind.nvim",
182 {
183 "rafamadriz/friendly-snippets",
184 config = function() require("luasnip.loaders.from_vscode").lazy_load() end
185 },
186 },
187 config = function()
188 local cmp = require("cmp")
189 local luasnip = require("luasnip")
190 local lspkind = require("lspkind")
191 cmp.setup({
192 snippet = {expand = function(args) luasnip.lsp_expand(args.body) end},
193 mapping = cmp.mapping.preset.insert({
194 ["<C-Space>"] = cmp.mapping.complete(),
195 ["<CR>"] = cmp.mapping.confirm({select=true}),
196 ["<Tab>"] = cmp.mapping(function(fb)
197 if cmp.visible() then cmp.select_next_item()
198 elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump()
199 else fb() end
200 end, {"i","s"}),
201 ["<S-Tab>"] = cmp.mapping(function(fb)
202 if cmp.visible() then cmp.select_prev_item()
203 elseif luasnip.jumpable(-1) then luasnip.jump(-1)
204 else fb() end
205 end, {"i","s"}),
206 }),
207 sources = cmp.config.sources({
208 {name="nvim_lsp", keyword_length = 2},{name="luasnip"},{name="buffer", keyword_length = 3},{name="path"}
209 }),
210 formatting = {
211 format = lspkind.cmp_format({
212 mode = "symbol_text", maxwidth = 50, ellipsis_char = "..."
213 })
214 }
215 })
216 end
217 }
218})
299vim.g.mapleader = " " 219vim.g.mapleader = " "
300vim.keymap.set("n", "<leader>e", ToggleVExplorer, {desc = "Toggle VExplorer"}) 220vim.keymap.set("n", "<leader>e", ToggleVExplorer, {desc = "Toggle VExplorer"})
301vim.keymap.set("n", "<leader>z", [[:%s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>]]) 221vim.keymap.set("n", "<leader>z", [[:%s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>]])
@@ -310,43 +230,20 @@ vim.keymap.set("n", "<leader>f", "<cmd>FzfLua files<cr>")
310vim.keymap.set("n", "<leader>F", "<cmd>FzfLua live_grep<cr>", {noremap = true, silent = true}) 230vim.keymap.set("n", "<leader>F", "<cmd>FzfLua live_grep<cr>", {noremap = true, silent = true})
311vim.keymap.set("n", "<leader>b", "<cmd>FzfLua buffers<cr>") 231vim.keymap.set("n", "<leader>b", "<cmd>FzfLua buffers<cr>")
312vim.keymap.set("n", "<leader>d", vim.lsp.buf.definition, {silent = true}) 232vim.keymap.set("n", "<leader>d", vim.lsp.buf.definition, {silent = true})
313vim.keymap.set( 233vim.keymap.set("n", "<leader>df", vim.diagnostic.open_float, {silent = true})
314 "n",
315 "<leader>df",
316 function()
317 vim.diagnostic.open_float()
318 end,
319 {silent = true}
320)
321vim.keymap.set("n", "<leader>k", vim.lsp.buf.hover, {silent = true}) 234vim.keymap.set("n", "<leader>k", vim.lsp.buf.hover, {silent = true})
322vim.keymap.set( 235vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, {silent = true})
323 "n",
324 "<leader>ca",
325 function()
326 vim.lsp.buf.code_action()
327 end,
328 {silent = true}
329)
330vim.keymap.set("n", "<leader>r", color_mode, {desc = "Change mode light/dark"}) 236vim.keymap.set("n", "<leader>r", color_mode, {desc = "Change mode light/dark"})
331vim.keymap.set( 237vim.keymap.set("n", "<leader>t", function()
332 "n", 238 vim.cmd("terminal")
333 "<leader>t", 239 vim.cmd("startinsert")
334 function() 240end, {desc = "Open terminal"})
335 vim.cmd("terminal")
336 vim.cmd("startinsert")
337 end,
338 {desc = "Open terminal in current window"}
339)
340 241
341vim.keymap.set("v", "J", ":m '>+1<CR>gv=gv") 242vim.keymap.set("v", "J", ":m '>+1<CR>gv=gv")
342vim.keymap.set("v", "K", ":m '<-2<CR>gv=gv") 243vim.keymap.set("v", "K", ":m '<-2<CR>gv=gv")
244vim.keymap.set("t", "<Esc>", function()
245 vim.cmd([[stopinsert]])
246 vim.cmd([[b#]])
247end, {noremap = true, silent = true})
248set_highlights()
343 249
344vim.keymap.set(
345 "t",
346 "<Esc>",
347 function()
348 vim.cmd([[stopinsert]])
349 vim.cmd([[b#]])
350 end,
351 {noremap = true, silent = true}
352)