summary refs log tree commit diff
path: root/.config/nvim/lua
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--.config/nvim/lua/config/diagnostics.lua (renamed from .vim/plugin/diagnostics.lua)14
-rw-r--r--.config/nvim/lua/config/filetypes.lua5
-rw-r--r--.config/nvim/lua/config/keymaps.lua36
-rw-r--r--.config/nvim/lua/config/lazy.lua63
-rw-r--r--.config/nvim/lua/config/lsp.lua66
-rw-r--r--.config/nvim/lua/config/options.lua (renamed from .vim/plugin/options.lua)4
-rw-r--r--.config/nvim/lua/config/reset.lua17
-rw-r--r--.config/nvim/lua/config/snippets.lua (renamed from .vim/lua/internal/snippets.lua)135
-rw-r--r--.config/nvim/lua/config/statuscolumn.lua (renamed from .vim/plugin/statuscolumn.lua)0
-rw-r--r--.config/nvim/lua/config/statusline.lua (renamed from .vim/plugin/statusline.lua)0
-rw-r--r--.config/nvim/lua/config/undo.lua (renamed from .vim/plugin/undo.lua)0
-rw-r--r--.config/nvim/lua/plugins/blink.lua (renamed from .vim/lua/internal/plugins/blink.lua)31
-rw-r--r--.config/nvim/lua/plugins/calcium.lua15
-rw-r--r--.config/nvim/lua/plugins/colorizer.lua (renamed from .vim/lua/internal/plugins/colorizer.lua)3
-rw-r--r--.config/nvim/lua/plugins/fzf.lua (renamed from .vim/lua/internal/plugins/fzf.lua)16
-rw-r--r--.config/nvim/lua/plugins/gentoo.lua15
-rw-r--r--.config/nvim/lua/plugins/git.lua (renamed from .vim/lua/internal/plugins/git.lua)11
-rw-r--r--.config/nvim/lua/plugins/icons.lua (renamed from .vim/lua/internal/plugins/icons.lua)0
-rw-r--r--.config/nvim/lua/plugins/indent.lua (renamed from .vim/lua/internal/plugins/indent.lua)2
-rw-r--r--.config/nvim/lua/plugins/lsp.lua6
-rw-r--r--.config/nvim/lua/plugins/markdown.lua82
-rw-r--r--.config/nvim/lua/plugins/mini.lua (renamed from .vim/lua/internal/plugins/mini.lua)0
-rw-r--r--.config/nvim/lua/plugins/oil.lua (renamed from .vim/lua/internal/plugins/oil.lua)0
-rw-r--r--.config/nvim/lua/plugins/snippets.lua13
-rw-r--r--.config/nvim/lua/plugins/treesitter.lua (renamed from .vim/lua/internal/plugins/treesitter.lua)43
-rw-r--r--.config/nvim/lua/plugins/whichkey.lua (renamed from .vim/lua/internal/plugins/whichkey.lua)0
26 files changed, 450 insertions, 127 deletions
diff --git a/.vim/plugin/diagnostics.lua b/.config/nvim/lua/config/diagnostics.lua
index 93ee621..6314b83 100644
--- a/.vim/plugin/diagnostics.lua
+++ b/.config/nvim/lua/config/diagnostics.lua
@@ -1,10 +1,10 @@
 vim.diagnostic.config({
   signs = {
     text = {
-      [vim.diagnostic.severity.ERROR] = 'โœ—',
-      [vim.diagnostic.severity.WARN] = 'โ–ท',
-      [vim.diagnostic.severity.INFO] = 'โ„น',
-      [vim.diagnostic.severity.HINT] = '๐Ÿžถ',
+      [vim.diagnostic.severity.ERROR] = '๓ฐทš',
+      [vim.diagnostic.severity.WARN] = '๓ฐ€ฆ',
+      [vim.diagnostic.severity.INFO] = '๓ฐ™Ž',
+      [vim.diagnostic.severity.HINT] = '๓ฐ›“',
     },
     linehl = {
       -- [vim.diagnostic.severity.ERROR] = 'Search',
@@ -44,7 +44,9 @@ end, { desc = 'diagnostic: prev' })
 
 vim.keymap.set('n', 'DD', vim.diagnostic.open_float, { desc = 'diagnostic: current line' })
 
-vim.keymap.set('n', '<leader>td', function()
+vim.keymap.set('n', '<leader>d', '<nop>', { desc = "diagnostics" })
+vim.keymap.set('n', '<leader>dd', vim.diagnostic.open_float, { desc = 'diagnostic: current line' })
+vim.keymap.set('n', '<leader>dv', function()
   -- NOTE: this can be used to switch between multiple sets of diagnostics display
   --       currently it only toggles virtual_text
   local visible = vim.diagnostic.config().virtual_text
@@ -58,6 +60,6 @@ vim.keymap.set('n', '<leader>td', function()
   end
 end, { desc = 'diagnostic: toggle visibility' })
 
-vim.keymap.set('n', '<leader>tD', function()
+vim.keymap.set('n', '<leader>da', function()
   vim.diagnostic.enable(not vim.diagnostic.is_enabled())
 end, { desc = 'diagnostic: toggle all' })
diff --git a/.config/nvim/lua/config/filetypes.lua b/.config/nvim/lua/config/filetypes.lua
new file mode 100644
index 0000000..f1428d2
--- /dev/null
+++ b/.config/nvim/lua/config/filetypes.lua
@@ -0,0 +1,5 @@
+vim.filetype.add({
+  pattern = {
+    ['todo.txt'] = 'todotxt',
+  }
+})
diff --git a/.config/nvim/lua/config/keymaps.lua b/.config/nvim/lua/config/keymaps.lua
new file mode 100644
index 0000000..9c00f7b
--- /dev/null
+++ b/.config/nvim/lua/config/keymaps.lua
@@ -0,0 +1,36 @@
+local map = vim.keymap.set
+
+map('n', 'gb', '<cmd>bnext<cr>', { desc = 'Buffer next' })
+map('n', 'gB', '<cmd>bprevious<cr>', { desc = 'Buffer prev' })
+
+map('n', '<a-j>', '<cmd>cnext<cr>', { desc = 'Quickfix next' })
+map('n', '<a-k>', '<cmd>cprev<cr>', { desc = 'Quickfix prev' })
+
+map('v', '<', '<gv', { desc = 'Indent' })
+map('v', '>', '>gv', { desc = 'Outdent' })
+
+map('t', '<esc>', [[ <c-\><c-n> ]], { desc = 'Terminal: Exit INSERT mode' })
+
+map(
+  'n',
+  'gx',
+  '<cmd>lua vim.ui.open(vim.fn.expand("<cfile>"))<cr>',
+  { desc = 'Open file under cursor' }
+)
+
+vim.api.nvim_create_autocmd({'BufEnter', 'BufWinEnter'}, {
+  group = vim.api.nvim_create_augroup('bufclose', {}),
+  callback = function()
+    if vim.list_contains({'help', 'nofile', 'quickfix'}, vim.bo.buftype) then
+      map('', 'q', '<cmd>close<cr>', { desc = 'Close buffer', buffer = 0 })
+    end
+  end,
+})
+
+map('n', '<leader><leader>x', function()
+  local file = vim.fn.expand('%')
+  vim.cmd.source(file)
+  vim.notify('** sourced ' .. file, vim.log.levels.INFO)
+end, { desc = 'source current file' })
+
+map('n', '<leader>a', '<cmd>edit #<cr>', { desc = 'open alternative file' })
diff --git a/.config/nvim/lua/config/lazy.lua b/.config/nvim/lua/config/lazy.lua
new file mode 100644
index 0000000..5f859f0
--- /dev/null
+++ b/.config/nvim/lua/config/lazy.lua
@@ -0,0 +1,63 @@
+local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim'
+if not (vim.uv or vim.loop).fs_stat(lazypath) then
+  local lazyrepo = 'https://github.com/folke/lazy.nvim.git'
+  local out = vim.fn.system({'git', 'clone', '--filter=blob:none', '--branch=stable', lazyrepo, lazypath})
+  if vim.v.shell_error ~= 0 then
+    vim.api.nvim_echo({
+      {'Failed to clone lazy.nvim:\n', 'ErrorMsg'},
+      {out, 'WarningMsg'},
+      {'\nPress any key to exit...'},
+    }, true, {})
+    vi.fn.getchar() -- let user ack
+    os.exit(1)
+  end
+end
+
+vim.opt.rtp:prepend(lazypath)
+
+vim.g.mapleader = " "
+vim.g.maplocalleader = "\\"
+
+require('lazy').setup({
+  -- load plugin specs from ./plugins
+  spec = { { import = 'plugins' } },
+  -- colorscheme for installing plugins
+  install = { colorscheme = { 'default' } },
+  -- automatically check for plugin updates
+  checker = {
+    enabled = true,
+    frequency = (3600 * 24 * 3), -- 3 days
+  },
+})
+
+vim.keymap.set({'n'}, '<leader>l', '<nop>', { desc = 'lazy' })
+vim.keymap.set({'n'}, '<leader>lz', '<cmd>Lazy<cr>', { desc = 'lazy: open ui' })
+vim.keymap.set({'n'}, '<leader>ln', function()
+  local pname = 'TODO'
+  local ppath = vim.fn.stdpath('config') .. '/lua/plugins'
+
+  vim.ui.input({ prompt = 'Plugin name: ' }, function(input)
+    pname = input
+  end)
+
+  vim.cmd.cd(ppath)
+
+  vim.fn.setreg('a', [[return {
+  {
+    '$name',
+    cmd = {'$cmd'},
+    opts = {$opts},
+    keys = {
+      { mode = {'n'}, '$lhs', '$rhs', desc = '$desc' },
+    },
+  }
+}]])
+
+  local buf = vim.api.nvim_create_buf(true, false)
+  vim.api.nvim_buf_set_name(buf, pname .. '.lua')
+  vim.api.nvim_set_option_value('filetype', 'lua', { buf = buf })
+  vim.api.nvim_win_set_buf(0, buf)
+
+  require('luasnip.extras.otf').on_the_fly('a')
+
+end, { desc = 'lazy: new plugin' })
diff --git a/.config/nvim/lua/config/lsp.lua b/.config/nvim/lua/config/lsp.lua
new file mode 100644
index 0000000..282a3dc
--- /dev/null
+++ b/.config/nvim/lua/config/lsp.lua
@@ -0,0 +1,66 @@
+if not vim.lsp.enable then return end
+
+local lsp = vim.lsp
+
+lsp.enable({
+  'bashls',
+  'ccls',
+  'clangd',
+  'gopls',
+  'rust_analyzer',
+  'superhtml',
+  'tinymist',
+  'zk',
+  'zls',
+})
+
+local capabilities = nil
+if pcall(require, 'blink.cmp') then
+  capabilities = require('blink.cmp').get_lsp_capabilities()
+end
+
+lsp.config('*', {
+  root_markers = {'.git'},
+  capabilities = capabilities
+})
+
+vim.api.nvim_create_autocmd({'LspAttach'}, {
+  group = vim.api.nvim_create_augroup('lspattach', {}),
+  callback = function(args)
+    local client = assert(vim.lsp.get_client_by_id(args.data.client_id))
+
+    -- TODO: what does this do?
+    vim.opt_local.omnifunc = 'v:lua.vim.lsp.omnifunc'
+
+    vim.keymap.set('n', 'gd', vim.lsp.buf.definition, { desc = 'goto_definition' })
+    vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, { desc = 'goto declaration' })
+    vim.keymap.set('n', 'gT', vim.lsp.buf.type_definition, { desc = 'goto type definition' })
+    vim.keymap.set('n', 'gR', vim.lsp.buf.references, { desc = 'show references' })
+    vim.keymap.set('n', 'ga', vim.lsp.buf.code_action, { desc = 'show code actions' })
+    vim.keymap.set('n', 'grr', vim.lsp.buf.rename, { desc = 'rename' })
+
+    if client:supports_method('textDocument/implementation') then
+      vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, { desc = 'goto implementation' })
+    end
+
+    if client:supports_method('textDocument/completion') then
+      vim.lsp.completion.enable(true, client.id, args.buf, {autotrigger = false})
+    end
+
+    if client:supports_method('textDocument/formatting') then
+    vim.keymap.set('n', '<leader>f', vim.lsp.buf.format, { desc = 'format' })
+    end
+
+    if not client:supports_method('textDocument/willSaveWaitUntil')
+        and client:supports_method('textDocument/formatting') then
+      vim.api.nvim_create_autocmd({'BufWritePre'}, {
+        group = vim.api.nvim_create_augroup('lspattach', {}),
+        buffer = args.buf,
+        callback = function()
+          if vim.b.nofmt then return end
+          vim.lsp.buf.format({ bufnr = args.buf, id = client.id, timeout_ms = 1000 })
+        end,
+      })
+    end
+  end,
+})
diff --git a/.vim/plugin/options.lua b/.config/nvim/lua/config/options.lua
index dba726a..073835f 100644
--- a/.vim/plugin/options.lua
+++ b/.config/nvim/lua/config/options.lua
@@ -15,13 +15,13 @@ opt.listchars:append({
   trail = 'ยฌ',
   tab = '> ',
   -- space = 'ยท',
-  lead = 'ยท',
+  -- lead = 'ยท',
 })
 opt.showbreak = 'โ†ช '
 
 -- show indicator and wrap text at 80 chars
 opt.colorcolumn = '+1'
-opt.textwidth = 79
+opt.textwidth = 80
 opt.wrap = true
 
 opt.conceallevel = 2
diff --git a/.config/nvim/lua/config/reset.lua b/.config/nvim/lua/config/reset.lua
new file mode 100644
index 0000000..4908c20
--- /dev/null
+++ b/.config/nvim/lua/config/reset.lua
@@ -0,0 +1,17 @@
+vim.g.loaded_gzip = 1
+vim.g.loaded_tar = 1
+vim.g.loaded_tarPlugin = 1
+vim.g.loaded_zip = 1
+vim.g.loaded_zipPlugin = 1
+vim.g.loaded_getscript = 1
+vim.g.loaded_getscriptPlugin = 1
+vim.g.loaded_vimball = 1
+vim.g.loaded_vimballPlugin = 1
+vim.g.loaded_matchit = 1
+vim.g.loaded_2html_plugin = 1
+vim.g.loaded_logiPat = 1
+vim.g.loaded_rrhelper = 1
+vim.g.loaded_netrw = 1
+vim.g.loaded_netrwPlugin = 1
+vim.g.loaded_netrwSettings = 1
+vim.g.loaded_netrwFileHandlers = 1
diff --git a/.vim/lua/internal/snippets.lua b/.config/nvim/lua/config/snippets.lua
index be00884..e0c260e 100644
--- a/.vim/lua/internal/snippets.lua
+++ b/.config/nvim/lua/config/snippets.lua
@@ -1,72 +1,12 @@
 local ls = require('luasnip')
 local types = require('luasnip.util.types')
 
--- attach to builtin snippet hooks
-
-vim.snippet.expand = ls.lsp_expand
-
----@diagnostic disable-next-line: duplicate-set-field
-vim.snippet.active = function(filter)
-  filter = filter or {}
-  filter.direction = filter.direction or 1
-
-  if filter.direction == 1 then
-    return ls.expand_or_jumpable()
-  else
-    return ls.jumpable(filter.direction)
-  end
-end
-
----@diagnostic disable-next-line: duplicate-set-field
-vim.snippet.jump = function(direction)
-  if direction == 1 then
-    if ls.expandable() then
-      return ls.expand_or_jump()
-    else
-      return ls.jumpable(1) and ls.jump(1)
-    end
-  else
-    return ls.jumpable(-1) and ls.jump(-1)
-  end
-end
-
-vim.snippet.stop = ls.unlink_current
-
-local snip_env = {
-  -- snippet helpers
-  nl = function()
-    return ls.t({ '', '' })
-  end,
-  exec = function(command)
-    return ls.f(function(_, _, ...)
-      local job = require('plenary.job'):new({
-        command = vim.env.SHELL,
-        args = { '-c', ... },
-        enable_recording = true,
-      })
-      local res, exitcode = job:sync()
-      if not exitcode == 0 or #res == 0 then
-        error(string.format('exec "%s" failed', ...))
-      end
-      return res
-    end, {}, { user_args = { command } })
-  end,
-  -- condition helpers
-  cond = {
-    ts = function(capture)
-      return function()
-        return vim.tbl_contains(vim.treesitter.get_captures_at_cursor(), capture)
-      end
-    end,
-  },
-}
-
+-- configure luasnip
 ls.config.set_config({
   enable_autosnippets = true,
   history = true,
   updateevents = 'TextChanged,TextChangedI',
   override_builtin = true,
-  snip_env = vim.tbl_deep_extend('error', ls.session.config.snip_env, snip_env),
   ext_opts = {
     [types.choiceNode] = {
       active = {
@@ -79,10 +19,41 @@ ls.config.set_config({
       },
     },
   },
+  snip_env = vim.tbl_deep_extend('error', ls.session.config.snip_env, {
+    -- snippet helpers
+    nl = function()
+      return ls.t({ '', '' })
+    end,
+    exec = function(command)
+      return ls.f(function(_, _, ...)
+        local job = require('plenary.job'):new({
+          command = vim.env.SHELL,
+          args = { '-c', ... },
+          enable_recording = true,
+        })
+        local res, exitcode = job:sync()
+        if not exitcode == 0 or #res == 0 then
+          error(string.format('exec "%s" failed', ...))
+        end
+        return res
+      end, {}, { user_args = { command } })
+    end,
+    -- condition helpers
+    cond = {
+      ts = function(capture)
+        return function()
+          return vim.tbl_contains(vim.treesitter.get_captures_at_cursor(), capture)
+        end
+      end,
+    },
+  }),
 })
 
-require('luasnip.loaders.from_lua').lazy_load({ paths = './snippets' })
+-- snippet loaders
+require('luasnip.loaders.from_lua').lazy_load()
+require('luasnip.loaders.from_vscode').lazy_load({ include = {} })
 
+-- keymaps
 vim.keymap.set({ 'i', 's' }, '<c-j>', function()
   return vim.snippet.active({ direction = 1 }) and vim.snippet.jump(1)
 end, { silent = true, desc = 'snippet: jump next' })
@@ -103,8 +74,10 @@ vim.keymap.set({ 'i', 's' }, '<c-p>', function()
   end
 end, { silent = true, desc = 'snippet: prev choice' })
 
+-- usercmds
 vim.api.nvim_create_user_command('EditSnippets', require('luasnip.loaders').edit_snippet_files, {})
 
+-- autocmds
 -- vim.api.nvim_create_autocmd('User', {
 --   pattern = 'LuasnipChoiceNodeEnter',
 --   callback = function()
@@ -127,3 +100,41 @@ vim.api.nvim_create_user_command('EditSnippets', require('luasnip.loaders').edit
 --     end)
 --   end,
 -- })
+
+-- unlink luasnip session on <esc>
+vim.api.nvim_create_autocmd('ModeChanged', {
+  pattern = '*',
+  callback = function()
+    if ((vim.v.event.old_mode == 's' and vim.v.event.new_mode == 'n') or vim.v.event.old_mode == 'i')
+        and ls.session.current_nodes[vim.api.nvim_get_current_buf()]
+        and not ls.session.jump_active
+        and not require("blink.cmp").is_visible()
+    then
+      ls.unlink_current()
+    end
+  end
+})
+
+-- attach to builtin snippet hooks
+vim.snippet.expand = ls.lsp_expand
+vim.snippet.active = function(filter)
+  filter = filter or {}
+  filter.direction = filter.direction or 1
+  if filter.direction == 1 then
+    return ls.expand_or_jumpable()
+  else
+    return ls.jumpable(filter.direction)
+  end
+end
+vim.snippet.jump = function(direction)
+  if direction == 1 then
+    if ls.expandable() then
+      return ls.expand_or_jump()
+    else
+      return ls.jumpable(1) and ls.jump(1)
+    end
+  else
+    return ls.jumpable(-1) and ls.jump(-1)
+  end
+end
+vim.snippet.stop = ls.unlink_current
diff --git a/.vim/plugin/statuscolumn.lua b/.config/nvim/lua/config/statuscolumn.lua
index 06e8988..06e8988 100644
--- a/.vim/plugin/statuscolumn.lua
+++ b/.config/nvim/lua/config/statuscolumn.lua
diff --git a/.vim/plugin/statusline.lua b/.config/nvim/lua/config/statusline.lua
index fed6d33..fed6d33 100644
--- a/.vim/plugin/statusline.lua
+++ b/.config/nvim/lua/config/statusline.lua
diff --git a/.vim/plugin/undo.lua b/.config/nvim/lua/config/undo.lua
index aed6195..aed6195 100644
--- a/.vim/plugin/undo.lua
+++ b/.config/nvim/lua/config/undo.lua
diff --git a/.vim/lua/internal/plugins/blink.lua b/.config/nvim/lua/plugins/blink.lua
index 1d0e0ae..1122bcc 100644
--- a/.vim/lua/internal/plugins/blink.lua
+++ b/.config/nvim/lua/plugins/blink.lua
@@ -6,14 +6,7 @@ return {
     lazy = false,
 
     dependencies = {
-      {
-        'L3MON4D3/LuaSnip',
-        version = 'v2.*',
-        build = 'make install_jsregexp',
-        config = function()
-          require('internal.snippets')
-        end,
-      },
+      { 'L3MON4D3/LuaSnip' },
     },
 
     init = function()
@@ -26,11 +19,29 @@ return {
       hl(0, 'BlinkCmpLabelDescription', { link = 'Comment', force = true })
     end,
 
+    opts_extend = { 'sources.default' },
+
     opts = {
       -- TODO:
       -- 'prefer_rust_with_warning', requires nightly rust, due to:
       -- https://github.com/rust-lang/rust/issues/86656
-      fuzzy = { implementation = 'lua' },
+      fuzzy = { 
+        implementation = 'lua',
+        sorts = {
+          function(a, b)
+            local prio = {
+              snippets = 99,
+              -- everyting else 0
+            }
+            local a_priority = prio[a.source_id] or 0
+            local b_priority = prio[b.source_id] or 0
+            if a_priority ~= b_priority then return a_priority > b_priority end
+          end,
+          -- defaults
+          'score',
+          'sort_text'
+        },
+      },
 
       appearance = {
         -- fallback to cmp highlight names
@@ -42,7 +53,6 @@ return {
       sources = {
         providers = {
           buffer = { min_keyword_length = 3 },
-          snippets = { min_keyword_length = 3 },
         },
       },
 
@@ -80,6 +90,5 @@ return {
 
       snippets = { preset = 'luasnip' },
     },
-    opts_extend = { 'sources.default' },
   },
 }
diff --git a/.config/nvim/lua/plugins/calcium.lua b/.config/nvim/lua/plugins/calcium.lua
new file mode 100644
index 0000000..f0ab78c
--- /dev/null
+++ b/.config/nvim/lua/plugins/calcium.lua
@@ -0,0 +1,15 @@
+return {
+  {
+    'necrom4/calcium.nvim',
+    cmd = {'Calcium'},
+    opts = {
+      notifications = false,
+      default_mode = 'replace',
+    },
+    keys = {
+      { mode = {'n', 'v'}, 'gl', '<nop>', desc = 'Calcium' },
+      { mode = {'n', 'v'}, 'glr', ':Calcium replace<cr>', desc = 'Calcium replace', silent = true },
+      { mode = {'n', 'v'}, 'gla', ':Calcium append<cr>', desc = 'Calcium append', silent = true },
+    },
+  }
+}
diff --git a/.vim/lua/internal/plugins/colorizer.lua b/.config/nvim/lua/plugins/colorizer.lua
index cf55336..2608ae6 100644
--- a/.vim/lua/internal/plugins/colorizer.lua
+++ b/.config/nvim/lua/plugins/colorizer.lua
@@ -2,12 +2,11 @@ return {
   {
     'NvChad/nvim-colorizer.lua',
     -- 'norcalli/nvim-colorizer.lua',
-    -- events = { 'VeryLazy' },
     lazy = false,
     opts = {
       name = true,
       RRGGBB = true,
-      RRGGBBAA = false,
+      RRGGBBAA = true,
       rgb_fn = true,
       hsl_fn = true,
       mode = 'background',
diff --git a/.vim/lua/internal/plugins/fzf.lua b/.config/nvim/lua/plugins/fzf.lua
index e8c0a9c..efee6ef 100644
--- a/.vim/lua/internal/plugins/fzf.lua
+++ b/.config/nvim/lua/plugins/fzf.lua
@@ -28,11 +28,19 @@ return {
             ['ctrl-p'] = 'up',
           },
         },
+        -- actions = {
+        --   files = {
+        --     ['ctrl-q'] = { fn = fzf.actions.file_sel_to_qf },
+        --   },
+        -- },
         fzf_colors = true,
         -- PICKER CONFIG
         files = {
           file_icons = true,
         },
+        marks = {
+          marks = '[a-zA-Z]',
+        }
       })
     end,
     keys = {
@@ -41,8 +49,12 @@ return {
       { mode = 'n', ';b', '<cmd>FzfLua buffers<cr>', desc = 'fzf: buffers' },
       { mode = 'n', ';f', '<cmd>FzfLua files<cr>', desc = 'fzf: find_files' },
       { mode = 'n', ';g', '<cmd>FzfLua live_grep<cr>', desc = 'fzf: live_grep' },
-      { mode = 'n', ';d', '<cmd>FzfLua diagnostics_workspace<cr>', desc = 'fzf: diagnostics' },
-      { mode = 'n', ';h', '<cmd>FzfLua helptags<cr>', desc = 'fzf: diagnostics' },
+      { mode = 'n', ';d', '<cmd>FzfLua diagnostics_workspace<cr>', desc = 'fzf: workspace diagnostics' },
+      { mode = 'n', ';D', '<cmd>FzfLua diagnostics_document<cr>', desc = 'fzf: document diagnostics' },
+      { mode = 'n', ';h', '<cmd>FzfLua helptags<cr>', desc = 'fzf: help' },
+      { mode = 'n', ';s', '<cmd>FzfLua lsp_document_symbols<cr>', desc = 'fzf: document symbols' },
+      { mode = 'n', ';w', '<cmd>FzfLua lsp_live_workspace_symbols<cr>', desc = 'fzf: workspace symbols' },
+      { mode = 'n', ';m', '<cmd>FzfLua marks<cr>', desc = 'fzf: marks' },
       {
         mode = 'n',
         ';v',
diff --git a/.config/nvim/lua/plugins/gentoo.lua b/.config/nvim/lua/plugins/gentoo.lua
new file mode 100644
index 0000000..470e6de
--- /dev/null
+++ b/.config/nvim/lua/plugins/gentoo.lua
@@ -0,0 +1,15 @@
+return {
+  {
+    'gentoo/gentoo-syntax',
+    -- ft = { 'ebuild' },
+    -- init = function()
+    --   vim.api.nvim_create_autocmd('LspAttach', {
+    --     callback = function(args)
+    --       if vim.opt.filetype == 'ebuild' then
+    --         vim.lsp.stop_client(vim.lsp.get_clients({ bufnr = args.bufnr }))
+    --       end
+    --     end,
+    --   })
+    -- end,
+  },
+}
diff --git a/.vim/lua/internal/plugins/git.lua b/.config/nvim/lua/plugins/git.lua
index 056cc14..2561ad9 100644
--- a/.vim/lua/internal/plugins/git.lua
+++ b/.config/nvim/lua/plugins/git.lua
@@ -3,10 +3,7 @@ return {
     'lewis6991/gitsigns.nvim',
     lazy = false,
     opts = {
-      signs = {
-        change = { text = 'โ–‹' },
-        add = { text = 'โ–‹' },
-      },
+      debug_mode = false,
     },
     keys = {
       {
@@ -31,8 +28,12 @@ return {
         end,
         desc = 'Gitsigns: prev hunk',
       },
+      { '<leader>g', '<nop>', desc = 'git' },
+      { '<leader>g<space>', '<cmd>Gitsigns<cr>', desc = 'Gitsigns: select action' },
       { '<leader>gb', '<cmd>Gitsigns blame<cr>', desc = 'Gitsigns: blame' },
-      { '<leader>gs', '<cmd>Gitsigns<cr>', desc = 'Gitsigns: select action' },
+      { '<leader>ga', '<cmd>Gitsigns stage_hunk<cr>', desc = 'Gitsigns: stage hunk' },
+      { '<leader>ga', ':Gitsigns stage_hunk<cr>', desc = 'Gitsigns: stage hunk', mode = 'x' },
+      { '<leader>gd', ':Gitsigns diffthis<cr>', desc = 'Gitsigns: diff' },
       {
         ';c',
         function()
diff --git a/.vim/lua/internal/plugins/icons.lua b/.config/nvim/lua/plugins/icons.lua
index 9a597ab..9a597ab 100644
--- a/.vim/lua/internal/plugins/icons.lua
+++ b/.config/nvim/lua/plugins/icons.lua
diff --git a/.vim/lua/internal/plugins/indent.lua b/.config/nvim/lua/plugins/indent.lua
index a27a328..e247c5a 100644
--- a/.vim/lua/internal/plugins/indent.lua
+++ b/.config/nvim/lua/plugins/indent.lua
@@ -12,11 +12,13 @@ return {
         enabled = true,
         show_start = false,
         show_end = false,
+        char = 'โ–Œ',
       },
     },
   },
   -- detect indent from the buffer contents
   {
+    enabled = false,
     'NMAC427/guess-indent.nvim',
     lazy = false,
     opts = {
diff --git a/.config/nvim/lua/plugins/lsp.lua b/.config/nvim/lua/plugins/lsp.lua
new file mode 100644
index 0000000..aebf3c4
--- /dev/null
+++ b/.config/nvim/lua/plugins/lsp.lua
@@ -0,0 +1,6 @@
+return {
+  {
+    'neovim/nvim-lspconfig',
+    version = '^2.0',
+  }
+}
diff --git a/.config/nvim/lua/plugins/markdown.lua b/.config/nvim/lua/plugins/markdown.lua
new file mode 100644
index 0000000..b21255e
--- /dev/null
+++ b/.config/nvim/lua/plugins/markdown.lua
@@ -0,0 +1,82 @@
+return {
+  {
+    -- handy markdown commands
+    'tadmccorkle/markdown.nvim',
+    ft = { 'markdown' },
+    opts = {
+      mappings = false,
+      on_attach = function(buf)
+        local set = function(mode, lhs, rhs, desc)
+          vim.keymap.set(mode, lhs, rhs, { buffer = buf, desc = 'Markdown: ' .. desc })
+        end
+        set('n', 'nio', '<cmd>MDListItemBelow<cr>', 'Insert list item below')
+        set('n', 'niO', '<cmd>MDListItemAbove<cr>', 'Insert list item above')
+        set({ 'n', 'v', 'x', 'i' }, '<m-x>', '<cmd>MDTaskToggle<cr>', 'Toggle task')
+        set('x', '<m-l>', '<esc>gv<plug>(markdown_add_link_visual)', 'Make link')
+      end,
+    },
+  },
+  {
+    -- pretty markdown
+    'MeanderingProgrammer/markdown.nvim',
+    name = 'render-markdown', -- needed if used together with markdown.nvim above
+    main = 'render-markdown',
+    dependencies = {
+      'nvim-treesitter/nvim-treesitter',
+      'echasnovski/mini.icons',
+    },
+    ft = { 'markdown' },
+    opts = {
+      completions = { blink = { enabled = true } },
+      sign = { enabled = true },
+      indent = { enabled = false },
+      heading = {
+        width = 'block',
+        icons = {
+          'โ–’ ',
+          'โ–’โ–’ ',
+          'โ–’โ–’โ–’ ',
+          'โ–’โ–’โ–’โ–’ ',
+          'โ–’โ–’โ–’โ–’โ–’ ',
+          'โ–’โ–’โ–’โ–’โ–’โ–’ ',
+        },
+        signs = { 'โ…ฐ', 'โ…ฑ', 'โ…ฒ', 'โ…ณ', 'โ…ด', 'โ…ต' },
+        backgrounds = {},
+        foregrounds = {},
+      },
+      bullet = {
+        icons = { '*โ€‰', '-', '>' },
+      },
+      checkbox = {
+        checked = { icon = '  ๓ฐ„ฒ ' },
+        unchecked = { icon = '  ๓ฐ„ฑ ' },
+        custom = {
+          todo = { raw = '[-]', rendered = '  ๓ฐ”Ÿ ', highlight = 'RenderMarkdownTodo' },
+        },
+      },
+      code = {
+        width = 'block',
+        border = 'thin',
+        disable_background = true,
+      },
+    },
+    init = vim.schedule_wrap(function()
+      local hl = vim.api.nvim_set_hl
+      hl(0, '@markup.bold', { link = 'markdownBold', force = true })
+      hl(0, '@markup.italic', { link = 'markdownItalic', force = true })
+
+      -- hl(0, 'RenderMarkdownH1', { fg = 'NvimLightCyan' })
+      -- hl(0, 'RenderMarkdownH1Bg', { bg = 'NvimDarkCyan' })
+      -- hl(0, 'RenderMarkdownH2', { fg = 'NvimLightMagenta' })
+      -- hl(0, 'RenderMarkdownH2Bg', { bg = 'NvimDarkMagenta' })
+      -- hl(0, 'RenderMarkdownH3', { fg = 'NvimLightYellow' })
+      -- hl(0, 'RenderMarkdownH3Bg', { bg = 'NvimDarkYellow' })
+      -- hl(0, 'RenderMarkdownH4', { fg = 'NvimLightBlue' })
+      -- hl(0, 'RenderMarkdownH4Bg', { bg = 'NvimDarkBlue' })
+      -- hl(0, 'RenderMarkdownH5', { fg = 'NvimLightRed' })
+      -- hl(0, 'RenderMarkdownH5Bg', { bg = 'NvimDarkRed' })
+
+      hl(0, 'RenderMarkdownBullet', { link = '@markup.list', force = true })
+    end),
+  },
+}
diff --git a/.vim/lua/internal/plugins/mini.lua b/.config/nvim/lua/plugins/mini.lua
index fb4c9a6..fb4c9a6 100644
--- a/.vim/lua/internal/plugins/mini.lua
+++ b/.config/nvim/lua/plugins/mini.lua
diff --git a/.vim/lua/internal/plugins/oil.lua b/.config/nvim/lua/plugins/oil.lua
index 401fe8b..401fe8b 100644
--- a/.vim/lua/internal/plugins/oil.lua
+++ b/.config/nvim/lua/plugins/oil.lua
diff --git a/.config/nvim/lua/plugins/snippets.lua b/.config/nvim/lua/plugins/snippets.lua
new file mode 100644
index 0000000..97a4455
--- /dev/null
+++ b/.config/nvim/lua/plugins/snippets.lua
@@ -0,0 +1,13 @@
+return {
+  {
+    'L3MON4D3/LuaSnip',
+    version = 'v2.*',
+    build = 'make install_jsregexp',
+    config = function()
+      require('config.snippets')
+    end,
+    dependencies = {
+      "rafamadriz/friendly-snippets",
+    },
+  }
+}
diff --git a/.vim/lua/internal/plugins/treesitter.lua b/.config/nvim/lua/plugins/treesitter.lua
index b8b1d56..93f396d 100644
--- a/.vim/lua/internal/plugins/treesitter.lua
+++ b/.config/nvim/lua/plugins/treesitter.lua
@@ -1,41 +1,24 @@
 return {
   {
     'nvim-treesitter/nvim-treesitter',
+    branch = 'master',
     dependencies = {
-      -- TODO: https://github.com/nvim-treesitter/nvim-treesitter-context
       { 'nvim-treesitter/nvim-treesitter-refactor', lazy = false },
       { 'nvim-treesitter/nvim-treesitter-textobjects', lazy = false },
-      { 'nvim-treesitter/playground', cmd = { 'TSPlayground' } },
+      -- { 'nvim-treesitter/playground', cmd = { 'TSPlayground' } },
     },
     lazy = false,
     build = ':TSUpdate',
     config = function(_, opts)
-      -- TODO: overwrite parser configs, insert gotmpl
-
       require('nvim-treesitter.configs').setup(opts)
 
       -- use bash parser for gentoo ebuilds
       vim.treesitter.language.register('bash', 'ebuild')
-
-      -- register mediawiki parser
-      -- local parser_configs = require('nvim-treesitter.parsers').get_parser_configs()
-      -- parser_configs.mediawiki = {
-      --   install_info = {
-      --     url = 'github.com/Ordoviz/tree-sitter-mediawiki',
-      --     files = { 'src/parser.c' },
-      --     branch = 'main',
-      --     generate_requires_npm = false,
-      --     requires_generate_from_grammar = false,
-      --   },
-      --   filetype = 'mediawiki',
-      -- }
     end,
     opts = {
       ensure_installed = {
         'bash',
-        'bibtex',
         'c',
-        'c_sharp',
         'cmake',
         'comment',
         'cpp',
@@ -45,37 +28,28 @@ return {
         'gomod',
         'gotmpl',
         'gowork',
-        'hare',
-        'hcl',
         'html',
-        'java',
         'javascript',
         'json',
         'jsonc',
-        'kotlin',
-        'latex',
-        'ledger',
         'lua',
         'make',
         'markdown',
         'markdown_inline',
         'ninja',
-        'norg',
         'python',
-        'query',
         'regex',
         'rust',
         'scss',
         'sql',
+        'todotxt',
         'toml',
         'typescript',
+        'typst',
         'vim',
         'vimdoc',
         'yaml',
         'zig',
-
-        -- external parsers
-        -- 'mediawiki', -- TODO: missing queries
       },
       highlight = {
         enable = true,
@@ -87,15 +61,9 @@ return {
       refactor = {
         navigation = {
           enable = true,
-          keymaps = {
-            goto_definition = 'gd',
-          },
         },
         smart_rename = {
           enable = true,
-          keymaps = {
-            smart_rename = 'grr',
-          },
         },
       },
       textobjects = {
@@ -112,7 +80,8 @@ return {
             ['al'] = '@loop.outer',
             ['is'] = '@scopename.inner',
             ['as'] = '@scopename.outer',
-            ['ic'] = '@comment.outer',
+            ['ic'] = '@comment.inner',
+            ['ac'] = '@comment.outer',
           },
           selection_mode = {
             ['@comment.outer'] = 'V',
diff --git a/.vim/lua/internal/plugins/whichkey.lua b/.config/nvim/lua/plugins/whichkey.lua
index dc21eda..dc21eda 100644
--- a/.vim/lua/internal/plugins/whichkey.lua
+++ b/.config/nvim/lua/plugins/whichkey.lua