commit 1c63057b73e30376ba45887c45b1d3381015ed75 Author: Bastian Gruber Date: Wed Jan 28 17:46:39 2026 +0000 Add first init diff --git a/.chezmoi.toml.tmpl b/.chezmoi.toml.tmpl new file mode 100644 index 0000000..09d43fe --- /dev/null +++ b/.chezmoi.toml.tmpl @@ -0,0 +1,17 @@ +{{- $hostname := .chezmoi.hostname -}} +{{- $os := .chezmoi.os -}} + +[data] +{{- if eq $hostname "maple" }} + machine = "server" + editor = "hx" +{{- else if eq $hostname "archbook" }} + machine = "laptop" + editor = "hx" +{{- else if eq $os "darwin" }} + machine = "macbook" + editor = "hx" +{{- else }} + machine = "unknown" + editor = "hx" +{{- end }} diff --git a/README.md b/README.md new file mode 100644 index 0000000..00f93f2 --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# Dotfiles + +Personal dotfiles managed with [Chezmoi](https://www.chezmoi.io/). + +## Machines + +- **maple** - Debian server +- **archbook** - Arch Linux laptop +- **macbook** - MacBook Pro (macOS) + +## What's Included + +- **Fish shell** - Config with utility functions +- **Helix** - Modal editor config with LSP settings +- **tmux** - Terminal multiplexer with Catppuccin theme + +## Quick Start + +### New Machine + +```bash +chezmoi init git@forgejo.novanexus.ca:gruberb/dotfiles.git +chezmoi diff +chezmoi apply +``` + +### Update Configs + +```bash +# Pull latest and apply +chezmoi update + +# After editing a file locally +chezmoi re-add + +# Push changes +cd ~/.local/share/chezmoi +git add . && git commit -m "Update configs" && git push +``` + +## Theme + +Catppuccin Macchiato across all tools. + +## Font + +Berkeley Mono (install manually per machine). diff --git a/dot_config/fish/config.fish.tmpl b/dot_config/fish/config.fish.tmpl new file mode 100644 index 0000000..2a1c81a --- /dev/null +++ b/dot_config/fish/config.fish.tmpl @@ -0,0 +1,34 @@ +if status is-interactive + # Fix for terminals without terminfo on server (e.g., Ghostty) + if not test -e /usr/share/terminfo/$TERM[1]/$TERM + set -gx TERM xterm-256color + end + + # Disable OSC 133 shell integration + functions -e __fish_on_interactive_startup_done + functions -e __fish_prompt_initialized +end + +# Clear screen AND scrollback with Ctrl+L +bind \cl 'printf "\e[2J\e[3J\e[H"; commandline -f repaint' + +# PATH setup +fish_add_path -g ~/.local/bin + +{{- if eq .machine "macbook" }} +# macOS-specific: Homebrew paths +fish_add_path -g /opt/homebrew/bin +fish_add_path -g /opt/homebrew/sbin +{{- end }} + +{{- if eq .machine "server" }} +# Server-specific: Helix runtime +set -gx HELIX_RUNTIME /usr/local/lib/helix/runtime +{{- end }} + +# GPG TTY for signing +set -gx GPG_TTY (tty) + +# Editor +set -gx EDITOR {{ .editor }} +set -gx VISUAL {{ .editor }} diff --git a/dot_config/fish/functions/gaa.fish b/dot_config/fish/functions/gaa.fish new file mode 100644 index 0000000..ca163de --- /dev/null +++ b/dot_config/fish/functions/gaa.fish @@ -0,0 +1,3 @@ +function gaa --wraps='git add .' --description 'alias gaa=git add .' + git add . $argv +end diff --git a/dot_config/fish/functions/gc.fish b/dot_config/fish/functions/gc.fish new file mode 100644 index 0000000..d94fb0d --- /dev/null +++ b/dot_config/fish/functions/gc.fish @@ -0,0 +1,3 @@ +function gc --wraps='git commit' --description 'alias gc=git commit' + git commit $argv +end diff --git a/dot_config/fish/functions/gco.fish b/dot_config/fish/functions/gco.fish new file mode 100644 index 0000000..3e8dd7b --- /dev/null +++ b/dot_config/fish/functions/gco.fish @@ -0,0 +1,3 @@ +function gco --wraps='git checkout' --description 'alias gco=git checkout' + git checkout $argv +end diff --git a/dot_config/fish/functions/glg.fish b/dot_config/fish/functions/glg.fish new file mode 100644 index 0000000..4c92fa6 --- /dev/null +++ b/dot_config/fish/functions/glg.fish @@ -0,0 +1,3 @@ +function glg --wraps='git log --all --oneline --decorate --graph' --description 'alias glg=git log --all --oneline --decorate --graph' + git log --all --oneline --decorate --graph $argv +end diff --git a/dot_config/fish/functions/gp.fish b/dot_config/fish/functions/gp.fish new file mode 100644 index 0000000..d19c505 --- /dev/null +++ b/dot_config/fish/functions/gp.fish @@ -0,0 +1,4 @@ +# Git push with optional arguments +function gp --description "Git push (shortcut)" + git push $argv +end diff --git a/dot_config/fish/functions/gpl.fish b/dot_config/fish/functions/gpl.fish new file mode 100644 index 0000000..e9cd9f2 --- /dev/null +++ b/dot_config/fish/functions/gpl.fish @@ -0,0 +1,4 @@ +# Git pull with optional arguments +function gpl --description "Git pull (shortcut)" + git pull $argv +end diff --git a/dot_config/fish/functions/gs.fish b/dot_config/fish/functions/gs.fish new file mode 100644 index 0000000..025a752 --- /dev/null +++ b/dot_config/fish/functions/gs.fish @@ -0,0 +1,4 @@ +# Git status shortcut +function gs --description "Git status (shortcut)" + git status $argv +end diff --git a/dot_config/fish/functions/gst.fish b/dot_config/fish/functions/gst.fish new file mode 100644 index 0000000..084a80e --- /dev/null +++ b/dot_config/fish/functions/gst.fish @@ -0,0 +1,8 @@ +function gst --wraps='git status -sb --show-stash --untracked-files=all' --description 'status + changed files' + git status -sb --show-stash --untracked-files=all + set -l changes (git status --porcelain=v1) + if test -n "$changes" + echo + git diff --name-status + end +end diff --git a/dot_config/fish/functions/l.fish b/dot_config/fish/functions/l.fish new file mode 100644 index 0000000..9881b16 --- /dev/null +++ b/dot_config/fish/functions/l.fish @@ -0,0 +1,3 @@ +function l --wraps='eza --all --long --header --description' --wraps='eza --all --long --header' --description 'alias l=eza --all --long --header' + eza --all --long --header $argv +end diff --git a/dot_config/fish/functions/mkcd.fish b/dot_config/fish/functions/mkcd.fish new file mode 100644 index 0000000..fe8f684 --- /dev/null +++ b/dot_config/fish/functions/mkcd.fish @@ -0,0 +1,4 @@ +# Create directory and cd into it +function mkcd --description "Create a directory and cd into it" + mkdir -p $argv[1] && cd $argv[1] +end diff --git a/dot_config/helix/config.toml b/dot_config/helix/config.toml new file mode 100644 index 0000000..ff3af98 --- /dev/null +++ b/dot_config/helix/config.toml @@ -0,0 +1,95 @@ +theme = "catppuccin_macchiato" + +[editor] +line-number = "relative" +mouse = true +cursorline = true +auto-save = true +bufferline = "multiple" +color-modes = true +true-color = true +rulers = [80, 120] + +[editor.cursor-shape] +insert = "bar" +normal = "block" +select = "underline" + +[editor.statusline] +left = ["mode", "spinner", "file-name", "file-modification-indicator"] +center = [] +right = ["diagnostics", "selections", "position", "file-encoding", "file-line-ending", "file-type"] +separator = "│" +mode.normal = "NORMAL" +mode.insert = "INSERT" +mode.select = "SELECT" + +[editor.lsp] +display-messages = true +display-inlay-hints = true + +[editor.indent-guides] +render = true +character = "│" +skip-levels = 1 + +[editor.soft-wrap] +enable = true + +[editor.file-picker] +hidden = false + +# ───────────────────────────────────────────────────────────── +# Key Bindings +# ───────────────────────────────────────────────────────────── + +[keys.normal] +# Quick save +C-s = ":w" + +# Buffer navigation +H = ":buffer-previous" +L = ":buffer-next" + +# Close buffer +C-w = ":buffer-close" + +# Quick quit +C-q = ":q" + +# Clipboard operations (system clipboard) +space.y = ":clipboard-yank" +space.p = ":clipboard-paste-after" +space.P = ":clipboard-paste-before" + +# File picker +space.f = "file_picker" +space.F = "file_picker_in_current_directory" + +# Buffer picker +space.b = "buffer_picker" + +# Symbol picker +space.s = "symbol_picker" +space.S = "workspace_symbol_picker" + +# Diagnostics +space.d = "goto_next_diag" +space.D = "goto_prev_diag" + +# Comment toggle +C-c = "toggle_comments" + +# Format +space.l = ":format" + +[keys.insert] +# Quick escape +j.k = "normal_mode" + +# Quick save from insert mode +C-s = ["normal_mode", ":w"] + +[keys.select] +# Clipboard operations in select mode +space.y = ":clipboard-yank" diff --git a/dot_config/helix/languages.toml b/dot_config/helix/languages.toml new file mode 100644 index 0000000..12a8e4c --- /dev/null +++ b/dot_config/helix/languages.toml @@ -0,0 +1,126 @@ +# Helix Language Server Configuration +# Auto-format on save and LSP settings per language + +# ───────────────────────────────────────────────────────────── +# Rust +# ───────────────────────────────────────────────────────────── + +[[language]] +name = "rust" +auto-format = true + +[language-server.rust-analyzer.config] +check.command = "clippy" +cargo.features = "all" + +# ───────────────────────────────────────────────────────────── +# Python +# ───────────────────────────────────────────────────────────── + +[[language]] +name = "python" +auto-format = true +language-servers = ["ruff", "pyright"] + +[language-server.ruff] +command = "ruff" +args = ["server"] + +[language-server.pyright] +command = "pyright-langserver" +args = ["--stdio"] + +# ───────────────────────────────────────────────────────────── +# JavaScript/TypeScript +# ───────────────────────────────────────────────────────────── + +[[language]] +name = "javascript" +auto-format = true +formatter = { command = "prettier", args = ["--parser", "javascript"] } + +[[language]] +name = "typescript" +auto-format = true +formatter = { command = "prettier", args = ["--parser", "typescript"] } + +[[language]] +name = "tsx" +auto-format = true +formatter = { command = "prettier", args = ["--parser", "typescript"] } + +[[language]] +name = "jsx" +auto-format = true +formatter = { command = "prettier", args = ["--parser", "javascript"] } + +# ───────────────────────────────────────────────────────────── +# Web Languages +# ───────────────────────────────────────────────────────────── + +[[language]] +name = "html" +auto-format = true +formatter = { command = "prettier", args = ["--parser", "html"] } + +[[language]] +name = "css" +auto-format = true +formatter = { command = "prettier", args = ["--parser", "css"] } + +[[language]] +name = "json" +auto-format = true +formatter = { command = "prettier", args = ["--parser", "json"] } + +# ───────────────────────────────────────────────────────────── +# Go +# ───────────────────────────────────────────────────────────── + +[[language]] +name = "go" +auto-format = true + +# ───────────────────────────────────────────────────────────── +# Shell +# ───────────────────────────────────────────────────────────── + +[[language]] +name = "bash" +auto-format = true +formatter = { command = "shfmt", args = ["-i", "4"] } + +[[language]] +name = "fish" +auto-format = false + +# ───────────────────────────────────────────────────────────── +# Markdown +# ───────────────────────────────────────────────────────────── + +[[language]] +name = "markdown" +auto-format = true +formatter = { command = "prettier", args = ["--parser", "markdown"] } + +# ───────────────────────────────────────────────────────────── +# TOML/YAML +# ───────────────────────────────────────────────────────────── + +[[language]] +name = "toml" +auto-format = true + +[[language]] +name = "yaml" +auto-format = true +formatter = { command = "prettier", args = ["--parser", "yaml"] } + +# ───────────────────────────────────────────────────────────── +# Nix +# ───────────────────────────────────────────────────────────── + +[[language]] +name = "nix" +auto-format = true +formatter = { command = "nixfmt" } diff --git a/dot_config/tmux/tmux.conf b/dot_config/tmux/tmux.conf new file mode 100644 index 0000000..cc31573 --- /dev/null +++ b/dot_config/tmux/tmux.conf @@ -0,0 +1,117 @@ +# tmux config - Catppuccin Macchiato theme +# Minimal but powerful setup + +# ───────────────────────────────────────────────────────────── +# General Settings +# ───────────────────────────────────────────────────────────── + +# Change prefix from C-b to C-a (easier to reach) +unbind C-b +set -g prefix C-a +bind C-a send-prefix + +# Enable true color support +set -g default-terminal "tmux-256color" +set -ga terminal-overrides ",*256col*:Tc" +set -ga terminal-overrides ",xterm-256color:Tc" + +# Enable mouse support +set -g mouse on + +# Start windows and panes at 1, not 0 +set -g base-index 1 +setw -g pane-base-index 1 + +# Renumber windows when one is closed +set -g renumber-windows on + +# Increase scrollback buffer +set -g history-limit 10000 + +# Reduce escape time (important for Helix/vim) +set -sg escape-time 0 + +# Enable focus events +set -g focus-events on + +# ───────────────────────────────────────────────────────────── +# Key Bindings +# ───────────────────────────────────────────────────────────── + +# Reload config +bind r source-file ~/.config/tmux/tmux.conf \; display "Config reloaded!" + +# Split panes with | and - +bind | split-window -h -c "#{pane_current_path}" +bind - split-window -v -c "#{pane_current_path}" +unbind '"' +unbind % + +# Vim-style pane navigation +bind h select-pane -L +bind j select-pane -D +bind k select-pane -U +bind l select-pane -R + +# Resize panes with H/J/K/L +bind -r H resize-pane -L 5 +bind -r J resize-pane -D 5 +bind -r K resize-pane -U 5 +bind -r L resize-pane -R 5 + +# New window in current path +bind c new-window -c "#{pane_current_path}" + +# Quick window switching +bind -n M-1 select-window -t 1 +bind -n M-2 select-window -t 2 +bind -n M-3 select-window -t 3 +bind -n M-4 select-window -t 4 +bind -n M-5 select-window -t 5 + +# ───────────────────────────────────────────────────────────── +# Catppuccin Macchiato Colors +# ───────────────────────────────────────────────────────────── + +# Palette +# Base: #24273a +# Surface0: #363a4f +# Surface1: #494d64 +# Text: #cad3f5 +# Subtext0: #a5adcb +# Mauve: #c6a0f6 +# Blue: #8aadf4 +# Green: #a6da95 +# Yellow: #eed49f +# Red: #ed8796 + +# Status bar +set -g status-position bottom +set -g status-style "bg=#24273a,fg=#cad3f5" +set -g status-left-length 30 +set -g status-right-length 50 + +# Status left: session name +set -g status-left "#[bg=#c6a0f6,fg=#24273a,bold] #S #[bg=#24273a] " + +# Status right: date and time +set -g status-right "#[fg=#a5adcb]%Y-%m-%d #[fg=#cad3f5]%H:%M #[bg=#8aadf4,fg=#24273a,bold] #h " + +# Window status +set -g window-status-format "#[fg=#a5adcb] #I:#W " +set -g window-status-current-format "#[bg=#363a4f,fg=#8aadf4,bold] #I:#W " +set -g window-status-separator "" + +# Pane borders +set -g pane-border-style "fg=#363a4f" +set -g pane-active-border-style "fg=#c6a0f6" + +# Message style +set -g message-style "bg=#363a4f,fg=#cad3f5" +set -g message-command-style "bg=#363a4f,fg=#cad3f5" + +# Mode style (copy mode, etc.) +setw -g mode-style "bg=#363a4f,fg=#cad3f5" + +# Clock +setw -g clock-mode-colour "#c6a0f6"