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:
8
.config/fish/conf.d/direnv.fish
Normal file
8
.config/fish/conf.d/direnv.fish
Normal 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
|
||||||
3
.config/fish/functions/ssh.fish
Normal file
3
.config/fish/functions/ssh.fish
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
function ssh
|
||||||
|
TERM=xterm-256color command ssh $argv
|
||||||
|
end
|
||||||
24
.config/ghostty/themes/tokyonight_night.yml
Normal file
24
.config/ghostty/themes/tokyonight_night.yml
Normal 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
|
||||||
8
.config/nvim.bak/.gitignore
vendored
8
.config/nvim.bak/.gitignore
vendored
@@ -1,8 +0,0 @@
|
|||||||
tt.*
|
|
||||||
.tests
|
|
||||||
doc/tags
|
|
||||||
debug
|
|
||||||
.repro
|
|
||||||
foo.*
|
|
||||||
*.log
|
|
||||||
data
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"neodev": {
|
|
||||||
"library": {
|
|
||||||
"enabled": true,
|
|
||||||
"plugins": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"neoconf": {
|
|
||||||
"plugins": {
|
|
||||||
"lua_ls": {
|
|
||||||
"enabled": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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.
|
|
||||||
@@ -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.
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
-- bootstrap lazy.nvim, LazyVim and your plugins
|
|
||||||
require("config.lazy")
|
|
||||||
@@ -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" }
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"extras": [
|
|
||||||
|
|
||||||
],
|
|
||||||
"install_version": 8,
|
|
||||||
"news": {
|
|
||||||
"NEWS.md": "10960"
|
|
||||||
},
|
|
||||||
"version": 8
|
|
||||||
}
|
|
||||||
@@ -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,
|
|
||||||
})
|
|
||||||
@@ -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" })
|
|
||||||
@@ -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",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
@@ -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
|
|
||||||
@@ -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,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -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",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -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" },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -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)" },
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -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,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -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" },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -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,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
indent_type = "Spaces"
|
|
||||||
indent_width = 2
|
|
||||||
column_width = 120
|
|
||||||
@@ -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. -->
|
|
||||||
|
|
||||||
```
|
|
||||||
```
|
|
||||||
@@ -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.
|
|
||||||
**************************************************************************
|
|
||||||
|
|
||||||
21
.config/nvim/.github/workflows/stylua.yml
vendored
21
.config/nvim/.github/workflows/stylua.yml
vendored
@@ -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 .
|
|
||||||
|
|
||||||
21
.config/nvim/.gitignore
vendored
21
.config/nvim/.gitignore
vendored
@@ -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
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
column_width = 160
|
|
||||||
line_endings = "Unix"
|
|
||||||
indent_type = "Spaces"
|
|
||||||
indent_width = 2
|
|
||||||
quote_style = "AutoPreferSingle"
|
|
||||||
call_parentheses = "None"
|
|
||||||
@@ -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.
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
|
||||||
@@ -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
@@ -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" }
|
||||||
}
|
}
|
||||||
|
|||||||
50
.config/nvim/lua/core/keymaps.lua
Normal file
50
.config/nvim/lua/core/keymaps.lua
Normal 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' })
|
||||||
45
.config/nvim/lua/core/lazy.lua
Normal file
45
.config/nvim/lua/core/lazy.lua
Normal 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,
|
||||||
|
},
|
||||||
|
})
|
||||||
61
.config/nvim/lua/core/options.lua
Normal file
61
.config/nvim/lua/core/options.lua
Normal 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
|
||||||
@@ -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
|
|
||||||
})
|
|
||||||
@@ -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 } },
|
|
||||||
}
|
|
||||||
})
|
|
||||||
@@ -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' })
|
|
||||||
@@ -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,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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 {}
|
|
||||||
@@ -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,
|
|
||||||
}
|
|
||||||
@@ -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,
|
|
||||||
}
|
|
||||||
@@ -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,
|
|
||||||
}
|
|
||||||
@@ -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,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -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 = {},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -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,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -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',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
147
.config/nvim/lua/plugins/completion.lua
Normal file
147
.config/nvim/lua/plugins/completion.lua
Normal 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,
|
||||||
|
},
|
||||||
|
}
|
||||||
67
.config/nvim/lua/plugins/editor.lua
Normal file
67
.config/nvim/lua/plugins/editor.lua
Normal 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' },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
77
.config/nvim/lua/plugins/formatting.lua
Normal file
77
.config/nvim/lua/plugins/formatting.lua
Normal 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,
|
||||||
|
},
|
||||||
|
}
|
||||||
72
.config/nvim/lua/plugins/git.lua
Normal file
72
.config/nvim/lua/plugins/git.lua
Normal 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' },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
31
.config/nvim/lua/plugins/harpoon.lua
Normal file
31
.config/nvim/lua/plugins/harpoon.lua
Normal 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,
|
||||||
|
},
|
||||||
|
}
|
||||||
276
.config/nvim/lua/plugins/lsp.lua
Normal file
276
.config/nvim/lua/plugins/lsp.lua
Normal 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,
|
||||||
|
},
|
||||||
|
}
|
||||||
113
.config/nvim/lua/plugins/neotree.lua
Normal file
113
.config/nvim/lua/plugins/neotree.lua
Normal 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,
|
||||||
|
},
|
||||||
|
}
|
||||||
89
.config/nvim/lua/plugins/telescope.lua
Normal file
89
.config/nvim/lua/plugins/telescope.lua
Normal 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,
|
||||||
|
},
|
||||||
|
}
|
||||||
103
.config/nvim/lua/plugins/treesitter.lua
Normal file
103
.config/nvim/lua/plugins/treesitter.lua
Normal 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,
|
||||||
|
},
|
||||||
|
}
|
||||||
76
.config/nvim/lua/plugins/ui.lua
Normal file
76
.config/nvim/lua/plugins/ui.lua
Normal 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
253
README.md
Normal 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!** 🚀
|
||||||
848
install.sh
848
install.sh
@@ -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"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
warn "GUI app installation for $app not implemented for $PACKAGE_MANAGER"
|
warn "GUI app installation for $app not supported on $OS"
|
||||||
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)
|
||||||
rm -rf ~/.config/fish
|
if [ ! -L ~/.config/fish ] && [ -d ~/.config/fish ]; then
|
||||||
|
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
|
||||||
chsh -s "$fish_path"
|
|
||||||
|
if [ "$SHELL" != "$fish_path" ]; then
|
||||||
|
log "Setting Fish as default shell..."
|
||||||
|
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_fish
|
||||||
setup_auto_updates
|
setup_neovim
|
||||||
|
setup_other_configs
|
||||||
show_menu
|
install_playwright
|
||||||
|
|
||||||
case $choice in
|
|
||||||
1)
|
|
||||||
setup_fish
|
|
||||||
log "Fish setup complete! Restart your terminal."
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
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}"
|
||||||
|
|||||||
Reference in New Issue
Block a user