diff --git a/dot_bashrc b/dot_bashrc
index e857dee..f15bdfa 100644
--- a/dot_bashrc
+++ b/dot_bashrc
@@ -12,7 +12,7 @@ fi
## Functions
# Yazi
-function ya() {
+function y() {
local tmp="$(mktemp -t "yazi-cwd.XXXXX")"
yazi "$@" --cwd-file="$tmp"
if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then
@@ -21,6 +21,11 @@ function ya() {
rm -f -- "$tmp"
}
+# Chezmoi apply changes from current chezmoi DIR
+function ca() {
+ chezmoi apply "$(chezmoi target-path "${1:-.}")"
+}
+
## Aliases
# Replace ls with eza
if [ -f /usr/bin/eza ]; then
diff --git a/dot_config/fish/conf.d/executable_fish_frozen_theme.fish b/dot_config/fish/conf.d/executable_fish_frozen_theme.fish
new file mode 100644
index 0000000..0caf65e
--- /dev/null
+++ b/dot_config/fish/conf.d/executable_fish_frozen_theme.fish
@@ -0,0 +1,37 @@
+# This file was created by fish when upgrading to version 4.3, to migrate
+# theme variables from universal to global scope.
+# Don't edit this file, as it will be written by the web-config tool (`fish_config`).
+# To customize your theme, delete this file and see
+# help interactive#syntax-highlighting
+# or
+# man fish-interactive | less +/^SYNTAX.HIGHLIGHTING
+# for appropriate commands to add to ~/.config/fish/config.fish instead.
+# See also the release notes for fish 4.3.0 (run `help relnotes`).
+
+set --global fish_color_autosuggestion brblack
+set --global fish_color_cancel -r
+set --global fish_color_command blue
+set --global fish_color_comment red
+set --global fish_color_cwd green
+set --global fish_color_cwd_root red
+set --global fish_color_end green
+set --global fish_color_error brred
+set --global fish_color_escape brcyan
+set --global fish_color_history_current --bold
+set --global fish_color_host normal
+set --global fish_color_host_remote yellow
+set --global fish_color_normal normal
+set --global fish_color_operator brcyan
+set --global fish_color_param cyan
+set --global fish_color_quote yellow
+set --global fish_color_redirection cyan --bold
+set --global fish_color_search_match white --background=brblack
+set --global fish_color_selection white --bold --background=brblack
+set --global fish_color_status red
+set --global fish_color_user brgreen
+set --global fish_color_valid_path --underline
+set --global fish_pager_color_completion normal
+set --global fish_pager_color_description yellow -i
+set --global fish_pager_color_prefix normal --bold --underline
+set --global fish_pager_color_progress brwhite --background=cyan
+set --global fish_pager_color_selected_background -r
diff --git a/dot_config/fish/config.fish b/dot_config/fish/config.fish
index 709bfbf..faac67a 100644
--- a/dot_config/fish/config.fish
+++ b/dot_config/fish/config.fish
@@ -134,6 +134,16 @@ function w2o
end
end
+# Chezmoi apply changes from current chezmoi DIR
+function ca
+ set -l path "."
+ if test (count $argv) -gt 0
+ set path $argv[1]
+ end
+
+ chezmoi apply (chezmoi target-path $path)
+end
+
## Aliases
# Replace ls with eza
if type -q eza
diff --git a/dot_config/fish/private_fish_variables b/dot_config/fish/private_fish_variables
new file mode 100644
index 0000000..49d4a24
--- /dev/null
+++ b/dot_config/fish/private_fish_variables
@@ -0,0 +1,30 @@
+# This file contains fish universal variable definitions.
+# VERSION: 3.0
+SETUVAR fish_color_autosuggestion:brblack
+SETUVAR fish_color_cancel:\x2dr
+SETUVAR fish_color_command:blue
+SETUVAR fish_color_comment:red
+SETUVAR fish_color_cwd:green
+SETUVAR fish_color_cwd_root:red
+SETUVAR fish_color_end:green
+SETUVAR fish_color_error:brred
+SETUVAR fish_color_escape:brcyan
+SETUVAR fish_color_history_current:\x2d\x2dbold
+SETUVAR fish_color_host:normal
+SETUVAR fish_color_host_remote:yellow
+SETUVAR fish_color_normal:normal
+SETUVAR fish_color_operator:brcyan
+SETUVAR fish_color_param:cyan
+SETUVAR fish_color_quote:yellow
+SETUVAR fish_color_redirection:cyan\x1e\x2d\x2dbold
+SETUVAR fish_color_search_match:bryellow\x1e\x2d\x2dbackground\x3dbrblack
+SETUVAR fish_color_selection:white\x1e\x2d\x2dbold\x1e\x2d\x2dbackground\x3dbrblack
+SETUVAR fish_color_status:red
+SETUVAR fish_color_user:brgreen
+SETUVAR fish_color_valid_path:\x2d\x2dunderline
+SETUVAR fish_key_bindings:fish_default_key_bindings
+SETUVAR fish_pager_color_completion:normal
+SETUVAR fish_pager_color_description:yellow\x1e\x2di
+SETUVAR fish_pager_color_prefix:normal\x1e\x2d\x2dbold\x1e\x2d\x2dunderline
+SETUVAR fish_pager_color_progress:brwhite\x1e\x2d\x2dbackground\x3dcyan
+SETUVAR fish_pager_color_selected_background:\x2dr
diff --git a/dot_config/ghostty/config b/dot_config/ghostty/config
index d3c19f5..8f0cad9 100644
--- a/dot_config/ghostty/config
+++ b/dot_config/ghostty/config
@@ -13,7 +13,7 @@ cursor-style = block
cursor-style-blink = true
# Scrollback
-scrollback-limit = 512000
+scrollback-limit = 10485760
# Terminal features
mouse-hide-while-typing = true
@@ -39,6 +39,15 @@ keybind = ctrl+plus=increase_font_size:1
keybind = ctrl+minus=decrease_font_size:1
keybind = ctrl+zero=reset_font_size
keybind = ctrl+enter=unbind
+keybind = ctrl+1=goto_tab:1
+keybind = ctrl+2=goto_tab:2
+keybind = ctrl+3=goto_tab:3
+keybind = ctrl+4=goto_tab:4
+keybind = ctrl+5=goto_tab:5
+keybind = ctrl+6=goto_tab:6
+keybind = ctrl+7=goto_tab:7
+keybind = ctrl+8=goto_tab:8
+keybind = ctrl+9=goto_tab:9
# GTK
gtk-titlebar = false
diff --git a/dot_config/vesktop/state.json b/dot_config/vesktop/state.json
new file mode 100644
index 0000000..6f07bbf
--- /dev/null
+++ b/dot_config/vesktop/state.json
@@ -0,0 +1,11 @@
+{
+ "firstLaunch": false,
+ "windowBounds": {
+ "x": 0,
+ "y": 0,
+ "width": 1920,
+ "height": 1080
+ },
+ "maximized": true,
+ "minimized": false
+}
\ No newline at end of file
diff --git a/dot_config/xfce4/xfconf/private_xfce-perchannel-xml/thunar.xml b/dot_config/xfce4/xfconf/private_xfce-perchannel-xml/thunar.xml
index 00a150c..eed3971 100644
--- a/dot_config/xfce4/xfconf/private_xfce-perchannel-xml/thunar.xml
+++ b/dot_config/xfce4/xfconf/private_xfce-perchannel-xml/thunar.xml
@@ -9,4 +9,7 @@
+
+
+
diff --git a/dot_config/yazi/keymap.toml b/dot_config/yazi/keymap.toml
index aeb675a..ece6fe2 100644
--- a/dot_config/yazi/keymap.toml
+++ b/dot_config/yazi/keymap.toml
@@ -1,8 +1,8 @@
# Bookmarks
[[mgr.prepend_keymap]]
on = [ "b", "g" ]
-run = "cd ~/git/"
-desc = "GIT"
+run = "cd ~/Projects/"
+desc = "GIT/Projects"
[[mgr.prepend_keymap]]
on = [ "b", "D" ]
diff --git a/dot_local/state/DankMaterialShell/encrypted_session.json.age b/dot_local/state/DankMaterialShell/encrypted_session.json.age
new file mode 100644
index 0000000..76e88c9
--- /dev/null
+++ b/dot_local/state/DankMaterialShell/encrypted_session.json.age
@@ -0,0 +1,92 @@
+-----BEGIN AGE ENCRYPTED FILE-----
+YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDhJU0h4b2RT
+eWQ0c2RRRXRmb0hpZWhMdUw0N0oxWVZOOFpVckc2UUsrQUpMNDMrYkZXRURQMUsz
+TnN1SmEyZHRtQVNycHlPQlpOSVQyTFhvTk5RK0dlcHZvYXBoUXZ2R291TGxwTHYz
+WUxSRDRzWUg0bjFnU1JoOFc0ZS9La3daekdCMjZ5UnpJNHJzKytGc2c3ZDZ2TWJk
+cUhqS2kxSlI5WHpMMkUyYTBZaWpucGY5QVdoZjlhK0p5amRnWjlaOXNVVGdxOXF3
+NXUyV2lrMEpVaHRITlk4emNScVhkVkRRNSt3SzdSL2FlR0c5cHpZd3Rqd2dtZ014
+cWI3MkRlVjlDcWR4L3Rhb0pTSmR6eEFpSDBHRm1nUlV1TWFHWEg1SVpGQm1oZjFD
+Mjh3ZkZjWTRQRXBzSWNNRTNsRmwvUkdBSDRPR3NCcWVmb0tZZi9iZnhtcEx6SWYw
+NmRLKys2TjBvbGx6RDFBdXhOSE8xS05HdWc0dkx4OWIrV251elpsSnBwY25XVmdG
+ZkFiZUtyVmdsUW4vb0YvZHp1OVRLYk5zalpsNzhUdGcwTE8wSEhXTG90RUtma3hO
+REtQVnU2dEJHb1hRK2xkR0pvc2pTaThpRHBuTkdRSUxISHlqUkIvMmhPM25tOCtW
+ME9RMzRYVDd2WFhNMGZ0UEJJU2N6RHJPRWhRUkxnTm1IQVVHK296ZlYyVXJ2SkNU
+Q3BrQVBjbkpSaEFUY3FhaUxPY0xWdmtjc25WbmQvS1JuLzJNQjVsZktxSU1jcjBO
+RFp0cklDMkVKVFlZVVpQaHhoaXc2NE8wd1Npa0luKzhXYmdZYXlkZWcrUllWZ083
+UkZwR1pZTWlxYW1MTXBuenVPSlRUNTIxeEVCR3BlYWlwdVRMRHpvNDVobGlyemVK
+ZFFQdFVUdm41MTNJb0VpS3FIcTd0Z0g3dWk1TytjNmg1TTd2VjZSY2xuU3c0R2Ry
+QjVaUlRwZmtWTVlOSUR3Z2FVRzV6VTRvdlJzWGs1dWdFUjVMRk5PVDJEdFJLSE5q
+TWJQbVdYVWFVenhJclZ6MHB6Z05qNjB5UmZIa2NRRWJVekZ3ZlR3VW5QNm05SDJ4
+QThjSHk3bVJIMzJSL09nUHR1amFPWWUrNWpQeC9sb2pHM1V6VmxwdGdRc2tiZnph
+Nzhla29nVkFuMHpjMEY5U04zbnlmVlRtdWkzNFhTbUdjU1VzQS93RlNSL25BaUhH
+TzlzTXV1MHBBWmVTOTlSMG9JQmJnWUV2K3JxcHlNOWZNaW5OZkg1bHcxVWx6Tktt
+blY0dnA3OHRPY0pnaWFkYmdvYWJWM3VlcEs4Uzk5cUhmelUwNThIaHdpWHJ0K29q
+Z0FhRlRBcVlOQ3h4UktyNXdXYWwwNWdhcUVPMjVYYmtDTjhRck51djdmL3dISlRD
+L1hhcXFHL29tMUpoRTk1dFBYRE43Y0FkTnFlSzNaVDBWd3Rib3ZzM3UwYktwNEFQ
+bTNmYlU2U3BmSkdrUG51OHZWWGd4RktTL3VTTUlIZGVhU21qTDFRZ0wwWEoxMDAr
+WHlTVmpPU0kxa0tDTnVzWVpJdTRPNWpqVjNpdjBuRjJpRFVvd2Y0TFNuRGcvdEE1
+ZndpdFRHWE50dTZZRGFWZGpPcVpuZnBkZ3UvRGlMeFpFREFteXJYUXNocmNlQ1FB
+THNQMVBJWlRhRlhTL20yUXRIODc1Y2FhVytUTzhHVzFFMzVaZnplOGNETE1kMFhp
+WEtqYUFVTGxScXY0U2hjOFhNT2Z4ODJYWWRSQVBUMm9EaTgrWHJlaGNEMzUzUkIy
+VHk3Y1J4WTRpVjVIQUNXd3Mzdkw0ZnZrVFdud2w0S003clYvdE5KalZtbXhHUWt0
+MnM1dzg0dUZJOUtHZVhYaXlEajZLd243SHdUckxWWG9DVkNCR1dxOTVtMERoNkc2
+RUpPUGtPZzNmOXNyTlFjaEdZUXR4WitTWmNZWXEyMXlHU0RqMFBTRlBYTENjZwpR
+aWwwc2pDdVBMUzRDMmk4eWw0RkJYY25VY2xhU1NPZmo5d0VXaVVFUFVnCi0tLSBK
+cWhucWNYOVAyVmRBUmRrMVdaQjNPQUgxalpvWGFVeEhGSDVONDQ5K3A0CtEhoJd4
+5lRNK2OjRusSit0FZvv8I9ftruZwYf+13qOMQ7DlGJ/yNJgu+FfTW5HXZx++SL40
+p3VSEzHpRsiEzz6yxBQ6kLwGJiI2VuLkEfXiyX8GE9NOar/DKxAXJmQG0v5MYurj
+Bsqx9oB2WEpPinsDFfsL6AW5kW1f8ROIgckpA/Ved0J99Qs/Sb63HwMwJqRrOkzm
+4CP91hgOSywCcjgCt35rbpeD/pHqZaoYkzLBeY6Em5Ua6QsE2v8BLIYJiak+WZbm
+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
+q1by
+-----END AGE ENCRYPTED FILE-----
diff --git a/run_once_05-system-setup.sh.tmpl b/run_once_05-system-setup.sh.tmpl
new file mode 100755
index 0000000..3ade099
--- /dev/null
+++ b/run_once_05-system-setup.sh.tmpl
@@ -0,0 +1,31 @@
+#!/bin/bash
+# run_once_05-system-setup.sh
+# Early system-level configuration that must run before package installs.
+
+set -euo pipefail
+
+SYS="{{ .system | default "desktop" }}"
+DISTRO_ID="{{ .chezmoi.osRelease.id | default "" }}"
+SRC="{{ .chezmoi.sourceDir }}"
+echo ">>> [system-setup] distro=$DISTRO_ID, system=$SYS, source=$SRC"
+
+case "$DISTRO_ID" in
+ arch)
+ echo ">>> [system-setup] applying pacman.conf"
+ sudo install -m644 "$SRC/assets/pacman.conf" /etc/pacman.conf
+
+ echo ">>> [system-setup] tuning makepkg.conf"
+ sudo sed -i 's/^#MAKEFLAGS=/MAKEFLAGS="-j'"$(nproc)"'"/' /etc/makepkg.conf
+ ;;
+
+ ubuntu)
+ echo ">>> [system-setup] ubuntu: no early system setup required"
+ ;;
+
+ *)
+ echo ">>> [system-setup] unsupported distro: ${DISTRO_ID:-unknown}, skipping"
+ exit 0
+ ;;
+esac
+
+echo ">>> [system-setup] done"
diff --git a/run_once_10-install-base.sh b/run_once_10-install-base.sh.tmpl
similarity index 75%
rename from run_once_10-install-base.sh
rename to run_once_10-install-base.sh.tmpl
index 24f7d78..f20aa8d 100755
--- a/run_once_10-install-base.sh
+++ b/run_once_10-install-base.sh.tmpl
@@ -4,8 +4,8 @@
set -euo pipefail
-SYS="$(chezmoi data --format=json 2>/dev/null | jq -r '.system // "desktop"')"
-DISTRO_ID="$(chezmoi data --format=json 2>/dev/null | jq -r '.chezmoi.osRelease.id // empty')"
+SYS="{{ .system | default "desktop" }}"
+DISTRO_ID="{{ .chezmoi.osRelease.id | default "" }}"
case "$DISTRO_ID" in
arch)
@@ -14,12 +14,15 @@ case "$DISTRO_ID" in
networkmanager-openvpn wireguard-tools base-devel \
inotify-tools libqalculate cifs-utils reflector os-prober ntfs-3g \
openssh upower expac unzip less curl wget gawk zip tar \
- btop fastfetch yazi eza bat fzf fd jq go npm python-pipx
+ btop fastfetch yazi eza bat fzf fd jq go npm python-pipx \
+ fish zoxide starship sshfs man-db man-pages p7zip ripgrep resvg \
+ lazygit exiftool
if [ "$SYS" != "server" ]; then
sudo pacman -Syu --noconfirm --needed \
dbeaver mariadb \
- jdk-openjdk maven rustup
+ jdk-openjdk maven rustup \
+ dotnet-sdk docker docker-compose
rustup default stable >/dev/null 2>&1 || true
fi
@@ -41,7 +44,9 @@ case "$DISTRO_ID" in
sudo apt-get install -y \
network-manager openvpn wireguard-tools inotify-tools libqalculate \
cifs-utils os-prober ntfs-3g openssh upower unzip less curl wget \
- gawk zip tar fzf fd-find jq
+ gawk zip tar fzf fd-find jq \
+ fish sshfs man-db manpages p7zip-full ripgrep \
+ libimage-exiftool-perl tesseract-ocr tesseract-ocr-eng
# fdfind → fd compatibility symlink
# if command -v fdfind >/dev/null 2>&1 && ! command -v fd >/dev/null 2>&1; then
@@ -50,7 +55,8 @@ case "$DISTRO_ID" in
if [ "$SYS" != "server" ]; then
sudo apt-get install -y \
- openjdk-17-jdk maven rustup npm golang-go
+ openjdk-17-jdk maven rustup npm golang-go \
+ dotnet-sdk-8.0 docker-compose
rustup default stable >/dev/null 2>&1 || true
fi
;;
diff --git a/run_once_20-install-desktop.sh b/run_once_20-install-desktop.sh.tmpl
similarity index 73%
rename from run_once_20-install-desktop.sh
rename to run_once_20-install-desktop.sh.tmpl
index 8881161..74c31ab 100755
--- a/run_once_20-install-desktop.sh
+++ b/run_once_20-install-desktop.sh.tmpl
@@ -4,8 +4,8 @@
set -euo pipefail
-SYS="$(chezmoi data --format=json 2>/dev/null | jq -r '.system // "desktop"')"
-DISTRO_ID="$(chezmoi data --format=json 2>/dev/null | jq -r '.chezmoi.osRelease.id // empty')"
+SYS="{{ .system | default "desktop" }}"
+DISTRO_ID="{{ .chezmoi.osRelease.id | default "" }}"
if [ "$SYS" = "server" ]; then
echo ">>> [gui] system=server, skipping"
@@ -26,23 +26,29 @@ case "$DISTRO_ID" in
cups cups-pdf cups-pk-helper \
qt5ct qt6ct \
papirus-icon-theme breeze-cursors adw-gtk-theme \
- brightnessctl playerctl libnotify mediainfo \
+ ddcutil playerctl libnotify mediainfo \
fprintd kimageformats \
+ kdeconnect loupe dosfstools gnome-disk-utility \
+ cava guvcview tesseract tesseract-data-eng \
cliphist wl-clipboard tesseract zbar imagemagick img2pdf \
- polkit-kde-agent xdg-desktop-portal-hyprland gnome-keyring \
+ xdg-desktop-portal-hyprland gnome-keyring \
hyprland greetd ghostty
# Dank Shell - sed workaround to pass args to installer
sudo -v && curl -fsSL https://install.danklinux.com | sed 's#\./installer$#./installer "$@"#' | sh -s -- -c hyprland -t ghostty --include-deps dms-greeter,danksearch,dankcalendar -y
# Firefox theming
pipx install pywalfox
- pywalfox install
+ ~/.local/bin/pywalfox install
+ mkdir -p ~/.cache/wal
+ touch ~/.cache/wal/dank-pywalfox.json
ln -sf ~/.cache/wal/dank-pywalfox.json ~/.cache/wal/colors.json
;;
ubuntu)
echo ">>> [gui] ubuntu, system=$SYS"
- echo ">>> [gui] ubuntu, no GUI packages"
+ sudo apt-get install -y \
+ kdeconnect dosfstools gnome-disk-utility \
+ cava ddcutil guvcview
;;
*)
diff --git a/run_once_30-install-power-mgmt.sh b/run_once_30-install-power-mgmt.sh
deleted file mode 100755
index b118e94..0000000
--- a/run_once_30-install-power-mgmt.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/bash
-# run_once_30-install-power-mgmt.sh
-# Laptop-only: power management stack. Skipped on desktop/server.
-
-set -euo pipefail
-
-SYS="$(chezmoi data --format=json 2>/dev/null | jq -r '.system // "desktop"')"
-DISTRO_ID="$(chezmoi data --format=json 2>/dev/null | jq -r '.chezmoi.osRelease.id // empty')"
-
-if [ "$SYS" != "laptop" ]; then
- echo ">>> [power-mgmt] system=$SYS, skipping (not a laptop)"
- exit 0
-fi
-
-case "$DISTRO_ID" in
- arch)
- echo ">>> [power-mgmt] arch"
- sudo pacman -Syu --noconfirm --needed tlp auto-cpufreq power-profiles-daemon
- sudo systemctl enable tlp
- sudo systemctl enable auto-cpufreq
- sudo systemctl enable power-profiles-daemon
- ;;
-
- ubuntu)
- echo ">>> [power-mgmt] ubuntu"
-
- sudo apt-get install -y tlp tlp-rdw power-profiles-daemon
- sudo systemctl enable tlp
- # tlp and power-profiles-daemon conflict on most hardware — mask the latter
- sudo systemctl mask power-profiles-daemon || true
- ;;
-
- *)
- echo ">>> [power-mgmt] unsupported distro: ${DISTRO_ID:-unknown}, skipping"
- exit 0
- ;;
-esac
-
-echo ">>> [power-mgmt] done"
diff --git a/run_once_40-install-apps.sh b/run_once_40-install-apps.sh.tmpl
similarity index 80%
rename from run_once_40-install-apps.sh
rename to run_once_40-install-apps.sh.tmpl
index b8820c5..4f08e1a 100755
--- a/run_once_40-install-apps.sh
+++ b/run_once_40-install-apps.sh.tmpl
@@ -4,9 +4,9 @@
set -euo pipefail
-SYS="$(chezmoi data --format=json 2>/dev/null | jq -r '.system // "desktop"')"
-GAMING="$(chezmoi data --format=json 2>/dev/null | jq -r '.gaming // "false"')"
-DISTRO_ID="$(chezmoi data --format=json 2>/dev/null | jq -r '.chezmoi.osRelease.id // empty')"
+SYS="{{ .system | default "desktop" }}"
+GAMING="{{ .gaming | default false }}"
+DISTRO_ID="{{ .chezmoi.osRelease.id | default "" }}"
if [ "$SYS" = "server" ]; then
echo ">>> [apps] system=server, skipping"
@@ -20,7 +20,7 @@ case "$DISTRO_ID" in
echo ">>> [apps] installing packages"
sudo pacman -Syu --noconfirm --needed \
libreoffice-fresh nextcloud-client \
- gvfs gvfs-mtp gvfs-smb thunar tumbler \
+ gvfs gvfs-mtp gvfs-smb thunar tumbler lshw \
mpv nvtop pavucontrol thunderbird firefox yt-dlp \
feishin
@@ -33,7 +33,7 @@ case "$DISTRO_ID" in
if [ "$GAMING" = "true" ]; then
echo ">>> [apps] installing gaming packages"
sudo pacman -Syu --noconfirm --needed \
- steam
+ steam
yay -Sy --noconfirm --needed \
heroic-games-launcher-bin
diff --git a/run_once_99-set-shell.sh b/run_once_50-configure-user.sh.tmpl
similarity index 51%
rename from run_once_99-set-shell.sh
rename to run_once_50-configure-user.sh.tmpl
index e76e21c..17327c2 100755
--- a/run_once_99-set-shell.sh
+++ b/run_once_50-configure-user.sh.tmpl
@@ -1,12 +1,12 @@
#!/bin/bash
-# run_once_99-set-shell.sh
-# Sets the user's default login shell to fish.
-# TODO prompt which shell
+# run_once_45-configure-user.sh
+# User configuration.
+# TODO prompt which shell, download ??
set -euo pipefail
if ! command -v fish >/dev/null 2>&1; then
- echo ">>> [set-shell] fish not installed; skipping"
+ echo ">>> [configure-user] fish not installed; skipping"
exit 0
fi
@@ -14,9 +14,9 @@ USER_NAME="${USER:-$(id -un)}"
current_shell="$(getent passwd "$USER_NAME" | cut -d: -f7)"
if [ "$current_shell" = "$(command -v fish)" ]; then
- echo ">>> [set-shell] shell already set to fish"
+ echo ">>> [configure-user] shell already set to fish"
exit 0
fi
-echo ">>> [set-shell] changing shell for $USER_NAME to $(command -v fish)"
+echo ">>> [configure-user] changing shell for $USER_NAME to $(command -v fish)"
sudo chsh -s "$(command -v fish)" "$USER_NAME" || true
diff --git a/run_once_50-configure-system.sh b/run_once_60-configure-system.sh.tmpl
similarity index 74%
rename from run_once_50-configure-system.sh
rename to run_once_60-configure-system.sh.tmpl
index fd2a161..9177903 100755
--- a/run_once_50-configure-system.sh
+++ b/run_once_60-configure-system.sh.tmpl
@@ -4,9 +4,9 @@
set -euo pipefail
-SYS="$(chezmoi data --format=json 2>/dev/null | jq -r '.system // "desktop"')"
-DISTRO_ID="$(chezmoi data --format=json 2>/dev/null | jq -r '.chezmoi.osRelease.id // empty')"
-SRC="$(chezmoi source-path)"
+SYS="{{ .system | default "desktop" }}"
+DISTRO_ID="{{ .chezmoi.osRelease.id | default "" }}"
+SRC="{{ .chezmoi.sourceDir }}"
echo ">>> [configure] distro=$DISTRO_ID, system=$SYS, source=$SRC"
services=(
@@ -17,12 +17,6 @@ services=(
case "$DISTRO_ID" in
arch)
- echo ">>> [configure] applying pacman.conf"
- sudo install -m644 "$SRC/assets/pacman.conf" /etc/pacman.conf
-
- echo ">>> [configure] applying pacman.conf"
- sudo sed -i 's/^#MAKEFLAGS=/MAKEFLAGS="-j'"$(nproc)"'"/' /etc/makepkg.conf
-
if [ "$SYS" != "server" ]; then
echo ">>> [configure] enabling services"
for service in "${services[@]}"; do
@@ -33,7 +27,7 @@ case "$DISTRO_ID" in
fi
done
- echo ">>> [configure] applying grub-theme"
+ echo ">>> [configure] applying grub-theme"
if [ -d /boot/grub/themes ]; then
sudo mkdir -p /boot/grub/themes/minegrub
sudo cp -r "$SRC/assets/minegrub/." /boot/grub/themes/minegrub/
diff --git a/run_once_70-configure-laptop.sh.tmpl b/run_once_70-configure-laptop.sh.tmpl
new file mode 100755
index 0000000..d78b886
--- /dev/null
+++ b/run_once_70-configure-laptop.sh.tmpl
@@ -0,0 +1,38 @@
+#!/bin/bash
+# run_once_60-configure-laptop.sh
+# Laptop only configuration.
+
+set -euo pipefail
+
+SYS="{{ .system | default "desktop" }}"
+DISTRO_ID="{{ .chezmoi.osRelease.id | default "" }}"
+
+if [ "$SYS" != "laptop" ]; then
+ echo ">>> [configure-laptop] system=$SYS, skipping (not a laptop)"
+ exit 0
+fi
+
+case "$DISTRO_ID" in
+ arch)
+ echo ">>> [configure-laptop] arch"
+ sudo pacman -Syu --noconfirm --needed tlp power-profiles-daemon
+ sudo systemctl enable tlp
+ sudo systemctl enable power-profiles-daemon
+ ;;
+
+ ubuntu)
+ echo ">>> [configure-laptop] ubuntu"
+
+ sudo apt-get install -y tlp tlp-rdw power-profiles-daemon
+ sudo systemctl enable tlp
+ # tlp and power-profiles-daemon conflict on most hardware — mask the latter
+ sudo systemctl mask power-profiles-daemon || true
+ ;;
+
+ *)
+ echo ">>> [configure-laptop] unsupported distro: ${DISTRO_ID:-unknown}, skipping"
+ exit 0
+ ;;
+esac
+
+echo ">>> [configure-laptop] done"