aboutsummaryrefslogtreecommitdiff
path: root/nvim/lua/config
diff options
context:
space:
mode:
Diffstat (limited to 'nvim/lua/config')
-rw-r--r--nvim/lua/config/autocmds.lua21
-rw-r--r--nvim/lua/config/filetypes.lua56
-rw-r--r--nvim/lua/config/keymaps.lua14
-rw-r--r--nvim/lua/config/options.lua3
-rw-r--r--nvim/lua/config/statusline.lua44
-rw-r--r--nvim/lua/config/treesitter.lua43
6 files changed, 94 insertions, 87 deletions
diff --git a/nvim/lua/config/autocmds.lua b/nvim/lua/config/autocmds.lua
index 0835670..2cca1df 100644
--- a/nvim/lua/config/autocmds.lua
+++ b/nvim/lua/config/autocmds.lua
@@ -1,7 +1,4 @@
1-- https://github.com/nvim-treesitter/nvim-treesitter/blob/main/doc/nvim-treesitter.txt 1-- https://github.com/nvim-treesitter/nvim-treesitter/blob/main/doc/nvim-treesitter.txt
2local treesitter_languages = require("config.treesitter").languages
3local extra_filetypes = require("config.filetypes").extra
4
5local function enable_treesitter_features() 2local function enable_treesitter_features()
6 if not pcall(vim.treesitter.start) then return end 3 if not pcall(vim.treesitter.start) then return end
7 4
@@ -10,20 +7,8 @@ local function enable_treesitter_features()
10 vim.bo.indentexpr = "v:lua.require('nvim-treesitter').indentexpr()" 7 vim.bo.indentexpr = "v:lua.require('nvim-treesitter').indentexpr()"
11end 8end
12 9
13-- Fuehrt zwei Listen zu einer neuen zusammen, ohne die Eingaben zu veraendern.
14local function merge(list, extra)
15 local merged = {}
16 for _, item in ipairs(list) do
17 table.insert(merged, item)
18 end
19 for _, item in ipairs(extra) do
20 table.insert(merged, item)
21 end
22 return merged
23end
24
25vim.api.nvim_create_autocmd("FileType", { 10vim.api.nvim_create_autocmd("FileType", {
26 pattern = merge(treesitter_languages, extra_filetypes), 11 pattern = require("config.treesitter").filetypes(),
27 callback = enable_treesitter_features, 12 callback = enable_treesitter_features,
28}) 13})
29 14
@@ -50,7 +35,7 @@ vim.api.nvim_create_autocmd("QuitPre", {
50vim.api.nvim_create_autocmd("LspAttach", { 35vim.api.nvim_create_autocmd("LspAttach", {
51 callback = function(event) 36 callback = function(event)
52 local client = vim.lsp.get_client_by_id(event.data.client_id) 37 local client = vim.lsp.get_client_by_id(event.data.client_id)
53 local keymaps = require("config.keymaps") 38
54 keymaps.lsp(event.buf, client) 39 require("config.keymaps").set_lsp(event.buf, client)
55 end, 40 end,
56}) 41})
diff --git a/nvim/lua/config/filetypes.lua b/nvim/lua/config/filetypes.lua
index 2537750..0cb9036 100644
--- a/nvim/lua/config/filetypes.lua
+++ b/nvim/lua/config/filetypes.lua
@@ -1,49 +1,31 @@
1-- Custom Filetype-Erkennung fuer Dateien, die sich nicht allein anhand ihrer 1-- Custom Filetype-Erkennung fuer Dateien, die sich nicht allein anhand ihrer
2-- Endung unterscheiden lassen (z.B. Ansible-YAML vs. normales YAML). 2-- Endung unterscheiden lassen (z.B. Ansible-YAML vs. normales YAML).
3--
4-- "yaml.ansible" wird ausserdem in config.treesitter (Autocmd-Pattern) und in
5-- plugins/lsp.lua (ansiblels.filetypes) verwendet.
3 6
4local M = {} 7-- Ansible-Dateien haben die Endung .yml/.yaml wie normales YAML und sind nur am
5 8-- Dateinamen bzw. am Pfad erkennbar. Die Patterns sind mit "$" verankert, damit
6-- Name des zusammengesetzten Filetypes fuer Ansible-YAML-Dateien. Wird auch 9-- Jinja-Templates (z.B. tasks/main.yml.j2) weiter als jinja gelten.
7-- von plugins/lsp.lua (vim.lsp.config.ansiblels.filetypes) referenziert, damit
8-- Erkennung und LSP-Konfiguration nicht auseinanderlaufen koennen.
9M.ANSIBLE_YAML = "yaml.ansible"
10
11-- Filetypes, die hier zusaetzlich zur eingebauten Erkennung entstehen und
12-- an anderer Stelle mitberuecksichtigt werden muessen (siehe config.autocmds,
13-- Treesitter-Aktivierung).
14M.extra = { M.ANSIBLE_YAML, "jsonc" }
15
16-- Ansible-Dateien haben die Endung .yml/.yaml wie normales YAML und sind nur
17-- am Dateinamen bzw. am Pfad erkennbar. Die Patterns sind mit "$" verankert,
18-- damit Jinja-Templates (z.B. tasks/main.yml.j2) weiter als jinja gelten.
19vim.filetype.add({ 10vim.filetype.add({
20 filename = { 11 filename = {
21 ["playbook.yml"] = M.ANSIBLE_YAML, 12 ["playbook.yml"] = "yaml.ansible",
22 ["playbook.yaml"] = M.ANSIBLE_YAML, 13 ["playbook.yaml"] = "yaml.ansible",
23 ["site.yml"] = M.ANSIBLE_YAML, 14 ["site.yml"] = "yaml.ansible",
24 ["site.yaml"] = M.ANSIBLE_YAML, 15 ["site.yaml"] = "yaml.ansible",
25 ["requirements.yml"] = M.ANSIBLE_YAML, 16 ["requirements.yml"] = "yaml.ansible",
26 ["requirements.yaml"] = M.ANSIBLE_YAML, 17 ["requirements.yaml"] = "yaml.ansible",
27 }, 18 },
28 pattern = { 19 pattern = {
29 [".*/roles/.*/tasks/.*%.ya?ml$"] = M.ANSIBLE_YAML, 20 [".*/roles/.*/tasks/.*%.ya?ml$"] = "yaml.ansible",
30 [".*/roles/.*/handlers/.*%.ya?ml$"] = M.ANSIBLE_YAML, 21 [".*/roles/.*/handlers/.*%.ya?ml$"] = "yaml.ansible",
31 [".*/tasks/.*%.ya?ml$"] = M.ANSIBLE_YAML, 22 [".*/tasks/.*%.ya?ml$"] = "yaml.ansible",
32 [".*/handlers/.*%.ya?ml$"] = M.ANSIBLE_YAML, 23 [".*/handlers/.*%.ya?ml$"] = "yaml.ansible",
33 [".*/group_vars/.*%.ya?ml$"] = M.ANSIBLE_YAML, 24 [".*/group_vars/.*%.ya?ml$"] = "yaml.ansible",
34 [".*/host_vars/.*%.ya?ml$"] = M.ANSIBLE_YAML, 25 [".*/host_vars/.*%.ya?ml$"] = "yaml.ansible",
35 [".*/playbooks/.*%.ya?ml$"] = M.ANSIBLE_YAML, 26 [".*/playbooks/.*%.ya?ml$"] = "yaml.ansible",
36 }, 27 },
37 extension = { 28 extension = {
38 j2 = "jinja", 29 j2 = "jinja",
39 -- .json als jsonc behandeln, damit Kommentare erlaubt sind (jsonls meldet
40 -- sie dann nicht als Fehler).
41 json = "jsonc",
42 }, 30 },
43}) 31})
44
45-- nvim-treesitter stellt keinen eigenen jsonc-Parser bereit. Der json-Parser
46-- versteht // und /* */ Kommentare, deshalb wird er fuer jsonc mitbenutzt.
47vim.treesitter.language.register("json", "jsonc")
48
49return M
diff --git a/nvim/lua/config/keymaps.lua b/nvim/lua/config/keymaps.lua
index 9896a57..bdae127 100644
--- a/nvim/lua/config/keymaps.lua
+++ b/nvim/lua/config/keymaps.lua
@@ -2,7 +2,7 @@ local M = {}
2 2
3local map = vim.keymap.set 3local map = vim.keymap.set
4 4
5function M.lsp(buffer, client) 5function M.set_lsp(buffer, client)
6 local opts = { 6 local opts = {
7 buffer = buffer, 7 buffer = buffer,
8 silent = true, 8 silent = true,
@@ -56,17 +56,23 @@ function M.lsp(buffer, client)
56 set_c_bindings() 56 set_c_bindings()
57 elseif client.name == "basedpyright" or client.name == "pyright" or client.name == "pylsp" then 57 elseif client.name == "basedpyright" or client.name == "pyright" or client.name == "pylsp" then
58 set_python_bindings() 58 set_python_bindings()
59 elseif client.name == "tsserver" or client.name == "vtsls" or client.name == "typescript_tools" then 59 elseif
60 client.name == "ts_ls"
61 or client.name == "tsgo"
62 or client.name == "tsserver"
63 or client.name == "vtsls"
64 or client.name == "typescript_tools"
65 then
60 set_npm_bindings() 66 set_npm_bindings()
61 end 67 end
62 end 68 end
63end 69end
64 70
65function M.gitsigns() 71function M.set_gitsigns()
66 map("n", "<leader>tb", require("gitsigns").toggle_current_line_blame) 72 map("n", "<leader>tb", require("gitsigns").toggle_current_line_blame)
67end 73end
68 74
69function M.global() 75function M.set_global()
70 local opts = { 76 local opts = {
71 silent = true, 77 silent = true,
72 } 78 }
diff --git a/nvim/lua/config/options.lua b/nvim/lua/config/options.lua
index b1d2104..55fe983 100644
--- a/nvim/lua/config/options.lua
+++ b/nvim/lua/config/options.lua
@@ -50,9 +50,6 @@ opt.matchpairs:append("<:>")
50-- automatisches Einlesen geänderter Dateien 50-- automatisches Einlesen geänderter Dateien
51opt.autoread = true 51opt.autoread = true
52 52
53-- Suche rekursiv
54opt.path:append("**")
55
56-- Tabs 53-- Tabs
57opt.expandtab = false 54opt.expandtab = false
58opt.tabstop = 4 55opt.tabstop = 4
diff --git a/nvim/lua/config/statusline.lua b/nvim/lua/config/statusline.lua
index 01339d0..ef6f315 100644
--- a/nvim/lua/config/statusline.lua
+++ b/nvim/lua/config/statusline.lua
@@ -46,19 +46,6 @@ local function git_diff()
46 return "" 46 return ""
47end 47end
48 48
49----------------------------------------------------------------------
50-- Dateiname mit Modifikationsstatus
51----------------------------------------------------------------------
52
53local function filename()
54 local name = vim.fn.expand("%:.")
55 if name == "" then name = "[No Name]" end
56
57 if vim.bo.modified then name = name .. " [+]" end
58
59 return " " .. name .. " "
60end
61
62------------------------------------------------------------------------ 49------------------------------------------------------------------------
63-- Treesitter-Aktivität (buffer-lokal, kein redraw-spam) 50-- Treesitter-Aktivität (buffer-lokal, kein redraw-spam)
64------------------------------------------------------------------------ 51------------------------------------------------------------------------
@@ -70,6 +57,23 @@ local function treesitter()
70end 57end
71 58
72------------------------------------------------------------------------ 59------------------------------------------------------------------------
60-- LSP-Clients des Buffers
61------------------------------------------------------------------------
62
63local function lsp()
64 local clients = vim.lsp.get_clients({ bufnr = 0 })
65
66 if #clients == 0 then return "" end
67
68 local names = {}
69 for _, client in ipairs(clients) do
70 table.insert(names, client.name)
71 end
72
73 return " " .. table.concat(names, ", ") .. " "
74end
75
76------------------------------------------------------------------------
73-- Diagnostik-Counts (buffer-lokal, kein redraw-spam) 77-- Diagnostik-Counts (buffer-lokal, kein redraw-spam)
74------------------------------------------------------------------------ 78------------------------------------------------------------------------
75 79
@@ -103,14 +107,6 @@ local function fileinfo()
103 return string.format(" %s %s ", ft, enc) 107 return string.format(" %s %s ", ft, enc)
104end 108end
105 109
106------------------------------------------------------------------------
107-- Cursor-Position (kein redraw-spam)
108------------------------------------------------------------------------
109
110local function position()
111 return string.format(" %d:%d ", vim.fn.line("."), vim.fn.col("."))
112end
113
114---------------------------------------------------------------------- 110----------------------------------------------------------------------
115-- Öffentliche Statusline-Funktion 111-- Öffentliche Statusline-Funktion
116---------------------------------------------------------------------- 112----------------------------------------------------------------------
@@ -123,16 +119,18 @@ function M.statusline()
123 git(), 119 git(),
124 git_diff(), 120 git_diff(),
125 "%#StatusLine#", 121 "%#StatusLine#",
126 filename(), 122 -- %f Dateiname, %m Modifikationsstatus; %(..%) faellt weg, wenn %m leer ist
123 " %f%( %m%) ",
127 124
128 "%=", 125 "%=",
129 126
130 -- RIGHT: Feedback & Meta 127 -- RIGHT: Feedback & Meta
131 diagnostics(), 128 diagnostics(),
129 lsp(),
132 treesitter(), 130 treesitter(),
133 fileinfo(), 131 fileinfo(),
134 " %p%% ", 132 " %p%% ",
135 position(), 133 " %l:%c ",
136 }) 134 })
137end 135end
138 136
diff --git a/nvim/lua/config/treesitter.lua b/nvim/lua/config/treesitter.lua
index e52d637..8e4e4ba 100644
--- a/nvim/lua/config/treesitter.lua
+++ b/nvim/lua/config/treesitter.lua
@@ -10,11 +10,11 @@ M.languages = {
10 -- "jinja", 10 -- "jinja",
11 -- "jinja_inline", 11 -- "jinja_inline",
12 "jq", 12 "jq",
13 "json", -- deckt auch den Dateityp jsonc ab (siehe lua/config/filetypes.lua) 13 "json", -- deckt auch den Dateityp jsonc ab (siehe extra_filetypes)
14 "lua", 14 "lua",
15 "make", 15 "make",
16 "markdown", 16 "markdown",
17 "markdown_inline", 17 "markdown_inline", -- kein eigener Dateityp, nur fuer Injections in Markdown
18 "po", 18 "po",
19 "powershell", 19 "powershell",
20 "prisma", 20 "prisma",
@@ -27,4 +27,43 @@ M.languages = {
27 "zsh", 27 "zsh",
28} 28}
29 29
30-- Filetypes ohne gleichnamigen Parser, samt Parser, den sie nutzen sollen.
31local extra_filetypes = {
32 -- nvim-treesitter stellt keinen jsonc-Parser bereit; der json-Parser
33 -- versteht // und /* */ Kommentare.
34 jsonc = "json",
35
36 -- Dateityp und Parser heissen unterschiedlich; ohne diese Zuordnung findet
37 -- vim.treesitter.start() keinen Parser und die FileType-Autocmd feuert nicht.
38 sh = "bash",
39 ps1 = "powershell",
40
41 -- Zusammengesetzter Dateityp aus config.filetypes: den Parser loest Neovim
42 -- selbst am Punkt auf, der Eintrag sorgt aber fuer das Autocmd-Pattern --
43 -- Patterns splitten nicht, "yaml" wuerde fuer "yaml.ansible" nicht feuern.
44 ["yaml.ansible"] = "yaml",
45}
46
47-- Macht die Parser der Filetypes ohne gleichnamigen Parser bekannt.
48function M.register_extra_filetypes()
49 for filetype, parser in pairs(extra_filetypes) do
50 vim.treesitter.language.register(parser, filetype)
51 end
52end
53
54-- Filetypes, fuer die Treesitter-Features aktiviert werden.
55function M.filetypes()
56 local filetypes = {}
57
58 for _, language in ipairs(M.languages) do
59 table.insert(filetypes, language)
60 end
61
62 for filetype in pairs(extra_filetypes) do
63 table.insert(filetypes, filetype)
64 end
65
66 return filetypes
67end
68
30return M 69return M