commit 2d80f54ef8b3e3c6d481dfce0333446b7af22013 Author: Ruben Hesselink Date: Fri Jul 3 09:41:20 2026 +0200 Initial commit diff --git a/.config/aerospace/aerospace.toml b/.config/aerospace/aerospace.toml new file mode 100644 index 0000000..2a8af77 --- /dev/null +++ b/.config/aerospace/aerospace.toml @@ -0,0 +1,222 @@ +# Place a copy of this config to ~/.aerospace.toml +# After that, you can edit ~/.aerospace.toml to your liking + +# Config version for compatibility and deprecations +# Fallback value (if you omit the key): config-version = 1 +config-version = 2 + +# You can use it to add commands that run after AeroSpace startup. +# Available commands : https://nikitabobko.github.io/AeroSpace/commands +after-startup-command = [ + 'exec-and-forget /bin/sh /Users/rubenhesselink/.config/aerospace/startup.sh', +] + +# Start AeroSpace at login +start-at-login = true + +# Normalizations. See: https://nikitabobko.github.io/AeroSpace/guide#normalization +enable-normalization-flatten-containers = true +enable-normalization-opposite-orientation-for-nested-containers = true + +# See: https://nikitabobko.github.io/AeroSpace/guide#layouts +# The 'accordion-padding' specifies the size of accordion padding +# You can set 0 to disable the padding feature +accordion-padding = 30 + +# Possible values: tiles|accordion +default-root-container-layout = 'tiles' + +# Possible values: horizontal|vertical|auto +# 'auto' means: wide monitor (anything wider than high) gets horizontal orientation, +# tall monitor (anything higher than wide) gets vertical orientation +default-root-container-orientation = 'auto' + +# Mouse follows focus when focused monitor changes +# Drop it from your config, if you don't like this behavior +# See https://nikitabobko.github.io/AeroSpace/guide#on-focus-changed-callbacks +# See https://nikitabobko.github.io/AeroSpace/commands#move-mouse +# Fallback value (if you omit the key): on-focused-monitor-changed = [] +on-focused-monitor-changed = ['move-mouse monitor-lazy-center'] + +# You can effectively turn off macOS "Hide application" (cmd-h) feature by toggling this flag +# Useful if you don't use this macOS feature, but accidentally hit cmd-h or cmd-alt-h key +# Also see: https://nikitabobko.github.io/AeroSpace/goodies#disable-hide-app +automatically-unhide-macos-hidden-apps = false + +# List of workspaces that should stay alive even when they contain no windows, +# even when they are invisible. +# This config version is only available since 'config-version = 2' +# Fallback value (if you omit the key): persistent-workspaces = [] +persistent-workspaces = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", + "C", "D", "E", "F", "G", "I", "M", "N", "O", "P", "Q", + "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] + +# A callback that runs every time binding mode changes +# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes +# See: https://nikitabobko.github.io/AeroSpace/commands#mode +on-mode-changed = [] + +# Possible values: (qwerty|dvorak|colemak) +# See https://nikitabobko.github.io/AeroSpace/guide#key-mapping +[key-mapping] + preset = 'qwerty' + +# Gaps between windows (inner-*) and between monitor edges (outer-*). +# Possible values: +# - Constant: gaps.outer.top = 8 +# - Per monitor: gaps.outer.top = [{ monitor.main = 16 }, { monitor."some-pattern" = 32 }, 24] +# In this example, 24 is a default value when there is no match. +# Monitor pattern is the same as for 'workspace-to-monitor-force-assignment'. +# See: +# https://nikitabobko.github.io/AeroSpace/guide#assign-workspaces-to-monitors +[gaps] + inner.horizontal = 0 + inner.vertical = 0 + outer.left = 0 + outer.bottom = 0 + outer.top = 0 + outer.right = 0 + +# 'main' binding mode declaration +# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes +# 'main' binding mode must be always presented +# Fallback value (if you omit the key): mode.main.binding = {} +[mode.main.binding] + + # All possible keys: + # - Letters. a, b, c, ..., z + # - Numbers. 0, 1, 2, ..., 9 + # - Keypad numbers. keypad0, keypad1, keypad2, ..., keypad9 + # - F-keys. f1, f2, ..., f20 + # - Special keys. minus, equal, period, comma, slash, backslash, quote, semicolon, + # backtick, leftSquareBracket, rightSquareBracket, space, enter, esc, + # backspace, tab, pageUp, pageDown, home, end, forwardDelete, + # sectionSign (ISO keyboards only, european keyboards only) + # - Keypad special. keypadClear, keypadDecimalMark, keypadDivide, keypadEnter, keypadEqual, + # keypadMinus, keypadMultiply, keypadPlus + # - Arrows. left, down, up, right + + # All possible modifiers: cmd, alt, ctrl, shift + + # All possible commands: https://nikitabobko.github.io/AeroSpace/commands + + # See: https://nikitabobko.github.io/AeroSpace/commands#exec-and-forget + # You can uncomment the following lines to open up terminal with alt + enter shortcut + # (like in i3) + # alt-enter = '''exec-and-forget osascript -e ' + # tell application "Terminal" + # do script + # activate + # end tell' + # ''' + # alt-shift-s = 'exec-and-forget screencapture -i -c' + + # See: https://nikitabobko.github.io/AeroSpace/commands#layout + alt-slash = 'layout tiles horizontal vertical' + alt-comma = 'layout accordion horizontal vertical' + + # See: https://nikitabobko.github.io/AeroSpace/commands#focus + alt-h = 'focus left' + alt-j = 'focus down' + alt-k = 'focus up' + alt-l = 'focus right' + + # See: https://nikitabobko.github.io/AeroSpace/commands#move + alt-shift-h = 'move left' + alt-shift-j = 'move down' + alt-shift-k = 'move up' + alt-shift-l = 'move right' + + # See: https://nikitabobko.github.io/AeroSpace/commands#resize + alt-minus = 'resize smart -50' + alt-equal = 'resize smart +50' + + # See: https://nikitabobko.github.io/AeroSpace/commands#workspace + alt-1 = 'workspace 1' + alt-2 = 'workspace 2' + alt-3 = 'workspace 3' + alt-4 = 'workspace 4' + alt-5 = 'workspace 5' + alt-6 = 'workspace 6' + alt-7 = 'workspace 7' + alt-8 = 'workspace 8' + alt-9 = 'workspace 9' + alt-a = 'workspace A' # In your config, you can drop workspace bindings that you don't need + alt-b = 'workspace B' + alt-c = 'workspace C' + alt-d = 'workspace D' + alt-e = 'workspace E' + alt-f = 'workspace F' + alt-g = 'workspace G' + alt-i = 'workspace I' + alt-m = 'workspace M' + alt-n = 'workspace N' + alt-o = 'workspace O' + alt-p = 'workspace P' + alt-q = 'workspace Q' + alt-r = 'workspace R' + alt-s = 'workspace S' + alt-t = 'workspace T' + alt-u = 'workspace U' + alt-v = 'workspace V' + alt-w = 'workspace W' + alt-x = 'workspace X' + alt-y = 'workspace Y' + alt-z = 'workspace Z' + + # See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace + alt-shift-1 = 'move-node-to-workspace 1' + alt-shift-2 = 'move-node-to-workspace 2' + alt-shift-3 = 'move-node-to-workspace 3' + alt-shift-4 = 'move-node-to-workspace 4' + alt-shift-5 = 'move-node-to-workspace 5' + alt-shift-6 = 'move-node-to-workspace 6' + alt-shift-7 = 'move-node-to-workspace 7' + alt-shift-8 = 'move-node-to-workspace 8' + alt-shift-9 = 'move-node-to-workspace 9' + alt-shift-a = 'move-node-to-workspace A' + alt-shift-b = 'move-node-to-workspace B' + alt-shift-c = 'move-node-to-workspace C' + alt-shift-d = 'move-node-to-workspace D' + alt-shift-e = 'move-node-to-workspace E' + alt-shift-f = 'move-node-to-workspace F' + alt-shift-g = 'move-node-to-workspace G' + alt-shift-i = 'move-node-to-workspace I' + alt-shift-m = 'move-node-to-workspace M' + alt-shift-n = 'move-node-to-workspace N' + alt-shift-o = 'move-node-to-workspace O' + alt-shift-p = 'move-node-to-workspace P' + alt-shift-q = 'move-node-to-workspace Q' + alt-shift-r = 'move-node-to-workspace R' + alt-shift-s = 'move-node-to-workspace S' + alt-shift-t = 'move-node-to-workspace T' + alt-shift-u = 'move-node-to-workspace U' + alt-shift-v = 'move-node-to-workspace V' + alt-shift-w = 'move-node-to-workspace W' + alt-shift-x = 'move-node-to-workspace X' + alt-shift-y = 'move-node-to-workspace Y' + alt-shift-z = 'move-node-to-workspace Z' + + # See: https://nikitabobko.github.io/AeroSpace/commands#workspace-back-and-forth + alt-tab = 'workspace-back-and-forth' + # See: https://nikitabobko.github.io/AeroSpace/commands#move-workspace-to-monitor + alt-shift-tab = 'move-workspace-to-monitor --wrap-around next' + + # See: https://nikitabobko.github.io/AeroSpace/commands#mode + alt-shift-semicolon = 'mode service' + +# 'service' binding mode declaration. +# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes +[mode.service.binding] + esc = ['reload-config', 'mode main'] + r = ['flatten-workspace-tree', 'mode main'] # reset layout + f = ['layout floating tiling', 'mode main'] # Toggle between floating and tiling layout + backspace = ['close-all-windows-but-current', 'mode main'] + + # sticky is not yet supported https://github.com/nikitabobko/AeroSpace/issues/2 + #s = ['layout sticky tiling', 'mode main'] + + alt-shift-h = ['join-with left', 'mode main'] + alt-shift-j = ['join-with down', 'mode main'] + alt-shift-k = ['join-with up', 'mode main'] + alt-shift-l = ['join-with right', 'mode main'] diff --git a/.config/aerospace/startup.sh b/.config/aerospace/startup.sh new file mode 100755 index 0000000..35901ab --- /dev/null +++ b/.config/aerospace/startup.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# Wait for Aerospace server to be fully ready +sleep 2 + +# Launch all apps (open returns immediately) +open -a "Ghostty" +open -a "Helium" +open -a "Slack" +open -a "1Password" +open -a "Proton Pass" +open -a "Proton Mail" + +# Give apps time to start up and create windows +sleep 4 + +# Place a window on its workspace, polling up to 30s +place_window() { + local app_name="$1" + local workspace="$2" + local window_id + + for _ in $(seq 1 30); do + window_id=$(aerospace list-windows --all --format "%{window-id} %{app-name}" 2>/dev/null \ + | grep -m1 " ${app_name}$" \ + | awk '{print $1}') + if [ -n "$window_id" ]; then + aerospace move-node-to-workspace --window-id "$window_id" "$workspace" + return 0 + fi + sleep 1 + done + return 1 +} + +place_window "Ghostty" "1" +place_window "Helium" "2" +place_window "Slack" "3" +place_window "1Password" "7" +place_window "Proton Pass" "6" +place_window "Proton Mail" "8" diff --git a/.config/fish/conf.d/fnm.fish b/.config/fish/conf.d/fnm.fish new file mode 100644 index 0000000..dab58c6 --- /dev/null +++ b/.config/fish/conf.d/fnm.fish @@ -0,0 +1 @@ +fnm env --use-on-cd --shell fish | source diff --git a/.config/fish/config.fish b/.config/fish/config.fish new file mode 100644 index 0000000..a375be3 --- /dev/null +++ b/.config/fish/config.fish @@ -0,0 +1,41 @@ +if status is-interactive + # Commands to run in interactive sessions can go here + and not set -q HERDR_ENV + and command -q herdr + herdr +end + +starship init fish | source + +alias k=kubectl # The one alias to rule them all +alias kg="kubectl get" # List resources +alias kd="kubectl describe" # Detailed info +alias kdr="kubectl --dry-run=client -o yaml" # Generate YAML without creating +alias krun="kubectl run --dry-run=client -o yaml" # Pod YAML generator + +# Resource-specific shortcuts +alias kgp="kubectl get pods" +alias kgd="kubectl get deploy" +alias kgs="kubectl get svc" +alias kgn="kubectl get nodes" +alias kgns="kubectl get ns" +alias kgcm="kubectl get configmap" +alias kgsec="kubectl get secret" + +# eza +alias ls eza +alias ll 'eza -l' +alias la 'eza -a' +alias lla 'eza -la' +alias lt 'eza --tree' +alias l. 'eza -a | grep -E "^\."' + +# Context switching (critical — every question may use a different namespace) +alias kcn="kubectl config set-context --current --namespace" +# Usage: kcn my-namespace + +# Delete with force for fast cleanup +alias kdf="kubectl delete --force --grace-period=0" + +# Bind sessionizer +bind \cf '~/.local/bin/sessionizer.fish' # Ctrl-F diff --git a/.config/ghostty/config b/.config/ghostty/config new file mode 100644 index 0000000..1ec17b2 --- /dev/null +++ b/.config/ghostty/config @@ -0,0 +1,67 @@ +# Ghostty — Rose Pine Moon +# Dark, slightly desaturated variant. Easier on the eyes than classic Rose Pine. +# Drop this at: ~/.config/ghostty/config + +# ── Theme: Rose Pine Moon ──────────────────────────────── +# https://github.com/rose-pine/ghostty +# Base: #232136 Surface: #2a273f Overlay: #393552 +# Text: #e0def4 Muted: #6e6a86 Subtle: #908caa + +palette = 0=#393552 +palette = 1=#eb6f92 +palette = 2=#3e8fb0 +palette = 3=#f6c177 +palette = 4=#9ccfd8 +palette = 5=#c4a7e7 +palette = 6=#ea9a97 +palette = 7=#e0def4 +palette = 8=#6e6a86 +palette = 9=#eb6f92 +palette = 10=#3e8fb0 +palette = 11=#f6c177 +palette = 12=#9ccfd8 +palette = 13=#c4a7e7 +palette = 14=#ea9a97 +palette = 15=#e0def4 + +background = #232136 +foreground = #e0def4 +cursor-color = #e0def4 +cursor-text = #232136 +selection-background = #44415a +selection-foreground = #e0def4 + +# ── Appearance ─────────────────────────────────────────── +background-opacity = 0.86 +background-blur-radius = 20 +window-padding-x = 10 +window-padding-y = 10 +window-padding-balance = true +window-decoration = false +macos-titlebar-style = tabs +macos-option-as-alt = true +macos-non-native-fullscreen = true + +# ── Font ───────────────────────────────────────────────── +font-family = BerkeleyMono Nerd Font Mono +font-size = 16 +font-feature = calt, liga, zero + +# ── Mouse ──────────────────────────────────────────────── +mouse-hide-while-typing = true + +# ── Cursor ─────────────────────────────────────────────── +cursor-style = bar +cursor-style-blink = true +copy-on-select = clipboard + +# ── Performance ────────────────────────────────────────── +macos-secure-input-indication = false + +# ── Confirmation ───────────────────────────────────────── +confirm-close-surface = true + +# ── Keybindings ────────────────────────────────────────── +keybind = shift+enter=text:\n + +shell-integration = fish diff --git a/.config/git/config b/.config/git/config new file mode 100644 index 0000000..b73c09c --- /dev/null +++ b/.config/git/config @@ -0,0 +1,86 @@ +[user] + name = Ruben Hesselink + email = rubenhesselink@pm.me + signingkey = ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILc7+9RhPgkxGyZW1q1aXcb473aQVLwfXPj20zdSZTyE rubenhesselink@pm.me + +[gpg] + format = ssh + +[commit] + gpgSign = true + +[core] + autocrlf = input # keep newlines as in input + compression = 9 # trade cpu for network + fsync = none + whitespace = error # threat incorrect whitespace as errors + +[advice] + addEmptyPathspec = false + pushNonFastForward = false + statusHints = false + +[blame] + coloring = highlightRecent + date = relative + +[diff] + context = 3 # less context in diffs + renames = copies # detect copies as renames in diffs + interHunkContext = 10 # merge near hunks in diffs + +[difftool] + prompt = false + +[init] + defaultBranch = main + +[log] + abbrevCommit = true # short commits + graphColors = blue,yellow,cyan,magenta,green,red + +[status] + branch = true + short = true + showStash = true + showUntrackedFiles = all # show individual untracked files + +[pager] + branch = false # no need to use pager for git branch + +[push] + autoSetupRemote = true # easier to push new branches + default = current # push only current branch by default + followTags = true # push also tags + +[pull] + rebase = true + +[submodule] + fetchJobs = 16 + +[rebase] + autoStash = true + +# Colors +[color "blame"] + highlightRecent = black bold,1 year ago,white,1 month ago,default,7 days ago,blue + +[color "branch"] + current = magenta + local = default + remote = yellow + upstream = green + plain = blue + +[color "diff"] + meta = black bold + frag = magenta + context = white + whitespace = yellow reverse + +[interactive] + singlekey = true + +[includeIf "gitdir:~/work/"] + path = ~/.config/git/work diff --git a/.config/git/work b/.config/git/work new file mode 100644 index 0000000..2563d21 --- /dev/null +++ b/.config/git/work @@ -0,0 +1,2 @@ +[user] + email = ruben@fourdigits.nl diff --git a/.config/herdr/config.toml b/.config/herdr/config.toml new file mode 100644 index 0000000..61107e1 --- /dev/null +++ b/.config/herdr/config.toml @@ -0,0 +1,16 @@ +onboarding = false + +[keys] +prefix = "ctrl+space" + +[[keys.command]] +key = "prefix+f" +type = "plugin_action" +command = "sessionizer.open" +description = "open project workspace" + +[[keys.command]] +key = "prefix+up" +type = "plugin_action" +command = "sessionizer.worktree-open" +description = "open worktree workspace" diff --git a/.config/herdr/plugins/config/sessionizer/config.toml b/.config/herdr/plugins/config/sessionizer/config.toml new file mode 100644 index 0000000..a512afa --- /dev/null +++ b/.config/herdr/plugins/config/sessionizer/config.toml @@ -0,0 +1,28 @@ +[projects] +roots = ["~/personal", "~/personal/repos", "~/work"] + +[layout] +placement = "overlay" +focus = "editor" + +[tabs.dev] +label = "dev" + +[[tabs.dev.panes]] +id = "editor" +title = "nvim" +command = "nvim ." + +[tabs.shell] +label = "shell" + +[[tabs.shell.panes]] +id = "shell" +title = "shell" + +[tabs.shell2] +label = "shell" + +[[tabs.shell2.panes]] +id = "shell" +title = "shell" diff --git a/.config/nvim/.gitignore b/.config/nvim/.gitignore new file mode 100644 index 0000000..cc5457a --- /dev/null +++ b/.config/nvim/.gitignore @@ -0,0 +1,8 @@ +tt.* +.tests +doc/tags +debug +.repro +foo.* +*.log +data diff --git a/.config/nvim/.neoconf.json b/.config/nvim/.neoconf.json new file mode 100644 index 0000000..7c48087 --- /dev/null +++ b/.config/nvim/.neoconf.json @@ -0,0 +1,15 @@ +{ + "neodev": { + "library": { + "enabled": true, + "plugins": true + } + }, + "neoconf": { + "plugins": { + "lua_ls": { + "enabled": true + } + } + } +} diff --git a/.config/nvim/LICENSE b/.config/nvim/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/.config/nvim/LICENSE @@ -0,0 +1,201 @@ + 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. diff --git a/.config/nvim/README.md b/.config/nvim/README.md new file mode 100644 index 0000000..185280b --- /dev/null +++ b/.config/nvim/README.md @@ -0,0 +1,4 @@ +# 💤 LazyVim + +A starter template for [LazyVim](https://github.com/LazyVim/LazyVim). +Refer to the [documentation](https://lazyvim.github.io/installation) to get started. diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua new file mode 100644 index 0000000..2514f9e --- /dev/null +++ b/.config/nvim/init.lua @@ -0,0 +1,2 @@ +-- bootstrap lazy.nvim, LazyVim and your plugins +require("config.lazy") diff --git a/.config/nvim/lazy-lock.json b/.config/nvim/lazy-lock.json new file mode 100644 index 0000000..b95a696 --- /dev/null +++ b/.config/nvim/lazy-lock.json @@ -0,0 +1,43 @@ +{ + "LazyVim": { "branch": "main", "commit": "459a4c3b1059671e766a46c7cc223827dc67e3d0" }, + "blink-copilot": { "branch": "main", "commit": "7ad8209b2f880a2840c94cdcd80ab4dc511d4f39" }, + "blink.cmp": { "branch": "main", "commit": "78336bc89ee5365633bcf754d93df01678b5c08f" }, + "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, + "catppuccin": { "branch": "main", "commit": "0303a7208dba448c459767486a38a6ec05c4216b" }, + "conform.nvim": { "branch": "master", "commit": "619363c30309d29ffa631e67c8183f2a72caa373" }, + "copilot.lua": { "branch": "master", "commit": "1d457ad5f267b8ef855a6b8b3fe152403cb00947" }, + "flash.nvim": { "branch": "main", "commit": "fcea7ff883235d9024dc41e638f164a450c14ca2" }, + "friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" }, + "gitsigns.nvim": { "branch": "main", "commit": "dd3f588bacbeb041be6facf1742e42097f62165d" }, + "grug-far.nvim": { "branch": "main", "commit": "5506c2f59dc9ab2ed6c233585412b24d31d51521" }, + "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, + "lazydev.nvim": { "branch": "main", "commit": "ff2cbcba459b637ec3fd165a2be59b7bbaeedf0d" }, + "lualine.nvim": { "branch": "master", "commit": "221ce6b2d999187044529f49da6554a92f740a96" }, + "markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "0a695750d747db1e7e70bcf0267ef8951c95fc83" }, + "mason.nvim": { "branch": "main", "commit": "16ba83bfc8a25f52bb545134f5bee082b195c460" }, + "mini.ai": { "branch": "main", "commit": "deacc8e9cf05df0297e3b14a08c2f8a415045c6f" }, + "mini.icons": { "branch": "main", "commit": "520995f1d75da0e4cc901ee95080b1ff2bc46b94" }, + "mini.pairs": { "branch": "main", "commit": "30cf2f01c4aaa2033db67376b9924fa2442c05d6" }, + "noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" }, + "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" }, + "nvim-lint": { "branch": "master", "commit": "d48f3a76189d03b2239f6df1b2f7e3fa8353743b" }, + "nvim-lspconfig": { "branch": "master", "commit": "07dff35e7c95288861200b788ef32d6103f107f0" }, + "nvim-treesitter": { "branch": "main", "commit": "4916d6592ede8c07973490d9322f187e07dfefac" }, + "nvim-treesitter-textobjects": { "branch": "main", "commit": "851e865342e5a4cb1ae23d31caf6e991e1c99f1e" }, + "nvim-ts-autotag": { "branch": "main", "commit": "88c1453db4ba7dd24131086fe51fdf74e587d275" }, + "persistence.nvim": { "branch": "main", "commit": "b20b2a7887bd39c1a356980b45e03250f3dce49c" }, + "plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" }, + "render-markdown.nvim": { "branch": "main", "commit": "5adf0895310c1904e5abfaad40a2baad7fe44a07" }, + "rose-pine": { "branch": "main", "commit": "ff483051a47e27d84bdef47703538df1ed9f4a47" }, + "snacks.nvim": { "branch": "main", "commit": "882c996cf28183f4d63640de0b4c02ec886d01f2" }, + "todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" }, + "tokyonight.nvim": { "branch": "main", "commit": "cdc07ac78467a233fd62c493de29a17e0cf2b2b6" }, + "trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" }, + "ts-comments.nvim": { "branch": "main", "commit": "123a9fb12e7229342f807ec9e6de478b1102b041" }, + "venv-selector.nvim": { "branch": "main", "commit": "cc4bb3975de8835291f9bb45889e96c6b2795fc4" }, + "vim-dadbod": { "branch": "master", "commit": "6d1d41da4873a445c5605f2005ad2c68c99d8770" }, + "vim-dadbod-completion": { "branch": "master", "commit": "a8dac0b3cf6132c80dc9b18bef36d4cf7a9e1fe6" }, + "vim-dadbod-ui": { "branch": "master", "commit": "07e92e22114cc5b1ba4938d99897d85b58e20475" }, + "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } +} diff --git a/.config/nvim/lazyvim.json b/.config/nvim/lazyvim.json new file mode 100644 index 0000000..12159bd --- /dev/null +++ b/.config/nvim/lazyvim.json @@ -0,0 +1,20 @@ +{ + "extras": [ + "lazyvim.plugins.extras.ai.copilot", + "lazyvim.plugins.extras.lang.docker", + "lazyvim.plugins.extras.lang.git", + "lazyvim.plugins.extras.lang.go", + "lazyvim.plugins.extras.lang.json", + "lazyvim.plugins.extras.lang.markdown", + "lazyvim.plugins.extras.lang.python", + "lazyvim.plugins.extras.lang.sql", + "lazyvim.plugins.extras.lang.toml", + "lazyvim.plugins.extras.lang.typescript", + "lazyvim.plugins.extras.util.mini-hipatterns" + ], + "install_version": 8, + "news": { + "NEWS.md": "11866" + }, + "version": 8 +} \ No newline at end of file diff --git a/.config/nvim/lua/config/autocmds.lua b/.config/nvim/lua/config/autocmds.lua new file mode 100644 index 0000000..4221e75 --- /dev/null +++ b/.config/nvim/lua/config/autocmds.lua @@ -0,0 +1,8 @@ +-- 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") diff --git a/.config/nvim/lua/config/keymaps.lua b/.config/nvim/lua/config/keymaps.lua new file mode 100644 index 0000000..2c134f7 --- /dev/null +++ b/.config/nvim/lua/config/keymaps.lua @@ -0,0 +1,3 @@ +-- 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 diff --git a/.config/nvim/lua/config/lazy.lua b/.config/nvim/lua/config/lazy.lua new file mode 100644 index 0000000..d73bfa1 --- /dev/null +++ b/.config/nvim/lua/config/lazy.lua @@ -0,0 +1,53 @@ +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not (vim.uv or vim.loop).fs_stat(lazypath) then + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, + { out, "WarningMsg" }, + { "\nPress any key to exit..." }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end +end +vim.opt.rtp:prepend(lazypath) + +require("lazy").setup({ + spec = { + -- add LazyVim and import its plugins + { "LazyVim/LazyVim", import = "lazyvim.plugins" }, + -- import/override with your plugins + { import = "plugins" }, + }, + defaults = { + -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup. + -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default. + lazy = false, + -- It's recommended to leave version=false for now, since a lot the plugin that support versioning, + -- have outdated releases, which may break your Neovim install. + version = false, -- always use the latest git commit + -- version = "*", -- try installing the latest stable version for plugins that support semver + }, + install = { colorscheme = { "tokyonight", "habamax" } }, + checker = { + enabled = true, -- check for plugin updates periodically + notify = false, -- notify on update + }, -- automatically check for plugin updates + performance = { + rtp = { + -- disable some rtp plugins + disabled_plugins = { + "gzip", + -- "matchit", + -- "matchparen", + -- "netrwPlugin", + "tarPlugin", + "tohtml", + "tutor", + "zipPlugin", + }, + }, + }, +}) diff --git a/.config/nvim/lua/config/options.lua b/.config/nvim/lua/config/options.lua new file mode 100644 index 0000000..3ea1454 --- /dev/null +++ b/.config/nvim/lua/config/options.lua @@ -0,0 +1,3 @@ +-- 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 +-- Add any additional options here diff --git a/.config/nvim/lua/plugins/blink.lua b/.config/nvim/lua/plugins/blink.lua new file mode 100644 index 0000000..86b64e9 --- /dev/null +++ b/.config/nvim/lua/plugins/blink.lua @@ -0,0 +1,10 @@ +return { + { + "saghen/blink.cmp", + opts = { + keymap = { + [""] = { "show", "show_documentation", "hide_documentation" }, + }, + }, + }, +} diff --git a/.config/nvim/lua/plugins/colorscheme.lua b/.config/nvim/lua/plugins/colorscheme.lua new file mode 100644 index 0000000..cf996f9 --- /dev/null +++ b/.config/nvim/lua/plugins/colorscheme.lua @@ -0,0 +1,74 @@ +-- return { +-- { +-- "LazyVim/LazyVim", +-- opts = { +-- colorscheme = "catppuccin-frappe", +-- }, +-- }, +-- } +-- Rose Pine Moon · dark + softer · transparent bg +-- LazyVim — drop in: ~/.config/nvim/lua/plugins/colorscheme.lua + +return { + { + "rose-pine/neovim", + name = "rose-pine", + lazy = false, + priority = 1000, + opts = { + variant = "moon", + dark_variant = "moon", + dim_inactive_windows = false, + extend_background_behind_borders = true, + + enable = { + terminal = true, + legacy_highlights = true, + migrations = true, + }, + + styles = { + bold = true, + italic = true, + transparency = true, + }, + + highlight_groups = { + LineNr = { fg = "subtle" }, + CursorLineNr = { fg = "iris", bold = true }, + CursorLine = { bg = "highlight_med" }, + NormalFloat = { bg = "surface" }, + FloatBorder = { fg = "highlight_high" }, + StatusLine = { bg = "surface", fg = "text" }, + StatusLineNC = { bg = "surface", fg = "highlight_high" }, + DiagnosticError = { fg = "love" }, + DiagnosticWarn = { fg = "gold" }, + DiagnosticInfo = { fg = "foam" }, + DiagnosticHint = { fg = "iris" }, + DiffAdd = { bg = "#283e3a", fg = "pine" }, + DiffChange = { bg = "#2a283e", fg = "foam" }, + DiffDelete = { bg = "#3a282e", fg = "love" }, + }, + }, + }, + + { + "LazyVim/LazyVim", + opts = { + colorscheme = "rose-pine", + }, + }, + + { + "rose-pine/neovim", + config = function(_, opts) + require("rose-pine").setup(opts) + vim.cmd.colorscheme("rose-pine") + vim.api.nvim_set_hl(0, "Normal", { bg = "NONE", ctermbg = "NONE" }) + vim.api.nvim_set_hl(0, "NormalNC", { bg = "NONE", ctermbg = "NONE" }) + vim.api.nvim_set_hl(0, "SignColumn", { bg = "NONE", ctermbg = "NONE" }) + vim.api.nvim_set_hl(0, "FoldColumn", { bg = "NONE", ctermbg = "NONE" }) + vim.api.nvim_set_hl(0, "LineNr", { bg = "NONE", ctermbg = "NONE" }) + end, + }, +} diff --git a/.config/nvim/lua/plugins/djlsp.lua b/.config/nvim/lua/plugins/djlsp.lua new file mode 100644 index 0000000..bf0aa1c --- /dev/null +++ b/.config/nvim/lua/plugins/djlsp.lua @@ -0,0 +1,24 @@ +return { + { + "neovim/nvim-lspconfig", + opts = { + servers = { + djlsp = { + mason = false, + cmd = { + vim.fn.expand("~/personal/repos/django-template-lsp/env/bin/djlsp"), + "--enable-log", + "--cache", + }, + root_markers = { "docker-compose.yml", "manage.py", ".git" }, + filetypes = { "html", "htmldjango" }, + init_options = { + docker_compose_file = "docker-compose.yml", + docker_compose_service = "django", + cache = true, + }, + }, + }, + }, + }, +} diff --git a/.config/nvim/stylua.toml b/.config/nvim/stylua.toml new file mode 100644 index 0000000..5d6c50d --- /dev/null +++ b/.config/nvim/stylua.toml @@ -0,0 +1,3 @@ +indent_type = "Spaces" +indent_width = 2 +column_width = 120 \ No newline at end of file diff --git a/.config/starship.toml b/.config/starship.toml new file mode 100644 index 0000000..d1ad059 --- /dev/null +++ b/.config/starship.toml @@ -0,0 +1,70 @@ +# Starship — Rose Pine Moon (softer dark) +# Palette: Base #232136 Text #e0def4 Pine #3e8fb0 Rose #ea9a97 + +palette = "rose-pine-moon" + +[palettes.rose-pine-moon] +iris = "#c4a7e7" +love = "#eb6f92" +pine = "#3e8fb0" +foam = "#9ccfd8" +gold = "#f6c177" +rose = "#ea9a97" +text = "#e0def4" +subtle = "#908caa" +muted = "#6e6a86" +surface = "#2a273f" + +format = """ +$directory\ +$git_branch\ +$git_status\ +$nix_shell\ +$cmd_duration\ +$line_break\ +$character""" + +[directory] +truncation_length = 3 +truncate_to_repo = true +style = "bold #9ccfd8" +[directory.substitutions] +"~/projects" = " " +"~/.config" = " " +"~/Documents" = " " + +[git_branch] +symbol = " " +style = "bold #c4a7e7" +format = "on [$symbol$branch]($style) " + +[git_status] +style = "#f6c177" +ahead = "⇡" +behind = "⇣" +diverged = "⇕" +conflicted = "≠" +untracked = "?" +stashed = "$" +modified = "!" +staged = "+" +renamed = "»" +deleted = "✘" + +[character] +success_symbol = "[❯](bold #3e8fb0)" # Moon Pine +error_symbol = "[❯](bold #eb6f92)" +vimcmd_symbol = "[❮](bold #9ccfd8)" + +[cmd_duration] +min_time = 2000 +format = "took [$duration]($style) " +style = "#908caa" + +[nix_shell] +format = "via [❄️ $name](bold #9ccfd8)" + +[os] +disabled = false +style = "bold #ea9a97" +symbols.Macos = " " diff --git a/.config/tmux/tmux.conf b/.config/tmux/tmux.conf new file mode 100644 index 0000000..7dea60d --- /dev/null +++ b/.config/tmux/tmux.conf @@ -0,0 +1,78 @@ +set -a terminal-features "tmux-256color:RGB" +# set -g prefix C-Space +# set -g prefix2 C-b +# set -g base-index 1 +# setw -g mode-keys vi +# set -g status-position top +# set -g status-justify absolute-centre +# set -g window-status-current-style "bold" +# set -g status-right "" +# set -g status-left "#S" +# set -g mouse on +# set-option -g history-limit 10000 + +# bind C-Space send-prefix +# bind C-b send-prefix +# bind r source-file ~/.config/tmux/tmux.conf \; display-message "Tmux config reloaded." + +# tmux — Rose Pine Moon (softer dark) +# Same as Rose Pine but with @rose_pine_variant "moon" + +set -g prefix C-Space +unbind C-b + +set-environment -g TMUX_PLUGIN_MANAGER_PATH /Users/rubenhesselink/.config/tmux/plugins + +set -g @rose_pine_variant "moon" +set -g @rose_pine_window_status_style "rounded" +set -g @rose_pine_date_time "#(date '+%a %d %b %H:%M')" +set -g @rose_pine_directory "on" + +set -g status-position top +set -g status-justify absolute-centre +set -g status-left-length 40 +set -g status-right-length 80 +set -g visual-bell off +set -g set-titles off + +set -g base-index 1 +set -g pane-base-index 1 +setw -g pane-base-index 1 +set -g renumber-windows on +setw -g mode-keys vi + +bind -n M-h select-pane -L +bind -n M-j select-pane -D +bind -n M-k select-pane -U +bind -n M-l select-pane -R +bind -n M-S-h previous-window +bind -n M-S-l next-window +bind -n M-Left resize-pane -L 5 +bind -n M-Right resize-pane -R 5 +bind -n M-Down resize-pane -D 3 +bind -n M-Up resize-pane -U 3 + +bind \\ split-window -h -c "#{pane_current_path}" +bind - split-window -v -c "#{pane_current_path}" + +bind r source-file ~/.config/tmux/tmux.conf \; display "Config reloaded!" + +set -g mouse on +set -g history-limit 50000 +set -sg escape-time 10 +set -g focus-events on +set -ga terminal-overrides ",*256col*:Tc" +set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q' + +set -g @plugin 'tmux-plugins/tpm' +set -g @plugin 'rose-pine/tmux' +set -g @plugin 'tmux-plugins/tmux-resurrect' +set -g @plugin 'tmux-plugins/tmux-continuum' + +set -g @continuum-restore 'on' +set -g @continuum-save-interval '15' + +if "test ! -d /Users/rubenhesselink/.config/tmux/plugins/tpm" \ + "run 'git clone https://github.com/tmux-plugins/tpm /Users/rubenhesselink/.config/tmux/plugins/tpm && /Users/rubenhesselink/.config/tmux/plugins/tpm/bin/install_plugins'" + +run '/Users/rubenhesselink/.config/tmux/plugins/tpm/tpm' diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9c2aa5d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +.DS_Store + +# nvim is a LazyVim starter that has its own git history — track files inline +.config/nvim/.git/ +.config/nvim/lua/plugins/example.lua + +# tmux plugins are managed by tpm at install time +.config/tmux/plugins/ + +# fish_variables is auto-generated runtime state +.config/fish/fish_variables diff --git a/Brewfile b/Brewfile new file mode 100644 index 0000000..852c91b --- /dev/null +++ b/Brewfile @@ -0,0 +1,135 @@ +tap "barutsrb/tap", "https://github.com/BarutSRB/homebrew-tap" +tap "felixkratz/formulae", "https://github.com/FelixKratz/homebrew-formulae" +tap "nikitabobko/tap" +# Version manager for neovim +brew "bob" +# Cat clone with syntax highlighting, used by Herdr Sessionizer previews +brew "bat" +# JavaScript runtime required by Herdr Sessionizer +brew "bun" +# Resource monitor. C++ version and continuation of bashtop and bpytop +brew "btop" +# Cross-platform make +brew "cmake" +# Container runtimes on MacOS (and Linux) with minimal setup +brew "colima", restart_service: :changed +# C++ header-only HTTP/HTTPS server and client library +brew "cpp-httplib" +# Tool for exploring each layer in a docker image +brew "dive" +# Pack, ship and run any application as a lightweight container +brew "docker" +# Isolated development environments using Docker +brew "docker-compose" +# Modern, maintained replacement for ls +brew "eza" +# Simple, fast and user-friendly alternative to find +brew "fd" +# User-friendly command-line shell for UNIX-like operating systems +brew "fish" +# Fast and simple Node.js version manager +brew "fnm" +# Command-line fuzzy finder written in Go +brew "fzf" +# Open source programming language to build simple/reliable/efficient software +brew "go" +# Kubernetes package manager +brew "helm" +# Terminal workspace manager +brew "herdr" +# Kubernetes CLI To Manage Your Clusters In Style! +brew "k9s" +# Tool that can switch between kubectl contexts easily and create aliases +brew "kubectx" +# Kubernetes command-line interface +brew "kubernetes-cli" +# Lazier way to manage everything docker +brew "lazydocker" +# Multi-format archive and compression library +brew "libarchive" +# ISO/IEC 23008-12:2017 HEIF file format decoder and encoder +brew "libheif" +# Powerful, lightweight programming language +brew "lua" +# Package manager for the Lua programming language +brew "luarocks" +# Run a Kubernetes cluster locally +brew "minikube" +# Replacement for ls, cp and other commands for object storage +brew "minio-mc" +# NCurses Disk Usage +brew "ncdu" +# Small build system for use with gyp or CMake +brew "ninja" +# AI coding agent, built for the terminal +brew "opencode" +# Object-relational database system +brew "postgresql@18", link: true +# Extremely fast Python linter, written in Rust +brew "ruff" +# Safe, concurrent, practical language +brew "rust" +# Cross-shell prompt for astronauts +brew "starship" +# Tail multiple Kubernetes pods & their containers +brew "stern" +# Very fast implementation of tldr in Rust +brew "tealdeer" +# Terminal multiplexer +brew "tmux" +# Header-only TOML config file parser and serializer for C++17 +brew "tomlplusplus" +# Extremely fast Python type checker, written in Rust +brew "ty" +# Extremely fast Python package installer and resolver, written in Rust +brew "uv" +# Userspace Go implementation of WireGuard +brew "wireguard-go" +# Tools for the WireGuard secure network tunnel +brew "wireguard-tools" +# Password manager that keeps all passwords secure behind one password +cask "1password" +# AeroSpace is an i3-like tiling window manager for macOS +cask "nikitabobko/tap/aerospace" +# Application launcher and productivity software +cask "alfred" +# OpenAI's official ChatGPT desktop app +cask "chatgpt" +# Anthropic's official Claude AI desktop app +cask "claude" +# Terminal-based AI coding assistant +cask "claude-code" +# OpenAI's coding agent that runs in your terminal +cask "codex" +# OpenAI's Codex desktop app for managing coding agents +cask "codex-app" +# Voice and text chat software +cask "discord" +# API documentation viewer +cask "dteoh-devdocs" +# Terminal emulator that uses platform-native UI and GPU acceleration +cask "ghostty" +# 2D and 3D game engine +cask "godot" +# Chromium-based web browser +cask "helium-browser" +# Deck tracker and deck manager for Hearthstone +cask "hstracker" +# Spreadsheet software +cask "microsoft-excel" +# Sandbox construction video game +cask "minecraft" +# Minecraft launcher +cask "prismlauncher" +# Client for Proton Mail and Proton Calendar +cask "proton-mail" +# Desktop client for Proton Pass +cask "proton-pass" +# Team communication and collaboration software +cask "slack" +# Music streaming service +cask "spotify" +# Mesh VPN based on WireGuard +cask "tailscale-app" +uv "fourdigits-cli" +npm "corepack" diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..86be5f8 --- /dev/null +++ b/install.sh @@ -0,0 +1,119 @@ +#!/usr/bin/env bash +set -euo pipefail + +DOTFILES_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +DRY_RUN=false + +for arg in "$@"; do + [[ "$arg" == "--dry-run" ]] && DRY_RUN=true +done + +$DRY_RUN && echo "[DRY RUN] No changes will be made." + +run() { + if $DRY_RUN; then + echo "[DRY RUN] Would run: $*" + else + "$@" + fi +} + +step() { echo "==> $*"; } + +# --------------------------------------------------------------------------- +# 1. Homebrew +# --------------------------------------------------------------------------- +step "Checking Homebrew" +if ! command -v brew &>/dev/null; then + if $DRY_RUN; then + echo "[DRY RUN] Would install Homebrew" + else + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + fi +fi + +# --------------------------------------------------------------------------- +# 2. Install packages +# --------------------------------------------------------------------------- +step "Installing packages from Brewfile" +run brew bundle install --file="$DOTFILES_DIR/Brewfile" --no-lock + +# --------------------------------------------------------------------------- +# 3. Set fish as default shell +# --------------------------------------------------------------------------- +step "Setting fish as default shell" +FISH_PATH="$(command -v fish || true)" +if [[ -z "$FISH_PATH" ]]; then + echo "ERROR: fish not found after brew install — cannot set as default shell" + exit 1 +fi + +if [[ "$SHELL" != "$FISH_PATH" ]]; then + if ! grep -qF "$FISH_PATH" /etc/shells; then + echo "Adding $FISH_PATH to /etc/shells (requires sudo)" + run sudo sh -c "echo '$FISH_PATH' >> /etc/shells" + fi + run chsh -s "$FISH_PATH" +else + echo "fish is already the default shell" +fi + +# --------------------------------------------------------------------------- +# 4. Copy configs +# --------------------------------------------------------------------------- +CONFIGS=( + "fish" + "starship.toml" + "nvim" + "git" + "herdr" + "tmux" + "aerospace" + "ghostty" +) + +step "Copying configs to ~/.config/" +for name in "${CONFIGS[@]}"; do + src="$DOTFILES_DIR/.config/$name" + dst="$HOME/.config/$name" + + if [[ ! -e "$src" ]]; then + echo " skip: $src not found in repo" + continue + fi + + if [[ -e "$dst" ]]; then + if $DRY_RUN; then + echo "[DRY RUN] Would backup $dst → ${dst}.bak" + echo "[DRY RUN] Would copy $src → $dst" + else + echo " backup: $dst → ${dst}.bak" + rm -rf "${dst}.bak" + cp -r "$dst" "${dst}.bak" + rm -rf "$dst" + cp -r "$src" "$dst" + fi + else + if $DRY_RUN; then + echo "[DRY RUN] Would copy $src → $dst" + else + echo " copy: $src → $dst" + cp -r "$src" "$dst" + fi + fi +done + +# --------------------------------------------------------------------------- +# 5. tmux plugin manager (tpm) +# --------------------------------------------------------------------------- +step "Setting up tpm (tmux plugin manager)" +TPM_DIR="$HOME/.config/tmux/plugins/tpm" +if [[ ! -d "$TPM_DIR" ]]; then + run git clone https://github.com/tmux-plugins/tpm "$TPM_DIR" +else + echo "tpm already installed" +fi + +echo "" +echo "Done. Open a new terminal to start using fish." +$DRY_RUN && echo "(This was a dry run — no changes were made.)"