commit fe48b976741fa1d2d7b9c6223fbbfbbac416d705 Author: stefiosif Date: Thu Mar 26 22:12:36 2026 +0200 initial commit diff --git a/alacritty/.config/alacritty/alacritty.toml b/alacritty/.config/alacritty/alacritty.toml new file mode 100644 index 0000000..19f69e8 --- /dev/null +++ b/alacritty/.config/alacritty/alacritty.toml @@ -0,0 +1,80 @@ +# ─── window ─────────────────────────────────────────────────────────────────── +[window] +startup_mode = "Maximized" +decorations = "None" +padding = { x = 8, y = 8 } + +# ─── font ───────────────────────────────────────────────────────────────────── +[font] +size = 15.0 + +[font.normal] +family = "FiraMono Nerd Font Mono" +style = "Regular" + +[font.bold] +family = "FiraMono Nerd Font Mono" +style = "Bold" + +[font.italic] +family = "FiraMono Nerd Font Mono" +style = "Italic" + +# ─── scrolling ──────────────────────────────────────────────────────────────── +[scrolling] +history = 10000 +multiplier = 3 + +# ─── selection ──────────────────────────────────────────────────────────────── +[selection] +save_to_clipboard = false + +# ─── cursor ─────────────────────────────────────────────────────────────────── +[cursor] +style = { shape = "Block", blinking = "On" } +blink_interval = 500 + +# ─── colors: catppuccin mocha ───────────────────────────────────────────────── +[colors.primary] +background = "#1e1e2e" +foreground = "#cdd6f4" + +[colors.cursor] +text = "#1e1e2e" +cursor = "#f5e0dc" + +[colors.normal] +black = "#45475a" +red = "#f38ba8" +green = "#a6e3a1" +yellow = "#f9e2af" +blue = "#89b4fa" +magenta = "#f5c2e7" +cyan = "#94e2d5" +white = "#bac2de" + +[colors.bright] +black = "#585b70" +red = "#f38ba8" +green = "#a6e3a1" +yellow = "#f9e2af" +blue = "#89b4fa" +magenta = "#f5c2e7" +cyan = "#94e2d5" +white = "#a6adc8" + +# ─── keybindings ────────────────────────────────────────────────────────────── +[[keyboard.bindings]] +key = "V" +mods = "Alt" +action = "Paste" + +[[keyboard.bindings]] +key = "C" +mods = "Alt" +action = "Copy" + +[[keyboard.bindings]] +key = "Return" +mods = "Alt|Shift" +action = "ToggleFullscreen" diff --git a/git/.gitconfig b/git/.gitconfig new file mode 100644 index 0000000..be7ddc5 --- /dev/null +++ b/git/.gitconfig @@ -0,0 +1,32 @@ +[user] + name = stefiosif + email = si.iosifidis@gmail.com + +[core] + editor = code --wait + autocrlf = input + excludesfile = ~/.gitignore_global + +[init] + defaultBranch = main + +[push] + default = current + autoSetupRemote = true + +[pull] + rebase = true + +[merge] + tool = code + conflictstyle = diff3 + +[diff] + algorithm = patience + colorMoved = default + +[color] + ui = auto + +[credential] + helper = store diff --git a/git/.gitignore_global b/git/.gitignore_global new file mode 100644 index 0000000..de7a0e2 --- /dev/null +++ b/git/.gitignore_global @@ -0,0 +1,22 @@ +# ─── OS ─── # +.DS_Store +Thumbs.db +desktop.ini + +# ─── editors ─── # +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# ─── rust ─── # +target/ + +# ─── node ─── # +node_modules/ + +# ─── env / secrets ─── # +.env +.env.local +.env.*.local diff --git a/install/apt-packages.sh b/install/apt-packages.sh new file mode 100755 index 0000000..104642c --- /dev/null +++ b/install/apt-packages.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "==> Installing base apt packages..." + +sudo apt update + +PACKAGES=( + # essentials + build-essential + curl + wget + git + unzip + zip + stow + + # terminal + tmux + + # search / file tools + ripgrep + fd-find + tree + + # network + openssh-client + rsync + + # libs often needed for compiling things + pkg-config + libssl-dev + libfontconfig1-dev +) + +sudo apt install -y "${PACKAGES[@]}" + +if ! command -v fd &>/dev/null && command -v fdfind &>/dev/null; then + mkdir -p "$HOME/.local/bin" + ln -sf "$(which fdfind)" "$HOME/.local/bin/fd" + echo " linked fdfind -> fd" +fi + +echo "==> apt packages done." diff --git a/install/bootstrap.sh b/install/bootstrap.sh new file mode 100755 index 0000000..10dfab5 --- /dev/null +++ b/install/bootstrap.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# bootstrap.sh — run this on a fresh Linux Mint install +set -euo pipefail + +DOTFILES_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +CONFIGS_DIR="$DOTFILES_DIR/configs" + +echo "==> Dotfiles bootstrap" +echo " dotfiles: $DOTFILES_DIR" +echo "" + +# ─── install packages and tools ─────────────────────────────────────────────── +bash "$CONFIGS_DIR/install/apt-packages.sh" +bash "$CONFIGS_DIR/install/rust.sh" +bash "$CONFIGS_DIR/install/docker.sh" +bash "$CONFIGS_DIR/install/node.sh" +bash "$CONFIGS_DIR/install/tools.sh" +bash "$CONFIGS_DIR/install/fonts.sh" + +# ─── symlink configs with stow ──────────────────────────────────────────────── +echo "" +echo "==> Symlinking configs with stow..." + +cd "$CONFIGS_DIR" + +for group in shell tmux alacritty git vscode; do + echo " stow $group -> ~" + stow -v --target="$HOME" "$group" +done + +# ─── tmux plugins ───────────────────────────────────────────────────────────── +echo "" +echo "==> Installing tmux plugins (tpm)..." +if [ ! -d "$HOME/.tmux/plugins/tpm" ]; then + git clone https://github.com/tmux-plugins/tpm "$HOME/.tmux/plugins/tpm" +fi +# install plugins headlessly +"$HOME/.tmux/plugins/tpm/bin/install_plugins" || true + +echo "" +echo "==> Installing VSCode extensions..." +if command -v code &>/dev/null; then + grep -v '^#' "$CONFIGS_DIR/vscode/extensions.txt" | grep -v '^$' | xargs -L1 code --install-extension +else + echo " code not found, skipping extensions" +fi + +echo "" +echo "==> Done! Open a new terminal or run: source ~/.bashrc" diff --git a/install/docker.sh b/install/docker.sh new file mode 100755 index 0000000..b19b8a9 --- /dev/null +++ b/install/docker.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "==> Setting up Docker..." + +if command -v docker &>/dev/null; then + echo " docker already installed: $(docker --version)" +else + echo " installing docker engine..." + # official docker install script (works on Ubuntu/Mint) + curl -fsSL https://get.docker.com | sudo sh +fi + +# add current user to docker group so we don't need sudo +if ! groups | grep -q docker; then + sudo usermod -aG docker "$USER" + echo " added $USER to docker group — log out and back in to apply" +fi + +echo "==> Docker done." diff --git a/install/fonts.sh b/install/fonts.sh new file mode 100755 index 0000000..2c7cca1 --- /dev/null +++ b/install/fonts.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "==> Installing fonts..." + +FONTS_DIR="$HOME/.local/share/fonts" +mkdir -p "$FONTS_DIR" + +# FiraCode Nerd Font (includes FiraMono Nerd Font Mono) +FIRA_VERSION="3.3.0" +FIRA_ZIP="FiraCode.zip" +FIRA_URL="https://github.com/ryanoasis/nerd-fonts/releases/download/v${FIRA_VERSION}/${FIRA_ZIP}" + +if fc-list | grep -qi "FiraCode Nerd Font"; then + echo " FiraCode Nerd Font already installed, skipping" +else + echo " downloading FiraCode Nerd Font v${FIRA_VERSION}..." + TMP_DIR=$(mktemp -d) + curl -fsSL "$FIRA_URL" -o "$TMP_DIR/$FIRA_ZIP" + unzip -q "$TMP_DIR/$FIRA_ZIP" -d "$TMP_DIR/fira" + cp "$TMP_DIR"/fira/*.ttf "$FONTS_DIR/" + rm -rf "$TMP_DIR" + fc-cache -f "$FONTS_DIR" + echo " FiraCode Nerd Font installed" +fi + +echo "==> Fonts done." diff --git a/install/node.sh b/install/node.sh new file mode 100755 index 0000000..02d431f --- /dev/null +++ b/install/node.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "==> Setting up Node.js..." + +export NVM_DIR="$HOME/.nvm" + +if [ -d "$NVM_DIR" ]; then + echo " nvm already installed, loading..." + . "$NVM_DIR/nvm.sh" +else + echo " installing nvm..." + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash + . "$NVM_DIR/nvm.sh" +fi + +echo " installing node LTS..." +nvm install --lts +nvm use --lts +nvm alias default node + +echo "==> Installing pnpm..." +if command -v pnpm &>/dev/null; then + echo " pnpm already installed: $(pnpm --version)" +else + npm install -g pnpm +fi + +echo "==> Node done." diff --git a/install/rust.sh b/install/rust.sh new file mode 100755 index 0000000..6e587a8 --- /dev/null +++ b/install/rust.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "==> Setting up Rust..." + +if command -v rustup &>/dev/null; then + echo " rustup already installed, updating..." + rustup update stable +else + echo " installing rustup..." + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path + source "$HOME/.cargo/env" +fi + +rustup toolchain install stable +rustup component add clippy rustfmt rust-analyzer + +echo "==> Installing cargo tools..." + +CARGO_TOOLS=( + cargo-watch # watch for changes and re-run + cargo-expand # expand macros + cargo-nextest # faster test runner + cargo-flamegraph # CPU profiling / flamegraphs + cargo-deny # lint deps (licenses, duplicates, advisories) + cargo-mutants # mutation testing + cargo-audit # check deps for known vulnerabilities +) + +for tool in "${CARGO_TOOLS[@]}"; do + if cargo install --list | grep -q "^${tool} "; then + echo " $tool already installed, skipping" + else + cargo install "$tool" + fi +done + +echo "==> Rust done." diff --git a/install/tools.sh b/install/tools.sh new file mode 100755 index 0000000..1259246 --- /dev/null +++ b/install/tools.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "==> Installing extra tools..." + +# ─── stow ───────────────────────────────────────────────────────────────────── +if ! command -v stow &>/dev/null; then + sudo apt install -y stow +fi + +echo "==> Extra tools done." diff --git a/shell/.bash_aliases b/shell/.bash_aliases new file mode 100644 index 0000000..9bea1ef --- /dev/null +++ b/shell/.bash_aliases @@ -0,0 +1,22 @@ +# ─── navigation ─────────────────────────────────────────────────────────────── +alias ..='cd ..' +alias ...='cd ../..' +alias ....='cd ../../..' + +# ─── ls ─────────────────────────────────────────────────────────────────────── +alias ls='ls --color=auto' +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' + +# ─── grep ───────────────────────────────────────────────────────────────────── +alias grep='grep --color=auto' + +# ─── system ─────────────────────────────────────────────────────────────────── +alias update='sudo apt update && sudo apt upgrade -y' +alias install='sudo apt install' +alias search='apt search' + +# ─── misc ───────────────────────────────────────────────────────────────────── +alias reload='source ~/.bashrc' +alias path='echo $PATH | tr ":" "\n"' diff --git a/shell/.bash_profile b/shell/.bash_profile new file mode 100644 index 0000000..3b1c107 --- /dev/null +++ b/shell/.bash_profile @@ -0,0 +1,13 @@ +# ~/.bash_profile — login shell +# source .bashrc for interactive login shells +[ -n "$BASH_VERSION" ] && [ -f "$HOME/.bashrc" ] && . "$HOME/.bashrc" + +# ─── XDG ────────────────────────────────────────────────────────────────────── +export XDG_CONFIG_HOME="$HOME/.config" +export XDG_DATA_HOME="$HOME/.local/share" +export XDG_CACHE_HOME="$HOME/.cache" + +# ─── default apps ───────────────────────────────────────────────────────────── +export EDITOR="code --wait" # change to nvim if you switch editors +export VISUAL="$EDITOR" +export BROWSER="google-chrome" diff --git a/shell/.bashrc b/shell/.bashrc new file mode 100644 index 0000000..1103014 --- /dev/null +++ b/shell/.bashrc @@ -0,0 +1,73 @@ +# ~/.bashrc — interactive shell config +# not interactive? bail out +case $- in *i*) ;; *) return ;; esac + +# ─── system defaults ────────────────────────────────────────────────────────── +[ -f /etc/bash.bashrc ] && source /etc/bash.bashrc + +# ─── history ────────────────────────────────────────────────────────────────── +HISTCONTROL=ignoreboth +HISTSIZE=10000 +HISTFILESIZE=20000 +HISTIGNORE="clear:bg:fg:cd:cd -:cd ..:exit:date:ls:l:ll:* --help" +shopt -s histappend +shopt -s checkwinsize + +# ─── prompt ─────────────────────────────────────────────────────────────────── +# green user, blue path — simple and readable +PS1='\[\e[1;32m\]\u\[\e[0m\]:\[\e[1;34m\]\w\[\e[0m\]\$ ' + +# ─── colors ─────────────────────────────────────────────────────────────────── +if [ -x /usr/bin/dircolors ]; then + eval "$(dircolors -b ~/.dircolors 2>/dev/null || dircolors -b)" +fi + +# ─── aliases ────────────────────────────────────────────────────────────────── +[ -f ~/.bash_aliases ] && source ~/.bash_aliases + +# ─── completions ────────────────────────────────────────────────────────────── +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi + +# ─── fzf ────────────────────────────────────────────────────────────────────── +[ -f ~/.fzf.bash ] && source ~/.fzf.bash +export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --border" + +# ─── less ───────────────────────────────────────────────────────────────────── +export LESS="-R --use-color" +[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" + +# ─── rust / cargo ───────────────────────────────────────────────────────────── +[ -f "$HOME/.cargo/env" ] && . "$HOME/.cargo/env" + +# ─── node / nvm ─────────────────────────────────────────────────────────────── +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" +[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" + +# ─── pnpm ───────────────────────────────────────────────────────────────────── +export PNPM_HOME="$HOME/.local/share/pnpm" +case ":$PATH:" in + *":$PNPM_HOME:"*) ;; + *) export PATH="$PNPM_HOME:$PATH" ;; +esac + +# ─── deno ───────────────────────────────────────────────────────────────────── +[ -f "$HOME/.deno/env" ] && . "$HOME/.deno/env" + +# ─── java ───────────────────────────────────────────────────────────────────── +export JAVA_HOME="$HOME/.jdks/corretto-23.0.2" +export PATH="$JAVA_HOME/bin:$PATH" + +# ─── jbang ──────────────────────────────────────────────────────────────────── +export PATH="$HOME/.jbang/bin:$PATH" +alias j!=jbang + +# ─── local bin ──────────────────────────────────────────────────────────────── +[ -d "$HOME/.local/bin" ] && export PATH="$HOME/.local/bin:$PATH" +[ -d "$HOME/bin" ] && export PATH="$HOME/bin:$PATH" diff --git a/tmux/.tmux.conf b/tmux/.tmux.conf new file mode 100644 index 0000000..95ef7ca --- /dev/null +++ b/tmux/.tmux.conf @@ -0,0 +1,19 @@ +# ─── plugins ────────────────────────────────────────────────────────────────── +set -g @plugin 'tmux-plugins/tpm' +set -g @plugin 'tmux-plugins/tmux-sensible' + +# ─── mouse ──────────────────────────────────────────────────────────────────── +set -g mouse on + +# ─── navigation ─────────────────────────────────────────────────────────────── +bind -n C-n next-window +bind -n C-p previous-window + +# ─── catppuccin ─────────────────────────────────────────────────────────────── +set -g @plugin 'catppuccin/tmux' +set -g @catppuccin_flavour 'mocha' +set -g @catppuccin_window_text " #W" +set -g @catppuccin_window_current_text " #W" + +# ─── initialize tpm (keep at bottom) ────────────────────────────────────────── +run '~/.tmux/plugins/tpm/tpm' diff --git a/vscode/.config/Code/User/keybindings.json b/vscode/.config/Code/User/keybindings.json new file mode 100644 index 0000000..88d572c --- /dev/null +++ b/vscode/.config/Code/User/keybindings.json @@ -0,0 +1,37 @@ +// VSCode keybindings +[ + // navigate back/forward with Alt+Left/Right (like browser) + { + "key": "alt+left", + "command": "workbench.action.navigateBack", + "when": "canNavigateBack" + }, + { + "key": "ctrl+alt+-", + "command": "-workbench.action.navigateBack", + "when": "canNavigateBack" + }, + { + "key": "alt+right", + "command": "workbench.action.navigateForward", + "when": "canNavigateForward" + }, + { + "key": "ctrl+shift+-", + "command": "-workbench.action.navigateForward", + "when": "canNavigateForward" + }, + // shift+enter in terminal sends a line continuation + { + "key": "shift+enter", + "command": "workbench.action.terminal.sendSequence", + "args": { "text": "\\\r\n" }, + "when": "terminalFocus" + }, + // disable default inlay hint escape binding + { + "key": "escape", + "command": "-inlayHints.stopReadingLineWithHint", + "when": "isReadingLineWithInlayHints" + } +] diff --git a/vscode/.config/Code/User/settings.json b/vscode/.config/Code/User/settings.json new file mode 100644 index 0000000..e75140f --- /dev/null +++ b/vscode/.config/Code/User/settings.json @@ -0,0 +1,58 @@ +{ + "workbench.colorTheme": "ZED One Theme Dark", + "workbench.startupEditor": "none", + "workbench.editor.splitInGroupLayout": "vertical", + "workbench.editor.wrapTabs": true, + + // editor + "editor.fontFamily": "'IBM Plex Mono', 'FiraCode', 'DejaVu Sans Mono', monospace", + "editor.fontWeight": "500", + "editor.fontSize": 17, + "editor.minimap.enabled": false, + "editor.inlayHints.enabled": "on", + + // terminal + "terminal.integrated.fontSize": 15.5, + "debug.console.fontSize": 15.5, + + // git + "git.enableSmartCommit": true, + "git.autofetch": true, + "git.confirmSync": false, + "git.openRepositoryInParentFolders": "always", + + // rust + "rust-analyzer.checkOnSave": true, + + // svelte + "svelte.enable-ts-plugin": true, + + // claude code + "claudeCode.preferredLocation": "panel", + "claudeCode.useTerminal": true, + + // misc + "extensions.ignoreRecommendations": true, + "explorer.confirmDelete": false, + "explorer.confirmDragAndDrop": false, + "diffEditor.ignoreTrimWhitespace": false, + "security.workspace.trust.untrustedFiles": "open", + "lldb.suppressUpdateNotifications": true, + "dotenv.enableAutocloaking": false, + "liveServer.settings.donotShowInfoMsg": true, + "liveServer.settings.donotVerifyTags": true, + + "files.associations": { + ".env*": "dotenv" + }, + + "errorLens.enabledDiagnosticLevels": ["error", "warning", "info", "hint"], + + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + + "editor.tokenColorCustomizations": { + "textMateRules": [] + } +} diff --git a/vscode/extensions.txt b/vscode/extensions.txt new file mode 100644 index 0000000..fff0589 --- /dev/null +++ b/vscode/extensions.txt @@ -0,0 +1,57 @@ +# VSCode extensions +# Install all with: cat extensions.txt | xargs -L1 code --install-extension + +# AI +anthropic.claude-code +github.copilot-chat + +# themes +arrrrny.zed-one-theme +drewxs.tokyo-night-dark +enkia.tokyo-night + +# rust +rust-lang.rust-analyzer +tauri-apps.tauri-vscode +vadimcn.vscode-lldb +fill-labs.dependi + +# web / js / ts +bradlc.vscode-tailwindcss +dbaeumer.vscode-eslint +esbenp.prettier-vscode +svelte.svelte-vscode +vue.volar +yoavbls.pretty-ts-errors +ritwickdey.liveserver + +# c / c++ +llvm-vs-code-extensions.vscode-clangd +ms-vscode.cpptools +ms-vscode.cpptools-extension-pack +ms-vscode.cpp-devtools + +# python +ms-python.python +ms-python.debugpy +ms-python.vscode-pylance +ms-python.vscode-python-envs + +# devops / infra +github.vscode-github-actions +ms-vscode-remote.remote-ssh +ms-vscode-remote.remote-ssh-edit +ms-vscode.remote-explorer + +# data / config +dotenv.dotenv-vscode +redhat.vscode-yaml +tamasfe.even-better-toml +nefrob.vscode-just-syntax + +# misc +humao.rest-client +usernamehw.errorlens +wayou.vscode-todo-highlight +yzhang.markdown-all-in-one +sidthesloth.html5-boilerplate