feat: Sync complete config - Fish, Ghostty, Neovim Scratch

- Add missing Fish configs (direnv, ssh function)
- Add Tokyo Night theme for Ghostty
- Complete Neovim scratch config sync
- Rewrite install.sh for new structure
- Add comprehensive README.md
This commit is contained in:
2025-10-13 10:00:52 +02:00
parent 5a7a2fdf9f
commit 8230492c3a
60 changed files with 1893 additions and 4382 deletions

View File

@@ -0,0 +1,8 @@
# Direnv integration for fish
if type -q direnv
# Remove any existing direnv functions first
functions -e __direnv_export_eval 2>/dev/null
# Set up direnv with the correct path
eval (direnv hook fish)
end

View File

@@ -0,0 +1,3 @@
function ssh
TERM=xterm-256color command ssh $argv
end

View File

@@ -0,0 +1,24 @@
# Tokyo Night theme for Ghostty
background: "#1a1b26"
foreground: "#c0caf5"
cursor-color: "#c0caf5"
selection-background: "#33467c"
selection-foreground: "#c0caf5"
palette:
- "#15161e" # black
- "#f7768e" # red
- "#9ece6a" # green
- "#e0af68" # yellow
- "#7aa2f7" # blue
- "#bb9af7" # magenta
- "#7dcfff" # cyan
- "#a9b1d6" # white
- "#414868" # bright black
- "#f7768e" # bright red
- "#9ece6a" # bright green
- "#e0af68" # bright yellow
- "#7aa2f7" # bright blue
- "#bb9af7" # bright magenta
- "#7dcfff" # bright cyan
- "#c0caf5" # bright white

View File

@@ -1,8 +0,0 @@
tt.*
.tests
doc/tags
debug
.repro
foo.*
*.log
data

View File

@@ -1,15 +0,0 @@
{
"neodev": {
"library": {
"enabled": true,
"plugins": true
}
},
"neoconf": {
"plugins": {
"lua_ls": {
"enabled": true
}
}
}
}

View File

@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -1,4 +0,0 @@
# 💤 LazyVim
A starter template for [LazyVim](https://github.com/LazyVim/LazyVim).
Refer to the [documentation](https://lazyvim.github.io/installation) to get started.

View File

@@ -1,2 +0,0 @@
-- bootstrap lazy.nvim, LazyVim and your plugins
require("config.lazy")

View File

@@ -1,54 +0,0 @@
{
"LazyVim": { "branch": "main", "commit": "3f034d0a7f58031123300309f2efd3bb0356ee21" },
"SchemaStore.nvim": { "branch": "main", "commit": "c61a74033522c3efbb8465fe6e9c75b27f5c3667" },
"blink.cmp": { "branch": "main", "commit": "cb5e346d9e0efa7a3eee7fd4da0b690c48d2a98e" },
"bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
"catppuccin": { "branch": "main", "commit": "5b5e3aef9ad7af84f463d17b5479f06b87d5c429" },
"code_runner.nvim": { "branch": "main", "commit": "cb9e1bc37c5e15a870f27730343f62ffd1d9c443" },
"conform.nvim": { "branch": "master", "commit": "eebc724d12c5579d733d1f801386e0ceb909d001" },
"diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" },
"flash.nvim": { "branch": "main", "commit": "3c942666f115e2811e959eabbdd361a025db8b63" },
"friendly-snippets": { "branch": "main", "commit": "efff286dd74c22f731cdec26a70b46e5b203c619" },
"gitsigns.nvim": { "branch": "main", "commit": "17ab794b6fce6fce768430ebc925347e349e1d60" },
"grug-far.nvim": { "branch": "main", "commit": "082f97122dd59d816a9a7b676d2b2f86a8ab6ed9" },
"lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" },
"lazydev.nvim": { "branch": "main", "commit": "2367a6c0a01eb9edb0464731cc0fb61ed9ab9d2c" },
"lualine.nvim": { "branch": "master", "commit": "834a5817f7e2be22a7062620032d49c600c35fab" },
"markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" },
"mason-lspconfig.nvim": { "branch": "main", "commit": "1a31f824b9cd5bc6f342fc29e9a53b60d74af245" },
"mason-nvim-dap.nvim": { "branch": "main", "commit": "4c2cdc69d69fe00c15ae8648f7e954d99e5de3ea" },
"mason.nvim": { "branch": "main", "commit": "fc98833b6da5de5a9c5b1446ac541577059555be" },
"mini.ai": { "branch": "main", "commit": "e139eb1101beb0250fea322f8c07a42f0f175688" },
"mini.hipatterns": { "branch": "main", "commit": "e5083df391171dc9d8172645606f8496d9443374" },
"mini.icons": { "branch": "main", "commit": "397ed3807e96b59709ef3292f0a3e253d5c1dc0a" },
"mini.pairs": { "branch": "main", "commit": "69864a2efb36c030877421634487fd90db1e4298" },
"neo-tree.nvim": { "branch": "main", "commit": "73d63376352ac731379892e27ac7b3d9449148e3" },
"noice.nvim": { "branch": "main", "commit": "0427460c2d7f673ad60eb02b35f5e9926cf67c59" },
"none-ls.nvim": { "branch": "main", "commit": "6377e77dae38015d0a8c24852530098f1d8a24f6" },
"nui.nvim": { "branch": "main", "commit": "8d3bce9764e627b62b07424e0df77f680d47ffdb" },
"nvim-autopairs": { "branch": "master", "commit": "2a406cdd8c373ae7fe378a9e062a5424472bd8d8" },
"nvim-dap": { "branch": "master", "commit": "7aade9e99bef5f0735cf966e715b3ce45515d786" },
"nvim-dap-ui": { "branch": "master", "commit": "bc81f8d3440aede116f821114547a476b082b319" },
"nvim-dap-virtual-text": { "branch": "master", "commit": "df66808cd78b5a97576bbaeee95ed5ca385a9750" },
"nvim-lint": { "branch": "master", "commit": "e7b4ffa6ab763af012e38b21af2c9159f10d2d33" },
"nvim-lspconfig": { "branch": "master", "commit": "442e077e326ac467daf9cd63e72120fb450a850b" },
"nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" },
"nvim-treesitter": { "branch": "master", "commit": "0e21ee8df6235511c02bab4a5b391d18e165a58d" },
"nvim-treesitter-context": { "branch": "master", "commit": "439789a9a8df9639ecd749bb3286b77117024a6f" },
"nvim-treesitter-textobjects": { "branch": "master", "commit": "698b5f805722254bca3c509591c1806d268b6c2f" },
"nvim-ts-autotag": { "branch": "main", "commit": "a1d526af391f6aebb25a8795cbc05351ed3620b5" },
"nvim-web-devicons": { "branch": "master", "commit": "57dfa947cc88cdf1baa2c7e13ed31edddd8fb1d1" },
"persistence.nvim": { "branch": "main", "commit": "166a79a55bfa7a4db3e26fc031b4d92af71d0b51" },
"plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" },
"snacks.nvim": { "branch": "main", "commit": "bc0630e43be5699bb94dadc302c0d21615421d93" },
"telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" },
"telescope.nvim": { "branch": "master", "commit": "a4ed82509cecc56df1c7138920a1aeaf246c0ac5" },
"todo-comments.nvim": { "branch": "main", "commit": "304a8d204ee787d2544d8bc23cd38d2f929e7cc5" },
"tokyonight.nvim": { "branch": "main", "commit": "057ef5d260c1931f1dffd0f052c685dcd14100a3" },
"trouble.nvim": { "branch": "main", "commit": "85bedb7eb7fa331a2ccbecb9202d8abba64d37b3" },
"ts-comments.nvim": { "branch": "main", "commit": "1bd9d0ba1d8b336c3db50692ffd0955fe1bb9f0c" },
"typescript-tools.nvim": { "branch": "master", "commit": "a4109c70e7d6a3a86f971cefea04ab6720582ba9" },
"undotree": { "branch": "master", "commit": "b951b87b46c34356d44aa71886aecf9dd7f5788a" },
"which-key.nvim": { "branch": "main", "commit": "370ec46f710e058c9c1646273e6b225acf47cbed" },
"yanky.nvim": { "branch": "main", "commit": "98b9c21d3c06d79f68fd9d471dcc28fc6d2d72ef" }
}

View File

@@ -1,10 +0,0 @@
{
"extras": [
],
"install_version": 8,
"news": {
"NEWS.md": "10960"
},
"version": 8
}

View File

@@ -1,35 +0,0 @@
-- Autocmds are automatically loaded on the VeryLazy event
-- Default autocmds that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua
--
-- Add any additional autocmds here
-- with `vim.api.nvim_create_autocmd`
--
-- Or remove existing autocmds by their group name (which is prefixed with `lazyvim_` for the defaults)
-- e.g. vim.api.nvim_del_augroup_by_name("lazyvim_wrap_spell")
vim.api.nvim_create_autocmd("FileType", {
pattern = { "python" },
callback = function()
vim.opt_local.colorcolumn = "88" -- Black's default line length
vim.opt_local.tabstop = 4
vim.opt_local.shiftwidth = 4
end,
})
vim.api.nvim_create_autocmd("FileType", {
pattern = { "php" },
callback = function()
vim.opt_local.colorcolumn = "120"
vim.opt_local.tabstop = 4
vim.opt_local.shiftwidth = 4
end,
})
vim.api.nvim_create_autocmd("FileType", {
pattern = { "typescript", "javascript", "typescriptreact", "javascriptreact" },
callback = function()
vim.opt_local.colorcolumn = "80"
vim.opt_local.tabstop = 2
vim.opt_local.shiftwidth = 2
end,
})

View File

@@ -1,16 +0,0 @@
-- Keymaps are automatically loaded on the VeryLazy event
-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua
-- Add any additional keymaps here
-- Keymaps are automatically loaded on the VeryLazy event
local function map(mode, lhs, rhs, opts)
local keys = require("lazy.core.handler").handlers.keys
if not keys.active[keys.parse({ lhs, mode = mode }).id] then
opts = opts or {}
opts.silent = opts.silent ~= false
vim.keymap.set(mode, lhs, rhs, opts)
end
end
-- Nützliche Keymaps
map("n", "<leader>bo", "<cmd>%bd|e#<cr>", { desc = "Close all buffers but the current one" })

View File

@@ -1,61 +0,0 @@
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
"git",
"clone",
"--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable",
lazypath,
})
end
vim.opt.rtp:prepend(lazypath)
require("lazy").setup({
spec = {
-- LazyVim Kern
{ "LazyVim/LazyVim", import = "lazyvim.plugins" },
-- Sprachunterstützung
{ import = "lazyvim.plugins.extras.lang.typescript" },
{ import = "lazyvim.plugins.extras.lang.json" },
{ import = "lazyvim.plugins.extras.lang.docker" },
{ import = "lazyvim.plugins.extras.lang.yaml" },
{ import = "lazyvim.plugins.extras.lang.tailwind" },
-- Linting & Formatting
{ import = "lazyvim.plugins.extras.linting.eslint" },
{ import = "lazyvim.plugins.extras.formatting.prettier" },
{ import = "lazyvim.plugins.extras.lsp.none-ls" },
-- Editor-Verbesserungen
-- { import = "lazyvim.plugins.extras.editor.mini-files" },
{ import = "lazyvim.plugins.extras.coding.yanky" },
{ import = "lazyvim.plugins.extras.util.mini-hipatterns" },
-- Debugging & Testing
{ import = "lazyvim.plugins.extras.dap.core" },
-- { import = "lazyvim.plugins.extras.test.core" },
-- Benutzerdefinierte Plugins
{ import = "plugins" },
},
defaults = {
lazy = false,
version = false,
},
install = { colorscheme = { "tokyonight", "catppuccin" } },
checker = { enabled = true },
performance = {
rtp = {
disabled_plugins = {
"gzip",
"tarPlugin",
"tohtml",
"tutor",
"zipPlugin",
},
},
},
})

View File

@@ -1,13 +0,0 @@
-- Options are automatically loaded before lazy.nvim startup
-- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua
--- Options are automatically loaded before lazy.nvim startup
-- Allgemeine Einstellungen
vim.opt.listchars = "tab:▸ ,trail:·,nbsp:␣,extends:,precedes:"
vim.opt.relativenumber = false
vim.opt.scrolloff = 10
vim.opt.tabstop = 2
vim.opt.shiftwidth = 2
vim.opt.expandtab = true
vim.opt.smartindent = true
vim.lsp.inlay_hint.enable = false

View File

@@ -1,43 +0,0 @@
return {
-- Code-Runner
{
"CRAG666/code_runner.nvim",
config = function()
require("code_runner").setup({
focus = false,
filetype = {
python = "python3 -u",
typescript = "deno run",
javascript = "node",
php = "php",
},
})
end,
keys = { { "<leader>rf", "<cmd>RunFile term<cr>", desc = "Run file" } },
},
-- TypeScript-Tooling
{
"pmizio/typescript-tools.nvim",
dependencies = {
"nvim-lua/plenary.nvim",
"neovim/nvim-lspconfig",
},
opts = {
settings = {
tsserver_file_preferences = {
importModuleSpecifierPreference = "relative",
},
},
},
},
-- Markdown-Vorschau
{
"iamcco/markdown-preview.nvim",
ft = "markdown",
build = function()
vim.fn["mkdp#util#install"]()
end,
},
}

View File

@@ -1,43 +0,0 @@
return {
-- Hauptfarbschema: Tokyo Night Storm
{
"folke/tokyonight.nvim",
lazy = false,
priority = 1000,
opts = {
style = "storm",
transparent = false,
styles = {
sidebars = "dark",
floats = "dark",
},
},
},
-- Alternative: Catppuccin
{
"catppuccin/nvim",
name = "catppuccin",
priority = 1000,
opts = {
flavour = "mocha",
transparent_background = false,
integrations = {
telescope = true,
gitsigns = true,
nvimtree = true,
indent_blankline = true,
which_key = true,
mini = true,
},
},
},
-- Aktiviere das Farbschema
{
"LazyVim/LazyVim",
opts = {
colorscheme = "tokyonight-storm",
},
},
}

View File

@@ -1,191 +0,0 @@
return {
-- LSP-Konfiguration
{
"neovim/nvim-lspconfig",
opts = {
servers = {
-- Python
pyright = {},
ruff_lsp = {},
-- TypeScript/JavaScript
tsserver = {
settings = {
typescript = {
inlayHints = {
includeInlayParameterNameHints = "all",
includeInlayParameterNameHintsWhenArgumentMatchesName = false,
includeInlayFunctionParameterTypeHints = true,
includeInlayVariableTypeHints = true,
includeInlayPropertyDeclarationTypeHints = true,
includeInlayFunctionLikeReturnTypeHints = true,
},
},
javascript = {
inlayHints = {
includeInlayParameterNameHints = "all",
includeInlayParameterNameHintsWhenArgumentMatchesName = false,
includeInlayFunctionParameterTypeHints = true,
includeInlayVariableTypeHints = true,
includeInlayPropertyDeclarationTypeHints = true,
includeInlayFunctionLikeReturnTypeHints = true,
},
},
},
},
-- PHP
intelephense = {
settings = {
intelephense = {
stubs = {
"bcmath",
"bz2",
"Core",
"curl",
"date",
"dom",
"fileinfo",
"filter",
"gd",
"gettext",
"hash",
"iconv",
"imap",
"intl",
"json",
"libxml",
"mbstring",
"mysqli",
"oci8",
"openssl",
"pcntl",
"pcre",
"PDO",
"pdo_mysql",
"Phar",
"readline",
"redis",
"Reflection",
"session",
"SimpleXML",
"SPL",
"standard",
"tokenizer",
"xml",
"xmlreader",
"xmlwriter",
"zip",
"zlib",
"wordpress",
"woocommerce",
"wordpress-globals",
"wp-cli",
},
environment = {
includePaths = {},
},
files = {
maxSize = 5000000,
},
},
},
},
-- Docker
dockerls = {},
docker_compose_language_service = {},
-- YAML
yamlls = {
settings = {
yaml = {
schemaStore = {
enable = true,
url = "https://www.schemastore.org/api/json/catalog.json",
},
format = { enable = true },
validate = true,
},
},
},
},
},
},
-- Mason für einfache Tool-Installation
{
"williamboman/mason.nvim",
opts = function(_, opts)
opts.ensure_installed = opts.ensure_installed or {}
vim.list_extend(opts.ensure_installed, {
-- Python
"pyright",
"ruff-lsp",
"black",
"mypy",
-- TypeScript/JavaScript
"typescript-language-server",
"eslint-lsp",
"prettier",
-- PHP
"intelephense",
"php-cs-fixer",
-- Docker
"dockerfile-language-server",
-- YAML
"yaml-language-server",
"yamllint",
"yamlfix",
-- Neue Tools für alle Frameworks
"css-lsp",
"tailwindcss-language-server",
"vue-language-server",
"typescript-language-server",
"eslint-lsp",
"prettier",
"stylelint-lsp",
"phpactor",
})
end,
},
-- Formatierung
{
"stevearc/conform.nvim",
opts = {
formatters_by_ft = {
lua = { "stylua" },
python = { "black" },
typescript = { "prettier" },
javascript = { "prettier" },
typescriptreact = { "prettier" },
javascriptreact = { "prettier" },
php = { "php_cs_fixer" },
yaml = { "yamlfix" },
json = { "prettier" },
markdown = { "prettier" },
},
},
},
-- Linting
{
"mfussenegger/nvim-lint",
opts = {
linters_by_ft = {
python = { "mypy", "ruff" },
typescript = { "eslint" },
javascript = { "eslint" },
typescriptreact = { "eslint" },
javascriptreact = { "eslint" },
yaml = { "yamllint" },
},
},
},
}

View File

@@ -1,54 +0,0 @@
return {
"nvim-neo-tree/neo-tree.nvim",
cmd = "Neotree",
priority = 950, -- Höhere Priorität für korrekte Initialisierung
lazy = false, -- Verhindert lazy-loading
config = function()
-- Stelle sicher, dass die Konfiguration direkt angewendet wird
require("neo-tree").setup({
sources = { "filesystem", "buffers", "git_status" },
filesystem = {
filtered_items = {
visible = true, -- Zeigt gefilterte Elemente an
hide_dotfiles = false, -- Versteckte Dateien anzeigen
hide_gitignored = false, -- Git-ignorierte Dateien anzeigen
always_show = {
".gitignore",
".env",
".gitlab-ci.yml",
".php-cs-fixer.php",
},
},
follow_current_file = {
enabled = true, -- Folgt der aktuellen Datei
},
use_libuv_file_watcher = true,
},
window = {
position = "right", -- Position explizit auf rechts setzen
width = 35, -- Breite des Explorers
mappings = {
["<space>"] = "none", -- Deaktiviert die Space-Taste im Explorer
["H"] = "toggle_hidden", -- Tastenkombination zum Umschalten versteckter Dateien
},
},
default_component_configs = {
indent = {
with_expanders = true,
},
},
})
-- Starte Neotree explizit nach der Konfiguration neu
vim.defer_fn(function()
vim.cmd("Neotree close")
vim.cmd("Neotree position=right")
end, 100)
end,
init = function()
-- Führe diese Konfiguration sofort aus
vim.g.neo_tree_remove_legacy_commands = 1
end,
keys = {
{ "<leader>e", "<cmd>Neotree toggle show position=right<cr>", desc = "Explorer (rechts)" },
},
}

View File

@@ -1,27 +0,0 @@
return {
-- Telescope-Konfiguration
{
"nvim-telescope/telescope.nvim",
opts = {
defaults = {
file_ignore_patterns = {
"^.git/",
"^node_modules/",
"^vendor/",
"^.venv/",
"^__pycache__/",
},
},
},
dependencies = {
-- Fuzzy-Finder-Verbesserung
{
"nvim-telescope/telescope-fzf-native.nvim",
build = "make",
config = function()
require("telescope").load_extension("fzf")
end,
},
},
},
}

View File

@@ -1,38 +0,0 @@
return {
-- Auto-Pairs für schnelleres Schreiben
{
"windwp/nvim-autopairs",
event = "InsertEnter",
opts = {
enable_check_bracket_line = true,
},
},
-- Diffview für Git-Diffs
{
"sindrets/diffview.nvim",
dependencies = {
{ "nvim-lua/plenary.nvim" },
{ "nvim-tree/nvim-web-devicons" },
},
config = function()
vim.opt.fillchars = "diff:░"
require("diffview").setup({
enhanced_diff_hl = true,
})
end,
keys = {
{ "<leader>gdo", ":DiffviewOpen<CR>", desc = "Open Diffview" },
{ "<leader>gdc", ":DiffviewClose<CR>", desc = "Close Diffview" },
},
},
-- Undotree für detaillierte Änderungshistorie
{
"mbbill/undotree",
cmd = "UndotreeToggle",
keys = {
{ "<leader>fu", "<cmd>UndotreeToggle<cr>", desc = "Undo tree" },
},
},
}

View File

@@ -1,46 +0,0 @@
return {
{
"nvim-treesitter/nvim-treesitter",
opts = {
ensure_installed = {
"bash",
"css",
"dockerfile",
"html",
"javascript",
"json",
"lua",
"markdown",
"markdown_inline",
"php",
"python",
"regex",
"tsx",
"typescript",
"vim",
"yaml",
},
highlight = {
enable = true,
},
indent = {
enable = true,
},
autotag = {
enable = true,
},
},
},
-- Zusätzliche Treesitter-Erweiterungen
{
"nvim-treesitter/nvim-treesitter-context",
dependencies = { "nvim-treesitter/nvim-treesitter" },
},
-- Automatisches Hinzufügen/Schließen von HTML/JSX-Tags
{
"windwp/nvim-ts-autotag",
config = true,
},
}

View File

@@ -1,3 +0,0 @@
indent_type = "Spaces"
indent_width = 2
column_width = 120

View File

@@ -1,35 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
<!-- Any bug report not following this template will be immediately closed. Thanks -->
## Before Reporting an Issue
- I have read the kickstart.nvim README.md.
- I have read the appropriate plugin's documentation.
- I have searched that this issue has not been reported before.
- [ ] **By checking this, I confirm that the above steps are completed. I understand leaving this unchecked will result in this report being closed immediately.**
## Describe the bug
<!-- A clear and concise description of what the bug is. -->
## To Reproduce
<!-- Steps to reproduce the behavior. -->
1. ...
## Desktop
<!-- please complete the following information. -->
- OS:
- Terminal:
## Neovim Version
<!-- Output of running `:version` from inside of neovim. -->
```
```

View File

@@ -1,8 +0,0 @@
***************************************************************************
**NOTE**
Please verify that the `base repository` above has the intended destination!
Github by default opens Pull Requests against the parent of a forked repository.
If this is your personal fork and you didn't intend to open a PR for contribution
to the original project then adjust the `base repository` accordingly.
**************************************************************************

View File

@@ -1,21 +0,0 @@
# Check Lua Formatting
name: Check Lua Formatting
on: pull_request_target
jobs:
stylua-check:
if: github.repository == 'nvim-lua/kickstart.nvim'
name: Stylua Check
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Stylua Check
uses: JohnnyMorganz/stylua-action@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
version: latest
args: --check .

View File

@@ -1,7 +1,16 @@
tags # Neovim
test.sh
.luarc.json
nvim
spell/
lazy-lock.json lazy-lock.json
.neoconf.json
# Plugin data
plugin/
spell/
# Treesitter compiled parsers
parser/
# Undo history
*~
# OS
.DS_Store

View File

@@ -1,6 +0,0 @@
column_width = 160
line_endings = "Unix"
indent_type = "Spaces"
indent_width = 2
quote_style = "AutoPreferSingle"
call_parentheses = "None"

View File

@@ -1,19 +0,0 @@
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,240 +1,241 @@
# kickstart.nvim # Neovim Configuration - Built from Scratch
## Introduction Moderne, minimale Neovim Config optimiert für **TypeScript/Playwright QA** und **Go Development**.
A starting point for Neovim that is: ## 🎯 Philosophie
* Small - **Scratch mit lazy.nvim**: Keine Distro, keine Abstraktionen
* Single-file - **TypeScript First**: Optimiert für Playwright Tests
* Completely Documented - **Go Ready**: Volle gopls Integration
- **Verständlich**: Jede Datei hat einen klaren Zweck
- **Wartbar**: Standard Neovim APIs, keine Magie
**NOT** a Neovim distribution, but instead a starting point for your configuration. ## 📁 Struktur
## Installation
### Install Neovim
Kickstart.nvim targets *only* the latest
['stable'](https://github.com/neovim/neovim/releases/tag/stable) and latest
['nightly'](https://github.com/neovim/neovim/releases/tag/nightly) of Neovim.
If you are experiencing issues, please make sure you have the latest versions.
### Install External Dependencies
External Requirements:
- Basic utils: `git`, `make`, `unzip`, C Compiler (`gcc`)
- [ripgrep](https://github.com/BurntSushi/ripgrep#installation)
- Clipboard tool (xclip/xsel/win32yank or other depending on the platform)
- A [Nerd Font](https://www.nerdfonts.com/): optional, provides various icons
- if you have it set `vim.g.have_nerd_font` in `init.lua` to true
- Emoji fonts (Ubuntu only, and only if you want emoji!) `sudo apt install fonts-noto-color-emoji`
- Language Setup:
- If you want to write Typescript, you need `npm`
- If you want to write Golang, you will need `go`
- etc.
> [!NOTE]
> See [Install Recipes](#Install-Recipes) for additional Windows and Linux specific notes
> and quick install snippets
### Install Kickstart
> [!NOTE]
> [Backup](#FAQ) your previous configuration (if any exists)
Neovim's configurations are located under the following paths, depending on your OS:
| OS | PATH |
| :- | :--- |
| Linux, MacOS | `$XDG_CONFIG_HOME/nvim`, `~/.config/nvim` |
| Windows (cmd)| `%localappdata%\nvim\` |
| Windows (powershell)| `$env:LOCALAPPDATA\nvim\` |
#### Recommended Step
[Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) this repo
so that you have your own copy that you can modify, then install by cloning the
fork to your machine using one of the commands below, depending on your OS.
> [!NOTE]
> Your fork's URL will be something like this:
> `https://github.com/<your_github_username>/kickstart.nvim.git`
You likely want to remove `lazy-lock.json` from your fork's `.gitignore` file
too - it's ignored in the kickstart repo to make maintenance easier, but it's
[recommended to track it in version control](https://lazy.folke.io/usage/lockfile).
#### Clone kickstart.nvim
> [!NOTE]
> If following the recommended step above (i.e., forking the repo), replace
> `nvim-lua` with `<your_github_username>` in the commands below
<details><summary> Linux and Mac </summary>
```sh
git clone https://github.com/nvim-lua/kickstart.nvim.git "${XDG_CONFIG_HOME:-$HOME/.config}"/nvim
```
</details>
<details><summary> Windows </summary>
If you're using `cmd.exe`:
``` ```
git clone https://github.com/nvim-lua/kickstart.nvim.git "%localappdata%\nvim" ~/.config/nvim/
├── init.lua # Entry point
├── lua/
│ ├── core/
│ │ ├── options.lua # Vim Settings
│ │ ├── keymaps.lua # Keybindings
│ │ └── lazy.lua # lazy.nvim Bootstrap
│ └── plugins/
│ ├── lsp.lua # LSP (ts_ls, gopls, etc.)
│ ├── completion.lua # nvim-cmp
│ ├── treesitter.lua # Syntax Highlighting
│ ├── telescope.lua # Fuzzy Finder
│ ├── harpoon.lua # File Navigation
│ ├── neotree.lua # File Explorer
│ ├── git.lua # Git Integration
│ ├── formatting.lua # Code Formatting
│ ├── ui.lua # Theme + Statusline
│ └── editor.lua # QoL Plugins
``` ```
If you're using `powershell.exe` ## 🚀 Installation
``` ### Prerequisites
git clone https://github.com/nvim-lua/kickstart.nvim.git "${env:LOCALAPPDATA}\nvim"
```bash
# Neovim 0.10+
brew install neovim
# Ripgrep (für Telescope)
brew install ripgrep
# Node.js (für TypeScript LSP)
brew install node
# Go (für gopls)
brew install go
``` ```
</details> ### Setup
### Post Installation ```bash
# Backup alte Config (falls vorhanden)
mv ~/.config/nvim ~/.config/nvim.backup
Start Neovim # Symlink aus dotfiles
ln -sf ~/gits/dotfiles/.config/nvim ~/.config/nvim
```sh # Neovim starten - lazy.nvim installiert automatisch
nvim nvim
``` ```
That's it! Lazy will install all the plugins you have. Use `:Lazy` to view Beim ersten Start:
the current plugin status. Hit `q` to close the window. 1. lazy.nvim installiert sich selbst
2. Alle Plugins werden geladen
3. Mason installiert LSP Server automatisch
4. Treesitter installiert Parser
#### Read The Friendly Documentation **Warte bis alles fertig ist!** (~2-3 Minuten)
Read through the `init.lua` file in your configuration folder for more ## ⌨️ Key Bindings
information about extending and exploring Neovim. That also includes
examples of adding popularly requested plugins.
> [!NOTE] ### Leader Key: `Space`
> For more information about a particular plugin check its repository's documentation.
### Core
- `<leader>w` - Save file
- `<Esc>` - Clear search highlight
- `jk` / `jj` - Exit insert mode
### Getting Started ### Navigation
- `<C-h/j/k/l>` - Navigate windows
- `<S-h/l>` - Previous/Next buffer
- `<leader>bd` - Delete buffer
[The Only Video You Need to Get Started with Neovim](https://youtu.be/m8C0Cq9Uv9o) ### Telescope (Find)
- `<leader>ff` - Find files
- `<leader>fg` - Live grep
- `<leader>fb` - Buffers
- `<leader>fo` - Recent files
- `<leader>fw` - Find word under cursor
- `<leader>fd` - Diagnostics
- `<leader>/` - Search in buffer
### FAQ ### Harpoon (File Navigation)
- `<leader>a` - Add file to Harpoon
- `<leader>h` - Toggle Harpoon menu
- `<C-j/k/l/;>` - Jump to file 1/2/3/4
* What should I do if I already have a pre-existing Neovim configuration? ### Neo-tree (Explorer)
* You should back it up and then delete all associated files. - `<leader>e` - Toggle explorer
* This includes your existing init.lua and the Neovim files in `~/.local` - `<leader>ef` - Focus filesystem
which can be deleted with `rm -rf ~/.local/share/nvim/` - `<leader>eb` - Focus buffers
* Can I keep my existing configuration in parallel to kickstart? - `<leader>eg` - Focus git status
* Yes! You can use [NVIM_APPNAME](https://neovim.io/doc/user/starting.html#%24NVIM_APPNAME)`=nvim-NAME`
to maintain multiple configurations. For example, you can install the kickstart
configuration in `~/.config/nvim-kickstart` and create an alias:
```
alias nvim-kickstart='NVIM_APPNAME="nvim-kickstart" nvim'
```
When you run Neovim using `nvim-kickstart` alias it will use the alternative
config directory and the matching local directory
`~/.local/share/nvim-kickstart`. You can apply this approach to any Neovim
distribution that you would like to try out.
* What if I want to "uninstall" this configuration:
* See [lazy.nvim uninstall](https://lazy.folke.io/usage#-uninstalling) information
* Why is the kickstart `init.lua` a single file? Wouldn't it make sense to split it into multiple files?
* The main purpose of kickstart is to serve as a teaching tool and a reference
configuration that someone can easily use to `git clone` as a basis for their own.
As you progress in learning Neovim and Lua, you might consider splitting `init.lua`
into smaller parts. A fork of kickstart that does this while maintaining the
same functionality is available here:
* [kickstart-modular.nvim](https://github.com/dam9000/kickstart-modular.nvim)
* Discussions on this topic can be found here:
* [Restructure the configuration](https://github.com/nvim-lua/kickstart.nvim/issues/218)
* [Reorganize init.lua into a multi-file setup](https://github.com/nvim-lua/kickstart.nvim/pull/473)
### Install Recipes ### LSP
- `gd` - Goto definition
- `gr` - Goto references
- `gI` - Goto implementation
- `K` - Hover documentation
- `<leader>ca` - Code action
- `<leader>rn` - Rename
- `[d` / `]d` - Previous/Next diagnostic
Below you can find OS specific install instructions for Neovim and dependencies. ### Git
- `<leader>gs` - Git status (Fugitive)
- `<leader>gc` - Git commit
- `<leader>gp` - Git push
- `<leader>gb` - Git blame
- `<leader>hs` - Stage hunk
- `<leader>hr` - Reset hunk
- `<leader>hp` - Preview hunk
- `[c` / `]c` - Previous/Next git hunk
After installing all the dependencies continue with the [Install Kickstart](#Install-Kickstart) step. ### Go Specific
- `<leader>ee` - Insert `if err != nil { return err }`
#### Windows Installation ### Formatting
- `<leader>cf` - Format buffer
- `:FormatDisable` - Disable auto-format
- `:FormatEnable` - Enable auto-format
<details><summary>Windows with Microsoft C++ Build Tools and CMake</summary> ## 🛠️ LSP Servers
Installation may require installing build tools and updating the run command for `telescope-fzf-native`
See `telescope-fzf-native` documentation for [more details](https://github.com/nvim-telescope/telescope-fzf-native.nvim#installation) Automatisch installiert via Mason:
- **ts_ls** - TypeScript/JavaScript (Playwright)
- **gopls** - Go
- **lua_ls** - Lua
- **html** - HTML
- **cssls** - CSS
- **jsonls** - JSON (mit Schema support)
- **yamlls** - YAML (mit Schema support)
- **dockerls** - Dockerfile
- **docker_compose_language_service** - Docker Compose
This requires: ### Weitere Sprachen hinzufügen
- Install CMake and the Microsoft C++ Build Tools on Windows 1. Öffne `lua/plugins/lsp.lua`
2. Füge Server zu `ensure_installed` hinzu
3. Füge Server Config hinzu (siehe Beispiele im File)
4. `:Mason` - Check ob installiert
## 🔧 Customization
### Options ändern
Editiere `lua/core/options.lua`:
```lua ```lua
{'nvim-telescope/telescope-fzf-native.nvim', build = 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build' } opt.relativenumber = true -- Enable relative numbers
```
</details>
<details><summary>Windows with gcc/make using chocolatey</summary>
Alternatively, one can install gcc and make which don't require changing the config,
the easiest way is to use choco:
1. install [chocolatey](https://chocolatey.org/install)
either follow the instructions on the page or use winget,
run in cmd as **admin**:
```
winget install --accept-source-agreements chocolatey.chocolatey
``` ```
2. install all requirements using choco, exit the previous cmd and ### Keybindings ändern
open a new one so that choco path is set, and run in cmd as **admin**: Editiere `lua/core/keymaps.lua`:
```lua
keymap('n', '<leader>ff', '<cmd>Telescope find_files<CR>')
``` ```
choco install -y neovim git ripgrep wget fd unzip gzip mingw make
```
</details>
<details><summary>WSL (Windows Subsystem for Linux)</summary>
### Plugin hinzufügen
Neue Datei in `lua/plugins/`:
```lua
-- lua/plugins/myplugin.lua
return {
{
'author/plugin-name',
config = function()
-- Setup here
end,
},
}
``` ```
wsl --install
wsl
sudo add-apt-repository ppa:neovim-ppa/unstable -y
sudo apt update
sudo apt install make gcc ripgrep unzip git xclip neovim
```
</details>
#### Linux Install
<details><summary>Ubuntu Install Steps</summary>
### Plugin entfernen
Datei löschen oder Plugin auskommentieren, dann:
```vim
:Lazy clean
``` ```
sudo add-apt-repository ppa:neovim-ppa/unstable -y
sudo apt update
sudo apt install make gcc ripgrep unzip git xclip neovim
```
</details>
<details><summary>Debian Install Steps</summary>
``` ## 🐛 Troubleshooting
sudo apt update
sudo apt install make gcc ripgrep unzip git xclip curl
# Now we install nvim ### LSP funktioniert nicht
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.tar.gz ```vim
sudo rm -rf /opt/nvim-linux-x86_64 :LspInfo " Check LSP status
sudo mkdir -p /opt/nvim-linux-x86_64 :Mason " Check installed servers
sudo chmod a+rX /opt/nvim-linux-x86_64 :checkhealth " General health check
sudo tar -C /opt -xzf nvim-linux-x86_64.tar.gz
# make it available in /usr/local/bin, distro installs to /usr/bin
sudo ln -sf /opt/nvim-linux-x86_64/bin/nvim /usr/local/bin/
``` ```
</details>
<details><summary>Fedora Install Steps</summary>
### Plugin-Probleme
```vim
:Lazy " Plugin manager UI
:Lazy sync " Update all plugins
:Lazy clean " Remove unused plugins
``` ```
sudo dnf install -y gcc make git ripgrep fd-find unzip neovim
```
</details>
<details><summary>Arch Install Steps</summary>
### Performance
```vim
:Lazy profile " Check startup time
``` ```
sudo pacman -S --noconfirm --needed gcc make git ripgrep fd unzip neovim
```
</details>
## 📦 Updates
```bash
# In Neovim:
:Lazy sync # Update plugins
# Mason LSP updates:
:Mason # Then 'U' für update all
```
## 🎓 Lernen
Wenn du was nicht verstehst:
1. Schau in die entsprechende Datei (gut kommentiert!)
2. `:help <command>` nutzen
3. Frag Claude 😊
## 🚨 Wichtig
- **Backup**: Alte Config ist in `~/.config/nvim.kickstart-backup`
- **Dotfiles**: Diese Config sollte in Git sein!
- **Updates**: Regelmäßig `:Lazy sync` und `:Mason` checken
## 📝 Änderungslog
- **2024-10**: Initial Scratch Build
- TypeScript/Playwright optimiert
- Go Support
- Moderne LSP APIs (vim.lsp.config)
- Harpoon v2
- Clean, modular structure

View File

@@ -1,24 +0,0 @@
================================================================================
INTRODUCTION *kickstart.nvim*
Kickstart.nvim is a project to help you get started on your neovim journey.
*kickstart-is-not*
It is not:
- Complete framework for every plugin under the sun
- Place to add every plugin that could ever be useful
*kickstart-is*
It is:
- Somewhere that has a good start for the most common "IDE" type features:
- autocompletion
- goto-definition
- find references
- fuzzy finding
- and hinting at what more can be done :)
- A place to _kickstart_ your journey.
- You should fork this project and use/modify it so that it matches your
style and preferences. If you don't want to do that, there are probably
other projects that would fit much better for you (and that's great!)!
vim:tw=78:ts=8:ft=help:norl:

View File

@@ -1,64 +1,15 @@
-- Grundeinstellungen -- ============================================================================
-- Neovim Config - Built from Scratch
-- Optimiert für TypeScript/Playwright QA und Go Development
-- ============================================================================
-- Leader key muss VOR lazy.nvim gesetzt werden
vim.g.mapleader = ' ' vim.g.mapleader = ' '
vim.g.maplocalleader = ' ' vim.g.maplocalleader = ' '
vim.opt.number = true
vim.opt.relativenumber = false
vim.opt.mouse = 'a'
vim.opt.showmode = false
vim.opt.clipboard = 'unnamedplus'
vim.opt.breakindent = true
vim.opt.undofile = true
vim.opt.ignorecase = true
vim.opt.smartcase = true
vim.opt.signcolumn = 'yes'
vim.opt.updatetime = 250
vim.opt.timeoutlen = 300
vim.opt.splitright = true
vim.opt.splitbelow = true
vim.opt.list = true
vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '' }
vim.opt.inccommand = 'split'
vim.opt.cursorline = true
vim.opt.scrolloff = 10
vim.opt.hlsearch = true
-- Lade lazy.nvim -- Core Einstellungen laden
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" require('core.options')
if not vim.loop.fs_stat(lazypath) then require('core.keymaps')
vim.fn.system({ require('core.lazy')
"git",
"clone",
"--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable", -- neueste stabile Version
lazypath,
})
end
vim.opt.rtp:prepend(lazypath)
-- Lade Plugins -- Nach Plugin-Load: LSP und weitere Configs werden automatisch geladen
require("lazy").setup({
-- Grundlegende Plugins
{ import = "custom.plugins" },
-- Colorscheme
{
"folke/tokyonight.nvim",
lazy = false,
priority = 1000,
config = function()
require("tokyonight").setup({
style = "storm",
transparent = false,
terminal_colors = true,
})
vim.cmd.colorscheme "tokyonight"
end,
},
})
-- Lade benutzerdefinierte Einstellungen
require("custom.config")
-- Lade Spracheinstellungen
require("custom.lsp")

File diff suppressed because it is too large Load Diff

View File

@@ -1,39 +1,38 @@
{ {
"LuaSnip": { "branch": "master", "commit": "776a29c3e1ac61029ac3f57ac6b5937df2340162" }, "Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" },
"LuaSnip": { "branch": "master", "commit": "73813308abc2eaeff2bc0d3f2f79270c491be9d7" },
"better-escape.nvim": { "branch": "master", "commit": "19a38aab94961016430905ebec30d272a01e9742" },
"cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" }, "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" },
"cmp-nvim-lsp": { "branch": "main", "commit": "a8912b88ce488f411177fc8aed358b04dc246d7b" }, "cmp-nvim-lsp": { "branch": "main", "commit": "bd5a7d6db125d4654b50eeae9f5217f24bb22fd3" },
"cmp-path": { "branch": "main", "commit": "c6635aae33a50d6010bf1aa756ac2398a2d54c32" }, "cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" },
"cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" }, "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" },
"conform.nvim": { "branch": "master", "commit": "b529dd4897c85c3188cc787084089a9d55843093" }, "conform.nvim": { "branch": "master", "commit": "fbcb4fa7f34bfea9be702ffff481a8e336ebf6ed" },
"diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, "fidget.nvim": { "branch": "main", "commit": "3f5475949679953af6d78654db29b944fa826e6a" },
"fidget.nvim": { "branch": "main", "commit": "d9ba6b7bfe29b3119a610892af67602641da778e" },
"friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" }, "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" },
"gitsigns.nvim": { "branch": "main", "commit": "d0f90ef51d4be86b824b012ec52ed715b5622e51" }, "gitsigns.nvim": { "branch": "main", "commit": "1ee5c1fd068c81f9dd06483e639c2aa4587dc197" },
"harpoon": { "branch": "master", "commit": "1bc17e3e42ea3c46b33c0bbad6a880792692a1b3" }, "harpoon": { "branch": "harpoon2", "commit": "ed1f853847ffd04b2b61c314865665e1dadf22c7" },
"hydra.nvim": { "branch": "master", "commit": "3ced42c0b6a6c85583ff0f221635a7f4c1ab0dd0" }, "indent-blankline.nvim": { "branch": "master", "commit": "005b56001b2cb30bfa61b7986bc50657816ba4ba" },
"lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, "lazy.nvim": { "branch": "main", "commit": "1ea3c4085785f460fb0e46d2fe1ee895f5f9e7c1" },
"leap.nvim": { "branch": "main", "commit": "08ca7ec9e859856251d56c22ea107f82f563ff3c" }, "lualine.nvim": { "branch": "master", "commit": "b8c23159c0161f4b89196f74ee3a6d02cdc3a955" },
"mason-lspconfig.nvim": { "branch": "main", "commit": "c2682b0d9732bf52cbc34862056f143e71dc4a6d" }, "mason-lspconfig.nvim": { "branch": "main", "commit": "6bdb14f230de0904229ec367b410fb817e59b072" },
"mason.nvim": { "branch": "main", "commit": "8024d64e1330b86044fed4c8494ef3dcd483a67c" }, "mason.nvim": { "branch": "main", "commit": "ad7146aa61dcaeb54fa900144d768f040090bff0" },
"neo-tree.nvim": { "branch": "main", "commit": "f3e8633f06007e015f855d3c1ec0cee23af14d8e" }, "neo-tree.nvim": { "branch": "main", "commit": "4c60a198e3f92098778a32a1c76d2bd7ba46a3b5" },
"neogit": { "branch": "master", "commit": "00038cca54436b6fecc064bba00bf42b77189041" }, "neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" },
"nui.nvim": { "branch": "main", "commit": "7cd18e73cfbd70e1546931b7268b3eebaeff9391" }, "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
"nvim-autopairs": { "branch": "master", "commit": "7a2c97cccd60abc559344042fefb1d5a85b3e33b" },
"nvim-cmp": { "branch": "main", "commit": "b5311ab3ed9c846b585c0c15b7559be131ec4be9" }, "nvim-cmp": { "branch": "main", "commit": "b5311ab3ed9c846b585c0c15b7559be131ec4be9" },
"nvim-colorizer.lua": { "branch": "master", "commit": "a065833f35a3a7cc3ef137ac88b5381da2ba302e" }, "nvim-lspconfig": { "branch": "master", "commit": "ac98db2f9f06a56498ec890a96928774eae412c3" },
"nvim-dap": { "branch": "master", "commit": "61643680dcb771a29073cd432894e2f81a7c2ae3" }, "nvim-surround": { "branch": "main", "commit": "a868c256c861044beb9794b4dd126480dcdfbdad" },
"nvim-dap-python": { "branch": "master", "commit": "261ce649d05bc455a29f9636dc03f8cdaa7e0e2c" },
"nvim-dap-ui": { "branch": "master", "commit": "73a26abf4941aa27da59820fd6b028ebcdbcf932" },
"nvim-lspconfig": { "branch": "master", "commit": "8adb3b5938f6074a1bcc36d3c3916f497d2e8ec4" },
"nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" },
"nvim-treesitter-textobjects": { "branch": "master", "commit": "0f051e9813a36481f48ca1f833897210dbcfffde" }, "nvim-treesitter-textobjects": { "branch": "master", "commit": "71385f191ec06ffc60e80e6b0c9a9d5daed4824c" },
"nvim-web-devicons": { "branch": "master", "commit": "1fb58cca9aebbc4fd32b086cb413548ce132c127" }, "nvim-ts-context-commentstring": { "branch": "main", "commit": "1b212c2eee76d787bbea6aa5e92a2b534e7b4f8f" },
"nvim-window-picker": { "branch": "main", "commit": "6382540b2ae5de6c793d4aa2e3fe6dbb518505ec" }, "nvim-web-devicons": { "branch": "master", "commit": "b8221e42cf7287c4dcde81f232f58d7b947c210d" },
"phpactor": { "branch": "master", "commit": "53741d8eb3d878d5b22e39f9255efa08c88d5dfc" }, "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
"plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" }, "schemastore.nvim": { "branch": "main", "commit": "caad5439cc80809be7475b625a5e36d1bb06cc7e" },
"schemastore.nvim": { "branch": "main", "commit": "9c4dbc346c0be7016cf56220bafb964fd8ef87d3" },
"telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" }, "telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" },
"telescope.nvim": { "branch": "master", "commit": "b4da76be54691e854d3e0e02c36b0245f945c2c7" }, "telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" },
"tokyonight.nvim": { "branch": "main", "commit": "057ef5d260c1931f1dffd0f052c685dcd14100a3" }, "telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" },
"typescript-tools.nvim": { "branch": "master", "commit": "3c501d7c7f79457932a8750a2a1476a004c5c1a9" }, "tokyonight.nvim": { "branch": "main", "commit": "d14614cbfc63b6037bfccd48bb982d2ad2003352" },
"zen-mode.nvim": { "branch": "main", "commit": "863f150ca321b3dd8aa1a2b69b5f411a220e144f" } "vim-fugitive": { "branch": "master", "commit": "61b51c09b7c9ce04e821f6cf76ea4f6f903e3cf4" },
"which-key.nvim": { "branch": "main", "commit": "b4177e3eaf15fe5eb8357ebac2286d488be1ed00" }
} }

View File

@@ -0,0 +1,50 @@
-- ============================================================================
-- Keymaps - Tastenkombinationen
-- ============================================================================
local keymap = vim.keymap.set
-- ESC clear search highlighting
keymap('n', '<Esc>', '<cmd>nohlsearch<CR>', { desc = 'Clear search highlighting' })
-- Better window navigation
keymap('n', '<C-h>', '<C-w>h', { desc = 'Navigate to left window' })
keymap('n', '<C-j>', '<C-w>j', { desc = 'Navigate to bottom window' })
keymap('n', '<C-k>', '<C-w>k', { desc = 'Navigate to top window' })
keymap('n', '<C-l>', '<C-w>l', { desc = 'Navigate to right window' })
-- Resize windows
keymap('n', '<C-Up>', ':resize +2<CR>', { desc = 'Increase window height' })
keymap('n', '<C-Down>', ':resize -2<CR>', { desc = 'Decrease window height' })
keymap('n', '<C-Left>', ':vertical resize -2<CR>', { desc = 'Decrease window width' })
keymap('n', '<C-Right>', ':vertical resize +2<CR>', { desc = 'Increase window width' })
-- Buffer navigation
keymap('n', '<S-h>', '<cmd>bprevious<CR>', { desc = 'Previous buffer' })
keymap('n', '<S-l>', '<cmd>bnext<CR>', { desc = 'Next buffer' })
keymap('n', '<leader>bd', '<cmd>bdelete<CR>', { desc = 'Delete buffer' })
-- Better indenting (bleibt in visual mode)
keymap('v', '<', '<gv', { desc = 'Indent left' })
keymap('v', '>', '>gv', { desc = 'Indent right' })
-- Move lines up/down
keymap('n', '<A-j>', ':m .+1<CR>==', { desc = 'Move line down' })
keymap('n', '<A-k>', ':m .-2<CR>==', { desc = 'Move line up' })
keymap('v', '<A-j>', ":m '>+1<CR>gv=gv", { desc = 'Move selection down' })
keymap('v', '<A-k>', ":m '<-2<CR>gv=gv", { desc = 'Move selection up' })
-- Go error handling (dein Shortcut!)
keymap('n', '<leader>ee', 'oif err != nil {<CR>}<Esc>Oreturn err<Esc>', { desc = 'Go error handling' })
-- Quick save
keymap('n', '<leader>w', '<cmd>w<CR>', { desc = 'Save file' })
-- Diagnostic keymaps (LSP errors)
keymap('n', '[d', vim.diagnostic.goto_prev, { desc = 'Previous diagnostic' })
keymap('n', ']d', vim.diagnostic.goto_next, { desc = 'Next diagnostic' })
keymap('n', '<leader>cd', vim.diagnostic.open_float, { desc = 'Show diagnostic' })
keymap('n', '<leader>q', vim.diagnostic.setloclist, { desc = 'Diagnostic list' })
-- Terminal
keymap('t', '<Esc><Esc>', '<C-\\><C-n>', { desc = 'Exit terminal mode' })

View File

@@ -0,0 +1,45 @@
-- ============================================================================
-- Lazy.nvim - Plugin Manager Setup
-- ============================================================================
-- lazy.nvim automatisch installieren wenn nicht vorhanden
local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim'
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
'git',
'clone',
'--filter=blob:none',
'https://github.com/folke/lazy.nvim.git',
'--branch=stable',
lazypath,
})
end
vim.opt.rtp:prepend(lazypath)
-- Plugins laden
require('lazy').setup({
-- Import alle Plugin-Specs aus lua/plugins/
{ import = 'plugins' },
}, {
-- Lazy.nvim UI Konfiguration
ui = {
border = 'rounded',
},
-- Performance
performance = {
rtp = {
disabled_plugins = {
'gzip',
'tarPlugin',
'tohtml',
'tutor',
'zipPlugin',
},
},
},
-- Check for updates aber nicht nerven
checker = {
enabled = true,
notify = false,
},
})

View File

@@ -0,0 +1,61 @@
-- ============================================================================
-- Neovim Options - Grundlegende Einstellungen
-- ============================================================================
local opt = vim.opt
-- Zeilennummern
opt.number = true
opt.relativenumber = false -- Absolute Nummern für QA-Arbeit
-- Maus
opt.mouse = 'a'
-- Clipboard (System Clipboard nutzen)
opt.clipboard = 'unnamedplus'
-- Tabs & Indentation
opt.tabstop = 2
opt.shiftwidth = 2
opt.expandtab = true
opt.autoindent = true
opt.breakindent = true
-- Suche
opt.ignorecase = true
opt.smartcase = true
opt.hlsearch = true
opt.incsearch = true
-- Aussehen
opt.termguicolors = true
opt.signcolumn = 'yes'
opt.cursorline = true
opt.scrolloff = 10
opt.sidescrolloff = 8
-- Split windows
opt.splitright = true
opt.splitbelow = true
-- Undo & Backup
opt.undofile = true
opt.backup = false
opt.swapfile = false
-- Performance
opt.updatetime = 250
opt.timeoutlen = 300
-- Whitespace characters
opt.list = true
opt.listchars = { tab = '» ', trail = '·', nbsp = '' }
-- Command line
opt.showmode = false -- Statusline zeigt mode schon
-- Completion
opt.completeopt = 'menu,menuone,noselect'
-- Fold (erstmal aus)
opt.foldenable = false

View File

@@ -1,94 +0,0 @@
-- Explorer-Konfiguration (Neo-tree)
require('neo-tree').setup({
close_if_last_window = false,
popup_border_style = "rounded",
enable_git_status = true,
enable_diagnostics = true,
sources = {
"filesystem",
"buffers",
"git_status",
},
source_selector = {
winbar = true,
content_layout = "center",
tabs_layout = "equal",
},
filesystem = {
filtered_items = {
visible = true,
hide_dotfiles = false,
hide_gitignored = false,
},
follow_current_file = {
enabled = true,
},
use_libuv_file_watcher = true,
},
window = {
position = "right",
width = 35,
mapping_options = {
noremap = true,
nowait = true,
},
},
git_status = {
symbols = {
added = "",
modified = "",
deleted = "",
renamed = "",
untracked = "",
ignored = "",
unstaged = "",
staged = "",
conflict = "",
},
},
})
-- Harpoon (Schnellwechsel zwischen Dateien)
local mark = require("harpoon.mark")
local ui = require("harpoon.ui")
vim.keymap.set("n", "<leader>a", mark.add_file, { desc = "Datei zu Harpoon hinzufügen" })
vim.keymap.set("n", "<leader>h", ui.toggle_quick_menu, { desc = "Harpoon-Menü anzeigen" })
-- Schnellzugriff auf die ersten 4 Dateien
vim.keymap.set("n", "<leader>1", function() ui.nav_file(1) end, { desc = "Harpoon Datei 1" })
vim.keymap.set("n", "<leader>2", function() ui.nav_file(2) end, { desc = "Harpoon Datei 2" })
vim.keymap.set("n", "<leader>3", function() ui.nav_file(3) end, { desc = "Harpoon Datei 3" })
vim.keymap.set("n", "<leader>4", function() ui.nav_file(4) end, { desc = "Harpoon Datei 4" })
-- Tastenkombinationen für Neo-tree
vim.keymap.set("n", "<leader>e", ":Neotree toggle right<CR>", { silent = true, desc = "Explorer öffnen" })
-- Git Signs
require('gitsigns').setup({
signs = {
add = { text = '+' },
change = { text = '~' },
delete = { text = '_' },
topdelete = { text = '' },
changedelete = { text = '~' },
untracked = { text = '' },
},
signcolumn = true,
on_attach = function(bufnr)
local gs = package.loaded.gitsigns
-- Navigation zwischen Änderungen
vim.keymap.set('n', ']c', function()
if vim.wo.diff then return ']c' end
vim.schedule(function() gs.next_hunk() end)
return '<Ignore>'
end, { expr = true, buffer = bufnr })
vim.keymap.set('n', '[c', function()
if vim.wo.diff then return '[c' end
vim.schedule(function() gs.prev_hunk() end)
return '<Ignore>'
end, { expr = true, buffer = bufnr })
end
})

View File

@@ -1,183 +0,0 @@
-- ~/.config/nvim/lua/custom/hydra.lua
local Hydra = require('hydra')
-- Fenster-Management Hydra
Hydra({
name = 'Fenster',
mode = 'n',
body = '<C-w>',
heads = {
-- Navigieren zwischen Fenstern
{ 'h', '<C-w>h', { desc = 'links' } },
{ 'j', '<C-w>j', { desc = 'unten' } },
{ 'k', '<C-w>k', { desc = 'oben' } },
{ 'l', '<C-w>l', { desc = 'rechts' } },
-- Fenster verschieben
{ 'H', '<C-w>H', { desc = 'nach links verschieben' } },
{ 'J', '<C-w>J', { desc = 'nach unten verschieben' } },
{ 'K', '<C-w>K', { desc = 'nach oben verschieben' } },
{ 'L', '<C-w>L', { desc = 'nach rechts verschieben' } },
-- Größe ändern
{ '>', '<C-w>>', { desc = 'breiter' } },
{ '<', '<C-w><', { desc = 'schmaler' } },
{ '+', '<C-w>+', { desc = 'höher' } },
{ '-', '<C-w>-', { desc = 'niedriger' } },
{ '=', '<C-w>=', { desc = 'gleiche Größe' } },
-- Neue Fenster
{ 's', '<C-w>s', { desc = 'horizontal teilen' } },
{ 'v', '<C-w>v', { desc = 'vertikal teilen' } },
{ 'n', '<cmd>new<CR>', { desc = 'neue horizontale Teilung' } },
{ 'N', '<cmd>vnew<CR>', { desc = 'neue vertikale Teilung' } },
-- Fenster schließen
{ 'c', '<C-w>c', { desc = 'schließen' } },
{ 'o', '<C-w>o', { desc = 'andere schließen' } },
-- Beenden
{ 'q', nil, { desc = 'beenden', exit = true } },
{ '<Esc>', nil, { desc = 'beenden', exit = true } },
}
})
-- Harpoon Hydra
Hydra({
name = 'Harpoon',
mode = 'n',
body = '<leader>h',
heads = {
{ 'a', function() require("harpoon.mark").add_file() end, { desc = 'Datei hinzufügen' } },
{ 'h', function() require("harpoon.ui").toggle_quick_menu() end, { desc = 'Menü anzeigen' } },
{ 'n', function() require("harpoon.ui").nav_next() end, { desc = 'Nächste Datei' } },
{ 'p', function() require("harpoon.ui").nav_prev() end, { desc = 'Vorherige Datei' } },
{ '1', function() require("harpoon.ui").nav_file(1) end, { desc = 'Datei 1' } },
{ '2', function() require("harpoon.ui").nav_file(2) end, { desc = 'Datei 2' } },
{ '3', function() require("harpoon.ui").nav_file(3) end, { desc = 'Datei 3' } },
{ '4', function() require("harpoon.ui").nav_file(4) end, { desc = 'Datei 4' } },
{ '5', function() require("harpoon.ui").nav_file(5) end, { desc = 'Datei 5' } },
{ 'q', nil, { desc = 'beenden', exit = true } },
{ '<Esc>', nil, { desc = 'beenden', exit = true } },
}
})
-- Git-Operationen Hydra (funktioniert mit Gitsigns und Neogit)
Hydra({
name = 'Git',
mode = 'n',
body = '<leader>g',
heads = {
-- Gitsigns
{ 'h', function() require("gitsigns").preview_hunk() end, { desc = 'Änderung anzeigen' } },
{ 'n', function() require("gitsigns").next_hunk() end, { desc = 'Nächste Änderung' } },
{ 'p', function() require("gitsigns").prev_hunk() end, { desc = 'Vorherige Änderung' } },
{ 's', function() require("gitsigns").stage_hunk() end, { desc = 'Änderung stagen' } },
{ 'u', function() require("gitsigns").undo_stage_hunk() end, { desc = 'Stagen rückgängig' } },
{ 'r', function() require("gitsigns").reset_hunk() end, { desc = 'Änderung zurücksetzen' } },
-- Neogit
{ 'g', function() require("neogit").open() end, { desc = 'Neogit öffnen', exit = true } },
{ 'c', function() require("neogit").open({ "commit" }) end, { desc = 'Commit', exit = true } },
{ 'P', function() require("neogit").open({ "push" }) end, { desc = 'Push', exit = true } },
{ 'l', function() require("neogit").open({ "log" }) end, { desc = 'Log', exit = true } },
-- Diffview
{ 'd', '<cmd>DiffviewOpen<CR>', { desc = 'Diff anzeigen', exit = true } },
-- Beenden
{ 'q', nil, { desc = 'beenden', exit = true } },
{ '<Esc>', nil, { desc = 'beenden', exit = true } },
}
})
-- Neo-tree Hydra
Hydra({
name = 'Explorer',
mode = 'n',
body = '<leader>E',
heads = {
{ 'e', '<cmd>Neotree toggle right<CR>', { desc = 'Explorer ein/aus', exit = true } },
{ 'f', '<cmd>Neotree focus filesystem right<CR>', { desc = 'Dateisystem', exit = true } },
{ 'b', '<cmd>Neotree focus buffers right<CR>', { desc = 'Buffer', exit = true } },
{ 'g', '<cmd>Neotree focus git_status right<CR>', { desc = 'Git-Status', exit = true } },
-- Leap Integration
{ 's', function()
-- Öffne Neo-tree und springe mit Leap
vim.cmd('Neotree focus filesystem right')
-- Eine kleine Verzögerung, damit Neo-tree Zeit hat, zu öffnen
vim.defer_fn(function()
require('leap').leap { target_windows = { vim.api.nvim_get_current_win() } }
end, 100)
end,
{ desc = 'Suchen mit Leap', exit = true }
},
-- Beenden
{ 'q', nil, { desc = 'beenden', exit = true } },
{ '<Esc>', nil, { desc = 'beenden', exit = true } },
}
})
-- LSP und Coding-Hydra
Hydra({
name = 'Code',
mode = 'n',
body = '<leader>c',
heads = {
-- LSP Aktionen
{ 'a', vim.lsp.buf.code_action, { desc = 'Code-Aktion' } },
{ 'r', vim.lsp.buf.rename, { desc = 'Umbenennen' } },
{ 'd', vim.lsp.buf.definition, { desc = 'Definition', exit = true } },
{ 'D', vim.lsp.buf.declaration, { desc = 'Deklaration', exit = true } },
{ 'i', vim.lsp.buf.implementation, { desc = 'Implementation', exit = true } },
{ 'h', vim.lsp.buf.hover, { desc = 'Hover Info' } },
{ 'f', function() require('conform').format() end, { desc = 'Formatieren' } },
-- Diagnostik
{ 'n', vim.diagnostic.goto_next, { desc = 'Nächster Fehler' } },
{ 'p', vim.diagnostic.goto_prev, { desc = 'Vorheriger Fehler' } },
{ 'l', vim.diagnostic.open_float, { desc = 'Fehler anzeigen' } },
-- Beenden
{ 'q', nil, { desc = 'beenden', exit = true } },
{ '<Esc>', nil, { desc = 'beenden', exit = true } },
}
})
-- Erweiterte Navigation mit Leap und Harpoon
Hydra({
name = 'Navigation',
mode = 'n',
body = '<leader>n',
heads = {
-- Leap
{ 'f', function() require('leap').leap { target_windows = { vim.api.nvim_get_current_win() } } end,
{ desc = 'Leap vorwärts', exit = true } },
{ 'F', function() require('leap').leap { backward = true, target_windows = { vim.api.nvim_get_current_win() } } end,
{ desc = 'Leap rückwärts', exit = true } },
{ 'w', function()
require('leap').leap { target_windows = vim.tbl_filter(
function(win) return vim.api.nvim_win_get_config(win).relative == '' end,
vim.api.nvim_list_wins()
) }
end, { desc = 'Leap alle Fenster', exit = true } },
-- Harpoon
{ 'h', function() require("harpoon.ui").toggle_quick_menu() end, { desc = 'Harpoon-Menü', exit = true } },
{ '1', function() require("harpoon.ui").nav_file(1) end, { desc = 'Harpoon 1', exit = true } },
{ '2', function() require("harpoon.ui").nav_file(2) end, { desc = 'Harpoon 2', exit = true } },
{ '3', function() require("harpoon.ui").nav_file(3) end, { desc = 'Harpoon 3', exit = true } },
{ '4', function() require("harpoon.ui").nav_file(4) end, { desc = 'Harpoon 4', exit = true } },
-- Dateiexploration
{ 'e', '<cmd>Neotree toggle right<CR>', { desc = 'Explorer', exit = true } },
{ 't', '<cmd>Telescope find_files<CR>', { desc = 'Dateien suchen', exit = true } },
{ 'g', '<cmd>Telescope live_grep<CR>', { desc = 'Inhalte suchen', exit = true } },
-- Beenden
{ 'q', nil, { desc = 'beenden', exit = true } },
{ '<Esc>', nil, { desc = 'beenden', exit = true } },
}
})

View File

@@ -1,280 +0,0 @@
-- LSP und Treesitter Konfiguration
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities)
-- Mason für einfache LSP-Installation
require('mason').setup()
require('mason-lspconfig').setup({
ensure_installed = {
-- Sprachen
'lua_ls', -- Lua
'pyright', -- Python
'ruff', -- Python Linter
'ts_ls', -- TypeScript/JavaScript
-- 'vue-language-server', -- Vue
'intelephense', -- PHP
'html', -- HTML
'cssls', -- CSS
'yamlls', -- YAML
'jsonls', -- JSON
'docker_compose_language_service', -- Docker Compose
'dockerls', -- Dockerfile
'gopls',
},
})
-- LSP-Server konfigurieren
local lspconfig = require('lspconfig')
-- Lua
lspconfig.lua_ls.setup({
capabilities = capabilities,
})
-- TypeScript (inkl. React)
lspconfig.ts_ls.setup({
capabilities = capabilities,
})
-- Typescript-Tools für bessere TS/JS Unterstützung
require("typescript-tools").setup({
settings = {
-- Für NestJS, React und andere TS-Frameworks
tsserver_file_preferences = {
importModuleSpecifierPreference = "relative",
},
},
})
-- Python
lspconfig.pyright.setup({
capabilities = capabilities,
})
-- PHP/Symfony
lspconfig.intelephense.setup({
capabilities = capabilities,
settings = {
intelephense = {
stubs = {
"apache", "bcmath", "bz2", "calendar", "Core", "curl", "date", "dba",
"dom", "fileinfo", "filter", "ftp", "gd", "gettext", "hash", "iconv",
"imap", "intl", "json", "ldap", "libxml", "mbstring", "mysqli", "mysqlnd",
"oci8", "openssl", "pcntl", "pcre", "PDO", "pdo_mysql", "pdo_pgsql",
"pdo_sqlite", "pgsql", "Phar", "posix", "pspell", "readline", "Reflection",
"session", "shmop", "SimpleXML", "snmp", "soap", "sockets", "sodium", "SPL",
"sqlite3", "standard", "superglobals", "sysvmsg", "sysvsem", "sysvshm",
"tidy", "tokenizer", "xml", "xmlreader", "xmlrpc", "xmlwriter", "xsl", "Zend OPcache",
"zip", "zlib", "wordpress", "symfony"
},
},
},
})
-- Go
lspconfig.gopls.setup({
capabilities = capabilities,
settings = {
gopls = {
analyses = {
unusedparams = true,
},
staticcheck = true,
gofumpt = true, -- Strengere Formatierung als gofmt
usePlaceholders = true,
completeUnimported = true,
experimentalPostfixCompletions = true,
},
},
})
-- YAML mit Schema-Unterstützung
lspconfig.yamlls.setup({
capabilities = capabilities,
settings = {
yaml = {
schemas = require('schemastore').yaml.schemas(),
},
},
})
-- JSON mit Schema-Unterstützung
lspconfig.jsonls.setup({
capabilities = capabilities,
settings = {
json = {
schemas = require('schemastore').json.schemas(),
validate = { enable = true },
},
},
})
-- Treesitter-Konfiguration für Syntax-Highlighting
require('nvim-treesitter.configs').setup({
ensure_installed = {
"lua", "vim", "vimdoc", "json", "yaml", "html", "css",
"javascript", "typescript", "tsx", "php", "python", "vue",
"dockerfile", "markdown", "regex", "bash", "go",
},
highlight = { enable = true },
indent = { enable = true },
})
-- Autocomplete-Konfiguration
local cmp = require('cmp')
local luasnip = require('luasnip')
cmp.setup({
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
window = {
completion = cmp.config.window.bordered(),
documentation = cmp.config.window.bordered(),
},
mapping = cmp.mapping.preset.insert({
['<C-d>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-Space>'] = cmp.mapping.complete(),
['<CR>'] = cmp.mapping.confirm({ select = true }),
['<Tab>'] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
else
fallback()
end
end, { 'i', 's' }),
['<S-Tab>'] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
elseif luasnip.jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end, { 'i', 's' }),
}),
sources = cmp.config.sources({
{ name = 'nvim_lsp' },
{ name = 'luasnip' },
{ name = 'buffer' },
{ name = 'path' },
}),
})
-- Einfache benutzerdefinierte Snippets (optional)
-- Hier ein Beispiel für ein paar einfache Snippets
local snippets_path = vim.fn.stdpath("config") .. "/snippets"
if vim.fn.isdirectory(snippets_path) == 0 then
vim.fn.mkdir(snippets_path, "p")
end
-- Füge einige nützliche Snippets hinzu
luasnip.add_snippets("python", {
luasnip.snippet("def", {
luasnip.text_node("def "),
luasnip.insert_node(1, "function_name"),
luasnip.text_node("("),
luasnip.insert_node(2, "args"),
luasnip.text_node("):\n\t"),
luasnip.insert_node(0),
}),
})
luasnip.add_snippets("typescript", {
luasnip.snippet("fn", {
luasnip.text_node("function "),
luasnip.insert_node(1, "name"),
luasnip.text_node("("),
luasnip.insert_node(2, "params"),
luasnip.text_node(") {\n\t"),
luasnip.insert_node(0),
luasnip.text_node("\n}"),
}),
})
luasnip.add_snippets("go", {
luasnip.snippet("func", {
luasnip.text_node("func "),
luasnip.insert_node(1, "name"),
luasnip.text_node("("),
luasnip.insert_node(2, "params"),
luasnip.text_node(") "),
luasnip.insert_node(3, "returnType"),
luasnip.text_node(" {\n\t"),
luasnip.insert_node(0),
luasnip.text_node("\n}"),
}),
luasnip.snippet("if", {
luasnip.text_node("if "),
luasnip.insert_node(1, "condition"),
luasnip.text_node(" {\n\t"),
luasnip.insert_node(0),
luasnip.text_node("\n}"),
}),
})
-- Code-Formatierung
require("conform").setup({
formatters_by_ft = {
javascript = { "prettier" },
typescript = { "prettier" },
javascriptreact = { "prettier" },
typescriptreact = { "prettier" },
vue = { "prettier" },
json = { "prettier" },
yaml = { "prettier" },
html = { "prettier" },
css = { "prettier" },
php = { "php_cs_fixer" },
python = { "black" },
lua = { "stylua" },
go = { "gofumpt" },
},
})
-- Formatierung beim Speichern
vim.api.nvim_create_autocmd("BufWritePre", {
pattern = "*",
callback = function()
require("conform").format({ async = false, lsp_fallback = true })
end,
})
-- Einstellungen für die Diagnostik (Fehleranzeige)
vim.diagnostic.config({
virtual_text = {
format = function(diagnostic)
local icon = ""
if diagnostic.severity == vim.diagnostic.severity.ERROR then
icon = ""
elseif diagnostic.severity == vim.diagnostic.severity.WARN then
icon = ""
elseif diagnostic.severity == vim.diagnostic.severity.INFO then
icon = " "
elseif diagnostic.severity == vim.diagnostic.severity.HINT then
icon = ""
end
return icon .. diagnostic.message
end
},
signs = true, -- Symbole in der Randspalte anzeigen
underline = true, -- Problematischen Code unterstreichen
update_in_insert = false,
severity_sort = true,
float = {
border = "rounded",
source = "always",
},
})
-- Tastenkombinationen für Diagnostik
vim.keymap.set('n', '<leader>cd', vim.diagnostic.open_float, { desc = 'Fehlerdetails anzeigen' })
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Vorheriger Fehler' })
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Nächster Fehler' })
vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist, { desc = 'Fehler in Liste anzeigen' })

View File

@@ -1,449 +0,0 @@
return {
-- Fuzzy Finder
{
'nvim-telescope/telescope.nvim',
dependencies = {
'nvim-lua/plenary.nvim',
'nvim-telescope/telescope-fzf-native.nvim',
},
},
-- LSP & Completion
{
'neovim/nvim-lspconfig',
dependencies = {
'williamboman/mason.nvim',
'williamboman/mason-lspconfig.nvim',
'hrsh7th/nvim-cmp',
'hrsh7th/cmp-nvim-lsp',
'hrsh7th/cmp-buffer',
'hrsh7th/cmp-path',
'L3MON4D3/LuaSnip',
'saadparwaiz1/cmp_luasnip',
'j-hui/fidget.nvim',
},
config = function()
-- Nichts hier definieren - wir laden die Konfiguration aus der lsp.lua
require("custom.lsp")
end,
},
-- Snipped
{
"rafamadriz/friendly-snippets",
dependencies = {
"L3MON4D3/LuaSnip",
},
config = function()
require("luasnip.loaders.from_vscode").lazy_load()
end,
},
-- Syntax Highlighting
{
'nvim-treesitter/nvim-treesitter',
build = ':TSUpdate',
dependencies = {
'nvim-treesitter/nvim-treesitter-textobjects',
},
},
-- Datei-Explorer
{
"nvim-neo-tree/neo-tree.nvim",
dependencies = {
"nvim-lua/plenary.nvim",
"nvim-tree/nvim-web-devicons", -- Für Datei-Icons
"MunifTanjim/nui.nvim", -- UI-Komponenten-Bibliothek
},
config = function()
-- Standardkonfiguration deaktivieren
vim.g.neo_tree_remove_legacy_commands = 1
require("neo-tree").setup({
close_if_last_window = false, -- Neovim schließen, wenn nur noch Neo-tree offen ist?
popup_border_style = "rounded", -- Stil für Popup-Fenster
enable_git_status = true, -- Git-Integration aktivieren
enable_diagnostics = true, -- Zeige Diagnostik-Informationen (LSP)
default_component_configs = {
container = {
enable_character_fade = true, -- Schöne Übergänge bei Textlängen
width = "100%",
right_padding = 0,
},
indent = {
indent_size = 2,
padding = 1,
with_markers = true,
indent_marker = "",
last_indent_marker = "",
highlight = "NeoTreeIndentMarker",
with_expanders = true, -- Klick-/Tastatur-expandierbare Ordner
expander_collapsed = "",
expander_expanded = "",
expander_highlight = "NeoTreeExpander",
},
icon = {
folder_closed = "",
folder_open = "",
folder_empty = "󰜌",
default = "*",
highlight = "NeoTreeFileIcon"
},
modified = {
symbol = "[+]",
highlight = "NeoTreeModified",
},
name = {
trailing_slash = false,
use_git_status_colors = true,
highlight = "NeoTreeFileName",
},
git_status = {
symbols = {
-- Symbole für Git-Status
added = "", -- oder "✚"
modified = "", -- oder "✹"
deleted = "", -- oder ""
renamed = "", -- oder ""
untracked = "", -- oder "✭"
ignored = "", -- oder "◌"
unstaged = "", -- oder "✗"
staged = "", -- oder "✓"
conflict = "", -- oder "≠"
}
},
},
-- Welche Ansichten verfügbar sein sollen
source_selector = {
winbar = true, -- Zeige Auswahl in der Fensterleiste
statusline = false, -- Nicht in der Statuszeile anzeigen
content_layout = "center",
sources = { -- Verfügbare Quellen
{ source = "filesystem", display_name = " Dateien " },
{ source = "buffers", display_name = " Buffer " },
{ source = "git_status", display_name = " Git " },
},
tabs_layout = "equal", -- "equal", "focus"
},
-- Dateisystemansicht
filesystem = {
filtered_items = {
visible = true, -- Gefilterte Elemente mit anderen Stil anzeigen
hide_dotfiles = false, -- Versteckte Dateien anzeigen
hide_gitignored = false, -- Git-ignorierte Dateien anzeigen
hide_hidden = false, -- Versteckte Dateien unter Windows anzeigen
hide_by_name = {
-- "node_modules", -- Auskommentieren, um zu verstecken
},
hide_by_pattern = {
-- "*.meta", -- Auskommentieren, um zu verstecken
},
always_show = { -- Immer anzeigen, auch wenn sie sonst gefiltert würden
".gitignored",
".env",
},
never_show = { -- Dateien, die immer ausgeblendet werden
".DS_Store",
},
never_show_by_pattern = { -- Regex-Muster für Dateien, die nie angezeigt werden
-- ".*\\.meta$",
},
},
follow_current_file = {
enabled = true, -- Hervorheben der aktuellen Datei im Explorer
leave_dirs_open = false, -- Ordner öffnen, wenn Datei darin
},
group_empty_dirs = false, -- Leere Unterordner unter Elternordner gruppieren
hijack_netrw_behavior = "open_default", -- Netrw ersetzen
use_libuv_file_watcher = true, -- Effiziente Dateiüberwachung (bemerkt Änderungen)
window = {
mappings = {
-- Tastenkombinationen im Dateisystem-Fenster
["<space>"] = "none", -- Space für andere Funktionen freigeben
["<2-LeftMouse>"] = "open",
["<cr>"] = "open",
["S"] = "open_split", -- In horizontales Split öffnen
["s"] = "open_vsplit", -- In vertikales Split öffnen
["t"] = "open_tabnew", -- In neuem Tab öffnen
["C"] = "close_node", -- Knoten schließen
["z"] = "close_all_nodes", -- Alle Knoten schließen
["R"] = "refresh", -- Aktualisieren
["a"] = {
"add", -- Neue Datei/Ordner erstellen
config = {
show_path =
"relative" -- Relativen Pfad beim Erstellen anzeigen
}
},
["d"] = "delete", -- Löschen
["r"] = "rename", -- Umbenennen
["y"] = "copy_to_clipboard", -- In Zwischenablage kopieren
["x"] = "cut_to_clipboard", -- Ausschneiden
["p"] = "paste_from_clipboard", -- Einfügen
["c"] = "copy", -- Kopieren (mit Ziel-Auswahl)
["m"] = "move", -- Verschieben (mit Ziel-Auswahl)
["/"] = "filter_on_submit", -- Filtern
["<esc>"] = "clear_filter", -- Filter löschen
["f"] = "filter_on_submit", -- Filtern (Alternative)
["<c-x>"] = "clear_filter", -- Filter löschen (Alternative)
["?"] = "show_help", -- Hilfe anzeigen
}
},
},
-- Buffer-Ansicht (Geöffnete Dateien)
buffers = {
follow_current_file = {
enabled = true, -- Aktuelle Datei hervorheben
},
group_empty_dirs = true, -- Leere Ordner gruppieren
show_unloaded = true, -- Auch nicht geladene Buffer anzeigen
},
-- Git-Status-Ansicht
git_status = {
window = {
mappings = {
["A"] = "git_add_all", -- Alle Änderungen stagen
["u"] = "git_unstage_file", -- Datei unstagen
["a"] = "git_add_file", -- Datei stagen
["r"] = "git_revert_file", -- Änderungen zurücksetzen
["c"] = "git_commit", -- Commit erstellen
["p"] = "git_push", -- Push
["gg"] = "git_commit_and_push", -- Commit und Push
}
}
},
-- Hauptfenster-Konfiguration
window = {
position = "right", -- Explorer auf der rechten Seite
width = 35, -- Breite des Explorers
mapping_options = {
noremap = true,
nowait = true,
},
mappings = {
["<space>"] = "none", -- Space für andere Funktionen freigeben
["<2-LeftMouse>"] = "open",
["<cr>"] = "open",
["S"] = "open_split",
["s"] = "open_vsplit",
["t"] = "open_tabnew",
["w"] = "open_with_window_picker", -- Mit Fensterauswahl öffnen
["C"] = "close_node",
["z"] = "close_all_nodes",
["R"] = "refresh",
["a"] = {
"add",
config = {
show_path = "relative"
}
},
["d"] = "delete",
["r"] = "rename",
["y"] = "copy_to_clipboard",
["x"] = "cut_to_clipboard",
["p"] = "paste_from_clipboard",
["c"] = "copy",
["m"] = "move",
["q"] = "close_window", -- Fenster schließen
["?"] = "show_help",
}
}
})
-- Tastenkombination zum Öffnen des Explorers
vim.keymap.set("n", "<leader>e", ":Neotree toggle right<CR>",
{ silent = true, desc = "Explorer ein/aus" })
-- Tastenkombination für Dateiansicht
vim.keymap.set("n", "<leader>ef", ":Neotree focus filesystem right<CR>",
{ silent = true, desc = "Datei-Explorer" })
-- Tastenkombination für Buffer-Liste
vim.keymap.set("n", "<leader>eb", ":Neotree focus buffers right<CR>",
{ silent = true, desc = "Buffer-Liste" })
-- Tastenkombination für Git-Status
vim.keymap.set("n", "<leader>eg", ":Neotree focus git_status right<CR>",
{ silent = true, desc = "Git-Status" })
end,
},
-- Schnellwechsel zwischen Dateien (wie Harpoon)
{
'ThePrimeagen/harpoon',
dependencies = {
'nvim-lua/plenary.nvim',
},
config = function()
-- Basiseinstellungen für Harpoon
require("harpoon").setup()
-- Einfache, direkte Keybindings
vim.keymap.set("n", "<leader>a", require("harpoon.mark").add_file, { desc = "Datei markieren" })
vim.keymap.set("n", "<leader>h", require("harpoon.ui").toggle_quick_menu,
{ desc = "Harpoon-Menü" })
vim.keymap.set("n", "<C-j>", function() require("harpoon.ui").nav_file(1) end)
vim.keymap.set("n", "<C-k>", function() require("harpoon.ui").nav_file(2) end)
vim.keymap.set("n", "<C-l>", function() require("harpoon.ui").nav_file(3) end)
vim.keymap.set("n", "<C-;>", function() require("harpoon.ui").nav_file(4) end)
end,
},
-- Git-Integration
{
'lewis6991/gitsigns.nvim',
config = true,
},
-- Formatierung
{
'stevearc/conform.nvim',
},
-- Framework-Unterstützung
-- PHP/Symfony
{
'phpactor/phpactor',
ft = 'php',
build = 'composer install --no-dev -o',
},
-- TypeScript/JavaScript/React/Vue/NestJS
{
'pmizio/typescript-tools.nvim',
dependencies = {
'nvim-lua/plenary.nvim',
'neovim/nvim-lspconfig',
},
config = function()
require("typescript-tools").setup({
settings = {
tsserver_file_preferences = {
importModuleSpecifierPreference = "relative",
},
},
})
end,
},
-- Vue.js
-- {
-- 'neovim/nvim-lspconfig',
-- opts = function(_, opts)
-- -- Füge Volar als Server hinzu
-- opts.servers = opts.servers or {}
-- opts.servers.volar = {
-- filetypes = { 'vue', 'typescript', 'javascript' }
-- }
-- end,
-- },
-- Playwright Testing
{
'mxsdev/nvim-dap',
dependencies = {
'rcarriga/nvim-dap-ui',
'mfussenegger/nvim-dap-python',
},
},
-- YAML und JSON Unterstützung
'b0o/schemastore.nvim',
-- Für Zen-Modus
{
"folke/zen-mode.nvim",
cmd = "ZenMode",
opts = {
window = {
width = 90,
options = {
number = false,
relativenumber = false,
},
},
},
},
-- Für Git-Integration
{
"sindrets/diffview.nvim",
dependencies = { "nvim-lua/plenary.nvim" },
},
-- Für Neogit
{
"NeogitOrg/neogit",
dependencies = {
"nvim-lua/plenary.nvim",
"sindrets/diffview.nvim",
},
cmd = "Neogit",
},
-- Für Farbvorschau in Code
{
"norcalli/nvim-colorizer.lua",
cmd = "ColorizerToggle",
config = true,
},
-- Leap/Lightspeed
{
"ggandor/leap.nvim",
config = function()
require('leap').add_default_mappings()
end,
},
-- Hydra für kontextbezogene Tastaturmodi
{
"anuvyklack/hydra.nvim",
event = "VeryLazy",
config = function()
-- Die Konfigurationen folgen im nächsten Schritt
require("custom.hydra")
end,
},
-- Window-Picker
{
"s1n7ax/nvim-window-picker",
version = "v2.*",
config = function()
require("window-picker").setup({
filter_rules = {
-- Filtere diese Fenstertypen aus
bo = {
filetype = { "neo-tree", "neo-tree-popup", "notify", "quickfix" },
buftype = { "terminal" },
},
},
highlights = {
statusline = {
focused = {
fg = "#000000",
bg = "#E35E4F",
},
unfocused = {
fg = "#000000",
bg = "#44CC41",
},
},
},
picker_config = {
statusline_winbar_picker = {
-- Verwende Buchstaben des Alphabets für die Fensterauswahl
selection_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
},
},
})
end,
}
}

View File

@@ -1,5 +0,0 @@
-- You can add your own plugins here or in other files in this directory!
-- I promise not to create any merge conflicts in this directory :)
--
-- See the kickstart.nvim README for more information
return {}

View File

@@ -1,52 +0,0 @@
--[[
--
-- This file is not required for your own configuration,
-- but helps people determine if their system is setup correctly.
--
--]]
local check_version = function()
local verstr = tostring(vim.version())
if not vim.version.ge then
vim.health.error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr))
return
end
if vim.version.ge(vim.version(), '0.10-dev') then
vim.health.ok(string.format("Neovim version is: '%s'", verstr))
else
vim.health.error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr))
end
end
local check_external_reqs = function()
-- Basic utils: `git`, `make`, `unzip`
for _, exe in ipairs { 'git', 'make', 'unzip', 'rg' } do
local is_executable = vim.fn.executable(exe) == 1
if is_executable then
vim.health.ok(string.format("Found executable: '%s'", exe))
else
vim.health.warn(string.format("Could not find executable: '%s'", exe))
end
end
return true
end
return {
check = function()
vim.health.start 'kickstart.nvim'
vim.health.info [[NOTE: Not every warning is a 'must-fix' in `:checkhealth`
Fix only warnings for plugins and languages you intend to use.
Mason will give warnings for languages that are not installed.
You do not need to install, unless you want to use those languages!]]
local uv = vim.uv or vim.loop
vim.health.info('System Information: ' .. vim.inspect(uv.os_uname()))
check_version()
check_external_reqs()
end,
}

View File

@@ -1,16 +0,0 @@
-- autopairs
-- https://github.com/windwp/nvim-autopairs
return {
'windwp/nvim-autopairs',
event = 'InsertEnter',
-- Optional dependency
dependencies = { 'hrsh7th/nvim-cmp' },
config = function()
require('nvim-autopairs').setup {}
-- If you want to automatically add `(` after selecting a function or method
local cmp_autopairs = require 'nvim-autopairs.completion.cmp'
local cmp = require 'cmp'
cmp.event:on('confirm_done', cmp_autopairs.on_confirm_done())
end,
}

View File

@@ -1,148 +0,0 @@
-- debug.lua
--
-- Shows how to use the DAP plugin to debug your code.
--
-- Primarily focused on configuring the debugger for Go, but can
-- be extended to other languages as well. That's why it's called
-- kickstart.nvim and not kitchen-sink.nvim ;)
return {
-- NOTE: Yes, you can install new plugins here!
'mfussenegger/nvim-dap',
-- NOTE: And you can specify dependencies as well
dependencies = {
-- Creates a beautiful debugger UI
'rcarriga/nvim-dap-ui',
-- Required dependency for nvim-dap-ui
'nvim-neotest/nvim-nio',
-- Installs the debug adapters for you
'williamboman/mason.nvim',
'jay-babu/mason-nvim-dap.nvim',
-- Add your own debuggers here
'leoluz/nvim-dap-go',
},
keys = {
-- Basic debugging keymaps, feel free to change to your liking!
{
'<F5>',
function()
require('dap').continue()
end,
desc = 'Debug: Start/Continue',
},
{
'<F1>',
function()
require('dap').step_into()
end,
desc = 'Debug: Step Into',
},
{
'<F2>',
function()
require('dap').step_over()
end,
desc = 'Debug: Step Over',
},
{
'<F3>',
function()
require('dap').step_out()
end,
desc = 'Debug: Step Out',
},
{
'<leader>b',
function()
require('dap').toggle_breakpoint()
end,
desc = 'Debug: Toggle Breakpoint',
},
{
'<leader>B',
function()
require('dap').set_breakpoint(vim.fn.input 'Breakpoint condition: ')
end,
desc = 'Debug: Set Breakpoint',
},
-- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
{
'<F7>',
function()
require('dapui').toggle()
end,
desc = 'Debug: See last session result.',
},
},
config = function()
local dap = require 'dap'
local dapui = require 'dapui'
require('mason-nvim-dap').setup {
-- Makes a best effort to setup the various debuggers with
-- reasonable debug configurations
automatic_installation = true,
-- You can provide additional configuration to the handlers,
-- see mason-nvim-dap README for more information
handlers = {},
-- You'll need to check that you have the required things installed
-- online, please don't ask me how to install them :)
ensure_installed = {
-- Update this to ensure that you have the debuggers for the langs you want
'delve',
},
}
-- Dap UI setup
-- For more information, see |:help nvim-dap-ui|
dapui.setup {
-- Set icons to characters that are more likely to work in every terminal.
-- Feel free to remove or use ones that you like more! :)
-- Don't feel like these are good choices.
icons = { expanded = '', collapsed = '', current_frame = '*' },
controls = {
icons = {
pause = '',
play = '',
step_into = '',
step_over = '',
step_out = '',
step_back = 'b',
run_last = '▶▶',
terminate = '',
disconnect = '',
},
},
}
-- Change breakpoint icons
-- vim.api.nvim_set_hl(0, 'DapBreak', { fg = '#e51400' })
-- vim.api.nvim_set_hl(0, 'DapStop', { fg = '#ffcc00' })
-- local breakpoint_icons = vim.g.have_nerd_font
-- and { Breakpoint = '', BreakpointCondition = '', BreakpointRejected = '', LogPoint = '', Stopped = '' }
-- or { Breakpoint = '●', BreakpointCondition = '⊜', BreakpointRejected = '⊘', LogPoint = '◆', Stopped = '⭔' }
-- for type, icon in pairs(breakpoint_icons) do
-- local tp = 'Dap' .. type
-- local hl = (type == 'Stopped') and 'DapStop' or 'DapBreak'
-- vim.fn.sign_define(tp, { text = icon, texthl = hl, numhl = hl })
-- end
dap.listeners.after.event_initialized['dapui_config'] = dapui.open
dap.listeners.before.event_terminated['dapui_config'] = dapui.close
dap.listeners.before.event_exited['dapui_config'] = dapui.close
-- Install golang specific config
require('dap-go').setup {
delve = {
-- On Windows delve must be run attached or it crashes.
-- See https://github.com/leoluz/nvim-dap-go/blob/main/README.md#configuring
detached = vim.fn.has 'win32' == 0,
},
}
end,
}

View File

@@ -1,61 +0,0 @@
-- Adds git related signs to the gutter, as well as utilities for managing changes
-- NOTE: gitsigns is already included in init.lua but contains only the base
-- config. This will add also the recommended keymaps.
return {
{
'lewis6991/gitsigns.nvim',
opts = {
on_attach = function(bufnr)
local gitsigns = require 'gitsigns'
local function map(mode, l, r, opts)
opts = opts or {}
opts.buffer = bufnr
vim.keymap.set(mode, l, r, opts)
end
-- Navigation
map('n', ']c', function()
if vim.wo.diff then
vim.cmd.normal { ']c', bang = true }
else
gitsigns.nav_hunk 'next'
end
end, { desc = 'Jump to next git [c]hange' })
map('n', '[c', function()
if vim.wo.diff then
vim.cmd.normal { '[c', bang = true }
else
gitsigns.nav_hunk 'prev'
end
end, { desc = 'Jump to previous git [c]hange' })
-- Actions
-- visual mode
map('v', '<leader>hs', function()
gitsigns.stage_hunk { vim.fn.line '.', vim.fn.line 'v' }
end, { desc = 'git [s]tage hunk' })
map('v', '<leader>hr', function()
gitsigns.reset_hunk { vim.fn.line '.', vim.fn.line 'v' }
end, { desc = 'git [r]eset hunk' })
-- normal mode
map('n', '<leader>hs', gitsigns.stage_hunk, { desc = 'git [s]tage hunk' })
map('n', '<leader>hr', gitsigns.reset_hunk, { desc = 'git [r]eset hunk' })
map('n', '<leader>hS', gitsigns.stage_buffer, { desc = 'git [S]tage buffer' })
map('n', '<leader>hu', gitsigns.stage_hunk, { desc = 'git [u]ndo stage hunk' })
map('n', '<leader>hR', gitsigns.reset_buffer, { desc = 'git [R]eset buffer' })
map('n', '<leader>hp', gitsigns.preview_hunk, { desc = 'git [p]review hunk' })
map('n', '<leader>hb', gitsigns.blame_line, { desc = 'git [b]lame line' })
map('n', '<leader>hd', gitsigns.diffthis, { desc = 'git [d]iff against index' })
map('n', '<leader>hD', function()
gitsigns.diffthis '@'
end, { desc = 'git [D]iff against last commit' })
-- Toggles
map('n', '<leader>tb', gitsigns.toggle_current_line_blame, { desc = '[T]oggle git show [b]lame line' })
map('n', '<leader>tD', gitsigns.preview_hunk_inline, { desc = '[T]oggle git show [D]eleted' })
end,
},
},
}

View File

@@ -1,9 +0,0 @@
return {
{ -- Add indentation guides even on blank lines
'lukas-reineke/indent-blankline.nvim',
-- Enable `lukas-reineke/indent-blankline.nvim`
-- See `:help ibl`
main = 'ibl',
opts = {},
},
}

View File

@@ -1,60 +0,0 @@
return {
{ -- Linting
'mfussenegger/nvim-lint',
event = { 'BufReadPre', 'BufNewFile' },
config = function()
local lint = require 'lint'
lint.linters_by_ft = {
markdown = { 'markdownlint' },
}
-- To allow other plugins to add linters to require('lint').linters_by_ft,
-- instead set linters_by_ft like this:
-- lint.linters_by_ft = lint.linters_by_ft or {}
-- lint.linters_by_ft['markdown'] = { 'markdownlint' }
--
-- However, note that this will enable a set of default linters,
-- which will cause errors unless these tools are available:
-- {
-- clojure = { "clj-kondo" },
-- dockerfile = { "hadolint" },
-- inko = { "inko" },
-- janet = { "janet" },
-- json = { "jsonlint" },
-- markdown = { "vale" },
-- rst = { "vale" },
-- ruby = { "ruby" },
-- terraform = { "tflint" },
-- text = { "vale" }
-- }
--
-- You can disable the default linters by setting their filetypes to nil:
-- lint.linters_by_ft['clojure'] = nil
-- lint.linters_by_ft['dockerfile'] = nil
-- lint.linters_by_ft['inko'] = nil
-- lint.linters_by_ft['janet'] = nil
-- lint.linters_by_ft['json'] = nil
-- lint.linters_by_ft['markdown'] = nil
-- lint.linters_by_ft['rst'] = nil
-- lint.linters_by_ft['ruby'] = nil
-- lint.linters_by_ft['terraform'] = nil
-- lint.linters_by_ft['text'] = nil
-- Create autocommand which carries out the actual linting
-- on the specified events.
local lint_augroup = vim.api.nvim_create_augroup('lint', { clear = true })
vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, {
group = lint_augroup,
callback = function()
-- Only run the linter in buffers that you can modify in order to
-- avoid superfluous noise, notably within the handy LSP pop-ups that
-- describe the hovered symbol using Markdown.
if vim.opt_local.modifiable:get() then
lint.try_lint()
end
end,
})
end,
},
}

View File

@@ -1,25 +0,0 @@
-- Neo-tree is a Neovim plugin to browse the file system
-- https://github.com/nvim-neo-tree/neo-tree.nvim
return {
'nvim-neo-tree/neo-tree.nvim',
version = '*',
dependencies = {
'nvim-lua/plenary.nvim',
'nvim-tree/nvim-web-devicons', -- not strictly required, but recommended
'MunifTanjim/nui.nvim',
},
cmd = 'Neotree',
keys = {
{ '\\', ':Neotree reveal<CR>', desc = 'NeoTree reveal', silent = true },
},
opts = {
filesystem = {
window = {
mappings = {
['\\'] = 'close_window',
},
},
},
},
}

View File

@@ -0,0 +1,147 @@
-- ============================================================================
-- Completion - nvim-cmp Configuration
-- ============================================================================
return {
{
'hrsh7th/nvim-cmp',
event = 'InsertEnter',
dependencies = {
-- Snippet Engine
{
'L3MON4D3/LuaSnip',
build = (function()
return 'make install_jsregexp'
end)(),
dependencies = {
'rafamadriz/friendly-snippets',
},
},
'saadparwaiz1/cmp_luasnip',
-- Completion Sources
'hrsh7th/cmp-nvim-lsp',
'hrsh7th/cmp-buffer',
'hrsh7th/cmp-path',
},
config = function()
local cmp = require('cmp')
local luasnip = require('luasnip')
-- Friendly snippets laden
require('luasnip.loaders.from_vscode').lazy_load()
-- Custom Snippets für Go
luasnip.add_snippets('go', {
luasnip.snippet('iferr', {
luasnip.text_node('if err != nil {'),
luasnip.text_node({ '', '\treturn err' }),
luasnip.text_node({ '', '}' }),
}),
})
cmp.setup({
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
completion = { completeopt = 'menu,menuone,noinsert' },
-- Keymaps
mapping = cmp.mapping.preset.insert({
-- Select next/prev item
['<C-n>'] = cmp.mapping.select_next_item(),
['<C-p>'] = cmp.mapping.select_prev_item(),
-- Scroll docs
['<C-b>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
-- Confirm completion
['<CR>'] = cmp.mapping.confirm({ select = true }),
-- Manual trigger
['<C-Space>'] = cmp.mapping.complete({}),
-- Tab für Snippet forward/backward + completion
['<Tab>'] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif luasnip.expand_or_locally_jumpable() then
luasnip.expand_or_jump()
else
fallback()
end
end, { 'i', 's' }),
['<S-Tab>'] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
elseif luasnip.locally_jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end, { 'i', 's' }),
}),
-- Sources (Priorität von oben nach unten)
sources = {
{ name = 'nvim_lsp' },
{ name = 'luasnip' },
{ name = 'buffer' },
{ name = 'path' },
},
-- Window styling
window = {
completion = cmp.config.window.bordered(),
documentation = cmp.config.window.bordered(),
},
-- Formatting
formatting = {
fields = { 'kind', 'abbr', 'menu' },
format = function(entry, item)
local icons = {
Text = '',
Method = '󰆧',
Function = '󰊕',
Constructor = '',
Field = '󰇽',
Variable = '󰂡',
Class = '󰠱',
Interface = '',
Module = '',
Property = '󰜢',
Unit = '',
Value = '󰎠',
Enum = '',
Keyword = '󰌋',
Snippet = '',
Color = '󰏘',
File = '󰈙',
Reference = '',
Folder = '󰉋',
EnumMember = '',
Constant = '󰏿',
Struct = '',
Event = '',
Operator = '󰆕',
TypeParameter = '󰅲',
}
item.kind = string.format('%s %s', icons[item.kind] or '', item.kind)
item.menu = ({
nvim_lsp = '[LSP]',
luasnip = '[Snippet]',
buffer = '[Buffer]',
path = '[Path]',
})[entry.source.name]
return item
end,
},
})
end,
},
}

View File

@@ -0,0 +1,67 @@
-- ============================================================================
-- Editor - Quality of Life Plugins
-- ============================================================================
return {
-- Auto pairs
{
'windwp/nvim-autopairs',
event = 'InsertEnter',
config = true,
},
-- Comment.nvim
{
'numToStr/Comment.nvim',
event = { 'BufReadPost', 'BufNewFile' },
dependencies = {
'JoosepAlviste/nvim-ts-context-commentstring',
},
config = function()
require('Comment').setup({
pre_hook = require('ts_context_commentstring.integrations.comment_nvim').create_pre_hook(),
})
end,
},
-- Surround
{
'kylechui/nvim-surround',
version = '*',
event = 'VeryLazy',
config = true,
},
-- Better escape
{
'max397574/better-escape.nvim',
event = 'InsertEnter',
config = function()
require('better_escape').setup({
mapping = { 'jk', 'jj' },
timeout = 200,
})
end,
},
-- Which-key (zeigt Keybindings)
{
'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' },
},
},
},
}

View File

@@ -0,0 +1,77 @@
-- ============================================================================
-- Formatting - conform.nvim
-- ============================================================================
return {
{
'stevearc/conform.nvim',
event = { 'BufWritePre' },
cmd = { 'ConformInfo' },
keys = {
{
'<leader>cf',
function()
require('conform').format({ async = true, lsp_fallback = true })
end,
mode = '',
desc = 'Format buffer',
},
},
opts = {
notify_on_error = false,
format_on_save = function(bufnr)
-- Disable with a global or buffer-local variable
if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then
return
end
return {
timeout_ms = 500,
lsp_fallback = true,
}
end,
formatters_by_ft = {
-- TypeScript/JavaScript
javascript = { 'prettier' },
typescript = { 'prettier' },
javascriptreact = { 'prettier' },
typescriptreact = { 'prettier' },
-- Go
go = { 'gofumpt', 'goimports' },
-- Web
html = { 'prettier' },
css = { 'prettier' },
json = { 'prettier' },
yaml = { 'prettier' },
markdown = { 'prettier' },
-- Lua
lua = { 'stylua' },
-- Shell
sh = { 'shfmt' },
},
},
init = function()
-- Autoformat toggle commands
vim.api.nvim_create_user_command('FormatDisable', function(args)
if args.bang then
vim.b.disable_autoformat = true
else
vim.g.disable_autoformat = true
end
end, {
desc = 'Disable autoformat-on-save',
bang = true,
})
vim.api.nvim_create_user_command('FormatEnable', function()
vim.b.disable_autoformat = false
vim.g.disable_autoformat = false
end, {
desc = 'Re-enable autoformat-on-save',
})
end,
},
}

View File

@@ -0,0 +1,72 @@
-- ============================================================================
-- Git Integration
-- ============================================================================
return {
-- Gitsigns - Git gutter signs
{
'lewis6991/gitsigns.nvim',
event = { 'BufReadPre', 'BufNewFile' },
opts = {
signs = {
add = { text = '' },
change = { text = '' },
delete = { text = '_' },
topdelete = { text = '' },
changedelete = { text = '~' },
untracked = { text = '' },
},
on_attach = function(bufnr)
local gs = package.loaded.gitsigns
local function map(mode, l, r, opts)
opts = opts or {}
opts.buffer = bufnr
vim.keymap.set(mode, l, r, opts)
end
-- Navigation
map('n', ']c', function()
if vim.wo.diff then return ']c' end
vim.schedule(function() gs.next_hunk() end)
return '<Ignore>'
end, { expr = true, desc = 'Next git hunk' })
map('n', '[c', function()
if vim.wo.diff then return '[c' end
vim.schedule(function() gs.prev_hunk() end)
return '<Ignore>'
end, { expr = true, desc = 'Previous git hunk' })
-- 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('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' })
map('n', '<leader>hp', gs.preview_hunk, { desc = 'Preview hunk' })
map('n', '<leader>hb', function() gs.blame_line({ full = true }) end, { desc = 'Blame line' })
map('n', '<leader>tb', gs.toggle_current_line_blame, { desc = 'Toggle blame line' })
map('n', '<leader>hd', gs.diffthis, { desc = 'Diff this' })
map('n', '<leader>hD', function() gs.diffthis('~') end, { desc = 'Diff this ~' })
map('n', '<leader>td', gs.toggle_deleted, { desc = 'Toggle deleted' })
end,
},
},
-- Fugitive - Git commands
{
'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>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>gd', '<cmd>Gdiffsplit<cr>', desc = 'Git diff' },
},
},
}

View File

@@ -0,0 +1,31 @@
-- ============================================================================
-- Harpoon - Schneller File Wechsel
-- ============================================================================
return {
{
'ThePrimeagen/harpoon',
branch = 'harpoon2',
dependencies = { 'nvim-lua/plenary.nvim' },
config = function()
local harpoon = require('harpoon')
-- REQUIRED: Setup
harpoon:setup()
-- Basic Keymaps
vim.keymap.set('n', '<leader>a', function() harpoon:list():add() end, { desc = 'Harpoon: Add file' })
vim.keymap.set('n', '<leader>h', function() harpoon.ui:toggle_quick_menu(harpoon:list()) end, { desc = 'Harpoon: Menu' })
-- Quick file navigation (1-4)
vim.keymap.set('n', '<C-j>', function() harpoon:list():select(1) end, { desc = 'Harpoon: File 1' })
vim.keymap.set('n', '<C-k>', function() harpoon:list():select(2) end, { desc = 'Harpoon: File 2' })
vim.keymap.set('n', '<C-l>', function() harpoon:list():select(3) end, { desc = 'Harpoon: File 3' })
vim.keymap.set('n', '<C-;>', function() harpoon:list():select(4) end, { desc = 'Harpoon: File 4' })
-- Toggle previous & next buffers stored within Harpoon list
vim.keymap.set('n', '<C-S-P>', function() harpoon:list():prev() end, { desc = 'Harpoon: Previous' })
vim.keymap.set('n', '<C-S-N>', function() harpoon:list():next() end, { desc = 'Harpoon: Next' })
end,
},
}

View File

@@ -0,0 +1,276 @@
-- ============================================================================
-- LSP Configuration - TypeScript/Playwright & Go optimiert
-- ============================================================================
return {
{
'neovim/nvim-lspconfig',
event = { 'BufReadPre', 'BufNewFile' },
dependencies = {
-- 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 = {} },
},
config = function()
-- LSP Capabilities für completion
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities)
-- Mason Setup
require('mason').setup({
ui = {
border = 'rounded',
icons = {
package_installed = '',
package_pending = '',
package_uninstalled = ''
}
}
})
-- Mason-LSPConfig: Automatische Server Installation
require('mason-lspconfig').setup({
ensure_installed = {
-- Primary (TypeScript/Playwright)
'ts_ls', -- TypeScript/JavaScript
-- Secondary (Go)
'gopls', -- Go
-- Supporting
'lua_ls', -- Lua (für Neovim config)
'html', -- HTML
'cssls', -- CSS
'jsonls', -- JSON
'yamlls', -- YAML
'dockerls', -- Dockerfile
'docker_compose_language_service', -- Docker Compose
},
})
-- LSP Keybindings (nur wenn LSP attached)
vim.api.nvim_create_autocmd('LspAttach', {
group = vim.api.nvim_create_augroup('lsp-attach', { clear = true }),
callback = function(event)
local map = function(keys, func, desc)
vim.keymap.set('n', keys, func, { buffer = event.buf, desc = 'LSP: ' .. desc })
end
-- Navigation
map('gd', require('telescope.builtin').lsp_definitions, 'Goto Definition')
map('gr', require('telescope.builtin').lsp_references, 'Goto References')
map('gI', require('telescope.builtin').lsp_implementations, 'Goto Implementation')
map('gD', vim.lsp.buf.declaration, 'Goto Declaration')
map('<leader>D', require('telescope.builtin').lsp_type_definitions, 'Type Definition')
-- Documentation
map('K', vim.lsp.buf.hover, 'Hover Documentation')
map('<C-k>', vim.lsp.buf.signature_help, 'Signature Help')
-- Actions
map('<leader>ca', vim.lsp.buf.code_action, 'Code Action')
map('<leader>rn', vim.lsp.buf.rename, 'Rename')
-- Workspace
map('<leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, 'Workspace Symbols')
-- Highlight references unter cursor
local client = vim.lsp.get_client_by_id(event.data.client_id)
if client and client.server_capabilities.documentHighlightProvider then
local highlight_augroup = vim.api.nvim_create_augroup('lsp-highlight', { clear = false })
vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, {
buffer = event.buf,
group = highlight_augroup,
callback = vim.lsp.buf.document_highlight,
})
vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, {
buffer = event.buf,
group = highlight_augroup,
callback = vim.lsp.buf.clear_references,
})
end
end,
})
-- ========== Server Configurations ==========
-- TypeScript/JavaScript (ts_ls)
vim.lsp.config('ts_ls', {
capabilities = capabilities,
settings = {
typescript = {
inlayHints = {
includeInlayParameterNameHints = 'all',
includeInlayParameterNameHintsWhenArgumentMatchesName = false,
includeInlayFunctionParameterTypeHints = true,
includeInlayVariableTypeHints = true,
includeInlayPropertyDeclarationTypeHints = true,
includeInlayFunctionLikeReturnTypeHints = true,
includeInlayEnumMemberValueHints = true,
},
},
javascript = {
inlayHints = {
includeInlayParameterNameHints = 'all',
includeInlayParameterNameHintsWhenArgumentMatchesName = false,
includeInlayFunctionParameterTypeHints = true,
includeInlayVariableTypeHints = true,
includeInlayPropertyDeclarationTypeHints = true,
includeInlayFunctionLikeReturnTypeHints = true,
includeInlayEnumMemberValueHints = true,
},
},
},
})
-- Go (gopls)
vim.lsp.config('gopls', {
capabilities = capabilities,
settings = {
gopls = {
gofumpt = true,
codelenses = {
gc_details = false,
generate = true,
regenerate_cgo = true,
run_govulncheck = true,
test = true,
tidy = true,
upgrade_dependency = true,
vendor = true,
},
hints = {
assignVariableTypes = true,
compositeLiteralFields = true,
compositeLiteralTypes = true,
constantValues = true,
functionTypeParameters = true,
parameterNames = true,
rangeVariableTypes = true,
},
analyses = {
fieldalignment = true,
nilness = true,
unusedparams = true,
unusedwrite = true,
useany = true,
},
usePlaceholders = true,
completeUnimported = true,
staticcheck = true,
directoryFilters = { '-.git', '-.vscode', '-.idea', '-.vscode-test', '-node_modules' },
semanticTokens = true,
},
},
})
-- Lua (lua_ls)
vim.lsp.config('lua_ls', {
capabilities = capabilities,
settings = {
Lua = {
completion = {
callSnippet = 'Replace',
},
diagnostics = {
globals = { 'vim' },
},
},
},
})
-- JSON mit Schema Support
vim.lsp.config('jsonls', {
capabilities = capabilities,
settings = {
json = {
schemas = require('schemastore').json.schemas(),
validate = { enable = true },
},
},
})
-- YAML mit Schema Support
vim.lsp.config('yamlls', {
capabilities = capabilities,
settings = {
yaml = {
schemaStore = {
enable = false,
url = '',
},
schemas = require('schemastore').yaml.schemas(),
},
},
})
-- HTML
vim.lsp.config('html', {
capabilities = capabilities,
})
-- CSS
vim.lsp.config('cssls', {
capabilities = capabilities,
})
-- Docker
vim.lsp.config('dockerls', {
capabilities = capabilities,
})
vim.lsp.config('docker_compose_language_service', {
capabilities = capabilities,
})
-- ========== Diagnostics Configuration ==========
vim.diagnostic.config({
virtual_text = {
prefix = '',
source = 'if_many',
},
signs = true,
underline = true,
update_in_insert = false,
severity_sort = true,
float = {
border = 'rounded',
source = 'always',
header = '',
prefix = '',
},
})
-- 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 = '' })
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,
},
-- SchemaStore für JSON/YAML
{
'b0o/schemastore.nvim',
lazy = true,
},
}

View File

@@ -0,0 +1,113 @@
-- ============================================================================
-- Neo-tree - File Explorer
-- ============================================================================
return {
{
'nvim-neo-tree/neo-tree.nvim',
version = '*',
dependencies = {
'nvim-lua/plenary.nvim',
'nvim-tree/nvim-web-devicons',
'MunifTanjim/nui.nvim',
},
cmd = 'Neotree',
keys = {
{ '<leader>e', '<cmd>Neotree toggle right<CR>', desc = 'Explorer toggle' },
{ '<leader>ef', '<cmd>Neotree focus filesystem right<CR>', desc = 'Explorer focus' },
{ '<leader>eb', '<cmd>Neotree focus buffers right<CR>', desc = 'Explorer buffers' },
{ '<leader>eg', '<cmd>Neotree focus git_status right<CR>', desc = 'Explorer git' },
},
config = function()
require('neo-tree').setup({
close_if_last_window = false,
popup_border_style = 'rounded',
enable_git_status = true,
enable_diagnostics = true,
default_component_configs = {
indent = {
indent_size = 2,
padding = 1,
with_markers = true,
indent_marker = '',
last_indent_marker = '',
with_expanders = true,
expander_collapsed = '',
expander_expanded = '',
},
icon = {
folder_closed = '',
folder_open = '',
folder_empty = '󰜌',
default = '*',
},
modified = {
symbol = '[+]',
},
git_status = {
symbols = {
added = '',
modified = '',
deleted = '',
renamed = '',
untracked = '',
ignored = '',
unstaged = '',
staged = '',
conflict = '',
}
},
},
window = {
position = 'right',
width = 35,
mappings = {
['<space>'] = 'none',
['<2-LeftMouse>'] = 'open',
['<cr>'] = 'open',
['S'] = 'open_split',
['s'] = 'open_vsplit',
['t'] = 'open_tabnew',
['C'] = 'close_node',
['z'] = 'close_all_nodes',
['R'] = 'refresh',
['a'] = {
'add',
config = {
show_path = 'relative'
}
},
['d'] = 'delete',
['r'] = 'rename',
['y'] = 'copy_to_clipboard',
['x'] = 'cut_to_clipboard',
['p'] = 'paste_from_clipboard',
['q'] = 'close_window',
['?'] = 'show_help',
}
},
filesystem = {
filtered_items = {
visible = false,
hide_dotfiles = false,
hide_gitignored = false,
hide_by_name = {
'node_modules'
},
never_show = {
'.DS_Store',
},
},
follow_current_file = {
enabled = true,
leave_dirs_open = false,
},
use_libuv_file_watcher = true,
},
})
end,
},
}

View File

@@ -0,0 +1,89 @@
-- ============================================================================
-- Telescope - Fuzzy Finder
-- ============================================================================
return {
{
'nvim-telescope/telescope.nvim',
event = 'VimEnter',
branch = '0.1.x',
dependencies = {
'nvim-lua/plenary.nvim',
{
'nvim-telescope/telescope-fzf-native.nvim',
build = 'make',
cond = function()
return vim.fn.executable('make') == 1
end,
},
{ 'nvim-telescope/telescope-ui-select.nvim' },
{ 'nvim-tree/nvim-web-devicons', enabled = vim.g.have_nerd_font },
},
config = function()
local telescope = require('telescope')
local actions = require('telescope.actions')
telescope.setup({
defaults = {
prompt_prefix = ' ',
selection_caret = ' ',
path_display = { 'truncate' },
sorting_strategy = 'ascending',
layout_config = {
horizontal = {
prompt_position = 'top',
preview_width = 0.55,
},
vertical = {
mirror = false,
},
width = 0.87,
height = 0.80,
preview_cutoff = 120,
},
mappings = {
i = {
['<C-n>'] = actions.cycle_history_next,
['<C-p>'] = actions.cycle_history_prev,
['<C-j>'] = actions.move_selection_next,
['<C-k>'] = actions.move_selection_previous,
},
},
},
pickers = {
find_files = {
hidden = true,
find_command = { 'rg', '--files', '--hidden', '--glob', '!**/.git/*' },
},
},
extensions = {
['ui-select'] = {
require('telescope.themes').get_dropdown(),
},
},
})
-- Extensions laden
pcall(telescope.load_extension, 'fzf')
pcall(telescope.load_extension, 'ui-select')
-- Keymaps
local builtin = require('telescope.builtin')
vim.keymap.set('n', '<leader>ff', builtin.find_files, { desc = 'Find files' })
vim.keymap.set('n', '<leader>fg', builtin.live_grep, { desc = 'Live grep' })
vim.keymap.set('n', '<leader>fb', builtin.buffers, { desc = 'Buffers' })
vim.keymap.set('n', '<leader>fh', builtin.help_tags, { desc = 'Help tags' })
vim.keymap.set('n', '<leader>fo', builtin.oldfiles, { desc = 'Recent files' })
vim.keymap.set('n', '<leader>fw', builtin.grep_string, { desc = 'Current word' })
vim.keymap.set('n', '<leader>fd', builtin.diagnostics, { desc = 'Diagnostics' })
vim.keymap.set('n', '<leader>fr', builtin.resume, { desc = 'Resume' })
vim.keymap.set('n', '<leader>f.', builtin.oldfiles, { desc = 'Recent files' })
vim.keymap.set('n', '<leader>/', builtin.current_buffer_fuzzy_find, { desc = 'Search in buffer' })
-- Git
vim.keymap.set('n', '<leader>gc', builtin.git_commits, { desc = 'Git commits' })
vim.keymap.set('n', '<leader>gf', builtin.git_files, { desc = 'Git files' })
vim.keymap.set('n', '<leader>gs', builtin.git_status, { desc = 'Git status' })
end,
},
}

View File

@@ -0,0 +1,103 @@
-- ============================================================================
-- Treesitter - Syntax Highlighting
-- ============================================================================
return {
{
'nvim-treesitter/nvim-treesitter',
build = ':TSUpdate',
event = { 'BufReadPost', 'BufNewFile' },
dependencies = {
'nvim-treesitter/nvim-treesitter-textobjects',
},
config = function()
require('nvim-treesitter.configs').setup({
-- Parser die automatisch installiert werden
ensure_installed = {
-- Primary
'typescript',
'tsx',
'javascript',
'go',
-- Supporting
'lua',
'vim',
'vimdoc',
'html',
'css',
'json',
'yaml',
'toml',
'markdown',
'markdown_inline',
'bash',
'dockerfile',
'git_config',
'git_rebase',
'gitcommit',
'gitignore',
},
-- Auto-install parser wenn fehlt
auto_install = true,
-- Syntax highlighting
highlight = {
enable = true,
additional_vim_regex_highlighting = false,
},
-- Indentation
indent = {
enable = true,
},
-- Incremental selection
incremental_selection = {
enable = true,
keymaps = {
init_selection = '<C-space>',
node_incremental = '<C-space>',
scope_incremental = false,
node_decremental = '<bs>',
},
},
-- Text objects
textobjects = {
select = {
enable = true,
lookahead = true,
keymaps = {
['af'] = '@function.outer',
['if'] = '@function.inner',
['ac'] = '@class.outer',
['ic'] = '@class.inner',
},
},
move = {
enable = true,
set_jumps = true,
goto_next_start = {
[']f'] = '@function.outer',
[']c'] = '@class.outer',
},
goto_next_end = {
[']F'] = '@function.outer',
[']C'] = '@class.outer',
},
goto_previous_start = {
['[f'] = '@function.outer',
['[c'] = '@class.outer',
},
goto_previous_end = {
['[F'] = '@function.outer',
['[C'] = '@class.outer',
},
},
},
})
end,
},
}

View File

@@ -0,0 +1,76 @@
-- ============================================================================
-- UI - Colorscheme & Statusline
-- ============================================================================
return {
-- Tokyonight Theme
{
'folke/tokyonight.nvim',
lazy = false,
priority = 1000,
config = function()
require('tokyonight').setup({
style = 'night',
transparent = true,
terminal_colors = true,
styles = {
sidebars = 'transparent',
floats = 'transparent',
},
on_colors = function(colors)
colors.bg_statusline = colors.none
end,
})
vim.cmd.colorscheme('tokyonight-night')
end,
},
-- Lualine Statusline
{
'nvim-lualine/lualine.nvim',
dependencies = { 'nvim-tree/nvim-web-devicons' },
event = 'VeryLazy',
opts = {
options = {
theme = 'tokyonight',
component_separators = { left = '', right = '' },
section_separators = { left = '', right = '' },
globalstatus = true,
},
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' }
},
},
},
-- Indent guides
{
'lukas-reineke/indent-blankline.nvim',
event = { 'BufReadPost', 'BufNewFile' },
main = 'ibl',
opts = {
indent = {
char = '',
},
scope = {
show_start = false,
show_end = false,
},
},
},
}

253
README.md Normal file
View File

@@ -0,0 +1,253 @@
# 🚀 Dotfiles - QA Engineer Dev Setup
Meine persönliche Development-Umgebung optimiert für:
- **TypeScript/Playwright** Testing (QA bei Mobilistics)
- **Go** Development (Benchmarking & Learning)
- **Fish Shell** mit modernen Tools
- **Ghostty** Terminal
- **Neovim** (Scratch Build - kein Framework!)
---
## 📦 Was ist enthalten?
### Core Tools
- **Neovim** - Scratch config mit lazy.nvim (TypeScript/Go optimiert)
- **Fish Shell** - Mit Fisher, NVM, FZF Integration
- **Ghostty** - Modernes Terminal mit Tokyo Night Theme
- **Starship** - Cross-shell prompt
### Development
- **LSP Support**: TypeScript (ts_ls), Go (gopls), Lua, HTML, CSS, JSON, YAML
- **Completion**: nvim-cmp mit Snippets
- **Navigation**: Harpoon, Telescope, Neo-tree
- **Git**: LazyGit, Fugitive, Gitsigns
- **Formatting**: Conform (Prettier, Black, gofumpt)
### System Monitoring
- **btop** - Ressourcen-Monitor
- **neofetch** - System Info
- **yabai** - Tiling Window Manager (macOS)
---
## 🔧 Installation
### Schnellstart (macOS/Linux)
```bash
# 1. Clone das Repo
git clone https://github.com/yourusername/dotfiles.git ~/gits/dotfiles
# 2. Run install script
cd ~/gits/dotfiles
chmod +x install.sh
./install.sh
# 3. Restart terminal
# 4. Open Neovim (plugins werden automatisch installiert)
nvim
```
### Manuelle Installation
```bash
# Core tools installieren
brew install git neovim fish starship fzf ripgrep fd bat btop
brew install --cask ghostty
# Symlinks erstellen
ln -sf ~/gits/dotfiles/.config/fish ~/.config/fish
ln -sf ~/gits/dotfiles/.config/nvim ~/.config/nvim
ln -sf ~/gits/dotfiles/.config/ghostty ~/.config/ghostty
ln -sf ~/gits/dotfiles/.config/starship.toml ~/.config/starship.toml
# Fish als default shell
chsh -s $(which fish)
```
---
## 📁 Struktur
```
dotfiles/
├── .config/
│ ├── fish/ # Fish shell config + plugins
│ │ ├── conf.d/ # Auto-loaded configs
│ │ ├── functions/ # Fish functions
│ │ └── config.fish # Main config
│ ├── ghostty/ # Terminal config + themes
│ ├── nvim/ # Neovim scratch config
│ │ ├── lua/
│ │ │ ├── core/ # Options, keymaps, lazy.nvim
│ │ │ └── plugins/ # Plugin configs (modular!)
│ │ └── init.lua # Entry point
│ ├── btop/ # System monitor config
│ ├── neofetch/ # System info config
│ ├── yabai/ # Window manager (macOS)
│ └── starship.toml # Prompt config
├── .zsh/ # Zsh configs (optional)
├── .zshrc # Zsh config
├── install.sh # Automated setup
└── README.md # This file
```
---
## 🎯 Neovim Keybindings (Wichtigste)
### General
- `<Space>` - Leader key
- `<leader>ee` - Go error handling snippet
### File Navigation
- `<leader>ff` - Telescope find files
- `<leader>fg` - Telescope live grep
- `<leader>fb` - Telescope buffers
- `<leader>e` - Neo-tree toggle
### Harpoon (File Switching)
- `<leader>a` - Mark file
- `<leader>h` - Harpoon menu
- `<C-j>` - Jump to file 1
- `<C-k>` - Jump to file 2
- `<C-l>` - Jump to file 3
- `<C-;>` - Jump to file 4
### Git
- `<leader>gs` - Git status (Fugitive)
- `<leader>gg` - LazyGit
### LSP
- `gd` - Go to definition
- `gr` - Go to references
- `K` - Hover documentation
- `<leader>ca` - Code actions
- `<leader>rn` - Rename
---
## 🔄 Updates
```bash
# Dotfiles updaten
cd ~/gits/dotfiles
git pull
# Neovim plugins updaten
nvim
:Lazy sync
# Fish plugins updaten
fisher update
```
---
## 🛠️ Anpassungen
### Neovim
- **Neue Sprache hinzufügen**: Editiere `~/.config/nvim/lua/plugins/lsp.lua`
- **Neues Plugin**: Erstelle neue Datei in `~/.config/nvim/lua/plugins/`
- **Keymaps ändern**: Editiere `~/.config/nvim/lua/core/keymaps.lua`
### Fish
- **Neue Aliases**: `~/.config/fish/conf.d/aliases.fish`
- **Environment Variables**: `~/.config/fish/conf.d/paths.fish`
- **Functions**: Neue Datei in `~/.config/fish/functions/`
### Ghostty
- **Theme ändern**: Editiere `~/.config/ghostty/config`
- **Neue Themes**: Hinzufügen in `~/.config/ghostty/themes/`
---
## 🐛 Troubleshooting
### Neovim Plugins laden nicht
```bash
# Lazy.nvim neu installieren
rm -rf ~/.local/share/nvim
nvim
```
### Fish Plugins fehlen
```bash
# Fisher neu installieren
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source
fisher install jorgebucaran/fisher
fisher update
```
### LSP funktioniert nicht
```bash
# Mason servers neu installieren
nvim
:Mason
# Dann manuell die benötigten Server installieren
```
---
## 📝 System Requirements
### Minimum
- **OS**: macOS 12+, Linux (Arch, Debian, Fedora)
- **Neovim**: 0.10+
- **Git**: 2.30+
- **Fish**: 3.5+
### Recommended
- **Neovim**: 0.11+ (für moderne LSP APIs)
- **Terminal**: Ghostty, iTerm2, Alacritty
- **Font**: Nerd Font (für Icons)
---
## 🎨 Features
### Neovim
**Scratch Build** - Kein Framework, volle Kontrolle
**Modern APIs** - Neovim 0.11 ready
**TypeScript/Playwright** - Optimiert für QA
**Go Support** - gopls mit gofumpt
**Modular** - Jedes Plugin in eigener Datei
**Lazy Loading** - Schneller Start
### Fish Shell
**NVM Integration** - Node Version Management
**FZF Integration** - Fuzzy finding everywhere
**Git Shortcuts** - Aliases für häufige Commands
**Kubernetes** - kubectl completion
**Auto-completion** - Für Docker, Git, etc.
---
## 📚 Resources
- [Neovim Docs](https://neovim.io/doc/)
- [Fish Shell Docs](https://fishshell.com/docs/current/)
- [Ghostty Terminal](https://ghostty.org/)
- [lazy.nvim](https://github.com/folke/lazy.nvim)
- [ThePrimeagen's Neovim Setup](https://github.com/ThePrimeagen/init.lua)
---
## 📄 License
MIT - Do whatever you want with it!
---
## 🙏 Credits
- **Neovim** Community
- **ThePrimeagen** - Harpoon & Inspiration
- **folke** - lazy.nvim, tokyonight
- **Fish Shell** Community
- **Ghostty** Team
---
**Happy Coding!** 🚀

View File

@@ -1,11 +1,11 @@
#!/bin/bash #!/bin/bash
# Dotfiles Installation Script - Cross-Platform # Dotfiles Installation Script - Cross-Platform
# Test Developer Setup: Fish or Zsh + Ghostty + Tools # Optimiert für Fish + Ghostty + Neovim Scratch Setup
set -e # Exit on error set -e # Exit on error
DOTFILES_DIR="$HOME/git/dotfiles" DOTFILES_DIR="$HOME/gits/dotfiles"
BACKUP_DIR="$HOME/.config-backup-$(date +%Y%m%d-%H%M%S)" BACKUP_DIR="$HOME/.config-backup-$(date +%Y%m%d-%H%M%S)"
# Colors # Colors
@@ -38,12 +38,6 @@ detect_os() {
elif [[ -f /etc/fedora-release ]]; then elif [[ -f /etc/fedora-release ]]; then
OS="fedora" OS="fedora"
PACKAGE_MANAGER="dnf" PACKAGE_MANAGER="dnf"
elif [[ -f /etc/redhat-release ]]; then
OS="rhel"
PACKAGE_MANAGER="yum"
elif [[ -f /etc/opensuse-release ]]; then
OS="opensuse"
PACKAGE_MANAGER="zypper"
else else
error "Unsupported operating system" error "Unsupported operating system"
exit 1 exit 1
@@ -72,14 +66,6 @@ install_package_manager() {
log "DNF detected - updating package database..." log "DNF detected - updating package database..."
sudo dnf check-update || true sudo dnf check-update || true
;; ;;
"yum")
log "YUM detected - updating package database..."
sudo yum check-update || true
;;
"zypper")
log "Zypper detected - updating package database..."
sudo zypper refresh
;;
esac esac
} }
@@ -100,12 +86,6 @@ install_package() {
"dnf") "dnf")
sudo dnf install -y "$package" sudo dnf install -y "$package"
;; ;;
"yum")
sudo yum install -y "$package"
;;
"zypper")
sudo zypper install -y "$package"
;;
esac esac
} }
@@ -118,51 +98,13 @@ install_cask() {
brew install --cask "$app" brew install --cask "$app"
;; ;;
"pacman") "pacman")
# This shouldn't be called for Arch anymore since we use yay directly # Use yay for AUR packages
warn "Arch Linux packages should be installed via yay, not individual pacman calls" if command -v yay &> /dev/null; then
;; yay -S --noconfirm "$app"
"apt") fi
case $app in
"brave-browser")
# Add Brave repository
curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg arch=amd64] https://brave-browser-apt-release.s3.brave.com/ stable main" | sudo tee /etc/apt/sources.list.d/brave-browser-release.list
sudo apt update
sudo apt install -y brave-browser
;;
"postman")
warn "Install Postman via Snap: sudo snap install postman"
;;
"1password")
# Add 1Password repository
curl -sS https://downloads.1password.com/linux/keys/1password.asc | sudo gpg --dearmor --output /usr/share/keyrings/1password-archive-keyring.gpg
echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/1password-archive-keyring.gpg] https://downloads.1password.com/linux/debian/amd64 stable main' | sudo tee /etc/apt/sources.list.d/1password.list
sudo apt update
sudo apt install -y 1password
;;
"parsec")
warn "Download Parsec manually from parseapp.com"
;;
"ghostty")
warn "Ghostty needs manual installation or Flatpak"
;;
esac
;;
"dnf"|"yum")
case $app in
"brave-browser")
sudo dnf config-manager --add-repo https://brave-browser-rpm-release.s3.brave.com/x86_64/
sudo rpm --import https://brave-browser-rpm-release.s3.brave.com/brave-core.asc
sudo dnf install -y brave-browser
;; ;;
*) *)
warn "Install $app via Flatpak: flatpak install $app" warn "GUI app installation for $app not supported on $OS"
;;
esac
;;
*)
warn "GUI app installation for $app not implemented for $PACKAGE_MANAGER"
warn "Consider using Flatpak: flatpak install $app"
;; ;;
esac esac
} }
@@ -170,8 +112,8 @@ install_cask() {
header() { header() {
echo -e "${BLUE} echo -e "${BLUE}
╔════════════════════════════════════╗ ╔════════════════════════════════════╗
Complete Development Setup ║ QA Engineer Dev Setup
Cross-Platform Tool Installer TypeScript/Playwright + Go
╚════════════════════════════════════╝${NC}" ╚════════════════════════════════════╝${NC}"
} }
@@ -195,45 +137,48 @@ backup_configs() {
# Backup existing configs # Backup existing configs
[ -d ~/.config/fish ] && cp -r ~/.config/fish "$BACKUP_DIR/" [ -d ~/.config/fish ] && cp -r ~/.config/fish "$BACKUP_DIR/"
[ -f ~/.zshrc ] && cp ~/.zshrc "$BACKUP_DIR/"
[ -d ~/.config/ghostty ] && cp -r ~/.config/ghostty "$BACKUP_DIR/" [ -d ~/.config/ghostty ] && cp -r ~/.config/ghostty "$BACKUP_DIR/"
[ -d ~/.config/nvim ] && cp -r ~/.config/nvim "$BACKUP_DIR/"
[ -d ~/.config/neofetch ] && cp -r ~/.config/neofetch "$BACKUP_DIR/" [ -d ~/.config/neofetch ] && cp -r ~/.config/neofetch "$BACKUP_DIR/"
[ -d ~/.config/btop ] && cp -r ~/.config/btop "$BACKUP_DIR/"
[ -d ~/.config/yabai ] && cp -r ~/.config/yabai "$BACKUP_DIR/"
[ -f ~/.config/starship.toml ] && cp ~/.config/starship.toml "$BACKUP_DIR/" [ -f ~/.config/starship.toml ] && cp ~/.config/starship.toml "$BACKUP_DIR/"
[ -f ~/.zshrc ] && cp ~/.zshrc "$BACKUP_DIR/"
log "Backup created: $BACKUP_DIR" log "Backup created: $BACKUP_DIR"
} }
install_tools() { install_core_tools() {
log "Installing development tools..." log "Installing core development tools..."
# Core tools - OS specific package names
case $OS in case $OS in
"macos") "macos")
# Command line tools # Essential CLI tools
install_package starship
install_package neofetch
install_package btop
install_package git install_package git
install_package neovim
install_package fish
install_package starship
install_package fzf install_package fzf
install_package ripgrep install_package ripgrep
install_package fd install_package fd
install_package bat install_package bat
install_package btop
install_package neofetch
# Development
install_package go install_package go
install_package python3 install_package python3
install_package node install_package node
install_package syncthing
install_package tailscale
install_package vim
# GUI Applications # Terminal
install_cask parsec
install_cask postman
install_cask 1password
install_cask brave-browser
install_cask ghostty install_cask ghostty
# Optional tools
install_package direnv
install_package lazygit
;; ;;
"arch") "arch")
# Check if yay is installed, install if not # Check if yay is installed
if ! command -v yay &> /dev/null; then if ! command -v yay &> /dev/null; then
log "Installing yay AUR helper..." log "Installing yay AUR helper..."
sudo pacman -S --needed base-devel git sudo pacman -S --needed base-devel git
@@ -242,693 +187,196 @@ install_tools() {
cd - && rm -rf /tmp/yay cd - && rm -rf /tmp/yay
fi fi
# Install everything via yay (handles both official repos + AUR) # Install via yay
log "Installing all packages via yay..."
yay -S --noconfirm \ yay -S --noconfirm \
starship \ git neovim fish starship fzf ripgrep fd bat btop neofetch \
neofetch \ go python nodejs npm \
btop \ ghostty direnv lazygit
git \
fzf \
ripgrep \
fd \
bat \
go \
python \
nodejs \
npm \
syncthing \
tailscale \
vim \
parsec \
postman-bin \
1password \
brave-bin \
ghostty
;; ;;
"debian") "debian"|"fedora")
# Command line tools # Basic tools
install_package git install_package git
install_package fish
install_package fzf install_package fzf
install_package ripgrep install_package ripgrep
install_package fd-find install_package fd-find
install_package bat install_package bat
install_package golang-go
install_package python3
install_package nodejs
install_package npm
install_package syncthing
install_package vim
# Install starship manually
curl -sS https://starship.rs/install.sh | sh
install_package neofetch install_package neofetch
# Tailscale # Neovim (from source if needed)
curl -fsSL https://tailscale.com/install.sh | sh if ! command -v nvim &> /dev/null; then
warn "Installing Neovim from source..."
install_neovim_from_source
fi
warn "GUI applications need manual installation on Debian/Ubuntu:" # Starship
warn "- Parsec, Postman, 1Password, Brave Browser" curl -sS https://starship.rs/install.sh | sh
warn "- btop may need manual installation on older versions"
;; # Development
"fedora"|"rhel")
# Command line tools
install_package git
install_package fzf
install_package ripgrep
install_package fd-find
install_package bat
install_package golang install_package golang
install_package python3 install_package python3
install_package nodejs install_package nodejs
install_package npm
install_package syncthing
install_package vim
# Install starship manually warn "Ghostty needs manual installation on $OS"
curl -sS https://starship.rs/install.sh | sh
install_package neofetch
# Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
warn "GUI applications available via Flatpak or manual installation"
;;
"opensuse")
# Command line tools
install_package git
install_package fzf
install_package ripgrep
install_package fd
install_package bat
install_package go
install_package python3
install_package nodejs
install_package npm
install_package syncthing
install_package vim
# Install starship manually
curl -sS https://starship.rs/install.sh | sh
install_package neofetch
# Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
warn "GUI applications may need manual installation"
;; ;;
esac esac
# Setup vim and other tools log "Core tools installed!"
setup_vim
install_node_tools
log "Tools installation complete!"
# Show post-installation notes
show_post_install_notes
} }
show_post_install_notes() { install_neovim_from_source() {
log "Building Neovim from source..."
# Install build dependencies
case $OS in case $OS in
"macos"|"arch") "debian")
log "All tools installed successfully!" sudo apt install -y ninja-build gettext cmake unzip curl build-essential
;; ;;
"debian"|"fedora"|"rhel"|"opensuse") "fedora")
warn "Additional GUI apps can be installed via:" sudo dnf install -y ninja-build cmake gcc make unzip gettext curl
warn "• Flatpak: flatpak install brave postman"
warn "• Snap: snap install brave postman"
warn "• Manual downloads from official websites"
warn "• AppImage versions where available"
;; ;;
esac esac
}
install_node_tools() { # Clone and build
log "Installing Node.js tools..." cd /tmp
git clone https://github.com/neovim/neovim
# Ensure npm is available cd neovim
if command -v npm &> /dev/null; then git checkout stable
npm install -g @playwright/test make CMAKE_BUILD_TYPE=Release
npx playwright install sudo make install
else cd ~
warn "npm not found, skipping Playwright installation" rm -rf /tmp/neovim
fi
} log "Neovim installed from source"
setup_vim() {
log "Setting up Kickstart Vim..."
# Backup existing .vimrc
[ -f ~/.vimrc ] && mv ~/.vimrc ~/.vimrc.backup.$(date +%Y%m%d-%H%M%S)
# Clone or update kickstart.vim
if [ -d ~/kickstart.vim ]; then
cd ~/kickstart.vim && git pull
else
git clone https://github.com/theopn/kickstart.vim.git ~/kickstart.vim
fi
# Create symlink
ln -sf ~/kickstart.vim/.vimrc ~/.vimrc
# Install plugins
vim +PlugInstall +qa
}
setup_dotfiles_symlinks() {
log "Creating dotfiles symlinks..."
# Remove existing configs
rm -rf ~/.config/neofetch ~/.config/btop
rm -f ~/.config/starship.toml
# Create symlinks to dotfiles - common configs
ln -sf "$DOTFILES_DIR/neofetch" ~/.config/neofetch
ln -sf "$DOTFILES_DIR/terminal/starship.toml" ~/.config/starship.toml
# Ghostty (only if directory exists in dotfiles)
if [ -d "$DOTFILES_DIR/terminal/ghostty" ]; then
rm -rf ~/.config/ghostty
ln -sf "$DOTFILES_DIR/terminal/ghostty" ~/.config/ghostty
fi
# Btop config
mkdir -p ~/.config/btop
if [ -f "$DOTFILES_DIR/btop/btop.conf" ]; then
ln -sf "$DOTFILES_DIR/btop/btop.conf" ~/.config/btop/btop.conf
fi
if [ -d "$DOTFILES_DIR/btop/themes" ]; then
ln -sf "$DOTFILES_DIR/btop/themes" ~/.config/btop/themes
fi
log "Dotfiles symlinks created!"
}
setup_auto_updates() {
log "Setting up automatic system updates..."
# Create update script
local update_script="$HOME/.local/bin/update-system.sh"
mkdir -p "$(dirname "$update_script")"
:
# Copy the update script content (same as before)
cat > "$update_script" << 'EOF'
#!/bin/bash
# System Update Script
# Updates all packages, dotfiles, and development tools
DOTFILES_DIR="$HOME/git/dotfiles"
LOG_FILE="$HOME/.local/share/system-updates.log"
LAST_UPDATE_FILE="$HOME/.local/share/last-system-update"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
# Colors for output
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
log() {
echo -e "${GREEN}[INFO]${NC} $1"
echo "[$DATE] INFO: $1" >> "$LOG_FILE"
}
warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
echo "[$DATE] WARN: $1" >> "$LOG_FILE"
}
error() {
echo -e "${RED}[ERROR]${NC} $1"
echo "[$DATE] ERROR: $1" >> "$LOG_FILE"
}
detect_os() {
if [[ "$OSTYPE" == "darwin"* ]]; then
OS="macos"
PACKAGE_MANAGER="brew"
elif [[ -f /etc/arch-release ]]; then
OS="arch"
PACKAGE_MANAGER="yay"
elif [[ -f /etc/debian_version ]]; then
OS="debian"
PACKAGE_MANAGER="apt"
elif [[ -f /etc/fedora-release ]]; then
OS="fedora"
PACKAGE_MANAGER="dnf"
elif [[ -f /etc/redhat-release ]]; then
OS="rhel"
PACKAGE_MANAGER="yum"
else
OS="unknown"
PACKAGE_MANAGER="unknown"
fi
}
is_update_needed() {
if [ ! -f "$LAST_UPDATE_FILE" ]; then
return 0 # No previous update, run it
fi
local last_update=$(cat "$LAST_UPDATE_FILE" 2>/dev/null || echo "0")
local current_date=$(date +%s)
local days_since_update=$(( (current_date - last_update) / 86400 ))
if [ $days_since_update -ge 30 ]; then
log "Last update was $days_since_update days ago, running update..."
return 0
else
log "Last update was $days_since_update days ago, skipping..."
return 1
fi
}
update_system_packages() {
log "Updating system packages ($OS)..."
case $PACKAGE_MANAGER in
"brew")
brew update
brew upgrade
brew cleanup
;;
"yay")
yay -Syu --noconfirm
yay -Yc --noconfirm
;;
"apt")
sudo apt update
sudo apt upgrade -y
sudo apt autoremove -y
sudo apt autoclean
;;
"dnf")
sudo dnf upgrade -y
sudo dnf autoremove -y
;;
"yum")
sudo yum update -y
sudo yum clean all
;;
esac
}
update_dotfiles() {
log "Updating dotfiles..."
if [ -d "$DOTFILES_DIR/.git" ]; then
cd "$DOTFILES_DIR"
git fetch origin
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse @{u})
if [ "$LOCAL" != "$REMOTE" ]; then
git pull origin main || git pull origin master
log "Dotfiles updated"
else
log "Dotfiles up to date"
fi
fi
}
update_vim_plugins() {
if [ -f "$HOME/.vimrc" ] && command -v vim &> /dev/null; then
vim +PlugUpdate +PlugClean! +qa
log "Vim plugins updated"
fi
}
update_node_packages() {
if command -v npm &> /dev/null; then
npm update -g
log "npm packages updated"
fi
if command -v npx &> /dev/null; then
npx playwright install 2>/dev/null || true
fi
}
mark_update_completed() {
date +%s > "$LAST_UPDATE_FILE"
log "Update timestamp saved"
}
main() {
mkdir -p "$(dirname "$LOG_FILE")"
mkdir -p "$(dirname "$LAST_UPDATE_FILE")"
# Check if running with --force flag
if [[ "$1" == "--force" ]] || is_update_needed; then
echo "[$DATE] Starting system update..." >> "$LOG_FILE"
detect_os
log "Starting update process..."
update_system_packages
update_dotfiles
update_vim_plugins
update_node_packages
mark_update_completed
log "Update completed!"
echo "[$DATE] Update completed" >> "$LOG_FILE"
fi
}
main "$@"
EOF
chmod +x "$update_script"
# Create startup check script
create_startup_check "$update_script"
# Setup traditional cron job (for always-on systems)
setup_cron_job "$update_script"
# Setup system-specific startup methods
setup_startup_updates "$update_script"
log "Auto-update system configured!"
log "Updates will run:"
log "• Monthly on 1st at 2:00 AM (if system is on)"
log "• At startup if update is overdue (30+ days)"
log "• Manual: $update_script --force"
log "View logs: tail -f ~/.local/share/system-updates.log"
}
create_startup_check() {
local update_script="$1"
local startup_check="$HOME/.local/bin/check-updates-on-startup.sh"
cat > "$startup_check" << EOF
#!/bin/bash
# Check for overdue updates on startup (runs max once per day)
DAILY_CHECK_FILE="\$HOME/.local/share/daily-update-check"
TODAY=\$(date +%Y-%m-%d)
# Only run once per day
if [ -f "\$DAILY_CHECK_FILE" ] && [ "\$(cat "\$DAILY_CHECK_FILE" 2>/dev/null)" = "\$TODAY" ]; then
exit 0
fi
# Mark today as checked
echo "\$TODAY" > "\$DAILY_CHECK_FILE"
# Run update check in background (non-blocking)
nohup "$update_script" > /dev/null 2>&1 &
EOF
chmod +x "$startup_check"
return "$startup_check"
}
setup_startup_updates() {
local update_script="$1"
local startup_check="$HOME/.local/bin/check-updates-on-startup.sh"
case $OS in
"macos")
setup_macos_startup "$startup_check"
;;
"arch"|"debian"|"fedora"|"rhel")
setup_linux_startup "$startup_check"
;;
esac
}
setup_macos_startup() {
local startup_check="$1"
local plist_file="$HOME/Library/LaunchAgents/com.user.system-updates.plist"
log "Setting up macOS LaunchAgent for startup updates..."
mkdir -p "$HOME/Library/LaunchAgents"
cat > "$plist_file" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.system-updates</string>
<key>ProgramArguments</key>
<array>
<string>$startup_check</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StandardOutPath</key>
<string>$HOME/.local/share/startup-updates.log</string>
<key>StandardErrorPath</key>
<string>$HOME/.local/share/startup-updates-error.log</string>
</dict>
</plist>
EOF
# Load the LaunchAgent
launchctl load "$plist_file" 2>/dev/null || warn "LaunchAgent setup may need manual activation"
log "macOS startup updates configured"
}
setup_linux_startup() {
local startup_check="$1"
# Try systemd user service first
if command -v systemctl &> /dev/null; then
setup_systemd_user_service "$startup_check"
else
# Fallback to shell profile
setup_shell_profile_check "$startup_check"
fi
}
setup_systemd_user_service() {
local startup_check="$1"
local service_dir="$HOME/.config/systemd/user"
log "Setting up systemd user service for startup updates..."
mkdir -p "$service_dir"
# Create service file
cat > "$service_dir/system-updates.service" << EOF
[Unit]
Description=System Updates Check
After=network-online.target
[Service]
Type=oneshot
ExecStart=$startup_check
StandardOutput=append:$HOME/.local/share/startup-updates.log
StandardError=append:$HOME/.local/share/startup-updates-error.log
[Install]
WantedBy=default.target
EOF
# Enable the service
systemctl --user daemon-reload
systemctl --user enable system-updates.service
log "systemd user service configured"
}
setup_shell_profile_check() {
local startup_check="$1"
log "Adding startup update check to shell profiles..."
# Add to shell profiles (as fallback)
local check_line="# Auto-update check (once per day)
if [ -f \"$startup_check\" ]; then
\"$startup_check\" &
fi"
# Add to profiles that exist
for profile in ~/.profile ~/.bash_profile ~/.zprofile; do
if [ -f "$profile" ]; then
if ! grep -q "check-updates-on-startup" "$profile"; then
echo "$check_line" >> "$profile"
log "Added to $profile"
fi
fi
done
}
setup_cron_job() {
local script_path="$1"
log "Setting up monthly cron job..."
# Create cron job entry
local cron_job="0 2 1 * * $script_path >> ~/.local/share/cron-updates.log 2>&1"
# Add to crontab if not already present
(crontab -l 2>/dev/null | grep -v "$script_path"; echo "$cron_job") | crontab -
log "Cron job installed: Monthly updates on 1st at 2:00 AM"
# Show current crontab
log "Current cron jobs:"
crontab -l | grep -v "^#" || warn "No cron jobs found"
} }
setup_fish() { setup_fish() {
log "Setting up Fish shell..." log "Setting up Fish shell..."
# Install Fish
install_package fish
# Install Fisher (Fish plugin manager) # Install Fisher (Fish plugin manager)
if ! command -v fisher &> /dev/null; then if ! fish -c "type -q fisher" 2>/dev/null; then
fish -c "curl -sL https://git.io/fisher | source && fisher install jorgebucaran/fisher" log "Installing Fisher..."
fish -c "curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher"
fi fi
# Remove existing fish config # Remove existing fish config (if not symlink)
if [ ! -L ~/.config/fish ] && [ -d ~/.config/fish ]; then
rm -rf ~/.config/fish rm -rf ~/.config/fish
fi
# Create symlink to dotfiles # Create symlink to dotfiles
ln -sf "$DOTFILES_DIR/shells/fish" ~/.config/fish ln -sf "$DOTFILES_DIR/.config/fish" ~/.config/fish
# Install Fish plugins # Install Fish plugins
log "Installing Fish plugins..." log "Installing Fish plugins..."
fish -c "fisher install jorgebucaran/nvm.fish" fish -c "fisher install jorgebucaran/nvm.fish" || true
fish -c "fisher install PatrickF1/fzf.fish" fish -c "fisher install PatrickF1/fzf.fish" || true
fish -c "fisher install franciscolourenco/done" fish -c "fisher install franciscolourenco/done" || true
# Install Node.js via NVM (if available)
if command -v fish &> /dev/null; then
fish -c "nvm install latest && nvm use latest" || warn "NVM setup failed, Node.js should be available via system package"
fi
# Set as default shell # Set as default shell
local fish_path=$(which fish) local fish_path=$(which fish)
if ! grep -q "$fish_path" /etc/shells; then if ! grep -q "$fish_path" /etc/shells 2>/dev/null; then
echo "$fish_path" | sudo tee -a /etc/shells echo "$fish_path" | sudo tee -a /etc/shells
fi fi
if [ "$SHELL" != "$fish_path" ]; then
log "Setting Fish as default shell..."
chsh -s "$fish_path" chsh -s "$fish_path"
fi
log "Fish shell configured!" log "Fish shell configured!"
} }
setup_zsh() { setup_neovim() {
log "Setting up Zsh shell..." log "Setting up Neovim..."
# Install Zsh # Remove existing nvim config (if not symlink)
install_package zsh if [ ! -L ~/.config/nvim ] && [ -d ~/.config/nvim ]; then
rm -rf ~/.config/nvim
# Remove existing configs
rm -rf ~/.zshrc ~/.oh-my-zsh
# Install Oh My Zsh
RUNZSH=no sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# Install NVM for Zsh (cross-platform)
if [ ! -d "$HOME/.nvm" ]; then
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
fi fi
# Create symlink to dotfiles # Create symlink
ln -sf "$DOTFILES_DIR/shells/zsh/.zshrc" ~/.zshrc ln -sf "$DOTFILES_DIR/.config/nvim" ~/.config/nvim
# Install Node.js via NVM log "Neovim configured! Run 'nvim' to install plugins on first start."
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
if command -v nvm &> /dev/null; then
nvm install node && nvm use node
else
warn "NVM setup failed, using system Node.js"
fi
# Set as default shell
local zsh_path=$(which zsh)
if ! grep -q "$zsh_path" /etc/shells; then
echo "$zsh_path" | sudo tee -a /etc/shells
fi
chsh -s "$zsh_path"
log "Zsh shell configured!"
} }
show_menu() { setup_other_configs() {
echo -e "${BLUE} log "Setting up other configurations..."
Select your shell setup:
1) Fish Shell # Ghostty
- Modern auto-completion if [ -d "$DOTFILES_DIR/.config/ghostty" ]; then
- Clean configuration rm -rf ~/.config/ghostty
- User-friendly syntax ln -sf "$DOTFILES_DIR/.config/ghostty" ~/.config/ghostty
fi
2) Zsh Shell # Starship
- POSIX compatible ln -sf "$DOTFILES_DIR/.config/starship.toml" ~/.config/starship.toml
- Oh-My-Zsh framework
- Traditional Unix shell
Detected OS: $OS ($PACKAGE_MANAGER) # Neofetch
if [ -d "$DOTFILES_DIR/.config/neofetch" ]; then
rm -rf ~/.config/neofetch
ln -sf "$DOTFILES_DIR/.config/neofetch" ~/.config/neofetch
fi
Tools to be installed: # Btop
• Development: Go, Python, Node.js, Git, Vim if [ -d "$DOTFILES_DIR/.config/btop" ]; then
• Terminal: Starship, Neofetch, btop, fzf, ripgrep, fd, bat mkdir -p ~/.config/btop
• Networking: Syncthing, Tailscale ln -sf "$DOTFILES_DIR/.config/btop/btop.conf" ~/.config/btop/btop.conf
• Applications: Parsec, Postman, 1Password, Brave Browser [ -d "$DOTFILES_DIR/.config/btop/themes" ] && ln -sf "$DOTFILES_DIR/.config/btop/themes" ~/.config/btop/themes
• Testing: Playwright framework fi
${NC}" # Yabai (macOS only)
read -p "Choose (1-2): " choice if [ "$OS" = "macos" ] && [ -d "$DOTFILES_DIR/.config/yabai" ]; then
rm -rf ~/.config/yabai
ln -sf "$DOTFILES_DIR/.config/yabai" ~/.config/yabai
fi
# Zsh (if exists)
if [ -f "$DOTFILES_DIR/.zshrc" ]; then
ln -sf "$DOTFILES_DIR/.zshrc" ~/.zshrc
fi
log "Configurations symlinked!"
}
install_playwright() {
log "Installing Playwright..."
if command -v npm &> /dev/null; then
npm install -g @playwright/test
npx playwright install
log "Playwright installed!"
else
warn "npm not found, skipping Playwright"
fi
} }
main() { main() {
header header
check_prerequisites check_prerequisites
backup_configs backup_configs
install_tools install_core_tools
setup_dotfiles_symlinks
setup_auto_updates
show_menu
case $choice in
1)
setup_fish setup_fish
log "Fish setup complete! Restart your terminal." setup_neovim
;; setup_other_configs
2) install_playwright
setup_zsh
log "Zsh setup complete! Restart your terminal."
;;
*)
error "Invalid choice. Exiting."
exit 1
;;
esac
echo -e "${GREEN} echo -e "${GREEN}
╔══════════════════════════════════════════════════════════╗ ╔══════════════════════════════════════════════════════════╗
║ Setup Complete! ║ ║ Setup Complete! ║
║ ║ ║ ║
║ ✓ $OS system detected ║ ║ ✓ $OS detected
║ ✓ Fish shell configured ║
║ ✓ Neovim (Scratch) configured ║
║ ✓ Ghostty terminal configured ║
║ ✓ Development tools installed ║ ║ ✓ Development tools installed ║
║ ✓ Dotfiles symlinked ║ ║ ✓ Dotfiles symlinked ║
║ ✓ Shell configured ║
║ ✓ Smart auto-updates enabled ║
║ ║ ║ ║
Updates run automatically: Next steps:
• Monthly (1st at 2 AM) if system is on 1. Restart your terminal
• At startup if overdue (30+ days) 2. Run 'nvim' to install plugins
• Max once per day (non-blocking) 3. Enjoy your setup!
║ ║
║ Manual commands: ║
║ • Force update: ~/.local/bin/update-system.sh --force ║
║ • View logs: tail -f ~/.local/share/system-updates.log ║
║ ║
║ Perfect for laptops and desktops! ║
║ ║
║ Restart terminal to see changes! ║
║ ║ ║ ║
║ Backup: $BACKUP_DIR ║ Backup: $BACKUP_DIR
╚══════════════════════════════════════════════════════════╝${NC}" ╚══════════════════════════════════════════════════════════╝${NC}"