From 4f6643fd8e7457e5dc5d1c8146f96db47910afda Mon Sep 17 00:00:00 2001 From: Bas Grolleman Date: Fri, 3 Jul 2026 13:53:07 +0200 Subject: [PATCH] Add hotkeys for apps --- CLAUDE.md | 64 +++++++++++++++++++++++++++++++++++++++++ niri/cfg/input.kdl | 2 +- niri/cfg/keybinds.kdl | 5 +++- niri/cfg/layout.kdl | 4 ++- niri/focus-or-launch.sh | 25 ++++++++++++++++ 5 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 CLAUDE.md create mode 100755 niri/focus-or-launch.sh diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..9e7dda6 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,64 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## What This Repo Is + +Personal dotfiles for a Linux desktop, currently running **Niri** (Wayland compositor) with **Noctalia** as the desktop shell. There are legacy X11 configs (i3, polybar, picom) that are no longer the primary setup. + +## Deployment + +Configs are deployed by symlinking into `~/.config/` and `~/.profile`: + +```bash +bash ~/.dotfiles/setup.sh +``` + +The script is idempotent — it skips links that already exist. After adding a new top-level config directory, add a `configlink ` line to `setup.sh`. + +## Installing Desktop Applications + +```bash +cd ansible.desktop +./install-desktop-toolsontech.sh +``` + +This installs ansible if missing, then runs the playbook. Tasks are split by category in `ansible.desktop/tasks/`. + +## Architecture + +### Niri (Wayland compositor) +`niri/config.kdl` is just includes — the real config lives in `niri/cfg/`: +- `input.kdl` — keyboard/mouse/touchpad settings +- `keybinds.kdl` — all keybindings +- `layout.kdl` — gaps, border, window sizing +- `display.kdl` — monitor layout and scaling +- `autostart.kdl` — apps launched on compositor start +- `rules.kdl` — window-specific rules +- `animation.kdl`, `misc.kdl` — tweaks + +Edit the relevant split file, not `config.kdl` itself. + +### Noctalia (desktop shell / bar) +All settings live in `noctalia/settings.json` (JSON, edited by the Noctalia GUI or directly). Colorschemes are in `noctalia/colorschemes/` and plugins in `noctalia/plugins/`. + +### Neovim +Uses **LazyVIM** framework. Entry point is `nvim/init.lua` which bootstraps lazy.nvim via `nvim/lua/config/lazy.lua`. + +- `nvim/lua/config/` — core config (options, keymaps, autocmds) +- `nvim/lua/plugins/` — plugin overrides/additions on top of LazyVIM defaults +- `nvim/lua/colorschemes/` — colorscheme configs + +LazyVIM handles most plugin management; only deviations from LazyVIM defaults need entries in `lua/plugins/`. + +### tmux +`tmux/tmux.conf` + catppuccin theme as a git submodule at `tmux/plugins/catppuccin/tmux`. After cloning, initialize the submodule: + +```bash +git submodule update --init +``` + +### Shell / profile +`profile` is symlinked to `~/.profile`. It sets up SSH keys via `keychain` and defines the `notes` alias (attaches/creates a tmux session with nvim opening `~/Notes/Personal`). + +`zoxide.bash` provides shell integration for zoxide (directory jumping) — sourced separately, not via `profile`. diff --git a/niri/cfg/input.kdl b/niri/cfg/input.kdl index 93d6dde..cfe0f34 100644 --- a/niri/cfg/input.kdl +++ b/niri/cfg/input.kdl @@ -12,7 +12,7 @@ input { } touchpad { - //tap // Enable tap-to-click + tap // Enable tap-to-click dwt scroll-method "two-finger" tap-button-map "left-right-middle" diff --git a/niri/cfg/keybinds.kdl b/niri/cfg/keybinds.kdl index c9ac6a3..48496b6 100644 --- a/niri/cfg/keybinds.kdl +++ b/niri/cfg/keybinds.kdl @@ -13,8 +13,12 @@ binds { // ─── Applications ─── Alt+Return hotkey-overlay-title="Open Terminal: Alacritty" { spawn "alacritty"; } + Mod+G hotkey-overlay-title="Focus: Gmail" { spawn-sh "$HOME/.config/niri/focus-or-launch.sh chrome-fmgjjmmmlfnkbppncabfkddbjimcfncm-Default /opt/helium-browser-bin/helium-wrapper --profile-directory=Default --app-id=fmgjjmmmlfnkbppncabfkddbjimcfncm"; } + Mod+W hotkey-overlay-title="Focus: WhatsApp" { spawn-sh "$HOME/.config/niri/focus-or-launch.sh chrome-hnpfjngllnobngcgfapefoaidbinmjnm-Default /opt/helium-browser-bin/helium-wrapper --profile-directory=Default --app-id=hnpfjngllnobngcgfapefoaidbinmjnm"; } + Mod+D hotkey-overlay-title="Focus: Todoist" { spawn-sh "$HOME/.config/niri/focus-or-launch.sh chrome-dlgohinmglaoopaiplliaecdpmnepmga-Default /opt/helium-browser-bin/helium-wrapper --profile-directory=Default --app-id=dlgohinmglaoopaiplliaecdpmnepmga"; } //Mod+CTRL+Return hotkey-overlay-title="Open App Launcher: noctalia launcher" { spawn-sh "qs -c noctalia-shell ipc call launcher toggle"; } Alt+Space hotkey-overlay-title="Open App Launcher: noctalia launcher" { spawn-sh "qs -c noctalia-shell ipc call launcher toggle"; } + Alt+Shift+Space hotkey-overlay-title="Open Window Search: noctalia launcher" { spawn-sh "qs -c noctalia-shell ipc call launcher windows"; } Mod+B hotkey-overlay-title="Open Browser: helium" { spawn "helium-browser"; } Mod+L hotkey-overlay-title="Lock Screen: noctalia lock" { spawn-sh "qs -c noctalia-shell ipc call lockScreen lock"; } Mod+Shift+Q hotkey-overlay-title="Session Menu: noctalia sessionMenu" { spawn-sh "qs -c noctalia-shell ipc call sessionMenu toggle"; } @@ -132,7 +136,6 @@ binds { // ─── Modes ─── Mod+T { toggle-window-floating; } Mod+F { fullscreen-window; } - Mod+W { toggle-column-tabbed-display; } // ─── Screenshots ─── CTRL+Shift+1 { screenshot; } diff --git a/niri/cfg/layout.kdl b/niri/cfg/layout.kdl index 67c79d2..18b2968 100644 --- a/niri/cfg/layout.kdl +++ b/niri/cfg/layout.kdl @@ -5,7 +5,9 @@ background-color "transparent" // <- needed for noctalia-shell to set wallpaper //default-column-width { proportion 0.95; } - default-column-width { proportion 0.40; } + //default-column-width { proportion 0.40; } + //default-column-width {} + default-column-width { fixed 1200; } preset-column-widths { proportion 0.33333 diff --git a/niri/focus-or-launch.sh b/niri/focus-or-launch.sh new file mode 100755 index 0000000..d95e18d --- /dev/null +++ b/niri/focus-or-launch.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# Focus an existing window by app-id, or launch it if not found. +# If the target window is already focused, return to the previous window. +# Usage: focus-or-launch.sh +APP_ID="$1" +shift + +WINDOWS=$(niri msg -j windows) +FOCUSED_ID=$(echo "$WINDOWS" | jq -r '.[] | select(.is_focused == true) | .id') +TARGET_ID=$(echo "$WINDOWS" | jq -r --arg app "$APP_ID" '.[] | select(.app_id == $app) | .id' | head -1) + +PREV_FILE="/tmp/niri-focus-prev-${APP_ID}" + +if [ "$FOCUSED_ID" = "$TARGET_ID" ]; then + if [ -f "$PREV_FILE" ]; then + niri msg action focus-window --id "$(cat "$PREV_FILE")" 2>/dev/null || true + fi +else + echo "$FOCUSED_ID" > "$PREV_FILE" + if [ -n "$TARGET_ID" ]; then + niri msg action focus-window --id "$TARGET_ID" + else + exec "$@" + fi +fi