feat: sync .config dotfiles, transition Node to mise, integrate 1Password CLI/SSH Agent, and add optional AI CLI tools

This commit is contained in:
2026-06-22 17:13:42 +02:00
parent 0379a21780
commit 6b09ba52b6
33 changed files with 837 additions and 1425 deletions
+29 -39
View File
@@ -1,67 +1,57 @@
-- ============================================================================
-- Editor - Quality of Life Plugins
-- Editor Enhancements - Comment, Surround, etc.
-- ============================================================================
return {
-- Auto pairs
{
'windwp/nvim-autopairs',
event = 'InsertEnter',
config = true,
},
-- Comment.nvim
-- Comment.nvim - gc zum Kommentieren
{
'numToStr/Comment.nvim',
event = { 'BufReadPost', 'BufNewFile' },
dependencies = {
'JoosepAlviste/nvim-ts-context-commentstring',
},
event = 'VeryLazy',
config = function()
require('Comment').setup({
pre_hook = require('ts_context_commentstring.integrations.comment_nvim').create_pre_hook(),
-- LHS of toggle mappings in NORMAL mode
toggler = {
line = 'gcc', -- Line-comment toggle
block = 'gbc', -- Block-comment toggle
},
-- LHS of operator-pending mappings in NORMAL and VISUAL mode
opleader = {
line = 'gc', -- Line-comment operator
block = 'gb', -- Block-comment operator
},
})
end,
},
-- Surround
-- Surround - ys/cs/ds für quotes, brackets, etc.
{
'kylechui/nvim-surround',
version = '*',
event = 'VeryLazy',
config = true,
config = function()
require('nvim-surround').setup()
end,
},
-- Better escape
-- Auto-pairs
{
'max397574/better-escape.nvim',
'windwp/nvim-autopairs',
event = 'InsertEnter',
config = function()
require('better_escape').setup({
mapping = { 'jk', 'jj' },
timeout = 200,
})
require('nvim-autopairs').setup()
end,
},
-- Which-key (zeigt Keybindings)
-- Undo-tree - Visueller Undo-Verlauf
{
'folke/which-key.nvim',
event = 'VeryLazy',
init = function()
vim.o.timeout = true
vim.o.timeoutlen = 300
end,
opts = {
-- Deine Leader-Gruppen
spec = {
{ '<leader>f', group = 'Find' },
{ '<leader>g', group = 'Git' },
{ '<leader>h', group = 'Hunk' },
{ '<leader>t', group = 'Toggle' },
{ '<leader>c', group = 'Code' },
{ '<leader>w', group = 'Workspace' },
},
'mbbill/undotree',
cmd = 'UndotreeToggle',
keys = {
{ '<leader>u', '<cmd>UndotreeToggle<CR>', desc = 'Toggle Undotree' },
},
config = function()
vim.g.undotree_WindowLayout = 3
vim.g.undotree_SetFocusWhenToggle = 1
end,
},
}
+16 -6
View File
@@ -8,6 +8,14 @@ return {
'lewis6991/gitsigns.nvim',
event = { 'BufReadPre', 'BufNewFile' },
opts = {
current_line_blame = true,
current_line_blame_opts = {
virt_text = true,
virt_text_pos = 'eol',
delay = 100,
},
current_line_blame_formatter = ' <author> • <author_time:%d.%m.%Y> • <summary>',
signs = {
add = { text = '' },
change = { text = '' },
@@ -41,8 +49,10 @@ return {
-- Actions
map('n', '<leader>hs', gs.stage_hunk, { desc = 'Stage hunk' })
map('n', '<leader>hr', gs.reset_hunk, { desc = 'Reset hunk' })
map('v', '<leader>hs', function() gs.stage_hunk({ vim.fn.line('.'), vim.fn.line('v') }) end, { desc = 'Stage hunk' })
map('v', '<leader>hr', function() gs.reset_hunk({ vim.fn.line('.'), vim.fn.line('v') }) end, { desc = 'Reset hunk' })
map('v', '<leader>hs', function() gs.stage_hunk({ vim.fn.line('.'), vim.fn.line('v') }) end,
{ desc = 'Stage hunk' })
map('v', '<leader>hr', function() gs.reset_hunk({ vim.fn.line('.'), vim.fn.line('v') }) end,
{ desc = 'Reset hunk' })
map('n', '<leader>hS', gs.stage_buffer, { desc = 'Stage buffer' })
map('n', '<leader>hu', gs.undo_stage_hunk, { desc = 'Undo stage hunk' })
map('n', '<leader>hR', gs.reset_buffer, { desc = 'Reset buffer' })
@@ -61,11 +71,11 @@ return {
'tpope/vim-fugitive',
cmd = { 'Git', 'G', 'Gdiffsplit', 'Gread', 'Gwrite', 'Ggrep', 'GMove', 'GDelete', 'GBrowse', 'GRemove', 'GRename', 'Glgrep', 'Gedit' },
keys = {
{ '<leader>gs', '<cmd>Git<cr>', desc = 'Git status' },
{ '<leader>gs', '<cmd>Git<cr>', desc = 'Git status' },
{ '<leader>gc', '<cmd>Git commit<cr>', desc = 'Git commit' },
{ '<leader>gp', '<cmd>Git push<cr>', desc = 'Git push' },
{ '<leader>gl', '<cmd>Git log<cr>', desc = 'Git log' },
{ '<leader>gb', '<cmd>Git blame<cr>', desc = 'Git blame' },
{ '<leader>gp', '<cmd>Git push<cr>', desc = 'Git push' },
{ '<leader>gl', '<cmd>Git log<cr>', desc = 'Git log' },
{ '<leader>gb', '<cmd>Git blame<cr>', desc = 'Git blame' },
{ '<leader>gd', '<cmd>Gdiffsplit<cr>', desc = 'Git diff' },
},
},
+95 -35
View File
@@ -10,10 +10,10 @@ return {
-- Mason: LSP Server installer
'williamboman/mason.nvim',
'williamboman/mason-lspconfig.nvim',
-- Status updates für LSP
{ 'j-hui/fidget.nvim', opts = {} },
-- Neodev für Neovim config entwicklung
{ 'folke/neodev.nvim', opts = {} },
},
@@ -38,22 +38,26 @@ return {
require('mason-lspconfig').setup({
ensure_installed = {
-- Primary (TypeScript/Playwright)
'ts_ls', -- TypeScript/JavaScript
'ts_ls', -- TypeScript/JavaScript
-- Secondary (Go)
'gopls', -- Go
'gopls', -- Go
-- Python (für Scripts/Workflows)
'pyright', -- Python
'pyright', -- Python
-- LaTeX
'texlab',
-- Supporting
'lua_ls', -- Lua (für Neovim config)
'html', -- HTML
'cssls', -- CSS
'jsonls', -- JSON
'yamlls', -- YAML
'dockerls', -- Dockerfile
'lua_ls', -- Lua (für Neovim config)
'html', -- HTML
'cssls', -- CSS
'jsonls', -- JSON
'yamlls', -- YAML
'dockerls', -- Dockerfile
'docker_compose_language_service', -- Docker Compose
'eslint', -- Eslinter
},
})
@@ -98,11 +102,25 @@ return {
callback = vim.lsp.buf.clear_references,
})
end
end,
if client and client.name == 'eslint' then
vim.api.nvim_create_autocmd('BufWritePre', {
buffer = event.buf,
callback = function()
-- Statt vim.cmd('EslintFixAll') nutzen wir die direkte LSP-Aktion:
vim.lsp.buf.code_action({
context = { only = { "source.fixAll.eslint" } },
apply = true,
})
end,
desc = 'ESLint: Fixe alle Probleme beim Speichern (0.11 Style)',
})
end
end
})
-- ========== Server Configurations ==========
-- TypeScript/JavaScript (ts_ls)
vim.lsp.config('ts_ls', {
capabilities = capabilities,
@@ -203,6 +221,43 @@ return {
},
})
-- Eslinter
vim.lsp.config('eslint', {
capabilities = capabilities,
settings = {
workingDirectory = { mode = 'auto' },
},
})
vim.lsp.enable('eslint')
-- LaTeX (texlab)
vim.lsp.config('texlab', {
capabilities = capabilities,
settings = {
texlab = {
build = {
executable = 'pdflatex',
args = { '%f' },
onSave = true, -- Auto-compile beim Speichern
forwardSearchAfter = false,
},
forwardSearch = {
executable = 'open',
args = { '%p' },
},
chktex = {
onOpenAndSave = true,
},
diagnosticsDelay = 300,
latexFormatter = 'latexindent',
latexindent = {
modifyLineBreaks = false,
},
},
},
})
-- JSON mit Schema Support
vim.lsp.config('jsonls', {
capabilities = capabilities,
@@ -247,14 +302,22 @@ return {
capabilities = capabilities,
})
-- ========== Diagnostics Configuration ==========
-- ========== Diagnostics Configuration (Modern 0.11 Style) ==========
vim.diagnostic.config({
-- Hier werden die Zeichen jetzt direkt definiert (ersetzt sign_define)
signs = {
text = {
[vim.diagnostic.severity.ERROR] = '',
[vim.diagnostic.severity.WARN] = '',
[vim.diagnostic.severity.HINT] = '',
[vim.diagnostic.severity.INFO] = '»',
},
},
virtual_text = {
prefix = '',
source = 'if_many',
},
signs = true,
underline = true,
update_in_insert = false,
severity_sort = true,
@@ -266,24 +329,21 @@ return {
},
})
-- Diagnostic signs
local signs = { Error = '', Warn = '', Hint = '', Info = '»' }
for type, icon in pairs(signs) do
local hl = 'DiagnosticSign' .. type
vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = '' })
-- LSP Hover & Signature Help Styling
local handlers = {
['textDocument/hover'] = vim.lsp.with(vim.lsp.handlers.hover, { border = 'rounded' }),
['textDocument/signatureHelp'] = vim.lsp.with(vim.lsp.handlers.signature_help, { border = 'rounded' }),
}
-- Handlers registrieren
for method, handler in pairs(handlers) do
vim.lsp.handlers[method] = handler
end
-- LSP Hover border
vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(
vim.lsp.handlers.hover,
{ border = 'rounded' }
)
vim.lsp.handlers['textDocument/signatureHelp'] = vim.lsp.with(
vim.lsp.handlers.signature_help,
{ border = 'rounded' }
)
end,
-- Hover Popup Styling (Highlights)
vim.api.nvim_set_hl(0, 'NormalFloat', { bg = '#1e1e1e', fg = '#ffffff' })
vim.api.nvim_set_hl(0, 'FloatBorder', { fg = '#61afef', bg = '#1e1e1e' })
end, -- Hier endet die config-Funktion des Plugins
},
-- SchemaStore für JSON/YAML
+1 -1
View File
@@ -1,5 +1,5 @@
-- ============================================================================
-- Neo-tree - File Explorer (ASCII Mode - Keine Nerd Font Icons benötigt)
-- Neo-tree - File Explorer
-- ============================================================================
return {
+13
View File
@@ -0,0 +1,13 @@
return {
'stevearc/oil.nvim',
dependencies = { "nvim-tree/nvim-web-devicons" },
config = function()
require("oil").setup({
view_options = {
show_hidden = true, -- Damit du auch .husky, .env etc. siehst
},
})
-- Der Primeagen-Shortcut: Einfach '-' drücken um den Ordner zu öffnen
vim.keymap.set("n", "-", "<CMD>Oil<CR>", { desc = "Open parent directory" })
end,
}
+1 -1
View File
@@ -17,7 +17,7 @@ return {
end,
},
{ 'nvim-telescope/telescope-ui-select.nvim' },
{ 'nvim-tree/nvim-web-devicons', enabled = vim.g.have_nerd_font },
{ 'nvim-tree/nvim-web-devicons', enabled = vim.g.have_nerd_font },
},
config = function()
local telescope = require('telescope')
+66 -35
View File
@@ -1,59 +1,73 @@
-- ============================================================================
-- UI - Colorscheme & Statusline
-- UI Enhancements - Colorscheme, Statusline, Which-Key
-- ============================================================================
return {
-- Tokyonight Theme
-- Colorscheme: Tokyo Night
{
'folke/tokyonight.nvim',
lazy = false,
priority = 1000,
config = function()
require('tokyonight').setup({
style = 'night',
transparent = true,
transparent = true, -- DEIN ALTER WERT!
terminal_colors = true,
styles = {
sidebars = 'transparent',
floats = 'transparent',
comments = { italic = true },
keywords = { italic = true },
sidebars = 'transparent', -- DEIN ALTER WERT!
floats = 'transparent', -- DEIN ALTER WERT!
},
on_colors = function(colors)
colors.bg_statusline = colors.none
end,
})
vim.cmd.colorscheme('tokyonight-night')
end,
},
-- Lualine Statusline
-- Statusline
{
'nvim-lualine/lualine.nvim',
dependencies = { 'nvim-tree/nvim-web-devicons' },
config = function()
require('lualine').setup({
options = {
theme = 'tokyonight',
component_separators = { left = '', right = '' },
section_separators = { left = '', right = '' },
},
sections = {
lualine_a = { 'mode' },
lualine_b = { 'branch', 'diff', 'diagnostics' },
lualine_c = {
{
'filename',
path = 1, -- Relativer Pfad
}
},
lualine_x = { 'encoding', 'fileformat', 'filetype' },
lualine_y = { 'progress' },
lualine_z = { 'location' }
},
})
end,
},
-- Which-Key: Zeigt verfügbare Keybindings
{
'folke/which-key.nvim',
event = 'VeryLazy',
opts = {
options = {
theme = 'tokyonight',
component_separators = { left = '', right = '' },
section_separators = { left = '', right = '' },
globalstatus = true,
preset = 'modern',
delay = 500,
win = {
border = 'rounded',
},
sections = {
lualine_a = { 'mode' },
lualine_b = { 'branch', 'diff', 'diagnostics' },
lualine_c = {
{
'filename',
path = 1, -- Relativer Pfad
symbols = {
modified = '[+]',
readonly = '[-]',
unnamed = '[No Name]',
}
}
},
lualine_x = { 'encoding', 'fileformat', 'filetype' },
lualine_y = { 'progress' },
lualine_z = { 'location' }
spec = {
{ '<leader>f', group = 'find' },
{ '<leader>g', group = 'git' },
{ '<leader>e', group = 'explorer' },
{ '<leader>c', group = 'code' },
{ '<leader>w', group = 'workspace' },
{ '<leader>a', group = 'avente/ai' },
},
},
},
@@ -61,15 +75,32 @@ return {
-- Indent guides
{
'lukas-reineke/indent-blankline.nvim',
event = { 'BufReadPost', 'BufNewFile' },
main = 'ibl',
event = { 'BufReadPost', 'BufNewFile' },
opts = {
indent = {
char = '',
},
scope = {
show_start = false,
show_end = false,
enabled = true,
},
},
},
{
'stevearc/dressing.nvim',
lazy = false, -- Wichtig, damit es sofort bereit ist
opts = {
input = {
enabled = true,
default_prompt = "",
border = "rounded",
relative = "editor",
prefer_width = 50,
},
select = {
enabled = true,
backend = { "nui", "builtin" }, -- Telescope hier bewusst rauslassen!
},
},
},