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 GOPATH "$HOME/.go"
|
||||||
set -gx GOCACHE "$HOME/.go/cache"
|
set -gx GOCACHE "$HOME/.go/cache"
|
||||||
set -gx GOROOT /usr/local/go
|
set -gx GOROOT /usr/local/go
|
||||||
|
set -gx OLS_BUILTIN_FOLDER "/home/jason/ThirdParty/ols/builtin"
|
||||||
|
|
||||||
# Direnv
|
# Direnv
|
||||||
direnv hook fish | source
|
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
|
CONFIRM_MODE=true # only true when no args are passed
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
echo "Usage: $0 [-l] [-i]"
|
echo "Usage: $0 [-l] [-i]"
|
||||||
echo " -l Only create symlinks (no confirmation)"
|
echo " -l Only create symlinks (no confirmation)"
|
||||||
echo " -i Only install system packages (no confirmation)"
|
echo " -i Only install system packages (no confirmation)"
|
||||||
echo " (no args = do both, with confirmation)"
|
echo " (no args = do both, with confirmation)"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ $# -eq 0 ]; then
|
if [ $# -eq 0 ]; then
|
||||||
DO_LINKS=true
|
DO_LINKS=true
|
||||||
DO_INSTALL=true
|
DO_INSTALL=true
|
||||||
CONFIRM_MODE=true
|
CONFIRM_MODE=true
|
||||||
else
|
else
|
||||||
CONFIRM_MODE=false
|
CONFIRM_MODE=false
|
||||||
while getopts ":lih" opt; do
|
while getopts ":lih" opt; do
|
||||||
case $opt in
|
case $opt in
|
||||||
l) DO_LINKS=true ;;
|
l) DO_LINKS=true ;;
|
||||||
i) DO_INSTALL=true ;;
|
i) DO_INSTALL=true ;;
|
||||||
h) usage ;;
|
h) usage ;;
|
||||||
*) usage ;;
|
*) usage ;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
## Helper function for linking
|
## Helper function for linking
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
link_file() {
|
link_file() {
|
||||||
local src="$1"
|
local src="$1"
|
||||||
local dest="$2"
|
local dest="$2"
|
||||||
|
|
||||||
if [ -L "$dest" ]; then
|
if [ -L "$dest" ]; then
|
||||||
if [ "$(readlink "$dest")" == "$src" ]; then
|
if [ "$(readlink "$dest")" == "$src" ]; then
|
||||||
echo "✅ Symlink already correct: $dest → $src"
|
echo "✅ Symlink already correct: $dest → $src"
|
||||||
((SKIPPED++))
|
((SKIPPED++))
|
||||||
else
|
else
|
||||||
echo "⚠️ $dest is a symlink but points to the wrong target."
|
echo "⚠️ $dest is a symlink but points to the wrong target."
|
||||||
echo " Replacing with correct symlink..."
|
echo " Replacing with correct symlink..."
|
||||||
rm "$dest"
|
rm "$dest"
|
||||||
ln -s "$src" "$dest"
|
ln -s "$src" "$dest"
|
||||||
echo "🔁 Fixed: $dest → $src"
|
echo "🔁 Fixed: $dest → $src"
|
||||||
((CREATED++))
|
((CREATED++))
|
||||||
fi
|
fi
|
||||||
elif [ -e "$dest" ]; then
|
elif [ -e "$dest" ]; then
|
||||||
echo "⚠️ $dest exists but is not a symlink. Skipping."
|
echo "⚠️ $dest exists but is not a symlink. Skipping."
|
||||||
((SKIPPED++))
|
((SKIPPED++))
|
||||||
else
|
else
|
||||||
mkdir -p "$(dirname "$dest")"
|
mkdir -p "$(dirname "$dest")"
|
||||||
ln -s "$src" "$dest"
|
ln -s "$src" "$dest"
|
||||||
echo "✅ Linked: $dest → $src"
|
echo "✅ Linked: $dest → $src"
|
||||||
((CREATED++))
|
((CREATED++))
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
## LINK SYMLINKS
|
## LINK SYMLINKS
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
if [ "$DO_LINKS" = true ]; then
|
if [ "$DO_LINKS" = true ]; then
|
||||||
if [ "$CONFIRM_MODE" = true ]; then
|
if [ "$CONFIRM_MODE" = true ]; then
|
||||||
read -p "❓ Do you want to create symlinks for your dotfiles? [y/N] " confirm
|
read -p "❓ Do you want to create symlinks for your dotfiles? [y/N] " confirm
|
||||||
case "$confirm" in
|
case "$confirm" in
|
||||||
[Yy]*) ;; # continue below
|
[Yy]*) ;; # continue below
|
||||||
*) DO_LINKS=false ;;
|
*) DO_LINKS=false ;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$DO_LINKS" = true ]; then
|
if [ "$DO_LINKS" = true ]; then
|
||||||
echo "🔗 Checking and creating symlinks..."
|
echo "🔗 Checking and creating symlinks..."
|
||||||
CREATED=0
|
CREATED=0
|
||||||
SKIPPED=0
|
SKIPPED=0
|
||||||
|
|
||||||
link_file "$DOTFILES_DIR/config/fish/config.fish" "$HOME/.config/fish/config.fish"
|
# Modern shell & editor setup
|
||||||
link_file "$DOTFILES_DIR/config/vim" "$HOME/.vim"
|
link_file "$DOTFILES_DIR/config/niri/config.kdl" "$HOME/.config/niri/config.kdl"
|
||||||
link_file "$DOTFILES_DIR/config/kanata" "$HOME/.config/kanata"
|
link_file "$DOTFILES_DIR/config/niri/dms/binds.kdl" "$HOME/.config/niri/dms/binds.kdl"
|
||||||
link_file "$DOTFILES_DIR/scripts/bin" "$HOME/.local/bin"
|
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 ""
|
||||||
echo "🧾 Summary: $CREATED symlink(s) created or fixed, $SKIPPED skipped."
|
echo "🧾 Summary: $CREATED symlink(s) created or fixed, $SKIPPED skipped."
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
echo "✅ Symlink setup complete."
|
echo "✅ Symlink setup complete."
|
||||||
echo ""
|
echo ""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
## INSTALL SYSTEM PACKAGES
|
## INSTALL SYSTEM PACKAGES
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
if [ "$DO_INSTALL" = true ]; then
|
if [ "$DO_INSTALL" = true ]; then
|
||||||
if [ "$CONFIRM_MODE" = true ]; then
|
if [ "$CONFIRM_MODE" = true ]; then
|
||||||
read -p "❓ Do you want to install system packages? [y/N] " confirm
|
read -p "❓ Do you want to install system packages? [y/N] " confirm
|
||||||
case "$confirm" in
|
case "$confirm" in
|
||||||
[Yy]*) ;; # continue below
|
[Yy]*) ;; # continue below
|
||||||
*) DO_INSTALL=false ;;
|
*) DO_INSTALL=false ;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$DO_INSTALL" = true ]; then
|
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..."
|
REPO_PACKAGES=(void-repo-nonfree)
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Check which packages are missing using dpkg
|
# Only add multilib-nonfree on x86_64
|
||||||
for pkg in "${REQUIRED_PACKAGES[@]}"; do
|
if [ "$(uname -m)" = "x86_64" ]; then
|
||||||
if ! dpkg -s "$pkg" >/dev/null 2>&1; then
|
REPO_PACKAGES+=(void-repo-multilib-nonfree)
|
||||||
MISSING_PACKAGES+=("$pkg")
|
fi
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ ${#MISSING_PACKAGES[@]} -eq 0 ]; then
|
MISSING_REPOS=()
|
||||||
echo "✅ All required packages are already installed."
|
for repo in "${REPO_PACKAGES[@]}"; do
|
||||||
else
|
if ! xbps-query -p pkgver "$repo" >/dev/null 2>&1; then
|
||||||
echo "📦 Syncing package index..."
|
MISSING_REPOS+=("$repo")
|
||||||
sudo apt update
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
echo "📦 Installing missing packages: ${MISSING_PACKAGES[*]}"
|
if [ ${#MISSING_REPOS[@]} -eq 0 ]; then
|
||||||
sudo apt install -y "${MISSING_PACKAGES[@]}"
|
echo "✅ Nonfree repositories already enabled."
|
||||||
fi
|
else
|
||||||
|
echo "📦 Enabling repositories: ${MISSING_REPOS[*]}"
|
||||||
|
sudo xbps-install -Sy "${MISSING_REPOS[@]}"
|
||||||
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "✅ Package setup complete."
|
|
||||||
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
|
fi
|
||||||
|
|||||||
@@ -1,15 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# ---------------------------------------------------------------------------------
|
|
||||||
# Odin compiler install recipe
|
|
||||||
# Target: Pop!_OS / Ubuntu / Debian
|
|
||||||
# Builds from source - recommended method on Linux
|
|
||||||
# ---------------------------------------------------------------------------------
|
|
||||||
set -e
|
set -e
|
||||||
ODIN_DIR="$HOME/.odin"
|
ODIN_DIR="$HOME/.odin"
|
||||||
|
|
||||||
echo "Installing Odin build dependencies..."
|
echo "Installing Odin build dependencies..."
|
||||||
sudo apt update
|
sudo xbps-install -S
|
||||||
sudo apt install -y llvm-18-dev clang-18 git-lfs build-essential
|
sudo xbps-install -y llvm18-devel clang18 git-lfs base-devel
|
||||||
|
|
||||||
git lfs install --force
|
git lfs install --force
|
||||||
|
|
||||||
echo "Cloning Odin repository..."
|
echo "Cloning Odin repository..."
|
||||||
@@ -21,10 +17,24 @@ else
|
|||||||
cd "$ODIN_DIR"
|
cd "$ODIN_DIR"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Building Odin compiler..."
|
# Detect available LLVM 18 config tool name on Void
|
||||||
LLVM_CONFIG=llvm-config-18 make release-native
|
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 ""
|
||||||
echo "✓ Odin install complete."
|
echo "✓ Odin install complete."
|
||||||
echo " Add to your path if needed: export PATH=\"\$HOME/.odin:\$PATH\""
|
echo " Add to your path if needed: export PATH=\"\$HOME/.odin:\$PATH\""
|
||||||
echo " Then verify with: odin version"
|
echo " Then verify with: odin version"
|
||||||
|
|||||||
@@ -1,15 +1,24 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
# Raylib-go dependency install recipe
|
# Raylib / Raylib-go dependency install recipe
|
||||||
# Target: Pop!_OS / Ubuntu / Debian
|
# Target: Void Linux
|
||||||
# Installs system libs needed for raylib to run
|
# Installs system development libraries needed for Raylib / GLFW / OpenGL
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
echo "Installing raylib-go system dependencies..."
|
echo "Installing Raylib system dependencies..."
|
||||||
sudo apt update
|
sudo xbps-install -S
|
||||||
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
|
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 ""
|
||||||
echo "✓ Raylib-go dependencies installed."
|
echo "✓ Raylib dependencies installed."
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
Reference in New Issue
Block a user