8bfba9f71b06436c399fed351fb6cf26a3323915

Author
Pavle Portic <git@theedgeofrage.com>
Committer
Pavle Portic <git@theedgeofrage.com>
Date

Message

Add new NeoVim configuration

Diff

This diff is truncated to protect this page.

  1diff --git a/dot_config/nvim/init.lua b/dot_config/nvim/init.lua
  2new file mode 100644
  3index 0000000000000000000000000000000000000000..402314beb8aaeed5a9d3a3bb0a3faaa2037a5c3d
  4--- /dev/null
  5+++ b/dot_config/nvim/init.lua
  6@@ -0,0 +1,35 @@
  7+require("sets")
  8+
  9+-- Lazy.nvim
 10+local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
 11+
 12+if not vim.loop.fs_stat(lazypath) then
 13+vim.fn.system({
 14+        "git",
 15+        "clone",
 16+        "--filter=blob:none",
 17+        "https://github.com/folke/lazy.nvim.git",
 18+        "--branch=stable",
 19+        lazypath,
 20+    })
 21+end
 22+
 23+vim.opt.rtp:prepend(lazypath)
 24+
 25+require("lazy").setup("plugins", {
 26+    change_detection = {
 27+        enabled = true,
 28+        notify = false,
 29+    },
 30+})
 31+
 32+vim.cmd([[colorscheme gruvbox]])
 33+
 34+require('telescope').load_extension('projects')
 35+require('project_nvim').setup({})
 36+
 37+-- Import additional config files
 38+require("mappings")
 39+require("git")
 40+require("lsp")
 41+require("line")
 42diff --git a/dot_config/nvim/lazy-lock.json b/dot_config/nvim/lazy-lock.json
 43new file mode 100644
 44index 0000000000000000000000000000000000000000..85851be30ad8a5829f16972cce13b1056d3c2667
 45--- /dev/null
 46+++ b/dot_config/nvim/lazy-lock.json
 47@@ -0,0 +1,35 @@
 48+{
 49+  "Comment.nvim": { "branch": "master", "commit": "0236521ea582747b58869cb72f70ccfa967d2e89" },
 50+  "LuaSnip": { "branch": "master", "commit": "0df29db3543837f8b41597f2640397c5ec792b7b" },
 51+  "bufferline.nvim": { "branch": "main", "commit": "6ecd37e0fa8b156099daedd2191130e083fb1490" },
 52+  "cmp-nvim-lsp": { "branch": "main", "commit": "44b16d11215dce86f253ce0c30949813c0a90765" },
 53+  "copilot.vim": { "branch": "release", "commit": "998cf5ab1b85e844c7e8edb864a997e590df7182" },
 54+  "diffview.nvim": { "branch": "main", "commit": "d38c1b5266850f77f75e006bcc26213684e1e141" },
 55+  "gitsigns.nvim": { "branch": "main", "commit": "ff01d34daaed72f271a8ffa088a7e839a60c640f" },
 56+  "gruvbox.nvim": { "branch": "main", "commit": "477c62493c82684ed510c4f70eaf83802e398898" },
 57+  "lazy.nvim": { "branch": "main", "commit": "276e572f645430bcfd6fd25faa301ea9077f6ab1" },
 58+  "lsp-zero.nvim": { "branch": "v3.x", "commit": "22d2186bee730d68f6fd3bb2d19a389784c37a96" },
 59+  "lualine.nvim": { "branch": "master", "commit": "45e27ca739c7be6c49e5496d14fcf45a303c3a63" },
 60+  "mason-lspconfig.nvim": { "branch": "main", "commit": "397273083f988c1a17acf3816947cd198338e700" },
 61+  "mason.nvim": { "branch": "main", "commit": "cd7835b15f5a4204fc37e0aa739347472121a54c" },
 62+  "neodev.nvim": { "branch": "main", "commit": "24b403eabde652904077f84fd55441744e77a109" },
 63+  "nvim-autopairs": { "branch": "master", "commit": "748e72c05495a3d30e88a6ef04b21697019a9aa9" },
 64+  "nvim-cmp": { "branch": "main", "commit": "5dce1b778b85c717f6614e3f4da45e9f19f54435" },
 65+  "nvim-cursorword": { "branch": "master", "commit": "c0f2958ec729b47be2dba0d79ef43d005dac9f4e" },
 66+  "nvim-lspconfig": { "branch": "master", "commit": "bb8e3dfbe10d80c294bb609c4bb4bba3ecdfbfe2" },
 67+  "nvim-treesitter": { "branch": "master", "commit": "0d5c611e3fd36353b11b412661ff4f07bcc8e5c6" },
 68+  "nvim-treesitter-textobjects": { "branch": "master", "commit": "76c7a89b41de77a4f83fb77fa072c5ad7605fe3b" },
 69+  "nvim-web-devicons": { "branch": "master", "commit": "a1e6268779411048a87f767a27380089362a0ce2" },
 70+  "plenary.nvim": { "branch": "master", "commit": "50012918b2fc8357b87cff2a7f7f0446e47da174" },
 71+  "project.nvim": { "branch": "main", "commit": "8c6bad7d22eef1b71144b401c9f74ed01526a4fb" },
 72+  "suda.vim": { "branch": "master", "commit": "8b0fc3711760195aba104e2d190cff9af8267052" },
 73+  "telescope-fzf-native.nvim": { "branch": "main", "commit": "6c921ca12321edaa773e324ef64ea301a1d0da62" },
 74+  "telescope.nvim": { "branch": "0.1.x", "commit": "7011eaae0ac1afe036e30c95cf80200b8dc3f21a" },
 75+  "undotree": { "branch": "master", "commit": "0e11ba7325efbbb3f3bebe06213afa3e7ec75131" },
 76+  "vim-fugitive": { "branch": "master", "commit": "cbe9dfa162c178946afa689dd3f42d4ea8bf89c1" },
 77+  "vim-matchup": { "branch": "master", "commit": "6dbe108230c7dbbf00555b7d4d9f6a891837ef07" },
 78+  "vim-repeat": { "branch": "master", "commit": "24afe922e6a05891756ecf331f39a1f6743d3d5a" },
 79+  "vim-surround": { "branch": "master", "commit": "3d188ed2113431cf8dac77be61b842acb64433d9" },
 80+  "which-key.nvim": { "branch": "main", "commit": "6962dae3565369363b59dd51fb206051555fcb4d" },
 81+  "whitespace.nvim": { "branch": "master", "commit": "f0fc9e9c4ce3f7d2166e9e5a069b64b9ca4a3f15" }
 82+}
 83diff --git a/dot_config/nvim/lua/git.lua b/dot_config/nvim/lua/git.lua
 84new file mode 100644
 85index 0000000000000000000000000000000000000000..a424ae4f280617c97f01a359122e81b9caf20df0
 86--- /dev/null
 87+++ b/dot_config/nvim/lua/git.lua
 88@@ -0,0 +1,68 @@
 89+require('gitsigns').setup{
 90+    signs = {
 91+        add          = { text = '+' },
 92+        change       = { text = '│' },
 93+        delete       = { text = '_' },
 94+        topdelete    = { text = '‾' },
 95+        changedelete = { text = '~' },
 96+        untracked    = { text = '┆' },
 97+    },
 98+    signcolumn = true,  -- :Gitsigns toggle_signs
 99+    numhl      = false, -- :Gitsigns toggle_numhl
100+    linehl     = false, -- :Gitsigns toggle_linehl
101+    word_diff  = false, -- :Gitsigns toggle_word_diff
102+    watch_gitdir = {
103+        follow_files = true
104+    },
105+    attach_to_untracked = true,
106+    current_line_blame = true, -- :Gitsigns toggle_current_line_blame
107+    current_line_blame_opts = {
108+        virt_text = true,
109+        virt_text_pos = 'right_align', -- 'eol' | 'overlay' | 'right_align'
110+        delay = 100,
111+        ignore_whitespace = false,
112+    },
113+    current_line_blame_formatter = '<author>, <author_time:%Y-%m-%d> - <summary>',
114+    sign_priority = 6,
115+    update_debounce = 100,
116+    status_formatter = nil, -- Use default
117+    max_file_length = 40000, -- Disable if file is longer than this (in lines)
118+    preview_config = {
119+        -- Options passed to nvim_open_win
120+        border = 'single',
121+        style = 'minimal',
122+        relative = 'cursor',
123+        row = 0,
124+        col = 1
125+    },
126+    on_attach = function(bufnr)
127+        local gs = package.loaded.gitsigns
128+
129+        local function map(mode, l, r, opts)
130+            opts = opts or {}
131+            opts.buffer = bufnr
132+            vim.keymap.set(mode, l, r, opts)
133+        end
134+
135+        -- Navigation
136+        map('n', ']c', function()
137+            if vim.wo.diff then return ']c' end
138+            vim.schedule(function() gs.next_hunk() end)
139+            return '<Ignore>'
140+        end, {expr=true})
141+
142+        map('n', '[c', function()
143+            if vim.wo.diff then return '[c' end
144+            vim.schedule(function() gs.prev_hunk() end)
145+            return '<Ignore>'
146+        end, {expr=true})
147+
148+        -- Actions
149+        map('n', '<leader>hs', gs.stage_hunk)
150+        map('n', '<leader>hu', gs.undo_stage_hunk)
151+        map('n', '<leader>hS', gs.stage_buffer)
152+        map('n', '<leader>hR', gs.reset_buffer)
153+        map('n', '<leader>tb', gs.toggle_current_line_blame)
154+        map('n', '<leader>td', gs.toggle_deleted)
155+    end
156+}
157diff --git a/dot_config/nvim/lua/line.lua b/dot_config/nvim/lua/line.lua
158new file mode 100644
159index 0000000000000000000000000000000000000000..4905c59d739f3049cfc70b32e7078d91799b6e3c
160--- /dev/null
161+++ b/dot_config/nvim/lua/line.lua
162@@ -0,0 +1,106 @@
163+require("lualine").setup({
164+    options = {
165+        icons_enabled = true,
166+        theme = 'gruvbox',
167+        component_separators = { left = '', right = ''},
168+        section_separators = { left = '', right = ''},
169+        disabled_filetypes = {
170+            statusline = {},
171+            winbar = {},
172+        },
173+        ignore_focus = {},
174+        always_divide_middle = true,
175+        globalstatus = false,
176+        refresh = {
177+            statusline = 1000,
178+            tabline = 1000,
179+            winbar = 1000,
180+        },
181+        show_filename_only = false,
182+    },
183+    sections = {
184+        lualine_a = {'mode'},
185+        lualine_b = {'branch', 'diff', 'diagnostics'},
186+        lualine_c = {
187+            {
188+                'filename',
189+                file_status = true,      -- Displays file status (readonly status, modified status)
190+                newfile_status = false,  -- Display new file status (new file means no write after created)
191+                path = 1,                -- 0: Just the filename
192+                -- 1: Relative path
193+                -- 2: Absolute path
194+                -- 3: Absolute path, with tilde as the home directory
195+                -- 4: Filename and parent dir, with tilde as the home directory
196+
197+                shorting_target = 40,    -- Shortens path to leave 40 spaces in the window
198+                -- for other components. (terrible name, any suggestions?)
199+                symbols = {
200+                    modified = '[+]',      -- Text to show when the file is modified.
201+                    readonly = '[-]',      -- Text to show when the file is non-modifiable or readonly.
202+                    unnamed = '[No Name]', -- Text to show for unnamed buffers.
203+                    newfile = '[New]',     -- Text to show for newly created file before first write
204+                }
205+            }
206+        },
207+        lualine_x = {
208+            'filetype',
209+            {
210+                require("lazy.status").updates,
211+                cond = require("lazy.status").has_updates,
212+                color = { fg = "#ff9e64" },
213+            },
214+        },
215+        lualine_y = {'progress'},
216+        lualine_z = {'location'},
217+    },
218+    inactive_sections = {
219+        lualine_a = {},
220+        lualine_b = {},
221+        lualine_c = {'filename'},
222+        lualine_x = {'location'},
223+        lualine_y = {},
224+        lualine_z = {},
225+    },
226+    tabline = {},
227+    winbar = {},
228+    inactive_winbar = {},
229+    extensions = {},
230+})
231+
232+
233+require("bufferline").setup({
234+    options = {
235+        mode = "buffers",
236+        themable = true,
237+        numbers = "ordinal",
238+        indicator = {
239+            icon = '▎', -- this should be omitted if indicator style is not 'icon'
240+            style = 'icon',
241+        },
242+        modified_icon = '●',
243+        close_icon = '',
244+        left_trunc_marker = '',
245+        right_trunc_marker = '',
246+        max_name_length = 24,
247+        max_prefix_length = 15, -- prefix used when a buffer is de-duplicated
248+        truncate_names = true, -- whether or not tab names should be truncated
249+        tab_size = 18,
250+        diagnostics = "nvim_lsp",
251+        color_icons = true,
252+        show_buffer_icons = true,
253+        show_buffer_close_icons = false,
254+        -- show_close_icon = false,
255+        -- show_tab_indicators = true | false,
256+        -- show_duplicate_prefix = true | false, -- whether to show duplicate buffer prefix
257+        persist_buffer_sort = true, -- whether or not custom sorted buffers should persist
258+        move_wraps_at_ends = false, -- whether or not the move command "wraps" at the first or last position
259+        -- can also be a table containing 2 custom separators
260+        -- [focused and unfocused]. eg: { '|', '|' }
261+        -- separator_style = "slant" | "slope" | "thick" | "thin" | { 'any', 'any' },
262diff --git a/dot_config/nvim/lua/lsp.lua b/dot_config/nvim/lua/lsp.lua
263new file mode 100644
264index 0000000000000000000000000000000000000000..78efd7980ac1f00d591dc951a84a66aea1cb78eb
265--- /dev/null
266+++ b/dot_config/nvim/lua/lsp.lua
267@@ -0,0 +1,68 @@
268+-- Load default lsp-zero keymaps
269+local lsp_zero = require('lsp-zero')
270+
271+lsp_zero.on_attach(function(_, bufnr)
272+    -- see :help lsp-zero-keybindings
273+    -- to learn the available actions
274+    lsp_zero.default_keymaps({buffer = bufnr})
275+
276+    local opts = {buffer = bufnr, remap = false}
277+    vim.keymap.set("n", "<leader>vw", function() vim.lsp.buf.workspace_symbol() end, opts)
278+    vim.keymap.set("n", "<leader>vc", function() vim.lsp.buf.code_action() end, opts)
279+    vim.keymap.set("n", "<leader>vr", function() vim.lsp.buf.rename() end, opts)
280+
281+    vim.keymap.set("n", "<leader>en", function() vim.diagnostic.goto_next() end, opts)
282+    vim.keymap.set("n", "<leader>ep", function() vim.diagnostic.goto_prev() end, opts)
283+    vim.keymap.set("i", "<C-h>", function() vim.lsp.buf.signature_help() end, opts)
284+end)
285+
286+lsp_zero.format_on_save({
287+    format_opts = {
288+        async = true,
289+        timeout_ms = 10000,
290+    },
291+    servers = {
292+        ['prettier'] = {'javascript', 'typescript'},
293+        ['gopls'] = {'go'},
294+        ['stylua'] = {'lua'},
295+    }
296+})
297+
298+-- Setup LSP servers
299+local lspconfig = require('lspconfig')
300+-- go
301+lspconfig.golangci_lint_ls.setup({})
302+lspconfig.gopls.setup({})
303+-- lua
304+lspconfig.lua_ls.setup({})
305+-- python
306+lspconfig.pylsp.setup{}
307+-- typescript
308+lspconfig.tsserver.setup({})
309+lspconfig.eslint.setup({})
310+-- other
311+lspconfig.terraformls.setup({})
312+lspconfig.jsonls.setup({})
313+
314+-- Customize keymaps
315+local cmp = require('cmp')
316+-- local cmp_action = require('lsp-zero').cmp_action()
317+
318+cmp.setup({
319+    mapping = cmp.mapping.preset.insert({
320+        -- `Enter` key to confirm completion
321+        ['<CR>'] = cmp.mapping.confirm({select = false}),
322+
323+        ['<C-Space>'] = cmp.mapping.complete(),
324+
325+        -- Scroll up and down in the completion documentation
326+        ['<C-u>'] = cmp.mapping.scroll_docs(-4),
327+        ['<C-d>'] = cmp.mapping.scroll_docs(4),
328+    })
329+})
330+
331+-- Fix lua lsp for nvim config
332+local lua_opts = lsp_zero.nvim_lua_ls()
333+require('lspconfig').lua_ls.setup(lua_opts)
334+
335+require("mason").setup()
336diff --git a/dot_config/nvim/lua/mappings.lua b/dot_config/nvim/lua/mappings.lua
337new file mode 100644
338index 0000000000000000000000000000000000000000..0bb9051cb45d850bb4f158f1fafabf7b6e12d6c9
339--- /dev/null
340+++ b/dot_config/nvim/lua/mappings.lua
341@@ -0,0 +1,70 @@
342+-- Colemak bindings
343+vim.keymap.set("", "n", "j")
344+vim.keymap.set("", "e", "k")
345+vim.keymap.set("", "i", "l")
346+vim.keymap.set("", "I", "$")
347+vim.keymap.set("", "H", "0")
348+vim.keymap.set("", "l", "i")
349+vim.keymap.set("", "L", "I")
350+vim.keymap.set("n", "N", "mzJ`z")
351+vim.keymap.set("", "k", "n")
352+vim.keymap.set("", "K", "N")
353+vim.keymap.set("", "J", "M")
354+vim.keymap.set("", "j", "m")
355+vim.keymap.set("", "m", "e")
356+vim.keymap.set("", "M", "E")
357+
358+vim.keymap.set("v", "N", ":m '>+1<CR>gv=gv")
359+vim.keymap.set("v", "E", ":m '<-2<CR>gv=gv")
360+
361+-- General mappings
362+vim.keymap.set("", "<BS>", "gg")
363+vim.keymap.set("", "<CR>", "G")
364+vim.keymap.set("", "<Space>", "<NOP>")
365+
366+vim.keymap.set("x", "p", "\"_dP")
367+
368+vim.keymap.set("n", "<tab>", vim.cmd.bn)
369+vim.keymap.set("n", "<s-tab>", vim.cmd.bp)
370+vim.keymap.set("n", "U", vim.cmd.redo)
371+
372+-- File operation maps
373+vim.keymap.set("n", "<leader>fd", function ()
374+    if vim.bo.filetype == "json" then
375+        vim.cmd("%!jq")
376+    else
377+        vim.cmd.normal('jzgg=G`z')
378+    end
379+end)
380+vim.keymap.set("n", "<leader>fs", vim.cmd.w)
381+vim.keymap.set("n", "<leader>W", vim.cmd.SudaWrite)
382+vim.keymap.set("n", "<leader>q", vim.cmd.q)
383+vim.keymap.set("n", "<leader>Q", ":q!<cr>")
384+vim.keymap.set("n", "<leader>wq", vim.cmd.wq)
385+vim.keymap.set("n", "<leader>bd", ":bp | bd #<cr>")
386+vim.keymap.set("n", "<leader>u", vim.cmd.UndotreeToggle)
387+
388+vim.keymap.set("", "\\", ":let @/ = \"\"<CR>")
389+
390+-- Git
391+vim.keymap.set("n", "<leader>gd", vim.cmd.Gvdiff)
392+-- vim.keymap.set("n", "<leader>gb", vim.cmd('Gitsigns toggle_current_line_blame'))
393+
394+-- window movement
395+vim.keymap.set("n", "<leader>wn", "<C-W>j")
396+vim.keymap.set("n", "<leader>we", "<C-W>k")
397+vim.keymap.set("n", "<leader>wh", "<C-W>h")
398+vim.keymap.set("n", "<leader>wi", "<C-W>l")
399+vim.keymap.set("n", "<leader>wH", "<C-W>5<")
400+vim.keymap.set("n", "<leader>wI", "<C-W>5>")
401+vim.keymap.set("n", "<leader>wN", ":resize +5<CR>")
402+vim.keymap.set("n", "<leader>wE", ":resize -5<CR>")
403+
404+-- Telescope
405+local builtin = require('telescope.builtin')
406+vim.keymap.set('n', '<leader>ff', builtin.find_files, {})
407+vim.keymap.set('n', '<leader>fp', builtin.git_files, {})
408+vim.keymap.set('n', '<c-p>', builtin.git_files, {})
409+vim.keymap.set('n', '<leader>rg', builtin.live_grep, {})
410+vim.keymap.set('n', '<leader>fb', builtin.buffers, {})
411+vim.keymap.set('n', '<leader>fh', builtin.help_tags, {})
412diff --git a/dot_config/nvim/lua/plugins/comment.lua b/dot_config/nvim/lua/plugins/comment.lua
413new file mode 100644
414index 0000000000000000000000000000000000000000..29b58e23ff162569e2f60a4d807ce8a4d96a1aca
415--- /dev/null
416+++ b/dot_config/nvim/lua/plugins/comment.lua
417@@ -0,0 +1,12 @@
418+return {
419+    'numToStr/Comment.nvim',
420+    opts = {
421+        toggler = {
422+            ---Line-comment toggle keymap
423+            line = '<leader>/',
424+            ---Block-comment toggle keymap
425+            block = '<leader>b/',
426+        },
427+    },
428+    lazy = false,
429+}
430diff --git a/dot_config/nvim/lua/plugins/git.lua b/dot_config/nvim/lua/plugins/git.lua
431new file mode 100644
432index 0000000000000000000000000000000000000000..bcfc75867b7e187ce0e4fa7a608773cd0a992f9f
433--- /dev/null
434+++ b/dot_config/nvim/lua/plugins/git.lua
435@@ -0,0 +1,5 @@
436+return {
437+    "lewis6991/gitsigns.nvim",
438+    "sindrets/diffview.nvim",
439+    "tpope/vim-fugitive",
440+}
441diff --git a/dot_config/nvim/lua/plugins/init.lua b/dot_config/nvim/lua/plugins/init.lua
442new file mode 100644
443index 0000000000000000000000000000000000000000..a821b93f118d1eec42cbb36b9a390341592dccfc
444--- /dev/null
445+++ b/dot_config/nvim/lua/plugins/init.lua
446@@ -0,0 +1,34 @@
447+return {
448+    -- Look and feel
449+    {
450+        "ellisonleao/gruvbox.nvim",
451+        priority = 1000 ,
452+        config = true,
453+    },
454+    {
455+        'akinsho/bufferline.nvim',
456+        version = "*",
457+        dependencies = 'nvim-tree/nvim-web-devicons',
458+    },
459+    "nvim-lualine/lualine.nvim",
460+
461+    -- keymaps and functionality
462+    {
463+        'windwp/nvim-autopairs',
464+        event = "InsertEnter",
465+        opts = {}
466+    },
467+    "tpope/vim-surround",
468+    "folke/which-key.nvim",
469+    'andymass/vim-matchup',
470+    'tpope/vim-repeat',
471+    'mbbill/undotree',
472+    'jdhao/whitespace.nvim',
473+    'lambdalisue/suda.vim',
474+    'xiyaowong/nvim-cursorword',
475+
476+    -- other
477+    'ahmedkhalf/project.nvim',
478+    'folke/neodev.nvim',
479+    'github/copilot.vim',
480+}
481diff --git a/dot_config/nvim/lua/plugins/lsp.lua b/dot_config/nvim/lua/plugins/lsp.lua
482new file mode 100644
483index 0000000000000000000000000000000000000000..9cfa1e6f8a2419a55e167de1308c0863c1917922
484--- /dev/null
485+++ b/dot_config/nvim/lua/plugins/lsp.lua
486@@ -0,0 +1,10 @@
487+return {
488+    {'williamboman/mason.nvim'},
489+    {'williamboman/mason-lspconfig.nvim'},
490+
491+    {'VonHeikemen/lsp-zero.nvim', branch = 'v3.x'},
492+    {'neovim/nvim-lspconfig'},
493+    {'hrsh7th/cmp-nvim-lsp'},
494+    {'hrsh7th/nvim-cmp'},
495+    {'L3MON4D3/LuaSnip'},
496+}
497diff --git a/dot_config/nvim/lua/plugins/telescope.lua b/dot_config/nvim/lua/plugins/telescope.lua
498new file mode 100644
499index 0000000000000000000000000000000000000000..78791fbd5529ee7af796bb61a7ba74b6a1bfc1cc
500--- /dev/null
501+++ b/dot_config/nvim/lua/plugins/telescope.lua
502@@ -0,0 +1,13 @@
503+return {
504+    {
505+        'nvim-telescope/telescope.nvim',
506+        branch = '0.1.x',
507+        dependencies = {
508+            'nvim-lua/plenary.nvim',
509+            {
510+                'nvim-telescope/telescope-fzf-native.nvim',
511+                build = 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build',
512+            }
513+        },
514+    },
515+}
516diff --git a/dot_config/nvim/lua/plugins/treesitter.lua b/dot_config/nvim/lua/plugins/treesitter.lua
517new file mode 100644
518index 0000000000000000000000000000000000000000..c9c21276a84115750b9ca85bac6d1ebefe7c9062
519--- /dev/null
520+++ b/dot_config/nvim/lua/plugins/treesitter.lua
521@@ -0,0 +1,57 @@
522+return {
523+    "nvim-treesitter/nvim-treesitter",
524+    version = false,
525+    build = ":TSUpdate",
526+    event = { "BufReadPost", "BufNewFile" },
527+    dependencies = {
528+        {
529+            "nvim-treesitter/nvim-treesitter-textobjects",
530+            init = function()
531+                require("lazy.core.loader").disable_rtp_plugin("nvim-treesitter-textobjects")
532+                load_textobjects = true
533+            end,
534+        },
535+    },
536+    cmd = { "TSUpdateSync" },
537+    keys = {
538+        { "<c-space>", desc = "Increment selection" },
539+        { "<bs>", desc = "Decrement selection", mode = "x" },
540+    },
541+    opts = {
542+        highlight = {
543+            enable = true,
544+            additional_vim_regex_highlighting = false,
545+        },
546+        indent = { enable = true },
547+        auto_install = true,
548+        ensure_installed = {
549+            "bash",
550+            "go",
551+            "javascript",
552+            "json",
553+            "lua",
554+            "luadoc",
555+            "luap",
556+            "markdown",
557+            "markdown_inline",
558+            "python",
559+            "query",
560+            "regex",
561+            "terraform",
562+            "tsx",
563+            "typescript",
564+            "vim",
565+            "vimdoc",
566+            "yaml",
567+        },
568+        incremental_selection = {
569+            enable = true,
570+            keymaps = {
571+                init_selection = "<C-space>",
572+                node_incremental = "<C-space>",
573+                scope_incremental = false,
574+                node_decremental = "<bs>",
575+            },
576+        },
577+    },
578+}
579diff --git a/dot_config/nvim/lua/sets.lua b/dot_config/nvim/lua/sets.lua
580new file mode 100644
581index 0000000000000000000000000000000000000000..92b8adabf0648254d00cb95172b902f205e4561b
582--- /dev/null
583+++ b/dot_config/nvim/lua/sets.lua
584@@ -0,0 +1,37 @@
585+vim.g.mapleader = " "
586+
587+-- sets
588+vim.opt.clipboard = "unnamedplus"
589+vim.opt.nu = true
590+vim.opt.relativenumber = true
591+vim.opt.encoding = "utf8"
592+vim.opt.shell = "/bin/bash"
593+vim.opt.laststatus = 2
594+vim.opt.tabstop = 4
595+vim.opt.shiftwidth = 4
596+vim.opt.softtabstop = 4
597+vim.opt.textwidth = 0
598+vim.opt.background = "dark"
599+vim.opt.listchars = "tab:│ ,trail:~,extends:>,precedes:<"
600+vim.opt.foldenable = false
601+vim.opt.foldmethod = "expr"
602+vim.opt.foldexpr = "nvim_treesitter#foldexpr()"
603+vim.opt.termguicolors = true
604+vim.opt.autochdir = true
605+vim.opt.showcmd = true
606+vim.opt.wrap = true
607+vim.opt.linebreak = true
608+vim.opt.number = true
609+vim.opt.relativenumber = true
610+vim.opt.cursorline = true
611+vim.opt.cursorcolumn = true
612+vim.opt.expandtab = true
613+vim.opt.autoindent = true
614+vim.opt.list = true
615+vim.opt.splitright = true
616+vim.opt.splitbelow = true
617+vim.opt.undofile = true
618+vim.opt.undodir = "/home/pavle/.local/share/nvim/undodir"
619+vim.opt.scrolloff = 8
620+vim.opt.ignorecase = true
621+vim.opt.smartcase = true