feat: sync .config dotfiles, transition Node to mise, integrate 1Password CLI/SSH Agent, and add optional AI CLI tools
This commit is contained in:
@@ -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,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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' },
|
||||
},
|
||||
},
|
||||
|
||||
@@ -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,5 +1,5 @@
|
||||
-- ============================================================================
|
||||
-- Neo-tree - File Explorer (ASCII Mode - Keine Nerd Font Icons benötigt)
|
||||
-- Neo-tree - File Explorer
|
||||
-- ============================================================================
|
||||
|
||||
return {
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
@@ -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')
|
||||
|
||||
@@ -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!
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user