Compare commits
5
Commits
83409564ef
...
f3f3d6a94a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f3f3d6a94a | ||
|
|
d4cb9100c0 | ||
|
|
9ce77ad817 | ||
|
|
2a6b552725 | ||
|
|
10db5ade01 |
@@ -22,6 +22,7 @@ set -gx DEBUG 1
|
||||
set -gx GOPATH "$HOME/.go"
|
||||
set -gx GOCACHE "$HOME/.go/cache"
|
||||
set -gx GOROOT /usr/local/go
|
||||
set -gx OLS_BUILTIN_FOLDER "/home/jason/ThirdParty/ols/builtin"
|
||||
|
||||
# Direnv
|
||||
direnv hook fish | source
|
||||
|
||||
@@ -0,0 +1,256 @@
|
||||
// ============================================================================
|
||||
// GENERAL & SYSTEM SETTINGS
|
||||
// Wiki: https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction
|
||||
// ============================================================================
|
||||
config-notification {
|
||||
disable-failed
|
||||
}
|
||||
|
||||
hotkey-overlay {
|
||||
skip-at-startup
|
||||
}
|
||||
|
||||
prefer-no-csd
|
||||
|
||||
screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
|
||||
|
||||
debug {
|
||||
honor-xdg-activation-with-invalid-serial
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// ENVIRONMENT VARIABLES
|
||||
// ============================================================================
|
||||
environment {
|
||||
XDG_CURRENT_DESKTOP "niri"
|
||||
QT_QPA_PLATFORM "wayland;xcb"
|
||||
ELECTRON_OZONE_PLATFORM_HINT "auto"
|
||||
QT_QPA_PLATFORMTHEME "gtk3"
|
||||
QT_QPA_PLATFORMTHEME_QT6 "gtk3"
|
||||
TERMINAL "alacritty"
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// AUTOSTART / SPAWN AT STARTUP
|
||||
// ============================================================================
|
||||
spawn-at-startup "dms" "run"
|
||||
|
||||
// Export the session env to D-Bus so xdg-desktop-portal works
|
||||
spawn-at-startup "dbus-update-activation-environment" "--all"
|
||||
|
||||
// Audio stack
|
||||
spawn-at-startup "pipewire"
|
||||
|
||||
// PolicyKit authentication agent (verify path: xbps-query -f mate-polkit | grep -i agent)
|
||||
spawn-at-startup "sh" "-c" "/usr/libexec/polkit-mate-authentication-agent-1 &"
|
||||
|
||||
// Clipboard history backing store for Mod+V
|
||||
spawn-at-startup "sh" "-c" "wl-paste --watch cliphist store"
|
||||
|
||||
// Automount removable media
|
||||
spawn-at-startup "udiskie" "--no-tray"
|
||||
|
||||
// ============================================================================
|
||||
// INPUT & GESTURES
|
||||
// Wiki: https://github.com/YaLTeR/niri/wiki/Configuration:-Input
|
||||
// ============================================================================
|
||||
input {
|
||||
keyboard {
|
||||
xkb {
|
||||
// If this section is empty, niri will fetch xkb settings
|
||||
// from org.freedesktop.locale1. You can control these using
|
||||
// localectl set-x11-keymap.
|
||||
}
|
||||
|
||||
// Enable numlock on startup, omitting this setting disables it.
|
||||
numlock
|
||||
}
|
||||
|
||||
// Focus windows and outputs automatically when moving the mouse into them.
|
||||
focus-follows-mouse max-scroll-amount="95%"
|
||||
}
|
||||
|
||||
gestures {
|
||||
hot-corners {
|
||||
off
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// LAYOUT & VISUAL APPEARANCE
|
||||
// Wiki: https://github.com/YaLTeR/niri/wiki/Configuration:-Layout
|
||||
// ============================================================================
|
||||
layout {
|
||||
background-color "transparent"
|
||||
|
||||
// When to center a column when changing focus: "never", "always", or "on-overflow"
|
||||
center-focused-column "never"
|
||||
|
||||
// Custom widths toggled by "switch-preset-column-width" (Mod+R)
|
||||
preset-column-widths {
|
||||
proportion 0.5
|
||||
proportion 1.0
|
||||
}
|
||||
|
||||
default-column-width { proportion 0.5; }
|
||||
|
||||
border {
|
||||
off
|
||||
width 4
|
||||
active-color "#707070" // Neutral gray
|
||||
inactive-color "#d0d0d0" // Light gray
|
||||
urgent-color "#cc4444" // Softer red
|
||||
}
|
||||
|
||||
shadow {
|
||||
softness 30
|
||||
spread 5
|
||||
offset x=0 y=5
|
||||
color "#0007"
|
||||
}
|
||||
|
||||
struts {
|
||||
}
|
||||
}
|
||||
|
||||
overview {
|
||||
workspace-shadow {
|
||||
off
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// ANIMATIONS
|
||||
// ============================================================================
|
||||
animations {
|
||||
workspace-switch {
|
||||
spring damping-ratio=0.80 stiffness=523 epsilon=0.0001
|
||||
}
|
||||
window-open {
|
||||
duration-ms 150
|
||||
curve "ease-out-expo"
|
||||
}
|
||||
window-close {
|
||||
duration-ms 150
|
||||
curve "ease-out-quad"
|
||||
}
|
||||
horizontal-view-movement {
|
||||
spring damping-ratio=0.85 stiffness=423 epsilon=0.0001
|
||||
}
|
||||
window-movement {
|
||||
spring damping-ratio=0.75 stiffness=323 epsilon=0.0001
|
||||
}
|
||||
window-resize {
|
||||
spring damping-ratio=0.85 stiffness=423 epsilon=0.0001
|
||||
}
|
||||
config-notification-open-close {
|
||||
spring damping-ratio=0.65 stiffness=923 epsilon=0.001
|
||||
}
|
||||
screenshot-ui-open {
|
||||
duration-ms 200
|
||||
curve "ease-out-quad"
|
||||
}
|
||||
overview-open-close {
|
||||
spring damping-ratio=0.85 stiffness=800 epsilon=0.0001
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// WINDOW & LAYER RULES
|
||||
// Wiki: https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules
|
||||
// ============================================================================
|
||||
layer-rule {
|
||||
match namespace="^quickshell$"
|
||||
place-within-backdrop true
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match app-id=r#"^org\.gnome\."#
|
||||
draw-border-with-background false
|
||||
geometry-corner-radius 12
|
||||
clip-to-geometry true
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match app-id=r#"^gnome-control-center$"#
|
||||
match app-id=r#"^pavucontrol$"#
|
||||
match app-id=r#"^nm-connection-editor$"#
|
||||
default-column-width { proportion 0.5; }
|
||||
open-floating false
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match app-id=r#"^org\.gnome\.Calculator$"#
|
||||
match app-id=r#"^gnome-calculator$"#
|
||||
match app-id=r#"^galculator$"#
|
||||
match app-id=r#"^blueman-manager$"#
|
||||
match app-id=r#"^org\.gnome\.Nautilus$"#
|
||||
match app-id=r#"^xdg-desktop-portal$"#
|
||||
open-floating true
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match app-id="Alacritty"
|
||||
match app-id="kitty"
|
||||
draw-border-with-background false
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match app-id=r#"firefox$"# title="^Picture-in-Picture$"
|
||||
match app-id="zoom"
|
||||
open-floating true
|
||||
}
|
||||
|
||||
// Force the Steam client, Friends List, and settings windows to float
|
||||
window-rule {
|
||||
match app-id="steam"
|
||||
open-floating true
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match app-id="steam"
|
||||
match title="Friends List"
|
||||
open-floating true
|
||||
default-floating-position x=10 y=10 relative-to="bottom-right"
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match app-id=r#"^steam$"# title=r#"^notificationtoasts_\d+_desktop$"#
|
||||
default-floating-position x=10 y=10 relative-to="top-right"
|
||||
open-focused false
|
||||
}
|
||||
|
||||
// Automatically fullscreen games launched via Proton
|
||||
window-rule {
|
||||
// Proton games typically use "steam_app_<id>" as their app-id.
|
||||
// The r#"..."# syntax tells niri to evaluate this as a regular expression.
|
||||
match app-id=r#"^steam_app_\d+$"#
|
||||
open-fullscreen true
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// NAVIGATION & KEYBINDINGS
|
||||
// ============================================================================
|
||||
// Override to disable super+tab
|
||||
recent-windows {
|
||||
binds {
|
||||
Alt+Tab { next-window scope="output"; }
|
||||
Alt+Shift+Tab { previous-window scope="output"; }
|
||||
Alt+grave { next-window filter="app-id"; }
|
||||
Alt+Shift+grave { previous-window filter="app-id"; }
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// INCLUDES (DMS MANAGEMENT)
|
||||
// ============================================================================
|
||||
// @NOTE: only dms file we could edit
|
||||
include optional=true "dms/binds.kdl"
|
||||
|
||||
// @NOTE: Non-editable files below all managed by dms
|
||||
include optional=true "dms/colors.kdl"
|
||||
include optional=true "dms/layout.kdl"
|
||||
include optional=true "dms/alttab.kdl"
|
||||
include optional=true "dms/outputs.kdl"
|
||||
include optional=true "dms/cursor.kdl"
|
||||
include optional=true "dms/input.kdl"
|
||||
@@ -0,0 +1,152 @@
|
||||
binds {
|
||||
// ========================================================================
|
||||
// SYSTEM & DMS APPLICATION LAUNCHERS
|
||||
// ========================================================================
|
||||
// Screenshots
|
||||
Alt+Print hotkey-overlay-title="Screenshot: Window" { spawn "dms" "screenshot" "window"; }
|
||||
Alt+XF86Launch1 hotkey-overlay-title="Screenshot: Window" { spawn "dms" "screenshot" "window"; }
|
||||
Ctrl+Print hotkey-overlay-title="Screenshot: Full Screen" { spawn "dms" "screenshot" "full"; }
|
||||
Ctrl+XF86Launch1 hotkey-overlay-title="Screenshot: Full Screen" { spawn "dms" "screenshot" "full"; }
|
||||
Mod+P hotkey-overlay-title="Screenshot: Region" { spawn "dms" "screenshot"; }
|
||||
|
||||
// Launchers & Overlays
|
||||
Mod+D hotkey-overlay-title="Application Launcher" { spawn "dms" "ipc" "call" "spotlight" "toggle"; }
|
||||
Mod+space hotkey-overlay-title="Spotlight Bar: Toggle" { spawn "dms" "ipc" "call" "spotlight-bar" "toggle"; }
|
||||
Mod+Y hotkey-overlay-title="Browse Wallpapers" { spawn "dms" "ipc" "call" "dash" "toggle" "wallpaper"; }
|
||||
Super+Backspace hotkey-overlay-title="Power Menu: Toggle" { spawn "dms" "ipc" "call" "powermenu" "toggle"; }
|
||||
Mod+Alt+L hotkey-overlay-title="Lock Screen" { spawn "dms" "ipc" "call" "lock" "lock"; }
|
||||
|
||||
// Utilities & Tools
|
||||
Ctrl+Alt+Delete hotkey-overlay-title="Task Manager" { spawn "dms" "ipc" "call" "processlist" "focusOrToggle"; }
|
||||
Mod+M hotkey-overlay-title="Task Manager" { spawn "dms" "ipc" "call" "processlist" "focusOrToggle"; }
|
||||
Mod+N hotkey-overlay-title="Notification Center" { spawn "dms" "ipc" "call" "notifications" "toggle"; }
|
||||
Mod+S hotkey-overlay-title="Notepad" { spawn "dms" "ipc" "call" "notepad" "toggle"; }
|
||||
Mod+V hotkey-overlay-title="Clipboard Manager" { spawn "dms" "ipc" "call" "clipboard" "toggle"; }
|
||||
Mod+Comma hotkey-overlay-title="Settings" { spawn "dms" "ipc" "call" "settings" "focusOrToggle"; }
|
||||
|
||||
// Configuration Helpers
|
||||
Ctrl+Shift+R hotkey-overlay-title="Rename Workspace" { spawn "dms" "ipc" "call" "workspace-rename" "open"; }
|
||||
Mod+Shift+W hotkey-overlay-title="Create window rule" { spawn "dms" "ipc" "call" "window-rules" "toggle"; }
|
||||
|
||||
// Audio Control (MPRIS)
|
||||
Ctrl+XF86AudioLowerVolume allow-when-locked=true { spawn "dms" "ipc" "call" "mpris" "decrement" "3"; }
|
||||
Ctrl+XF86AudioRaiseVolume allow-when-locked=true { spawn "dms" "ipc" "call" "mpris" "increment" "3"; }
|
||||
|
||||
// ========================================================================
|
||||
// WINDOW & COLUMN FOCUS
|
||||
// ========================================================================
|
||||
// Focus Columns (Horizontal)
|
||||
Mod+H { focus-column-left; }
|
||||
Mod+Left { focus-column-left; }
|
||||
Mod+L { focus-column-right; }
|
||||
Mod+Right { focus-column-right; }
|
||||
Mod+Home { focus-column-first; }
|
||||
Mod+End { focus-column-last; }
|
||||
|
||||
// Focus Windows within Column (Vertical)
|
||||
Mod+J { focus-window-down; }
|
||||
Mod+Down { focus-window-down; }
|
||||
Mod+K { focus-window-up; }
|
||||
Mod+Up { focus-window-up; }
|
||||
|
||||
// Mouse Wheel Focus Navigation
|
||||
Mod+WheelScrollLeft { focus-column-left; }
|
||||
Mod+WheelScrollRight { focus-column-right; }
|
||||
Mod+Shift+WheelScrollUp { focus-column-left; }
|
||||
Mod+Shift+WheelScrollDown { focus-column-right; }
|
||||
|
||||
// ========================================================================
|
||||
// WINDOW & COLUMN MANIPULATION
|
||||
// ========================================================================
|
||||
// Close Window
|
||||
Mod+Q repeat=false { close-window; }
|
||||
|
||||
// Move Columns (Horizontal)
|
||||
Mod+Shift+H { move-column-left; }
|
||||
Mod+Shift+Left { move-column-left; }
|
||||
Mod+Shift+L { move-column-right; }
|
||||
Mod+Shift+Right { move-column-right; }
|
||||
Mod+Ctrl+Home { move-column-to-first; }
|
||||
Mod+Ctrl+End { move-column-to-last; }
|
||||
Mod+Ctrl+WheelScrollLeft { move-column-left; }
|
||||
Mod+Ctrl+WheelScrollRight { move-column-right; }
|
||||
Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
|
||||
Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
|
||||
|
||||
// Move Windows within Column (Vertical)
|
||||
Mod+Shift+J { move-window-down; }
|
||||
Mod+Shift+Down { move-window-down; }
|
||||
Mod+Shift+K { move-window-up; }
|
||||
Mod+Shift+Up { move-window-up; }
|
||||
|
||||
// Sizing & Layout Constraints
|
||||
Mod+Equal { set-column-width "+10%"; }
|
||||
Mod+Minus { set-column-width "-10%"; }
|
||||
Mod+Shift+Equal { set-window-height "+10%"; }
|
||||
Mod+Shift+Minus { set-window-height "-10%"; }
|
||||
Mod+R { switch-preset-column-width; }
|
||||
Mod+Shift+R { switch-preset-window-height; }
|
||||
Mod+Ctrl+R { reset-window-height; }
|
||||
Mod+Ctrl+F { expand-column-to-available-width; }
|
||||
Mod+F { maximize-column; }
|
||||
Mod+Shift+F { fullscreen-window; }
|
||||
|
||||
// Positioning, Floating & Tiling States
|
||||
Mod+C { center-column; }
|
||||
Mod+Ctrl+C { center-visible-columns; }
|
||||
Mod+W { toggle-column-tabbed-display; }
|
||||
Mod+Shift+T { toggle-window-floating; }
|
||||
Mod+Shift+V { switch-focus-between-floating-and-tiling; }
|
||||
Mod+BracketLeft { consume-or-expel-window-left; }
|
||||
Mod+BracketRight { consume-or-expel-window-right; }
|
||||
Mod+Period { expel-window-from-column; }
|
||||
|
||||
// ========================================================================
|
||||
// WORKSPACE MANAGEMENT
|
||||
// ========================================================================
|
||||
// Switch Workspace Focus
|
||||
Mod+Page_Up { focus-workspace-up; }
|
||||
Mod+I { focus-workspace-up; }
|
||||
Mod+Page_Down { focus-workspace-down; }
|
||||
Mod+U { focus-workspace-down; }
|
||||
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
|
||||
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
|
||||
|
||||
// Switch Workspace by Index
|
||||
Mod+1 { focus-workspace 1; }
|
||||
Mod+2 { focus-workspace 2; }
|
||||
Mod+3 { focus-workspace 3; }
|
||||
Mod+4 { focus-workspace 4; }
|
||||
|
||||
// Move Focused Column to Workspace
|
||||
Mod+Ctrl+Up { move-column-to-workspace-up; }
|
||||
Mod+Ctrl+I { move-column-to-workspace-up; }
|
||||
Mod+Ctrl+Down { move-column-to-workspace-down; }
|
||||
Mod+Ctrl+U { move-column-to-workspace-down; }
|
||||
Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
|
||||
Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
|
||||
|
||||
// Move Focused Column to Workspace Index
|
||||
Mod+Shift+1 { move-column-to-workspace 1; }
|
||||
Mod+Shift+2 { move-column-to-workspace 2; }
|
||||
Mod+Shift+3 { move-column-to-workspace 3; }
|
||||
Mod+Shift+4 { move-column-to-workspace 4; }
|
||||
|
||||
// Move Entire Workspace Position
|
||||
Mod+Shift+Page_Up { move-workspace-up; }
|
||||
Mod+Shift+I { move-workspace-up; }
|
||||
Mod+Shift+Page_Down { move-workspace-down; }
|
||||
Mod+Shift+U { move-workspace-down; }
|
||||
|
||||
// ========================================================================
|
||||
// COMPOSITOR & SESSION CONTROLS
|
||||
// ========================================================================
|
||||
|
||||
Mod+T hotkey-overlay-title="Open Terminal" { spawn "alacritty"; }
|
||||
Mod+O repeat=false { toggle-overview; }
|
||||
Mod+Tab repeat=false { toggle-overview; }
|
||||
Mod+Slash { show-hotkey-overlay; }
|
||||
Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
|
||||
Mod+Shift+P { power-off-monitors; }
|
||||
Mod+Shift+E { quit; }
|
||||
}
|
||||
+132
-101
@@ -12,143 +12,174 @@ DO_INSTALL=false
|
||||
CONFIRM_MODE=true # only true when no args are passed
|
||||
|
||||
usage() {
|
||||
echo "Usage: $0 [-l] [-i]"
|
||||
echo " -l Only create symlinks (no confirmation)"
|
||||
echo " -i Only install system packages (no confirmation)"
|
||||
echo " (no args = do both, with confirmation)"
|
||||
exit 1
|
||||
echo "Usage: $0 [-l] [-i]"
|
||||
echo " -l Only create symlinks (no confirmation)"
|
||||
echo " -i Only install system packages (no confirmation)"
|
||||
echo " (no args = do both, with confirmation)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
DO_LINKS=true
|
||||
DO_INSTALL=true
|
||||
CONFIRM_MODE=true
|
||||
DO_LINKS=true
|
||||
DO_INSTALL=true
|
||||
CONFIRM_MODE=true
|
||||
else
|
||||
CONFIRM_MODE=false
|
||||
while getopts ":lih" opt; do
|
||||
case $opt in
|
||||
l) DO_LINKS=true ;;
|
||||
i) DO_INSTALL=true ;;
|
||||
h) usage ;;
|
||||
*) usage ;;
|
||||
esac
|
||||
done
|
||||
CONFIRM_MODE=false
|
||||
while getopts ":lih" opt; do
|
||||
case $opt in
|
||||
l) DO_LINKS=true ;;
|
||||
i) DO_INSTALL=true ;;
|
||||
h) usage ;;
|
||||
*) usage ;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
## Helper function for linking
|
||||
# ---------------------------------------------------------------------------------
|
||||
link_file() {
|
||||
local src="$1"
|
||||
local dest="$2"
|
||||
local src="$1"
|
||||
local dest="$2"
|
||||
|
||||
if [ -L "$dest" ]; then
|
||||
if [ "$(readlink "$dest")" == "$src" ]; then
|
||||
echo "✅ Symlink already correct: $dest → $src"
|
||||
((SKIPPED++))
|
||||
else
|
||||
echo "⚠️ $dest is a symlink but points to the wrong target."
|
||||
echo " Replacing with correct symlink..."
|
||||
rm "$dest"
|
||||
ln -s "$src" "$dest"
|
||||
echo "🔁 Fixed: $dest → $src"
|
||||
((CREATED++))
|
||||
fi
|
||||
elif [ -e "$dest" ]; then
|
||||
echo "⚠️ $dest exists but is not a symlink. Skipping."
|
||||
((SKIPPED++))
|
||||
else
|
||||
mkdir -p "$(dirname "$dest")"
|
||||
ln -s "$src" "$dest"
|
||||
echo "✅ Linked: $dest → $src"
|
||||
((CREATED++))
|
||||
fi
|
||||
if [ -L "$dest" ]; then
|
||||
if [ "$(readlink "$dest")" == "$src" ]; then
|
||||
echo "✅ Symlink already correct: $dest → $src"
|
||||
((SKIPPED++))
|
||||
else
|
||||
echo "⚠️ $dest is a symlink but points to the wrong target."
|
||||
echo " Replacing with correct symlink..."
|
||||
rm "$dest"
|
||||
ln -s "$src" "$dest"
|
||||
echo "🔁 Fixed: $dest → $src"
|
||||
((CREATED++))
|
||||
fi
|
||||
elif [ -e "$dest" ]; then
|
||||
echo "⚠️ $dest exists but is not a symlink. Skipping."
|
||||
((SKIPPED++))
|
||||
else
|
||||
mkdir -p "$(dirname "$dest")"
|
||||
ln -s "$src" "$dest"
|
||||
echo "✅ Linked: $dest → $src"
|
||||
((CREATED++))
|
||||
fi
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
## LINK SYMLINKS
|
||||
# ---------------------------------------------------------------------------------
|
||||
if [ "$DO_LINKS" = true ]; then
|
||||
if [ "$CONFIRM_MODE" = true ]; then
|
||||
read -p "❓ Do you want to create symlinks for your dotfiles? [y/N] " confirm
|
||||
case "$confirm" in
|
||||
[Yy]*) ;; # continue below
|
||||
*) DO_LINKS=false ;;
|
||||
esac
|
||||
fi
|
||||
if [ "$CONFIRM_MODE" = true ]; then
|
||||
read -p "❓ Do you want to create symlinks for your dotfiles? [y/N] " confirm
|
||||
case "$confirm" in
|
||||
[Yy]*) ;; # continue below
|
||||
*) DO_LINKS=false ;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$DO_LINKS" = true ]; then
|
||||
echo "🔗 Checking and creating symlinks..."
|
||||
CREATED=0
|
||||
SKIPPED=0
|
||||
echo "🔗 Checking and creating symlinks..."
|
||||
CREATED=0
|
||||
SKIPPED=0
|
||||
|
||||
link_file "$DOTFILES_DIR/config/fish/config.fish" "$HOME/.config/fish/config.fish"
|
||||
link_file "$DOTFILES_DIR/config/vim" "$HOME/.vim"
|
||||
link_file "$DOTFILES_DIR/config/kanata" "$HOME/.config/kanata"
|
||||
link_file "$DOTFILES_DIR/scripts/bin" "$HOME/.local/bin"
|
||||
# Modern shell & editor setup
|
||||
link_file "$DOTFILES_DIR/config/niri/config.kdl" "$HOME/.config/niri/config.kdl"
|
||||
link_file "$DOTFILES_DIR/config/niri/dms/binds.kdl" "$HOME/.config/niri/dms/binds.kdl"
|
||||
link_file "$DOTFILES_DIR/config/fish/config.fish" "$HOME/.config/fish/config.fish"
|
||||
link_file "$DOTFILES_DIR/config/vim" "$HOME/.vim"
|
||||
link_file "$DOTFILES_DIR/config/kanata" "$HOME/.config/kanata"
|
||||
link_file "$DOTFILES_DIR/scripts/bin" "$HOME/.local/bin"
|
||||
|
||||
echo ""
|
||||
echo "🧾 Summary: $CREATED symlink(s) created or fixed, $SKIPPED skipped."
|
||||
echo ""
|
||||
echo ""
|
||||
echo "🧾 Summary: $CREATED symlink(s) created or fixed, $SKIPPED skipped."
|
||||
echo ""
|
||||
|
||||
echo "✅ Symlink setup complete."
|
||||
echo ""
|
||||
echo "✅ Symlink setup complete."
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
## INSTALL SYSTEM PACKAGES
|
||||
# ---------------------------------------------------------------------------------
|
||||
if [ "$DO_INSTALL" = true ]; then
|
||||
if [ "$CONFIRM_MODE" = true ]; then
|
||||
read -p "❓ Do you want to install system packages? [y/N] " confirm
|
||||
case "$confirm" in
|
||||
[Yy]*) ;; # continue below
|
||||
*) DO_INSTALL=false ;;
|
||||
esac
|
||||
fi
|
||||
if [ "$CONFIRM_MODE" = true ]; then
|
||||
read -p "❓ Do you want to install system packages? [y/N] " confirm
|
||||
case "$confirm" in
|
||||
[Yy]*) ;; # continue below
|
||||
*) DO_INSTALL=false ;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$DO_INSTALL" = true ]; then
|
||||
REQUIRED_PACKAGES=(
|
||||
# system
|
||||
fuse3
|
||||
# network & download
|
||||
wget curl ca-certificates gnupg rsync
|
||||
# core utilities
|
||||
fish git vim fd-find jq fzf ripgrep tree direnv make bat
|
||||
ark unzip p7zip-full tar gzip bzip2 xz-utils
|
||||
# build & dev tools
|
||||
build-essential valgrind nodejs
|
||||
# fonts
|
||||
fonts-noto-core fonts-noto-color-emoji
|
||||
# desktop portal
|
||||
xdg-desktop-portal xdg-desktop-portal-gtk
|
||||
)
|
||||
|
||||
MISSING_PACKAGES=()
|
||||
# -----------------------------------------------------------------------------
|
||||
## ADD NONFREE REPOS
|
||||
# -----------------------------------------------------------------------------
|
||||
echo "📦 Checking nonfree repositories..."
|
||||
|
||||
echo "🔍 Checking for missing packages..."
|
||||
echo ""
|
||||
REPO_PACKAGES=(void-repo-nonfree)
|
||||
|
||||
# Check which packages are missing using dpkg
|
||||
for pkg in "${REQUIRED_PACKAGES[@]}"; do
|
||||
if ! dpkg -s "$pkg" >/dev/null 2>&1; then
|
||||
MISSING_PACKAGES+=("$pkg")
|
||||
fi
|
||||
done
|
||||
# Only add multilib-nonfree on x86_64
|
||||
if [ "$(uname -m)" = "x86_64" ]; then
|
||||
REPO_PACKAGES+=(void-repo-multilib-nonfree)
|
||||
fi
|
||||
|
||||
if [ ${#MISSING_PACKAGES[@]} -eq 0 ]; then
|
||||
echo "✅ All required packages are already installed."
|
||||
else
|
||||
echo "📦 Syncing package index..."
|
||||
sudo apt update
|
||||
MISSING_REPOS=()
|
||||
for repo in "${REPO_PACKAGES[@]}"; do
|
||||
if ! xbps-query -p pkgver "$repo" >/dev/null 2>&1; then
|
||||
MISSING_REPOS+=("$repo")
|
||||
fi
|
||||
done
|
||||
|
||||
echo "📦 Installing missing packages: ${MISSING_PACKAGES[*]}"
|
||||
sudo apt install -y "${MISSING_PACKAGES[@]}"
|
||||
fi
|
||||
if [ ${#MISSING_REPOS[@]} -eq 0 ]; then
|
||||
echo "✅ Nonfree repositories already enabled."
|
||||
else
|
||||
echo "📦 Enabling repositories: ${MISSING_REPOS[*]}"
|
||||
sudo xbps-install -Sy "${MISSING_REPOS[@]}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ Package setup complete."
|
||||
echo ""
|
||||
echo ""
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
## INSTALL REQUIRED PACKAGES
|
||||
# -----------------------------------------------------------------------------
|
||||
REQUIRED_PACKAGES=(
|
||||
# system & shell
|
||||
pfetch fuse3 fish-shell
|
||||
# network & download
|
||||
wget curl ca-certificates gnupg rsync
|
||||
# core utilities & CLI tools
|
||||
git vim fd jq fzf ripgrep tree direnv make bat
|
||||
ark unzip p7zip tar gzip bzip2 xz kanata gitu
|
||||
# build & dev tools
|
||||
alacritty base-devel valgrind tree-sitter-cli go nodejs
|
||||
)
|
||||
|
||||
MISSING_PACKAGES=()
|
||||
|
||||
echo "🔍 Checking for missing packages..."
|
||||
echo ""
|
||||
|
||||
# Check which packages are missing using xbps-query
|
||||
for pkg in "${REQUIRED_PACKAGES[@]}"; do
|
||||
if ! xbps-query -p pkgver "$pkg" >/dev/null 2>&1; then
|
||||
MISSING_PACKAGES+=("$pkg")
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${#MISSING_PACKAGES[@]} -eq 0 ]; then
|
||||
echo "✅ All required packages are already installed."
|
||||
else
|
||||
echo "📦 Syncing repository indexes..."
|
||||
sudo xbps-install -S
|
||||
|
||||
echo "📦 Installing missing packages: ${MISSING_PACKAGES[*]}"
|
||||
sudo xbps-install "${MISSING_PACKAGES[@]}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ Package setup complete."
|
||||
echo ""
|
||||
fi
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
#!/bin/bash
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Odin compiler install recipe
|
||||
# Target: Pop!_OS / Ubuntu / Debian
|
||||
# Builds from source - recommended method on Linux
|
||||
# ---------------------------------------------------------------------------------
|
||||
set -e
|
||||
ODIN_DIR="$HOME/.odin"
|
||||
|
||||
echo "Installing Odin build dependencies..."
|
||||
sudo apt update
|
||||
sudo apt install -y llvm-18-dev clang-18 git-lfs build-essential
|
||||
sudo xbps-install -S
|
||||
sudo xbps-install -y llvm18-devel clang18 git-lfs base-devel
|
||||
|
||||
git lfs install --force
|
||||
|
||||
echo "Cloning Odin repository..."
|
||||
@@ -21,8 +17,22 @@ else
|
||||
cd "$ODIN_DIR"
|
||||
fi
|
||||
|
||||
echo "Building Odin compiler..."
|
||||
LLVM_CONFIG=llvm-config-18 make release-native
|
||||
# Detect available LLVM 18 config tool name on Void
|
||||
LLVM_CFG=""
|
||||
for cfg in llvm-config-18 llvm-config18 llvm-config; do
|
||||
if command -v "$cfg" >/dev/null 2>&1; then
|
||||
LLVM_CFG="$cfg"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$LLVM_CFG" ]; then
|
||||
echo "❌ Error: Could not locate a valid llvm-config binary."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Building Odin compiler using $LLVM_CFG..."
|
||||
LLVM_CONFIG="$LLVM_CFG" make release-native
|
||||
|
||||
echo ""
|
||||
echo "✓ Odin install complete."
|
||||
|
||||
@@ -1,15 +1,24 @@
|
||||
#!/bin/bash
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Raylib-go dependency install recipe
|
||||
# Target: Pop!_OS / Ubuntu / Debian
|
||||
# Installs system libs needed for raylib to run
|
||||
# Raylib / Raylib-go dependency install recipe
|
||||
# Target: Void Linux
|
||||
# Installs system development libraries needed for Raylib / GLFW / OpenGL
|
||||
# ---------------------------------------------------------------------------------
|
||||
set -e
|
||||
|
||||
echo "Installing raylib-go system dependencies..."
|
||||
sudo apt update
|
||||
sudo apt install -y build-essential libasound2-dev libgl1-mesa-dev libx11-dev libxrandr-dev libxi-dev libxcursor-dev libxinerama-dev libxinerama-dev libxcursor-dev libxinerama-dev
|
||||
echo "Installing Raylib system dependencies..."
|
||||
sudo xbps-install -S
|
||||
sudo xbps-install -y \
|
||||
base-devel \
|
||||
alsa-lib-devel \
|
||||
MesaLib-devel \
|
||||
libX11-devel \
|
||||
libXrandr-devel \
|
||||
libXi-devel \
|
||||
libXcursor-devel \
|
||||
libXinerama-devel \
|
||||
libXxf86vm-devel
|
||||
|
||||
echo ""
|
||||
echo "✓ Raylib-go dependencies installed."
|
||||
echo "✓ Raylib dependencies installed."
|
||||
echo ""
|
||||
Reference in New Issue
Block a user