Compare commits

..

1 Commits

Author SHA1 Message Date
Uyanide 0a4f7c6eef Refactor README structure and content
Reorganize sections and update details for clarity.
2026-04-25 16:25:22 +02:00
99 changed files with 1666 additions and 1449 deletions
-3
View File
@@ -4,6 +4,3 @@
[submodule "assets/yazi-catppuccin"]
path = assets/yazi-catppuccin
url = https://github.com/catppuccin/yazi.git
[submodule "config/ghostty/.config/ghostty/shaders"]
path = config/ghostty/.config/ghostty/shaders
url = https://github.com/0xhckr/ghostty-shaders.git
+2 -2
View File
@@ -37,7 +37,7 @@ https://github.com/user-attachments/assets/2550607a-48ea-4662-98ba-d26722b26b1b
- Bar: ~~Waybar~~ | **Quickshell**
- Shell: (bash & fish) | **Zsh**
- Prompt: Oh My Posh | **Starship**
- Terminal: **Kitty** | WezTerm | Ghostty
- Terminal: **Kitty** & (WezTerm | **Ghostty**)
- Power Menu: **Wlogout** & Quickshell
- Colorscheme: **Catppuccin Mocha**
- App Launcher: ~~Rofi~~ | ~~Fuzzel~~ | **vicinae**
@@ -100,7 +100,7 @@ This feature is only enabled in Niri. Swww also manages wallpapers of the Hyprla
## Wallpaper & Colortheme
The most suitable primary color (or so-called flavor) will be chosen from the [Catppuccin Mocha](https://catppuccin.com/palette/) palette and applied to various apps automatically after changing wallpaper. And also:
- [wallpaper-chooser](https://github.com/Uyanide/Wallpaper_Chooser) to select wallpaper, which implements an Image Carousel with Qt Widgets.
- [backgrounds collection](https://github.com/Uyanide/backgrounds) for personal use.
+23
View File
@@ -66,6 +66,12 @@ PKGS = {
"niri": NIRI_PKGS,
}
SESSION_NAME = {
"hyprland": "Hyprland",
"niri": "niri",
"default": "default",
}
PKGS_PATH = Path(__file__).resolve().parent.resolve() / "config"
DEST_PATH = Path.home().expanduser()
@@ -101,6 +107,12 @@ def unstow(pkg: str):
)
def switch(session: str):
subprocess.run(
[str(Path("~/.local/scripts/config-switch").expanduser()), session], check=True
)
def main():
if not check_deps():
exit(1)
@@ -135,6 +147,17 @@ def main():
if is_unstow:
return # No need to switch session if we're just unstowing
if args.package in SESSION_NAME:
session = SESSION_NAME[args.package]
else:
session = SESSION_NAME["default"]
try:
switch(session)
_log("INFO", f"Switched to session profile '{session}'.")
except subprocess.CalledProcessError as e:
_log("ERROR", f"Failed to switch session profile '{session}': {e}")
if __name__ == "__main__":
main()
+33 -1
View File
@@ -4,12 +4,38 @@ AccessModifierOffset: -2
AlignConsecutiveAssignments: true
AllowAllArgumentsOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Empty
AllowShortCaseLabelsOnASingleLine: true
AllowShortFunctionsOnASingleLine: Inline
AllowShortLambdasOnASingleLine: All
# BreakAfterReturnType: All
BinPackArguments: false
BinPackParameters: false
ColumnLimit: 0
CompactNamespaces: false
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
EmptyLineBeforeAccessModifier: LogicalBlock
FixNamespaceComments: true
IncludeBlocks: Regroup
SortIncludes: true
IncludeCategories:
- Regex: '^<ext/.*\.h>'
Priority: 2
@@ -22,10 +48,16 @@ IncludeCategories:
IndentWidth: 4
KeepEmptyLinesAtTheStartOfBlocks: true
InsertNewlineAtEOF: true
MaxEmptyLinesToKeep: 1
TabWidth: 4
UseTab: Never
SeparateDefinitionBlocks: Always
ColumnLimit: 0
QualifierAlignment: Left
@@ -0,0 +1 @@
shaders
@@ -0,0 +1,27 @@
theme = Catppuccin Mocha
background-opacity = 0.75
background-blur = true
window-padding-x = 10
window-padding-y = 10
keybind = ctrl+shift+r=reload_config
keybind = ctrl+shift+h=write_screen_file:copy
keybind = ctrl+shift+j=text:ghostty-capture\n
keybind = ctrl+enter=unbind
command = exec /bin/zsh
confirm-close-surface = false
font-family = monospace
font-size = 12
cursor-style = bar
adjust-cursor-thickness = 3
custom-shader = cursor-shaders/cursor-smear.glsl
quit-after-last-window-closed = false
@@ -0,0 +1 @@
shaders
@@ -1,6 +1,6 @@
theme = Catppuccin Mocha
background-opacity = 0.9
background-opacity = 0.95
background-blur = true
window-padding-x = 10
@@ -0,0 +1,120 @@
// https://github.com/KroneCorylus/ghostty-shader-playground/blob/main/shaders/cursor_smear.glsl
float getSdfRectangle(in vec2 p, in vec2 xy, in vec2 b)
{
vec2 d = abs(p - xy) - b;
return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);
}
// Based on Inigo Quilez's 2D distance functions article: https://iquilezles.org/articles/distfunctions2d/
// Potencially optimized by eliminating conditionals and loops to enhance performance and reduce branching
float seg(in vec2 p, in vec2 a, in vec2 b, inout float s, float d) {
vec2 e = b - a;
vec2 w = p - a;
vec2 proj = a + e * clamp(dot(w, e) / dot(e, e), 0.0, 1.0);
float segd = dot(p - proj, p - proj);
d = min(d, segd);
float c0 = step(0.0, p.y - a.y);
float c1 = 1.0 - step(0.0, p.y - b.y);
float c2 = 1.0 - step(0.0, e.x * w.y - e.y * w.x);
float allCond = c0 * c1 * c2;
float noneCond = (1.0 - c0) * (1.0 - c1) * (1.0 - c2);
float flip = mix(1.0, -1.0, step(0.5, allCond + noneCond));
s *= flip;
return d;
}
float getSdfParallelogram(in vec2 p, in vec2 v0, in vec2 v1, in vec2 v2, in vec2 v3) {
float s = 1.0;
float d = dot(p - v0, p - v0);
d = seg(p, v0, v3, s, d);
d = seg(p, v1, v0, s, d);
d = seg(p, v2, v1, s, d);
d = seg(p, v3, v2, s, d);
return s * sqrt(d);
}
vec2 normalize(vec2 value, float isPosition) {
return (value * 2.0 - (iResolution.xy * isPosition)) / iResolution.y;
}
float antialising(float distance) {
return 1. - smoothstep(0., normalize(vec2(2., 2.), 0.).x, distance);
}
float determineStartVertexFactor(vec2 a, vec2 b) {
// Conditions using step
float condition1 = step(b.x, a.x) * step(a.y, b.y); // a.x < b.x && a.y > b.y
float condition2 = step(a.x, b.x) * step(b.y, a.y); // a.x > b.x && a.y < b.y
// If neither condition is met, return 1 (else case)
return 1.0 - max(condition1, condition2);
}
vec2 getRectangleCenter(vec4 rectangle) {
return vec2(rectangle.x + (rectangle.z / 2.), rectangle.y - (rectangle.w / 2.));
}
float ease(float x) {
return pow(1.0 - x, 3.0);
}
vec4 saturate(vec4 color, float factor) {
float gray = dot(color, vec4(0.299, 0.587, 0.114, 0.)); // luminance
return mix(vec4(gray), color, factor);
}
vec4 TRAIL_COLOR = iCurrentCursorColor;
const float OPACITY = 0.6;
const float DURATION = 0.3; //IN SECONDS
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
#if !defined(WEB)
fragColor = texture(iChannel0, fragCoord.xy / iResolution.xy);
#endif
// Normalization for fragCoord to a space of -1 to 1;
vec2 vu = normalize(fragCoord, 1.);
vec2 offsetFactor = vec2(-.5, 0.5);
// Normalization for cursor position and size;
// cursor xy has the postion in a space of -1 to 1;
// zw has the width and height
vec4 currentCursor = vec4(normalize(iCurrentCursor.xy, 1.), normalize(iCurrentCursor.zw, 0.));
vec4 previousCursor = vec4(normalize(iPreviousCursor.xy, 1.), normalize(iPreviousCursor.zw, 0.));
// When drawing a parellelogram between cursors for the trail i need to determine where to start at the top-left or top-right vertex of the cursor
float vertexFactor = determineStartVertexFactor(currentCursor.xy, previousCursor.xy);
float invertedVertexFactor = 1.0 - vertexFactor;
// Set every vertex of my parellogram
vec2 v0 = vec2(currentCursor.x + currentCursor.z * vertexFactor, currentCursor.y - currentCursor.w);
vec2 v1 = vec2(currentCursor.x + currentCursor.z * invertedVertexFactor, currentCursor.y);
vec2 v2 = vec2(previousCursor.x + currentCursor.z * invertedVertexFactor, previousCursor.y);
vec2 v3 = vec2(previousCursor.x + currentCursor.z * vertexFactor, previousCursor.y - previousCursor.w);
float sdfCurrentCursor = getSdfRectangle(vu, currentCursor.xy - (currentCursor.zw * offsetFactor), currentCursor.zw * 0.5);
float sdfTrail = getSdfParallelogram(vu, v0, v1, v2, v3);
float progress = clamp((iTime - iTimeCursorChange) / DURATION, 0.0, 1.0);
float easedProgress = ease(progress);
// Distance between cursors determine the total length of the parallelogram;
vec2 centerCC = getRectangleCenter(currentCursor);
vec2 centerCP = getRectangleCenter(previousCursor);
float lineLength = distance(centerCC, centerCP);
vec4 newColor = vec4(fragColor);
vec4 trail = TRAIL_COLOR;
trail = saturate(trail, 2.5);
// Draw trail
newColor = mix(newColor, trail, antialising(sdfTrail));
// Draw current cursor
newColor = mix(newColor, trail, antialising(sdfCurrentCursor));
newColor = mix(newColor, fragColor, step(sdfCurrentCursor, 0.));
// newColor = mix(fragColor, newColor, OPACITY);
fragColor = mix(fragColor, newColor, step(sdfCurrentCursor, easedProgress * lineLength));
}
+1 -1
View File
@@ -1,7 +1,7 @@
theme = "catppuccin_mocha"
[editor]
# default-yank-register = "+"
default-yank-register = "+"
shell = ["bash", "-c"]
line-number = "relative"
indent-guides.render = true
@@ -5,12 +5,3 @@ indent = { tab-width = 4, unit = " " }
[[language]]
name = "cpp"
indent = { tab-width = 4, unit = " " }
[[language]]
name = "python"
formatter = { command = "ruff", args = ["format", "-"] }
language-servers = ["ruff"]
[language-server.ruff]
command = "ruff"
args = ["server"]
+2 -2
View File
@@ -1,5 +1,5 @@
$lock_cmd = pidof hyprlock || hyprlock
$suspend_cmd = systemctl suspend || loginctl suspend
$suspend_cmd = pidof steam || systemctl suspend || loginctl suspend # fuck nvidia
general {
lock_cmd = $lock_cmd
@@ -14,7 +14,7 @@ listener {
listener {
timeout = 300 # 5mins
on-timeout = hyprctl dispatch dpms off || niri msg action power-off-monitors
on-resume = hyprctl dispatch dpms on || niri msg action power-on-monitors
on-resume = hyprctl dispatch dpms on || true
}
#listener {
+48
View File
@@ -0,0 +1,48 @@
allow_remote_control yes
listen_on unix:/tmp/kitty
shell_integration enabled
# kitty-scrollback.nvim Kitten alias
action_alias kitty_scrollback_nvim kitten $HOME/.local/share/nvim/lazy/kitty-scrollback.nvim/python/kitty_scrollback_nvim.py
# Browse scrollback buffer in nvim
map kitty_mod+h kitty_scrollback_nvim
# Browse output of the last shell command in nvim
map kitty_mod+g kitty_scrollback_nvim --config ksb_builtin_last_cmd_output
# Show clicked command output in nvim
mouse_map ctrl+shift+right press ungrabbed combine : mouse_select_command_output : kitty_scrollback_nvim --config ksb_builtin_last_visited_cmd_output
# disable the stupid notification
confirm_os_window_close 0
# set shell to zsh
shell /bin/zsh
# hide_window_decorations yes
window_padding_width 10
background_opacity 0.75
background_blur 16
font_family monospace
font_size 12
tab_bar_style powerline
tab_powerline_style round
tab_title_template {title}{' :{}:'.format(num_windows) if num_windows > 1 else ''}
map ctrl+up previous_window
map ctrl+down next_window
cursor_trail 1
cursor_shape beam
include Catppuccin-Mocha.conf
map ctrl+plus change_font_size all +1
map ctrl+kp_add change_font_size all +1
map ctrl+minus change_font_size all -1
map ctrl+kp_subtract change_font_size all -1
map ctrl+0 change_font_size all 0
map ctrl+kp_0 change_font_size all 0
@@ -0,0 +1,80 @@
# vim:ft=kitty
## name: Catppuccin-Mocha
## author: Pocco81 (https://github.com/Pocco81)
## license: MIT
## upstream: https://github.com/catppuccin/kitty/blob/main/mocha.conf
## blurb: Soothing pastel theme for the high-spirited!
# The basic colors
foreground #CDD6F4
background #1E1E2E
selection_foreground #1E1E2E
selection_background #F5E0DC
# Cursor colors
cursor #F5E0DC
cursor_text_color #1E1E2E
# URL underline color when hovering with mouse
url_color #F5E0DC
# Kitty window border colors
active_border_color #B4BEFE
inactive_border_color #6C7086
bell_border_color #F9E2AF
# OS Window titlebar colors
wayland_titlebar_color system
macos_titlebar_color system
# Tab bar colors
active_tab_foreground #11111B
active_tab_background #CBA6F7
inactive_tab_foreground #CDD6F4
inactive_tab_background #181825
tab_bar_background #11111B
# Colors for marks (marked text in the terminal)
mark1_foreground #1E1E2E
mark1_background #B4BEFE
mark2_foreground #1E1E2E
mark2_background #CBA6F7
mark3_foreground #1E1E2E
mark3_background #74C7EC
# The 16 terminal colors
# black
color0 #45475A
color8 #585B70
# red
color1 #F38BA8
color9 #F38BA8
# green
color2 #A6E3A1
color10 #A6E3A1
# yellow
color3 #F9E2AF
color11 #F9E2AF
# blue
color4 #89B4FA
color12 #89B4FA
# magenta
color5 #F5C2E7
color13 #F5C2E7
# cyan
color6 #94E2D5
color14 #94E2D5
# white
color7 #BAC2DE
color15 #A6ADC8
@@ -3,13 +3,13 @@ listen_on unix:/tmp/kitty
shell_integration enabled
# kitty-scrollback.nvim Kitten alias
# action_alias kitty_scrollback_nvim kitten $HOME/.local/share/nvim/lazy/kitty-scrollback.nvim/python/kitty_scrollback_nvim.py
action_alias kitty_scrollback_nvim kitten $HOME/.local/share/nvim/lazy/kitty-scrollback.nvim/python/kitty_scrollback_nvim.py
# Browse scrollback buffer in nvim
# map kitty_mod+h kitty_scrollback_nvim
map kitty_mod+h kitty_scrollback_nvim
# Browse output of the last shell command in nvim
# map kitty_mod+g kitty_scrollback_nvim --config ksb_builtin_last_cmd_output
map kitty_mod+g kitty_scrollback_nvim --config ksb_builtin_last_cmd_output
# Show clicked command output in nvim
# mouse_map ctrl+shift+right press ungrabbed combine : mouse_select_command_output : kitty_scrollback_nvim --config ksb_builtin_last_visited_cmd_output
mouse_map ctrl+shift+right press ungrabbed combine : mouse_select_command_output : kitty_scrollback_nvim --config ksb_builtin_last_visited_cmd_output
# disable the stupid notification
confirm_os_window_close 0
@@ -20,7 +20,7 @@ shell /bin/zsh
# hide_window_decorations yes
window_padding_width 10
background_opacity 0.9
background_opacity 0.95
background_blur 16
font_family monospace
-7
View File
@@ -1,7 +0,0 @@
include kitty.conf
remember_window_size false
initial_window_width 960
initial_window_height 720
window_padding_width 5
@@ -1,2 +0,0 @@
protocol file
action launch --type=overlay xdg-open $FILE_PATH
+7 -7
View File
@@ -14,9 +14,9 @@ binds {
Mod+E repeat=false { spawn "dolphin" "--new-window"; }
Mod+Shift+E repeat=false { spawn "nautilus" "--new-window"; }
Mod+W repeat=false { spawn-sh "zen || zen-browser"; }
Mod+B repeat=false { spawn-sh "pkill -x -n btop || kitty-floating -e btop"; }
Mod+Shift+T repeat=false { spawn "kitty-floating"; }
Mod+Shift+Return repeat=false { spawn "kitty-floating"; }
Mod+B repeat=false { spawn-sh "pkill -x -n btop || ghostty +new-window -e btop"; }
Mod+Shift+T repeat=false { spawn "ghostty" "+new-window"; }
Mod+Shift+Return repeat=false { spawn "ghostty" "+new-window"; }
Mod+T repeat=false { spawn "kitty"; }
Mod+Return repeat=false { spawn "kitty"; }
Mod+Shift+W repeat=false { spawn "wallreel"; }
@@ -45,9 +45,9 @@ binds {
Mod+D repeat=false { spawn "vicinae" "vicinae://launch/system/run?toggle=true"; }
// Actions
Print repeat=false { screenshot-screen show-pointer=false; }
Mod+Shift+S repeat=false { screenshot show-pointer=false; }
Mod+Ctrl+Shift+S repeat=false { screenshot-window show-pointer=false; }
Print repeat=false { screenshot-screen; }
Mod+Shift+S repeat=false { screenshot; }
Mod+Ctrl+Shift+S repeat=false { screenshot-window; }
Mod+Shift+C repeat=false { spawn "hyprpicker" "-a"; }
// Media
@@ -163,7 +163,7 @@ binds {
// Session
Mod+K allow-inhibiting=false repeat=false { quit; }
Mod+Shift+P allow-inhibiting=false repeat=false { spawn-sh "loginctl lock-session; niri msg action power-off-monitors"; }
Mod+Shift+P allow-inhibiting=false repeat=false { spawn-sh "hyprlock & niri msg action power-off-monitors"; }
Mod+L allow-inhibiting=false repeat=false { spawn "loginctl" "lock-session"; }
}
@@ -1,3 +1,6 @@
// Switch configs
spawn-at-startup "config-switch" "niri"
// Core
spawn-at-startup "nm-applet"
spawn-at-startup "gnome-keyring-daemon" "--start" "--components=secrets"
+1 -1
View File
@@ -1,7 +1,7 @@
screenshot-path "~/Pictures/Screenshots/niri_screenshot_%Y-%m-%d_%H-%M-%S.png"
debug {
render-drm-device "/dev/dri/renderD129"
render-drm-device "/dev/dri/renderD128"
honor-xdg-activation-with-invalid-serial
}
+1 -5
View File
@@ -1,5 +1 @@
environment {
__NV_PRIME_RENDER_OFFLOAD "1"
__VK_LAYER_NV_optimus "NVIDIA_only"
__GLX_VENDOR_LIBRARY_NAME "nvidia"
}
+1 -18
View File
@@ -20,7 +20,6 @@ window-rule {
window-rule {
match app-id="org.wezfurlong.wezterm"
match app-id="com.mitchellh.ghostty"
match app-id="kitty-floating"
open-floating true
default-column-width { proportion 0.5; }
}
@@ -62,16 +61,9 @@ window-rule {
open-floating true
}
// QQ
window-rule {
match app-id="QQ" title="资料卡"
match app-id="QQ" title="天气"
open-focused false
}
// Block from recording
window-rule {
match app-id="org.mozilla.Thunderbird"
match app-id="thunderbird"
block-out-from "screen-capture"
}
@@ -97,12 +89,3 @@ window-rule {
// open-maximized-to-edges true
// open-on-output "HDMI-A-1"
}
// Steam toasts
window-rule {
match app-id="^steam$" title=r#"^notificationtoasts_\d+_desktop$"#
open-floating true
open-focused false
default-floating-position x=2 y=3 relative-to="bottom-right"
}
+4 -20
View File
@@ -82,20 +82,10 @@ layer-rule {
}
layer-rule {
match layer="top"
match layer="overlay"
background-effect {
xray false
}
}
window-rule {
match is-floating=true
background-effect {
xray false
}
cursor {
xcursor-theme "Bibata-Modern-Ice"
xcursor-size 24
hide-when-typing
}
// I love rounded corners
@@ -104,12 +94,6 @@ window-rule {
clip-to-geometry true
}
cursor {
xcursor-theme "Bibata-Modern-Ice"
xcursor-size 24
hide-when-typing
}
recent-windows {
highlight {
active-color "#89b4fa"
+6 -6
View File
@@ -3,22 +3,22 @@
xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
>
<bookmark href="smb://100.64.0.2/documents/" added="2026-05-06T10:05:54.879153Z" modified="2026-05-06T10:05:54.879156Z" visited="2026-05-06T10:05:54.879154Z">
<title>documents auf 100.64.0.2</title>
<bookmark href="smb://deccenia/default/" added="2026-03-27T08:04:42.401527Z" modified="2026-03-27T08:04:42.401531Z" visited="2026-03-27T08:04:42.401528Z">
<title>default on deccenia</title>
<info>
<metadata owner="http://freedesktop.org">
<bookmark:applications>
<bookmark:application name="org.gnome.Nautilus" exec="&apos;org.gnome.Nautilus %u&apos;" modified="2026-05-06T10:05:54.879155Z" count="1"/>
<bookmark:application name="org.gnome.Nautilus" exec="&apos;org.gnome.Nautilus %u&apos;" modified="2026-03-27T08:04:42.401530Z" count="1"/>
</bookmark:applications>
</metadata>
</info>
</bookmark>
<bookmark href="smb://100.64.0.2/default/" added="2026-05-06T10:06:20.264480Z" modified="2026-05-06T10:06:20.264483Z" visited="2026-05-06T10:06:20.264481Z">
<title>default auf 100.64.0.2</title>
<bookmark href="smb://deccenia/documents/" added="2026-03-27T08:04:57.185422Z" modified="2026-03-27T08:04:57.185426Z" visited="2026-03-27T08:04:57.185423Z">
<title>documents on deccenia</title>
<info>
<metadata owner="http://freedesktop.org">
<bookmark:applications>
<bookmark:application name="org.gnome.Nautilus" exec="&apos;org.gnome.Nautilus %u&apos;" modified="2026-05-06T10:06:20.264482Z" count="1"/>
<bookmark:application name="org.gnome.Nautilus" exec="&apos;org.gnome.Nautilus %u&apos;" modified="2026-03-27T08:04:57.185424Z" count="1"/>
</bookmark:applications>
</metadata>
</info>
@@ -11,11 +11,8 @@ import qs.Modules.Bar.Modules
import qs.Services
Variants {
id: root
model: Quickshell.screens
property var pinnedTrayIds
Item {
property var modelData
@@ -136,7 +133,7 @@ Variants {
id: rightLayout
height: parent.height - Style.marginXS * 2
spacing: Style.marginS
spacing: Style.marginM
anchors {
right: parent.right
@@ -189,8 +186,8 @@ Variants {
RecordIndicator {
}
// Ip {
// }
Ip {
}
CpuTemp {
}
@@ -268,21 +265,6 @@ Variants {
Separator {
}
Loader {
Layout.fillHeight: true
active: NukeKded6.done
sourceComponent: SystemTray {
screen: modelData
pinnedIds: root.pinnedTrayIds
height: parent.height
}
}
Separator {
}
RowLayout {
Layout.fillHeight: true
spacing: Style.marginS
@@ -293,7 +275,6 @@ Variants {
sourceComponent: TrayExpander {
screen: modelData
baseSize: rightLayout.height - Style.marginXS * 2
excludeIds: root.pinnedTrayIds
}
}
@@ -15,10 +15,8 @@ Rectangle {
property ShellScreen screen
property var activeTrayItem: null
property var pinnedIds: []
property var excludeIds: []
implicitWidth: trayFlow.implicitWidth > 0 ? trayFlow.implicitWidth + 20 : 0
implicitWidth: trayFlow.implicitWidth + 20
implicitHeight: parent.height
radius: 0
color: Colors.transparent
@@ -38,12 +36,7 @@ Rectangle {
delegate: Item {
width: 18
height: 18
visible: {
if (!modelData) return false
if (pinnedIds.length > 0) return pinnedIds.includes(modelData.id)
if (excludeIds.length > 0) return !excludeIds.includes(modelData.id)
return true
}
visible: modelData
IconImage {
id: trayIcon
@@ -11,23 +11,15 @@ Item {
property color fillColor: Colors.mRed
property color _actualColor: Colors.mRed
property bool _expand: mouseArea.containsMouse
property string displayText: Niri.castOutputs.length > 0 ? Niri.castOutputs.join(", ") : "Casting"
visible: Niri.isCasting
visible: RecordService.isRecording
implicitHeight: Math.max(symbolIcon.implicitHeight, textLabel.implicitHeight)
implicitWidth: height + expander.implicitWidth
Connections {
target: Niri
onCastOutputsListChanged: {
root.displayText = Niri.castOutputs.length > 0 ? Niri.castOutputs.join(", ") : "Casting";
}
}
SequentialAnimation {
id: blinkAnimation
running: root.visible
running: RecordService.isRecording
loops: Animation.Infinite
ColorAnimation {
@@ -78,7 +70,7 @@ Item {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 5
text: root.displayText
text: RecordService.recordingDisplay || "Recording"
color: root.fillColor
}
@@ -100,6 +92,12 @@ Item {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
onClicked: (mouse) => {
if (mouse.button === Qt.LeftButton)
RecordService.startOrStop();
}
}
Behavior on _actualColor {
@@ -11,7 +11,6 @@ Item {
property ShellScreen screen
property int baseSize: Style.baseWidgetSize
property var excludeIds: []
implicitWidth: baseSize + trayContainer.implicitWidth
implicitHeight: layout.implicitHeight
@@ -41,7 +40,6 @@ Item {
id: expandedTray
screen: root.screen
excludeIds: root.excludeIds
}
Behavior on implicitWidth {
@@ -18,7 +18,7 @@ Singleton {
id: process
running: false
command: ["kitty-floating", "-e", "btop"]
command: ["ghostty", "+new-window", "-e", "btop"]
}
}
@@ -35,16 +35,11 @@ Singleton {
})
property var workspaceCache: ({
})
property var castCache: ({
})
property var castOutputs: []
property bool isCasting: false
signal workspaceChanged()
signal activeWindowChanged()
signal windowListChanged()
signal outputsChanged()
signal castOutputsListChanged()
function initialize() {
niriEventStream.connected = true;
@@ -439,79 +434,6 @@ Singleton {
}
}
function _syncCasts() {
isCasting = Object.keys(castCache).length > 0;
castOutputs = [];
for (const castId in castCache) {
const cast = castCache[castId];
if (cast.output) {
if (!castOutputs.includes(cast.output))
castOutputs.push(cast.output);
}
}
castOutputsListChanged();
}
function _handleCastsChanged(eventData) {
try {
const casts = eventData.casts || [];
castCache = {
};
castOutputs = [];
for (const cast of casts) {
const castData = {
"id": cast.stream_id,
"stream_id": cast.stream_id,
"session_id": cast.session_id,
"kind": cast.kind,
"output": cast.target?.Output?.name,
"pid": cast.pid
};
castCache[castData.id] = castData;
}
_syncCasts();
} catch (e) {
Logger.e("NiriService", "Error handling CastsChanged:", e);
}
}
function _handleCastStopped(eventData) {
try {
const castId = eventData.stream_id;
delete castCache[castId];
_syncCasts();
} catch (e) {
Logger.e("NiriService", "Error handling CastStopped:", e);
}
}
function _handleCastStartedOrChanged(eventData) {
try {
const cast = eventData.cast;
if (!cast)
return ;
if (cast.is_active === true) {
// If the cast is active, we can treat it as a new or updated cast
const castData = {
"id": cast.stream_id,
"stream_id": cast.stream_id,
"session_id": cast.session_id,
"kind": cast.kind,
"output": cast.target?.Output?.name,
"pid": cast.pid
};
castCache[castData.id] = castData;
} else {
// If the cast is not active, we should remove it from the cache
const castId = cast.stream_id;
delete castCache[castId];
}
_syncCasts();
} catch (e) {
Logger.e("NiriService", "Error handling CastStartedOrChanged:", e);
}
}
function switchToWorkspace(workspace) {
try {
Quickshell.execDetached(["niri", "msg", "action", "focus-workspace", workspace.idx.toString()]);
@@ -656,12 +578,6 @@ Singleton {
_queryDisplayScales();
else if (event.ScreenshotCaptured)
_handleScreenshotCaptured(event.ScreenshotCaptured);
else if (event.CastsChanged)
_handleCastsChanged(event.CastsChanged);
else if (event.CastStopped)
_handleCastStopped(event.CastStopped);
else if (event.CastStartedOrChanged)
_handleCastStartedOrChanged(event.CastStartedOrChanged);
} catch (e) {
Logger.e("NiriService", "Error parsing event stream:", e, data);
}
@@ -39,7 +39,7 @@ Singleton {
function openNote(path) {
recentNotePath = path;
Quickshell.execDetached(["kitty-floating", "-e", "helix", path]);
Quickshell.execDetached(["ghostty", "+new-window", "-e", "helix", path]);
}
function openRecent() {
@@ -16,13 +16,13 @@ Singleton {
property bool isReplayStarted: false
property bool isStopping: false
property bool isReplayStopping: false
readonly property string codec: "av1_nvenc"
readonly property string container: "mp4"
readonly property string pixelFormat: "p010le"
readonly property string codec: "libx264"
readonly property string container: "mkv"
readonly property string pixelFormat: "yuv420p"
property string recordingDisplay: ""
readonly property int replayDuration: 15
readonly property int framerate: 60
readonly property var codecParams: Object.freeze(["preset=p4", "rc=constqp", "qp=18", "color_range=tv"])
readonly property var codecParams: Object.freeze(["preset=ultrafast", "crf=15", "tune=zerolatency", "color_range=tv"])
readonly property var filterArgs: ""
function getFilename(prefix = "recording") {
@@ -29,8 +29,6 @@ ShellRoot {
Bar {
id: bar
pinnedTrayIds: ["Fcitx", "nm-applet", "blueman"]
}
Corners {
@@ -40,9 +40,13 @@ CONFIG_DIR = Path("~/.config").expanduser()
# An application may have multiple scripts (e.g. due to config-switch)
SCRIPTS = {
"eww": [CONFIG_DIR / "eww" / "apply-color"],
"fastfetch": [CONFIG_DIR / "fastfetch" / "apply-color"],
"fuzzel": [CONFIG_DIR / "fuzzel" / "apply-color"],
"hypr": [CONFIG_DIR / "hypr" / "apply-color"],
"kvantum": [CONFIG_DIR / "Kvantum" / "apply-color"],
"nwg-look": [CONFIG_DIR / "nwg-look" / "apply-color"],
"mako": [CONFIG_DIR / "mako" / "apply-color"],
"niri": [CONFIG_DIR / "niri" / "apply-color"],
"oh-my-posh": [
CONFIG_DIR / "fish" / "apply-color-omp"
@@ -51,7 +55,12 @@ SCRIPTS = {
CONFIG_DIR / "fish" / "apply-color-starship"
], # borrowing fish's directory
"quickshell": [CONFIG_DIR / "quickshell" / "apply-color"],
"wlogout": [CONFIG_DIR / "wlogout" / "apply-color"],
"rofi": [CONFIG_DIR / "rofi" / "apply-color"],
"waybar": [CONFIG_DIR / "waybar" / "apply-color"],
"wlogout": [
CONFIG_DIR / ".alt" / "wlogout-default" / "apply-color",
CONFIG_DIR / ".alt" / "wlogout-niri" / "apply-color",
],
"yazi": [CONFIG_DIR / "yazi" / "apply-color"],
}
# or simply `find [-L] <CONFIG_DIR> -type f -name 'apply-color*'` to get all available scripts,
+3 -3
View File
@@ -36,8 +36,8 @@ ITERM2_EXPECTED_RESPONSE=$(printf "\033]1337;") # followed by "ReportCellSize=..
FENCE_CODE=$(printf "\033[c")
# Set terminal to raw mode with timeout
stty_orig=$(stty -g < /dev/tty)
trap 'stty "$stty_orig" < /dev/tty' EXIT INT TERM HUP
stty_orig=$(stty -g)
trap 'stty "$stty_orig"' EXIT INT TERM HUP
stty -echo -icanon min 1 time 0
printf "%s%s%s" "$ITERM2_QUERY_CODE" "$KGP_QUERY_CODE" "$FENCE_CODE" > /dev/tty
@@ -48,7 +48,7 @@ support_sixel=0
response=""
while true; do
IFS= read -r -N 1 -t "$TIMEOUT" char < /dev/tty || {
IFS= read -r -N 1 -t "$TIMEOUT" char || {
[ -z "$char" ] && break
}
+3 -3
View File
@@ -14,8 +14,8 @@ EXPECTED_RESPONSE=$(printf "\033]1337;") # followed by "ReportCellSize=...", but
FENCE_CODE=$(printf "\033[c")
# Set terminal to raw mode
stty_orig=$(stty -g < /dev/tty)
trap 'stty "$stty_orig" < /dev/tty' EXIT INT TERM HUP
stty_orig=$(stty -g)
trap 'stty "$stty_orig"' EXIT INT TERM HUP
stty -echo -icanon min 1 time 0
printf "%s%s" "$QUERY_CODE" "$FENCE_CODE" > /dev/tty
@@ -23,7 +23,7 @@ printf "%s%s" "$QUERY_CODE" "$FENCE_CODE" > /dev/tty
response=""
ret=1
while true; do
IFS= read -r -N 1 -t 0.3 char < /dev/tty || {
IFS= read -r -N 1 -t 0.3 char || {
[ -z "$char" ] && break
}
+3 -3
View File
@@ -17,8 +17,8 @@ EXPECTED_RESPONSE=$(printf "\033_Gi=%d;OK\033\\" "$QUERY_ID")
FENCE_CODE=$(printf "\033[c")
# Set terminal to raw mode with timeout
stty_orig=$(stty -g < /dev/tty)
trap 'stty "$stty_orig" < /dev/tty' EXIT INT TERM HUP
stty_orig=$(stty -g)
trap 'stty "$stty_orig"' EXIT INT TERM HUP
stty -echo -icanon min 1 time 0
printf "%s%s" "$QUERY_CODE" "$FENCE_CODE" > /dev/tty
@@ -26,7 +26,7 @@ printf "%s%s" "$QUERY_CODE" "$FENCE_CODE" > /dev/tty
response=""
ret=1
while true; do
IFS= read -r -N 1 -t 0.3 char < /dev/tty || {
IFS= read -r -N 1 -t 0.3 char || {
[ -z "$char" ] && break
}
@@ -1,3 +0,0 @@
#!/bin/sh
kitty --app-id kitty-floating --config "$HOME/.config/kitty/floating.conf" "$@"
+8 -13
View File
@@ -72,6 +72,7 @@ cleanup() {
}
trap cleanup EXIT INT TERM
# --- Nested Partition Logic ---
OUTER_MOUNT_POINT=""
handle_nested_partition() {
local uuid="$1"
@@ -88,20 +89,14 @@ handle_nested_partition() {
echo "[INFO] Found outer device: $outer_device" >&2
# Check if already mounted
if findmnt -n "$outer_device" >/dev/null; then
echo "[INFO] Outer device is already mounted." >&2
OUTER_MOUNT_POINT=$(findmnt -n -o TARGET "$outer_device")
else
# Create a temporary mount point for the outer partition
OUTER_MOUNT_POINT=$(mktemp -d -t luks_outer_XXXXXX)
# Create a temporary mount point for the outer partition
OUTER_MOUNT_POINT=$(mktemp -d -t luks_outer_XXXXXX)
echo "[INFO] Mounting outer device to $OUTER_MOUNT_POINT..." >&2
if ! sudo mount "$outer_device" "$OUTER_MOUNT_POINT"; then
echo "[ERROR] Failed to mount outer device." >&2
rmdir "$OUTER_MOUNT_POINT"
exit 1
fi
echo "[INFO] Mounting outer device to $OUTER_MOUNT_POINT..." >&2
if ! sudo mount "$outer_device" "$OUTER_MOUNT_POINT"; then
echo "[ERROR] Failed to mount outer device." >&2
rmdir "$OUTER_MOUNT_POINT"
exit 1
fi
local luks_image="$OUTER_MOUNT_POINT/$NESTED_path"
@@ -1,42 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
follow_symlink=0
target_dir="/usr"
while [[ $# -gt 0 ]]; do
case $1 in
-L)
follow_symlink=1
shift
;;
*)
target_dir="$1"
shift
;;
esac
done
if [[ ! -d $target_dir ]]; then
echo "${target_dir} is not a directory" >&2
exit 1
fi
export LC_ALL=C
export LANG=C
owned_list="$(mktemp)"
trap 'rm "$owned_list"' EXIT
pacman -Qlq | sort -u > "$owned_list"
comm -23 <(find "$target_dir" ! -type d | sort) "$owned_list" | while read -r f; do
if [[ $follow_symlink -eq 1 && -L "$f" ]]; then
target=$(realpath -m "$f")
if grep -qxF "$target" "$owned_list"; then
continue
fi
fi
echo "$f"
done
+8 -11
View File
@@ -2,15 +2,14 @@
set -euo pipefail
# [[ "$XDG_CURRENT_DESKTOP" != "niri" ]] && exit 1
[[ "$XDG_CURRENT_DESKTOP" != "niri" ]] && exit 1
# if grep -q 'prefer_order=(nvidia intel)' "$HOME/.local/snippets/set_display"; then
if grep -q '[^[:space:]]' "$HOME/.config/niri/config/prime.kdl"; then
sed -i -E 's/prefer_order=\([^)]*\)/prefer_order=(intel nvidia)/' "$HOME/.local/snippets/set_display"
if grep -q 'prefer_order=(nvidia intel)' "$HOME/.local/snippets/set_display"; then
sed -i 's/prefer_order=(nvidia intel)/prefer_order=(intel nvidia)/' "$HOME/.local/snippets/set_display"
echo "" >"$HOME/.config/niri/config/prime.kdl"
echo "Disabled global Nvidia Prime offloading."
else
sed -i -E 's/prefer_order=\([^)]*\)/prefer_order=(nvidia intel)/' "$HOME/.local/snippets/set_display"
sed -i 's/prefer_order=(intel nvidia)/prefer_order=(nvidia intel)/' "$HOME/.local/snippets/set_display"
cat >"$HOME/.config/niri/config/prime.kdl" <<EOF
environment {
__NV_PRIME_RENDER_OFFLOAD "1"
@@ -23,10 +22,8 @@ fi
# Restart session
if [[ $XDG_CURRENT_DESKTOP == niri ]]; then
printf "Session restart is required to apply changes.\nDo it now? (Y/n): "
read -r answer
if [[ $answer =~ ^[Yy]$ || -z $answer ]]; then
niri msg action quit
fi
printf "Session restart is required to apply changes.\nDo it now? (Y/n): "
read -r answer
if [[ "$answer" =~ ^[Yy]$ || -z "$answer" ]]; then
niri msg action quit
fi
+3 -3
View File
@@ -9,15 +9,15 @@ set -euo pipefail
QUERY_CODE=$(printf "\033[c")
# Set terminal to raw mode with timeout as 0.5s
stty_orig=$(stty -g < /dev/tty)
trap 'stty "$stty_orig" < /dev/tty' EXIT INT TERM HUP
stty_orig=$(stty -g)
trap 'stty "$stty_orig"' EXIT INT TERM HUP
stty -echo -icanon min 1 time 0
printf "%s" "$QUERY_CODE" >/dev/tty
response=""
while true; do
IFS= read -r -N 1 -t 0.3 char < /dev/tty || {
IFS= read -r -N 1 -t 0.3 char || {
[ -z "$char" ] && break
}
+1 -1
View File
@@ -9,7 +9,7 @@
# Constants
niri_config_file="$HOME/.config/niri/config/misc.kdl"
prefer_order=(nvidia intel)
prefer_order=(intel nvidia)
# Get vendor and path of each GPU
default_card_path="$(find /dev/dri/card* 2>/dev/null | head -n 1)"
@@ -1,5 +1,5 @@
if [ -d "$HOME/.zfunc" ]; then
fpath=($HOME/.zfunc $fpath)
fpath=($HOME/.zfunc $fpath)
fi
if [ -d "$HOME/.zsh/completions" ]; then
@@ -9,9 +9,9 @@ fi
# Cache compinit: only regenerate dump once daily
autoload -Uz compinit
if [[ -n ${ZDOTDIR:-$HOME}/.zcompdump(#qN.mh+24) ]]; then
compinit
compinit
else
compinit -C
compinit -C
fi
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
@@ -2,19 +2,19 @@ _uy_antidote_dir="${XDG_DATA_HOME:-$HOME/.local/share}/antidote"
# Find antidote: system package → user-local clone → auto-bootstrap
if [[ -f /usr/share/zsh-antidote/antidote.zsh ]]; then
source /usr/share/zsh-antidote/antidote.zsh
source /usr/share/zsh-antidote/antidote.zsh
elif [[ -f "$_uy_antidote_dir/antidote.zsh" ]]; then
source "$_uy_antidote_dir/antidote.zsh"
source "$_uy_antidote_dir/antidote.zsh"
elif (( $+commands[git] )); then
git clone --depth=1 https://github.com/mattmc3/antidote.git "$_uy_antidote_dir"
source "$_uy_antidote_dir/antidote.zsh"
git clone --depth=1 https://github.com/mattmc3/antidote.git "$_uy_antidote_dir"
source "$_uy_antidote_dir/antidote.zsh"
fi
if (( $+functions[antidote] )); then
_uy_zsh_plugins="${XDG_CONFIG_HOME:-$HOME/.config}/zsh/.zsh_plugins.txt"
if [[ -f "$_uy_zsh_plugins" ]]; then
antidote load "$_uy_zsh_plugins"
fi
_uy_zsh_plugins="${XDG_CONFIG_HOME:-$HOME/.config}/zsh/.zsh_plugins.txt"
if [[ -f "$_uy_zsh_plugins" ]]; then
antidote load "$_uy_zsh_plugins"
fi
fi
unset _uy_antidote_dir _uy_zsh_plugins
+37 -37
View File
@@ -10,56 +10,56 @@ zmodload zsh/datetime
: ${uy_done_exclude:='^(nvim|helix|hx|vim|vi|nano|less|more|man|ssh|top|htop|btop)$'}
uy_done_get_focused_window_id() {
(( $+commands[jq] )) || return
niri msg --json focused-window 2>/dev/null | jq -r '.id // empty'
(( $+commands[jq] )) || return
niri msg --json focused-window 2>/dev/null | jq -r '.id // empty'
}
uy_done_preexec() {
uy_done_cmd="$1"
uy_done_start=$EPOCHSECONDS
uy_done_window_id=$(uy_done_get_focused_window_id)
uy_done_cmd="$1"
uy_done_start=$EPOCHSECONDS
uy_done_window_id=$(uy_done_get_focused_window_id)
}
uy_done_precmd() {
local exit_status=$?
[[ -n "$uy_done_start" ]] || return
local exit_status=$?
[[ -n "$uy_done_start" ]] || return
local elapsed=$(( EPOCHSECONDS - uy_done_start ))
unset uy_done_start
local elapsed=$(( EPOCHSECONDS - uy_done_start ))
unset uy_done_start
(( elapsed >= uy_done_min_cmd_duration )) || return
(( elapsed >= uy_done_min_cmd_duration )) || return
# skip excluded commands
local cmd_name="${uy_done_cmd%% *}"
[[ "$cmd_name" =~ $uy_done_exclude ]] && return
# skip excluded commands
local cmd_name="${uy_done_cmd%% *}"
[[ "$cmd_name" =~ $uy_done_exclude ]] && return
# skip if window is still focused
local current_id
current_id=$(uy_done_get_focused_window_id)
[[ -n "$uy_done_window_id" && "$uy_done_window_id" = "$current_id" ]] && return
# skip if window is still focused
local current_id
current_id=$(uy_done_get_focused_window_id)
[[ -n "$uy_done_window_id" && "$uy_done_window_id" = "$current_id" ]] && return
# humanize duration
local title duration="" urgency=low
local minutes=$(( elapsed / 60 )) seconds=$(( elapsed % 60 ))
local hours=$(( elapsed / 3600 ))
(( hours > 0 )) && duration+="${hours}h "
(( minutes > 0 )) && duration+="$(( minutes % 60 ))m "
duration+="${seconds}s"
# humanize duration
local title duration="" urgency=low
local minutes=$(( elapsed / 60 )) seconds=$(( elapsed % 60 ))
local hours=$(( elapsed / 3600 ))
(( hours > 0 )) && duration+="${hours}h "
(( minutes > 0 )) && duration+="$(( minutes % 60 ))m "
duration+="${seconds}s"
local wd="${PWD/#$HOME/~}"
if (( exit_status == 0 )); then
title="Done in $duration"
else
title="Failed ($exit_status) after $duration"
urgency=critical
fi
local wd="${PWD/#$HOME/~}"
if (( exit_status == 0 )); then
title="Done in $duration"
else
title="Failed ($exit_status) after $duration"
urgency=critical
fi
notify-send \
--hint=int:transient:1 \
--urgency="$urgency" \
--icon=utilities-terminal \
--app-name=zsh \
"$title" "$wd/ $uy_done_cmd" &
notify-send \
--hint=int:transient:1 \
--urgency="$urgency" \
--icon=utilities-terminal \
--app-name=zsh \
"$title" "$wd/ $uy_done_cmd"
}
autoload -Uz add-zsh-hook
+11 -12
View File
@@ -1,29 +1,29 @@
# MANPAGER
if (( $+commands[bat] )); then
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
export MANROFFOPT=-c
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
export MANROFFOPT=-c
fi
# Editor
for _uy_app in nvim helix vim vi nano; do
if (( $+commands[$_uy_app] )); then
export EDITOR=$_uy_app
export VISUAL=$_uy_app
break
fi
if (( $+commands[$_uy_app] )); then
export EDITOR=$_uy_app
export VISUAL=$_uy_app
break
fi
done
unset _uy_app
if (( $+commands[helix] )) && ! (( $+commands[hx] )); then
alias hx=helix
alias hx=helix
fi
# GPG
if (( $+commands[gpg] )); then
export GPG_TTY=$(tty)
export GPG_TTY=$(tty)
fi
# Catppuccin Mocha — autosuggestions color
@@ -39,12 +39,11 @@ fi
# fnm
if (( $+commands[fnm] )); then
eval "$(fnm env --shell zsh --use-on-cd)"
eval "$(fnm env --shell zsh --use-on-cd)"
fi
# bat
if (( $+commands[bat] )); then
export BAT_THEME="Catppuccin Mocha"
export BAT_STYLE="default,-numbers"
export BAT_THEME="Catppuccin Mocha"
fi
+42 -42
View File
@@ -1,54 +1,54 @@
# Remove the last command from history (both memory and file).
# The alias has a leading space so "oops" itself is not recorded (HIST_IGNORE_SPACE).
uy_oops_confirm() {
# Flush current session to file so we operate on the latest state
fc -W
# Flush current session to file so we operate on the latest state
fc -W
if [[ ! -f "$HISTFILE" || ! -s "$HISTFILE" ]]; then
print -P "%F{yellow}History is empty, nothing to delete.%f"
return 1
fi
if [[ ! -f "$HISTFILE" || ! -s "$HISTFILE" ]]; then
print -P "%F{yellow}History is empty, nothing to delete.%f"
return 1
fi
# Read the last entry (may span multiple lines if it ends with \)
local -a entry
local line
while IFS= read -r line; do
entry+=("$line")
# EXTENDED_HISTORY continuation lines end with a literal backslash
[[ "$line" == *'\' ]] || break
done < <(tail -n 50 "$HISTFILE" | tac)
# entry is reversed (last line first), flip it back
local -a ordered
for (( i=${#entry[@]}; i>=1; i-- )); do
ordered+=("${entry[$i]}")
done
# Read the last entry (may span multiple lines if it ends with \)
local -a entry
local line
while IFS= read -r line; do
entry+=("$line")
# EXTENDED_HISTORY continuation lines end with a literal backslash
[[ "$line" == *'\' ]] || break
done < <(tail -n 50 "$HISTFILE" | tac)
# entry is reversed (last line first), flip it back
local -a ordered
for (( i=${#entry[@]}; i>=1; i-- )); do
ordered+=("${entry[$i]}")
done
if (( ${#ordered[@]} == 0 )); then
print -P "%F{yellow}Could not parse last history entry.%f"
return 1
fi
if (( ${#ordered[@]} == 0 )); then
print -P "%F{yellow}Could not parse last history entry.%f"
return 1
fi
print -P "About to permanently delete the last command from history:"
for line in "${ordered[@]}"; do
print -P " %F{red}${line}%f"
done
print -P "About to permanently delete the last command from history:"
for line in "${ordered[@]}"; do
print -P " %F{red}${line}%f"
done
local reply
echo -n "Proceed? [Y/n] "
read -r reply
local reply
echo -n "Proceed? [Y/n] "
read -r reply
if [[ -z "$reply" || "$reply" == [yY]* ]]; then
# Delete the last N lines (the full entry) from the file
local n=${#ordered[@]}
head -n -"$n" "$HISTFILE" > "$HISTFILE.tmp" && mv "$HISTFILE.tmp" "$HISTFILE"
# Reload history from the updated file
fc -R
print -P "%F{green}Deleted ($n line(s) removed).%f"
else
# Reload anyway to stay in sync
fc -R
print -P "%F{yellow}Cancelled.%f"
fi
if [[ -z "$reply" || "$reply" == [yY]* ]]; then
# Delete the last N lines (the full entry) from the file
local n=${#ordered[@]}
head -n -"$n" "$HISTFILE" > "$HISTFILE.tmp" && mv "$HISTFILE.tmp" "$HISTFILE"
# Reload history from the updated file
fc -R
print -P "%F{green}Deleted ($n line(s) removed).%f"
else
# Reload anyway to stay in sync
fc -R
print -P "%F{yellow}Cancelled.%f"
fi
}
alias oops=' uy_oops_confirm'
+11 -11
View File
@@ -3,17 +3,17 @@
if [[ "${UY_ENABLE_GPG_AGENT_SSH:-0}" = "1" ]] &&
(( $+commands[gpg-init] )) && (( $+commands[gpgconf] )); then
: # GPG agent handles SSH — nothing to do
: # GPG agent handles SSH — nothing to do
elif [[ "${UY_USING_SSH_AGENT:-0}" = "1" ]]; then
sshs() {
if ! ssh-add -l &>/dev/null; then
if [[ -n "${uy_ssh_keys[*]}" ]]; then
ssh-add "${uy_ssh_keys[@]}"
else
ssh-add
fi
fi
ssh "$@"
}
sshs() {
if ! ssh-add -l &>/dev/null; then
if [[ -n "${uy_ssh_keys[*]}" ]]; then
ssh-add "${uy_ssh_keys[@]}"
else
ssh-add
fi
fi
ssh "$@"
}
fi
+140 -153
View File
@@ -1,96 +1,95 @@
# fzf
if (( $+commands[fzf] )); then
source <(fzf --zsh)
source <(fzf --zsh)
# use fd if available (search cwd only, skip vcs/cache junk)
if (( $+commands[fd] )); then
export FD_CMD="fd"
elif (( $+commands[fdfind] )); then
export FD_CMD="fdfind"
fi
if [[ -n "$FD_CMD" ]]; then
export FZF_DEFAULT_COMMAND="$FD_CMD --type f --hidden --exclude .git"
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_ALT_C_COMMAND="$FD_CMD --type d --hidden --exclude .git"
fi
# use fd if available (search cwd only, skip vcs/cache junk)
if (( $+commands[fd] )); then
export FD_CMD="fd"
elif (( $+commands[fdfind] )); then
export FD_CMD="fdfind"
fi
if [[ -n "$FD_CMD" ]]; then
export FZF_DEFAULT_COMMAND="$FD_CMD --type f --hidden --exclude .git"
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_ALT_C_COMMAND="$FD_CMD --type d --hidden --exclude .git"
fi
# C-y to copy fzf's output
if (( $+commands[wl-copy] )); then
export FZF_DEFAULT_OPTS="--bind \"ctrl-y:execute-silent(echo -n {+} | wl-copy)+abort\""
fi
# C-y to copy fzf's output
if (( $+commands[wl-copy] )); then
export FZF_DEFAULT_OPTS="--bind \"ctrl-y:execute-silent(echo -n {+} | wl-copy)+abort\""
fi
# fz: fuzzy find a file and preview
if (( $+commands[bat] )); then
alias fz="fzf --preview 'bat --style=numbers --color=always {}'"
else
alias fz="fzf --preview 'cat -n {}'"
fi
# fz: fuzzy find a file and preview
if (( $+commands[bat] )); then
alias fz="fzf --preview 'bat --style=numbers --color=always {}'"
else
alias fz="fzf --preview 'cat -n {}'"
fi
# fe: fuzzy find a file and edit using $EDITOR
fe() {
local file
file=$(fz --header "[edit with $EDITOR]")
[[ -n "$file" ]] && $EDITOR "$file"
}
# fe: fuzzy find a file and edit using $EDITOR
fe() {
local file
file=$(fz --header "[edit with $EDITOR]")
[[ -n "$file" ]] && $EDITOR "$file"
}
# fkp: fuzzy find a process and kill
fkp() {
local pids
pids=$(ps -ef | fzf -m --header-lines 1 --preview 'pstree -p $(echo {} | awk "{print \$2}")' --header "[kill process]" | awk '{print $2}')
echo "$pids" | xargs -r kill -${1:-9}
}
# fkp: fuzzy find a process and kill
fkp() {
local pids
pids=$(ps -ef | fzf -m --header-lines 1 --preview 'pstree -p $(echo {} | awk "{print \$2}")' --header "[kill process]" | awk '{print $2}')
echo "$pids" | xargs -r kill -${1:-9}
}
# fks: fuzzy find a TCP process and kill
if (( $+commands[ss] )); then
fks() {
local pids
# Call sudo separately since one cannot enter password in fzf's window
pids=$(sudo ss -lptn)
pids=$(echo "$pids" | fzf -m --header-lines 1 --header "[kill process]" | grep -oP 'pid=\K\d+')
echo "$pids" | xargs -r sudo kill -${1:-9}
}
fi
# fks: fuzzy find a TCP process and kill
if (( $+commands[ss] )); then
fks() {
local pids
# Call sudo separately since one cannot enter password in fzf's window
pids=$(sudo ss -lptn)
pids=$(echo "$pids" | fzf -m --header-lines 1 --header "[kill process]" | grep -oP 'pid=\K\d+')
echo "$pids" | xargs -r sudo kill -${1:-9}
}
fi
if (( $+commands[yay] )); then
# fyq: fuzzy yay local query
alias fyq="yay -Qq | fzf --preview 'yay -Qi {}' --preview-window='right,70%,wrap'"
if (( $+commands[yay] )); then
# fyq: fuzzy yay local query
alias fyq="yay -Qq | fzf --preview 'yay -Qi {}' --preview-window='right,70%,wrap'"
# fyi: fuzzy yay install
fyi() {
local pkg
pkg=$(yay -Sl | awk '{print $1"/"$2}' | fzf -m --preview 'yay -Si {}' --preview-window='right,70%,wrap' --header "[install package]" "$@")
# yay supports "repo/package" format
[[ -n "$pkg" ]] && yay -S ${=pkg}
}
# fyi: fuzzy yay install
fyi() {
local pkg
pkg=$(yay -Sl | awk '{print $1"/"$2}' | fzf -m --preview 'yay -Si {}' --preview-window='right,70%,wrap' --header "[install package]" "$@")
# yay supports "repo/package" format
[[ -n "$pkg" ]] && yay -S ${=pkg}
}
# fyr: fuzzy yay remove
fyr() {
local pkg
pkg=$(yay -Qq | fzf -m --preview 'yay -Qi {}' --preview-window='right,70%,wrap' --header "[remove package]" "$@")
[[ -n "$pkg" ]] && yay -Rn ${=pkg}
}
fi
# fyr: fuzzy yay remove
fyr() {
local pkg
pkg=$(yay -Qq | fzf -m --preview 'yay -Qi {}' --preview-window='right,70%,wrap' --header "[remove package]" "$@")
[[ -n "$pkg" ]] && yay -Rn ${=pkg}
}
fi
fi
# cd (zoxide)
if (( $+commands[zoxide] )); then
eval "$(zoxide init zsh)"
alias cd=z
eval "$(zoxide init zsh)"
alias cd=z
fi
# ls
if (( $+commands[eza] )); then
alias ls="eza --color=auto --hyperlink"
alias ll="eza -lh --group-directories-first --icons=auto --hyperlink"
alias la="eza -lh --group-directories-first --icons=auto --hyperlink --all"
alias lt="eza --tree --level=2 --long --icons --git"
alias ll="eza -lh --group-directories-first --icons=auto"
alias la="eza -lh --group-directories-first --icons=auto --all"
alias lt="eza --tree --level=2 --long --icons --git"
else
alias ls="ls --color=auto --hyperlinko"
alias ll="ls -lh --group-directories-first --color=auto --hyperlink"
alias la="ls -lah --group-directories-first --color=auto --hyperlink"
alias ls="ls --color=auto"
alias ll="ls -lh --group-directories-first --color=auto"
alias la="ls -lah --group-directories-first --color=auto"
fi
# directories
@@ -106,34 +105,33 @@ alias dir="dir --color=auto"
alias vdir="vdir --color=auto"
alias fgrep="fgrep --color=auto"
alias egrep="egrep --color=auto"
alias diff="diff --color=auto"
# copy
copy() {
if [[ $# -eq 2 && -d "$1" ]]; then
command cp -r "${1%/}" "$2"
else
command cp "$@"
fi
if [[ $# -eq 2 && -d "$1" ]]; then
command cp -r "${1%/}" "$2"
else
command cp "$@"
fi
}
# wget
if (( $+commands[wget] )); then
alias wget="wget -c "
alias wget="wget -c "
fi
# pacman
if (( $+commands[expac] )); then
alias big="expac -H M '%m\t%n' | sort -h | nl"
alias big="expac -H M '%m\t%n' | sort -h | nl"
fi
# clock
if (( $+commands[tty-clock] )); then
alias clock="tty-clock -c -C 4"
alias clock="tty-clock -c -C 4"
fi
# journalctl
@@ -143,8 +141,8 @@ alias jctl="journalctl -p 3 -xb"
# nohup
nh() {
nohup "$@" >/dev/null 2>&1 &
disown
nohup "$@" >/dev/null 2>&1 &
disown
}
# ffmpeg
@@ -155,92 +153,81 @@ alias ffprobe="ffprobe -hide_banner"
# git
if (( $+commands[git] )); then
gcp() {
git add -A || return 1
if [[ $# -eq 0 ]]; then
git commit -m "👐 foo:)" || return 1
else
git commit -m "$*" || return 1
fi
git push
}
gcp() {
git add -A || return 1
if [[ $# -eq 0 ]]; then
git commit -m "👐 foo: too lazy to come up with a helpful commit message :)" || return 1
else
git commit -m "$*" || return 1
fi
git push
}
if (( $+commands[wl-paste] )); then
# Get a git repo URL from clipboard, prompting if invalid
uy_git_repo_from_clipboard() {
local repo
repo=$(wl-paste)
if [[ ! "$repo" =~ '^(http|https|git|ssh)://|^git@' ]]; then
echo "Error: Clipboard does not contain a valid git repository URL." >&2
echo "Error: Clipboard content: $repo" >&2
read "repo?Enter a valid git repository URL: "
if [[ ! "$repo" =~ '^(http|https|git|ssh)://|^git@' ]]; then
echo "Error: Invalid git repository URL." >&2
return 1
fi
fi
print -r -- "$repo"
}
if (( $+commands[wl-paste] )); then
# Get a git repo URL from clipboard, prompting if invalid
uy_git_repo_from_clipboard() {
local repo
repo=$(wl-paste)
if [[ ! "$repo" =~ '^(http|https|git|ssh)://|^git@' ]]; then
echo "Error: Clipboard does not contain a valid git repository URL." >&2
echo "Error: Clipboard content: $repo" >&2
read "repo?Enter a valid git repository URL: "
if [[ ! "$repo" =~ '^(http|https|git|ssh)://|^git@' ]]; then
echo "Error: Invalid git repository URL." >&2
return 1
fi
fi
print -r -- "$repo"
}
gcl() {
local repo
repo=$(uy_git_repo_from_clipboard) || return 1
git clone "$repo"
}
gc() {
local repo
repo=$(uy_git_repo_from_clipboard) || return 1
git clone "$repo"
}
pingo() {
builtin cd "$HOME/Repositories/Uni" || return 1
local repo
repo=$(uy_git_repo_from_clipboard) || return 1
local dir_name="${repo:t:r}"
local course="${${dir_name%%[^[:lower:]]*}:u}"
mkdir -p "$course"
builtin cd "$course" || return 1
if [[ ! -d "$dir_name" ]]; then
git clone "$repo" || return 1
fi
builtin cd "$dir_name"
local app="$1"
if [[ -n "$app" ]] && (( $+commands[$app] )); then
echo "Opening project with $app"
# nohup "$app" . >/dev/null 2>&1 &
# disown
if [[ ${XDG_CURRENT_DESKTOP:-} = "niri" ]]; then
niri msg action spawn -- "$app" "$HOME/Repositories/Uni/$course/$dir_name"
else
nohup "$app" . >/dev/null 2>&1 &
disown
fi
fi
}
fi
pingo() {
cd "$HOME/Repositories/Uni" || return 1
local repo
repo=$(uy_git_repo_from_clipboard) || return 1
local dir_name="${repo:t:r}"
if [[ ! -d "$dir_name" ]]; then
git clone "$repo" || return 1
fi
local app="$1"
if [[ -n "$app" ]] && (( $+commands[$app] )); then
echo "Opening project with $app"
nohup "$app" "$dir_name" >/dev/null 2>&1 &
disown
else
echo "Opening method missing or invalid"
cd "$dir_name"
fi
}
fi
fi
# jj
if (( $+commands[jj] )); then
jjc() {
jj describe -m "$*"
jj new
}
jjc() {
jj describe -m "$*"
jj new
}
jjp() {
default_branch() {
git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's|.*/||' \
|| git remote show origin | awk '/HEAD branch/ {print $NF}' || echo "master"
}
local branch pos
branch=${1:-$(default_branch)}
pos=${2:-@-}
jj bookmark move "$branch" --to "$pos"
jj git push
}
jjp() {
local branch pos
branch=${1:-master}
pos=${2:-@-}
jj bookmark move "$branch" --to "$pos"
jj git push
}
fi
# Global aliases (can be used as part of a command)
# wl-paste
if (( $+commands[wl-paste] )); then
alias -g C="| wl-copy"
alias -g C="| wl-copy"
fi
# Redirects
+28 -28
View File
@@ -1,15 +1,15 @@
# Detect logo capability
if [[ -z "$uy_fetch_logo_type" ]]; then
if (( $+commands[kgp-query] )) && kgp-query 2>/dev/null; then
uy_fetch_logo_type=kitty
elif (( $+commands[sixel-query] )) && sixel-query 2>/dev/null; then
uy_fetch_logo_type=sixel
elif (( $+commands[kgp-query] )) || (( $+commands[sixel-query] )); then
uy_fetch_logo_type=logo
else
uy_fetch_logo_type=auto
fi
if (( $+commands[kgp-query] )) && kgp-query 2>/dev/null; then
uy_fetch_logo_type=kitty
elif (( $+commands[sixel-query] )) && sixel-query 2>/dev/null; then
uy_fetch_logo_type=sixel
elif (( $+commands[kgp-query] )) || (( $+commands[sixel-query] )); then
uy_fetch_logo_type=logo
else
uy_fetch_logo_type=auto
fi
fi
: ${uy_fetch_color:="38;2;137;180;250"}
@@ -18,37 +18,37 @@ fi
case "$uy_fetch_logo_type" in
symbols)
uy_fetch_args=(--logo-type raw --logo-width 42 --logo "$HOME/.config/fastfetch/logo_ros/42x.symbols" --color "$uy_fetch_color")
uy_fetch_args_brief=(--logo-type raw --logo-width 28 --logo "$HOME/.config/fastfetch/logo_ros/28x.symbols" --color "$uy_fetch_color")
;;
uy_fetch_args=(--logo-type raw --logo-width 42 --logo "$HOME/.config/fastfetch/logo_ros/42x.symbols" --color "$uy_fetch_color")
uy_fetch_args_brief=(--logo-type raw --logo-width 28 --logo "$HOME/.config/fastfetch/logo_ros/28x.symbols" --color "$uy_fetch_color")
;;
logo)
uy_fetch_args=(--logo-type builtin)
uy_fetch_args_brief=(--logo-type small)
;;
uy_fetch_args=(--logo-type builtin)
uy_fetch_args_brief=(--logo-type small)
;;
sixel)
uy_fetch_args=(--logo-type raw --logo-width 42 --logo "$HOME/.config/fastfetch/logo_ros/42x.sixel" --color "$uy_fetch_color")
uy_fetch_args_brief=(--logo-type raw --logo-width 28 --logo "$HOME/.config/fastfetch/logo_ros/28x.sixel" --color "$uy_fetch_color")
;;
uy_fetch_args=(--logo-type raw --logo-width 42 --logo "$HOME/.config/fastfetch/logo_ros/42x.sixel" --color "$uy_fetch_color")
uy_fetch_args_brief=(--logo-type raw --logo-width 28 --logo "$HOME/.config/fastfetch/logo_ros/28x.sixel" --color "$uy_fetch_color")
;;
*) # kitty, auto, etc.
uy_fetch_args=(--logo-type "$uy_fetch_logo_type" --logo-width 42 --logo "$HOME/.config/fastfetch/logo_ros/ros.png" --color "$uy_fetch_color")
uy_fetch_args_brief=(--logo-type "$uy_fetch_logo_type" --logo-width 28 --logo "$HOME/.config/fastfetch/logo_ros/ros.png" --color "$uy_fetch_color")
;;
uy_fetch_args=(--logo-type "$uy_fetch_logo_type" --logo-width 42 --logo "$HOME/.config/fastfetch/logo_ros/ros.png" --color "$uy_fetch_color")
uy_fetch_args_brief=(--logo-type "$uy_fetch_logo_type" --logo-width 28 --logo "$HOME/.config/fastfetch/logo_ros/ros.png" --color "$uy_fetch_color")
;;
esac
# Functions
if (( $+commands[fastfetch] )); then
ff() { fastfetch -c "$HOME/.config/fastfetch/config.jsonc" "${uy_fetch_args[@]}" "$@"; }
ff() { fastfetch -c "$HOME/.config/fastfetch/config.jsonc" "${uy_fetch_args[@]}" "$@"; }
if [[ -f "$HOME/.config/fastfetch/brief.jsonc" ]]; then
ffb() { fastfetch -c "$HOME/.config/fastfetch/brief.jsonc" "${uy_fetch_args_brief[@]}" "$@"; }
else
ffb() { ff "$@"; }
fi
if [[ -f "$HOME/.config/fastfetch/brief.jsonc" ]]; then
ffb() { fastfetch -c "$HOME/.config/fastfetch/brief.jsonc" "${uy_fetch_args_brief[@]}" "$@"; }
else
ffb() { ff "$@"; }
fi
fi
# Auto-fetch on startup
if [[ -z "$uy_no_fetch" ]] && (( $+functions[ffb] )); then
ffb
ffb
fi
-1
View File
@@ -45,7 +45,6 @@ fi
[[ -f "$HOME/.cargo/env" ]] && source "$HOME/.cargo/env"
(( $+commands[opam] )) && eval "$(opam env)"
prepend_path "$HOME/.cargo/bin"
prepend_path "$HOME/go/bin"
prepend_path "$HOME/.local/bin"
prepend_path "$HOME/.local/scripts"
+1 -2
View File
@@ -17,8 +17,7 @@
},
"theme": {
"dark": {
"name": "catppuccin-mocha",
"icon_theme": "Papirus"
"name": "catppuccin-mocha"
}
}
}
@@ -14,7 +14,7 @@
},
"action": {
"onSelected": "qs ipc call background set '{{ path }}'; change-colortheme -c '{{ colorHex }}'",
"onPreview": "exit 0; qs ipc call background preview '{{ path }}'; change-colortheme -c '{{ colorHex }}' quickshell niri",
"onPreview": "qs ipc call background preview '{{ path }}'; change-colortheme -c '{{ colorHex }}' quickshell niri",
"quitOnSelected": true,
"saveState": [
{
@@ -23,7 +23,7 @@
"command": "qs ipc call colors get mPrimary"
}
],
"onRestore": "exit 0; qs ipc call background preview ''; change-colortheme -c '{{ flavor }}' quickshell niri"
"onRestore": "qs ipc call background preview ''; change-colortheme -c '{{ flavor }}' quickshell niri"
},
"cache": {
"maxImageEntries": 300
+24
View File
@@ -0,0 +1,24 @@
#!/bin/bash
[ -f "$HOME/.local/snippets/apply-color-helper" ] || {
echo "Missing helper script: $HOME/.local/snippets/apply-color-helper"
exit 1
}
. "$HOME/.local/snippets/apply-color-helper"
for file in "$path"/icons/*.svg; do
[ -f "$file" ] || continue
sed -i -E "s/(fill=\"#)([0-9A-Fa-f]{6})(\")/\1${colorHex}\3/" "$file" || {
log_error "Failed to edit ${file}"
exit 1
}
done
file="$path"/style.css
sed -i -E "s/(border-color:\s*#)([0-9A-Fa-f]{6})(;)/\1${colorHex}\3/" "$file" || {
log_error "Failed to edit ${file}"
exit 1
}
log_success "wlogout"

Before

Width:  |  Height:  |  Size: 969 B

After

Width:  |  Height:  |  Size: 969 B

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before

Width:  |  Height:  |  Size: 877 B

After

Width:  |  Height:  |  Size: 877 B

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,36 @@
{
"label": "lock",
"action": "loginctl lock-session",
"text": "Lock",
"keybind": "l"
}
{
"label": "hibernate",
"action": "systemctl hibernate",
"text": "Hibernate",
"keybind": "h"
}
{
"label": "logout",
"action": "hyprctl dispatch exit",
"text": "Logout",
"keybind": "e"
}
{
"label": "shutdown",
"action": "systemctl poweroff",
"text": "Shutdown",
"keybind": "s"
}
{
"label": "suspend",
"action": "sleep 0.1 && systemctl suspend",
"text": "Suspend",
"keybind": "u"
}
{
"label": "reboot",
"action": "systemctl reboot",
"text": "Reboot",
"keybind": "r"
}
@@ -0,0 +1,120 @@
* {
background-image: none;
font-size: 24px;
font-family: 'Sour Gummy Light';
}
window {
background-color: rgba(30, 30, 46, 0.5);
}
button {
color: #cdd6f4;
border-radius: 0;
outline-style: none;
background-color: alpha(#1e1e2e, 0.8);
border: none;
border-width: 0px;
border-radius: 0px;
border-color: #89b4fa;
box-shadow: none;
text-shadow: none;
text-decoration-color: #cdd6f4;
background-repeat: no-repeat;
background-position: center;
background-size: 20%;
animation: gradient_f 20s ease-in infinite;
}
button:focus,
button:active,
button:hover {
background-size: 20%;
background-color: alpha(#1e1e2e, 0.7);
animation: gradient_f 20s ease-in infinite;
transition: all 0.3s cubic-bezier(0.55, 0, 0.28, 1.682);
}
#lock {
background-image: image(url('./icons/lock.svg'));
border-radius: 32px 0 0 0;
}
#logout {
background-image: image(url('./icons/logout.svg'));
}
#suspend {
background-image: image(url('./icons/suspend.svg'));
border-radius: 0 32px 0 0;
}
#hibernate {
background-image: image(url('./icons/hibernate.svg'));
border-radius: 0 0 0 32px;
}
#shutdown {
background-image: image(url('./icons/shutdown.svg'));
}
#reboot {
background-image: image(url('./icons/reboot.svg'));
border-radius: 0 0 32px 0;
}
#lock:hover {
border-radius: 30px 0 0 0;
margin: -30px 0 0 -30px;
}
#logout:hover {
margin: -30px 0 0 0;
}
#suspend:hover {
border-radius: 0 30px 0 0;
margin: -30px -30px 0 0;
}
#hibernate:hover {
border-radius: 0 0 0 30px;
margin: 0 0 -30 -30px;
}
#shutdown:hover {
margin: 0 0 -30px 0;
}
#reboot:hover {
border-radius: 0 0 30px 0;
margin: 0 -30px -30px 0;
}
#lock:focus {
border-radius: 60px 0 0 0;
margin: -60px 0 0 -60px;
}
#logout:focus {
margin: -60px 0 0 0;
}
#suspend:focus {
border-radius: 0 60px 0 0;
margin: -60px -60px 0 0;
}
#hibernate:focus {
border-radius: 0 0 0 60px;
margin: 0 0 -60 -60px;
}
#shutdown:focus {
margin: 0 0 -60px 0;
}
#reboot:focus {
border-radius: 0 0 60px 0;
margin: 0 -60px -60px 0;
}
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg fill="#89b4fa" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>
<g><g><path d="M500,10C229.4,10,10,229.4,10,500s219.4,490,490,490s490-219.4,490-490S770.6,10,500,10z M500,885.1c-212.7,0-385.1-172.4-385.1-385.1S287.3,114.9,500,114.9S885.1,287.3,885.1,500S712.7,885.1,500,885.1z M576.5,308.7v382.4c0,42.2-34.2,76.5-76.5,76.5c-42.3,0-76.5-34.2-76.5-76.5V308.7c0-42.2,34.2-76.5,76.5-76.5C542.2,232.3,576.5,266.5,576.5,308.7z"/></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g></g>
</svg>

After

Width:  |  Height:  |  Size: 969 B

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg fill="#89b4fa" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>
<g><g><path d="M321.8,455.5h356.4V321.8c0-49.2-17.4-91.2-52.2-126c-34.8-34.8-76.8-52.2-126-52.2c-49.2,0-91.2,17.4-126,52.2c-34.8,34.8-52.2,76.8-52.2,126L321.8,455.5L321.8,455.5z M900.9,522.3v400.9c0,18.6-6.5,34.3-19.5,47.3c-13,13-28.8,19.5-47.3,19.5H165.9c-18.6,0-34.3-6.5-47.3-19.5s-19.5-28.8-19.5-47.3V522.3c0-18.6,6.5-34.3,19.5-47.3c13-13,28.8-19.5,47.3-19.5h22.3V321.8c0-85.4,30.6-158.7,91.9-219.9C341.3,40.6,414.6,10,500,10c85.4,0,158.7,30.6,219.9,91.9c61.3,61.3,91.9,134.6,91.9,219.9v133.6h22.3c18.6,0,34.3,6.5,47.3,19.5C894.4,487.9,900.9,503.7,900.9,522.3L900.9,522.3z"/></g></g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg fill="#89b4fa" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>
<g><path d="M622.5,990H50.8C26.3,990,10,973.7,10,949.2V50.8C10,26.3,26.3,10,50.8,10h571.7c24.5,0,40.8,16.3,40.8,40.8v285.8c0,24.5-16.3,40.8-40.8,40.8s-40.8-16.3-40.8-40.8v-245h-490v816.7h490v-245c0-24.5,16.3-40.8,40.8-40.8s40.8,16.3,40.8,40.8v285.8C663.3,973.7,647,990,622.5,990z"/><path d="M949.2,540.8H336.7c-24.5,0-40.8-16.3-40.8-40.8c0-24.5,16.3-40.8,40.8-40.8h612.5c24.5,0,40.8,16.3,40.8,40.8C990,524.5,973.7,540.8,949.2,540.8z"/><path d="M949.2,540.8c-12.3,0-20.4-4.1-28.6-12.3L757.3,365.3c-16.3-16.3-16.3-40.8,0-57.2c16.3-16.3,40.8-16.3,57.2,0l163.3,163.3c16.3,16.3,16.3,40.8,0,57.2C969.6,536.8,961.4,540.8,949.2,540.8z"/><path d="M785.8,704.2c-12.3,0-20.4-4.1-28.6-12.3c-16.3-16.3-16.3-40.8,0-57.2l163.3-163.3c16.3-16.3,40.8-16.3,57.2,0c16.3,16.3,16.3,40.8,0,57.2L814.4,691.9C806.3,700.1,798.1,704.2,785.8,704.2z"/></g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg fill="#89b4fa" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>
<g><path d="M134.6,285.6C64.9,420.7,60.1,590,137.1,723.4L42,668.5l-32,55.4c93.1,52.1,133.6,75.9,184,106.2c28.5-51.5,52.8-94.4,107.4-186.1L246,612l-53.4,92.5C65.4,502.7,167.2,200.3,398.8,126.2C638,29.3,929,223.5,931.5,481.5c19.6,236.7-208.9,443.6-439.3,416.2l-29.5,51c277.7,54.4,556.5-201.7,524.7-483.1C976.1,170.8,637.1-41.2,367.1,77.5C262.8,114.2,183.1,191.5,134.6,285.6z"/></g>
</svg>

After

Width:  |  Height:  |  Size: 877 B

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg fill="#89b4fa" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>
<g><path d="M764,152.1c30.9,22,58.3,46.8,82.4,74.6c24,27.8,44.6,57.8,61.8,90.1c17.2,32.3,30.2,66.4,39.1,102.4c8.9,36,13.4,72.6,13.4,109.6c0,63.8-12.2,123.7-36.5,179.6c-24.4,55.9-57.3,104.7-98.8,146.2c-41.5,41.5-90.2,74.5-146.2,98.8C623.2,977.8,563.3,990,499.5,990c-63.1,0-122.7-12.2-178.6-36.5c-55.9-24.4-104.8-57.3-146.7-98.8c-41.9-41.5-74.8-90.2-98.8-146.2c-24-55.9-36-115.8-36-179.6c0-36.4,4.3-72.1,12.9-107.1c8.6-35,20.8-68.3,36.5-99.9c15.8-31.6,35.3-61.1,58.7-88.5c23.3-27.5,49.4-52.2,78.2-74.1c15.1-11,31.4-15.1,48.9-12.4c17.5,2.7,31.7,11.3,42.7,25.7c11,14.4,15.1,30.5,12.4,48.4c-2.7,17.8-11.3,32.3-25.7,43.2c-43.2,31.6-76.4,70.3-99.3,116.3c-23,46-34.5,95.4-34.5,148.2c0,45.3,8.6,88,25.7,128.2c17.2,40.1,40.7,75.1,70.5,105c29.9,29.9,64.9,53.5,105,71c40.1,17.5,82.9,26.3,128.2,26.3c45.3,0,88-8.7,128.2-26.3c40.1-17.5,75.1-41.2,105-71s53.5-64.9,71-105c17.5-40.1,26.3-82.9,26.3-128.2c0-53.5-12.4-104.1-37.1-151.8c-24.7-47.7-59.4-87-104-117.9c-15.1-10.3-24.2-24.4-27.3-42.2c-3.1-17.8,0.5-34.3,10.8-49.4c10.3-14.4,24.4-23.2,42.2-26.2C732.5,138.2,748.9,141.8,764,152.1L764,152.1z M499.5,531.9c-17.8,0-33.1-6.3-45.8-19c-12.7-12.7-19-28-19-45.8V75.9c0-17.8,6.3-33.3,19-46.3c12.7-13,28-19.6,45.8-19.6c18.5,0,34.1,6.5,46.8,19.6c12.7,13,19,28.5,19,46.3v391.2c0,17.8-6.3,33.1-19,45.8C533.6,525.6,518,531.9,499.5,531.9L499.5,531.9z"/></g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg fill="#89b4fa" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>
<g><path d="M500,990c-66.1,0-130.3-13-190.7-38.5c-58.4-24.7-110.8-60-155.7-105s-80.3-97.4-105-155.7C23,630.3,10,566.1,10,500c0-66.1,13-130.3,38.5-190.7c24.7-58.4,60-110.8,105-155.7c45-45,97.4-80.3,155.7-105C369.7,23,433.9,10,500,10c66.1,0,130.3,13,190.7,38.5c58.4,24.7,110.8,60,155.7,105c45,45,80.3,97.4,105,155.7C977,369.7,990,433.9,990,500c0,66.1-13,130.3-38.5,190.7c-24.7,58.4-60,110.8-105,155.7s-97.4,80.3-155.7,105C630.3,977,566.1,990,500,990z M500,79.6c-112.3,0-217.9,43.7-297.3,123.1C123.3,282.1,79.6,387.7,79.6,500s43.7,217.9,123.1,297.3c79.4,79.4,185,123.1,297.3,123.1c112.3,0,217.9-43.7,297.3-123.1c79.4-79.4,123.1-185,123.1-297.3s-43.7-217.9-123.1-297.3C717.9,123.3,612.3,79.6,500,79.6z"/><path d="M322.5,290.6h108v412h-108V290.6z"/><path d="M561.6,290.6h107.9v412H561.6V290.6z"/></g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -1,6 +1,6 @@
{
"label": "lock",
"action": "loginctl lock-session",
"action": "hyprlock &",
"text": "Lock",
"keybind": "l"
}
@@ -24,7 +24,7 @@
}
{
"label": "suspend",
"action": "systemctl suspend",
"action": "sleep 0.1 && systemctl suspend",
"text": "Suspend",
"keybind": "u"
}
@@ -33,4 +33,4 @@
"action": "systemctl reboot",
"text": "Reboot",
"keybind": "r"
}
}
-1
View File
@@ -1,2 +1 @@
Uni /home/kolkas/Repositories/Uni/ 1
backgrounds /home/kolkas/Pictures/backgrounds/ 0
File diff suppressed because it is too large Load Diff
+9 -9
View File
@@ -1,11 +1,11 @@
[[plugin.deps]]
use = "yazi-rs/plugins:git"
rev = "38efe09"
hash = "88e56a64b7ce7c4314427452343fef17"
rev = "ac82af3"
hash = "6849444b7c2df08eace83f3f86fb55a3"
[[plugin.deps]]
use = "yazi-rs/plugins:smart-enter"
rev = "38efe09"
rev = "ac82af3"
hash = "187cc58ba7ac3befd49c342129e6f1b6"
[[plugin.deps]]
@@ -15,18 +15,18 @@ hash = "699fe07e0d2d1b4af8dafb84168eeb04"
[[plugin.deps]]
use = "KKV9/compress"
rev = "e60e122"
hash = "fbaf0adc8efc59555b748d36aab62d40"
rev = "46a6b9f"
hash = "771af2becc575a3f43d0542de823969d"
[[plugin.deps]]
use = "llanosrocas/yaziline"
rev = "25161c1"
hash = "5c7802a9ac249be88729978e3b9525bc"
rev = "cc0314c"
hash = "b937c5c8e2d9fa314d4532489176814e"
[[plugin.deps]]
use = "Rolv-Apneseth/starship"
rev = "159eaba"
hash = "7de446280b1ba8c49ffd86dbc24bbbe6"
rev = "a837101"
hash = "635b0feb9215772d22020eb0abf0bb34"
[flavor]
deps = []
@@ -1,4 +1,4 @@
--- @since 26.5.6
--- @since 25.12.29
-- Check for windows
local is_windows = ya.target_family() == "windows"
@@ -460,7 +460,7 @@ return {
-- Create a temporary directory for intermediate files
local temp_dir_name = ".tmp_compress"
local temp_dir = combine_url(output_dir, temp_dir_name)
temp_dir = tostring(fs.unique("dir", Url(temp_dir)))
temp_dir = tostring(fs.unique_name(Url(temp_dir)))
-- Attempt to create the temporary directory
local temp_dir_status, temp_dir_err = fs.create("dir_all", Url(temp_dir))
@@ -532,7 +532,7 @@ return {
-- Move the final file from the temporary directory to the output directory
local final_output_url = combine_url(output_dir, original_name)
local temp_url_processed = combine_url(temp_dir, original_name)
final_output_url = tostring(fs.unique("file", Url(final_output_url)))
final_output_url = tostring(fs.unique_name(Url(final_output_url)))
local from, to = Url(temp_url_processed), Url(final_output_url)
local move_status, move_err = fs.rename(from, to)
if not move_status then
@@ -39,46 +39,49 @@ group = "git"
## Advanced
You can customize the [Style](https://yazi-rs.github.io/docs/configuration/theme#types.style) of the status sign with:
> [!NOTE]
> The following configuration must be put before `require("git"):setup()`
- `[git].unknown` - status cannot/not yet determined
- `[git].modified` - modified file
- `[git].added` - added file
- `[git].untracked` - untracked file
- `[git].ignored` - ignored file
- `[git].deleted` - deleted file
- `[git].updated` - updated file
- `[git].clean` - clean file
You can customize the [Style](https://yazi-rs.github.io/docs/plugins/layout#style) of the status sign with:
- `th.git.unknown` - status cannot/not yet determined
- `th.git.modified` - modified file
- `th.git.added` - added file
- `th.git.untracked` - untracked file
- `th.git.ignored` - ignored file
- `th.git.deleted` - deleted file
- `th.git.updated` - updated file
- `th.git.clean` - clean file
For example:
```toml
# theme.toml / flavor.toml
[git]
modified = { fg = "blue" }
deleted = { fg = "red", bold = true }
```lua
-- ~/.config/yazi/init.lua
th.git = th.git or {}
th.git.modified = ui.Style():fg("blue")
th.git.deleted = ui.Style():fg("red"):bold()
```
You can also customize the text of the status sign with:
- `[git].unknown_sign` - status cannot/not yet determined
- `[git].modified_sign` - modified file
- `[git].added_sign` - added file
- `[git].untracked_sign` - untracked file
- `[git].ignored_sign` - ignored file
- `[git].deleted_sign` - deleted file
- `[git].updated_sign` - updated file
- `[git].clean_sign` - clean file
- `th.git.unknown_sign` - status cannot/not yet determined
- `th.git.modified_sign` - modified file
- `th.git.added_sign` - added file
- `th.git.untracked_sign` - untracked file
- `th.git.ignored_sign` - ignored file
- `th.git.deleted_sign` - deleted file
- `th.git.updated_sign` - updated file
- `th.git.clean_sign` - clean file
For example:
```toml
# theme.toml / flavor.toml
[git]
unknown_sign = " "
modified_sign = "M"
deleted_sign = "D"
clean_sign = "✔"
```lua
-- ~/.config/yazi/init.lua
th.git = th.git or {}
th.git.unknown_sign = " "
th.git.modified_sign = "M"
th.git.deleted_sign = "D"
th.git.clean_sign = ""
```
## License
@@ -1,4 +1,4 @@
--- @since 26.5.6
--- @since 26.1.22
local WINDOWS = ya.target_family() == "windows"
@@ -71,7 +71,7 @@ local old_build = Tab.build
Tab.build = function(self, ...)
local bar = function(c, x, y)
if x <= 0 or x == self._area.w - 1 then
return ui.Bar(ui.Edge.TOP)
return ui.Bar(ui.Edge.TOP):area(ui.Rect.default)
end
return ui.Bar(ui.Edge.TOP)
@@ -87,15 +87,15 @@ Tab.build = function(self, ...)
local c = self._chunks
self._chunks = {
c[1]:pad(ui.Pad.y(1)),
c[2]:pad(ui.Pad.y(1)),
c[2]:pad(ui.Pad(1, c[3].w > 0 and 0 or 1, 1, c[1].w > 0 and 0 or 1)),
c[3]:pad(ui.Pad.y(1)),
}
self._base = ya.list_merge(self._base or {}, {
bar("", c[2].x, c[1].y),
bar("", c[2].x, c[1].bottom - 1),
bar("", c[2].right - 1, c[2].y),
bar("", c[2].right - 1, c[2].bottom - 1),
bar("", c[1].right - 1, c[1].y),
bar("", c[1].right - 1, c[1].bottom - 1),
bar("", c[2].right, c[2].y),
bar("", c[2].right, c[2].bottom - 1),
})
old_build(self, ...)
@@ -24,8 +24,6 @@ This setup allows shipping stable versions on time, while giving early access to
| yaziline | yazi |
| :------------------------------------------------------------------------: | ----------------------------------------------------------------------------------------- |
| [v2.5.4](https://github.com/llanosrocas/yaziline.yazi/releases/tag/v2.5.4) | [v26.5.6](https://github.com/sxyazi/yazi/releases/tag/v26.5.6) |
| [v2.5.3](https://github.com/llanosrocas/yaziline.yazi/releases/tag/v2.5.3) | [v26.1.22](https://github.com/sxyazi/yazi/releases/tag/v26.1.22) |
| [v2.5.2](https://github.com/llanosrocas/yaziline.yazi/releases/tag/v2.5.2) | [v26.1.22](https://github.com/sxyazi/yazi/releases/tag/v26.1.22) |
| [v2.5.2](https://github.com/llanosrocas/yaziline.yazi/releases/tag/v2.5.2) | [2f66561](https://github.com/sxyazi/yazi/commit/2f66561a8251f8788b2b0fd366af90555ecafc86) |
| [v2.5.2](https://github.com/llanosrocas/yaziline.yazi/releases/tag/v2.5.2) | [6cfa92f](https://github.com/sxyazi/yazi/commit/6cfa92f11205d212155579b5b76d4cbabe723829) |
@@ -60,15 +60,15 @@ local function setup(_, options)
})
end
function Status:length()
function Status:size()
local h = self._current.hovered
local len = h and h.cha.len or 0
local size = h and (h:size() or h.cha.len) or 0
local style = self:style()
return ui.Span(
current_separator_style.separator_close
.. " "
.. ya.readable_size(len)
.. ya.readable_size(size)
.. " "
)
:fg(config.color or style.main:bg())
+5 -5
View File
@@ -1,6 +1,6 @@
# A TOML linter such as https://taplo.tamasfe.dev/ can use this schema to validate your config.
# If you encounter any issues, please make an issue at https://github.com/yazi-rs/schemas.
#:schema https://yazi-rs.github.io/schemas/yazi.json
"$schema" = "https://yazi-rs.github.io/schemas/yazi.json"
[mgr]
ratio = [1, 3, 4]
@@ -86,10 +86,10 @@ suppress_preload = false
[plugin]
fetchers = [
# Mimetype
{ id = "mime", url = "*/", run = "mime.dir", prio = "high", group = "mime" },
{ id = "mime", url = "*", run = "mime.local", if = "!mime", prio = "high", group = "mime" },
{ id = "git", url = "*", run = "git", prio = "normal", group = "mime" },
{ id = "git", url = "*/", run = "git", prio = "normal", group = "mime" },
{ id = "mime", url = "*/", run = "mime.dir", prio = "high" },
{ id = "mime", url = "*", run = "mime.local", if = "!mime", prio = "high" },
{ id = "git", url = "*", run = "git", prio = "normal" },
{ id = "git", url = "*/", run = "git", prio = "normal" },
]
preloaders = [
# Image
+1 -1
View File
@@ -92,4 +92,4 @@
:monitor 0
:geometry (geometry :x 1108 :y -45)
(lyrics-single)
)
)
-43
View File
@@ -1,43 +0,0 @@
> 嗯, 用户想问的似乎是如何使用
>
> - `qemu-user-static`
> - `qemu-user-static-binfmt`
>
> 通过
>
> ```bash
> sudo systemd-nspawn -M {{ rootfs-name }}
> ```
>
> 运行从
>
> ```bash
> wget https://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
> ```
>
> 下载且通过
>
> ```bash
> sudo mkdir -p /var/lib/machines/{{ rootfs-name }} && \
> sudo bsdtar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C /var/lib/machines/{{ rootfs-name }}
> ```
>
> 解压的 aarch64 架构的 archlinux rootfs. 但要不要提醒用户应该取消注释 `/etc/pacman.conf` 中的
>
> ```conf
> [options]
> #DisableSandboxFilesystem
> #DisableSandboxSyscalls
> ```
>
> 以禁用在 systemd-nspawn 中默认不可用的下载沙盒, 并且应该避免运行需要 setuid 的程序 (如 sudo), 因为 `/proc/sys/fs/binfmt_misc/qemu-aarch64` 中的 `flags` 缺失 `C` (Credentials) 标志, 导致可执行文件的 `s` 权限位被忽视? 不过如果真的需要 setuid 的话, 也可以通过
>
> ```bash
> sudo cp /usr/lib/binfmt.d/qemu-aarch64-static.conf /etc/binfmt.d/
> ```
>
> 复制一份并在末尾加上 C, 要不要一并告诉用户?
>
> 算了, 反正用户什么也不懂, 即使问题解决也只会原地消失, 一句感谢也不说.
_Baked for 27s._
-90
View File
@@ -1,90 +0,0 @@
## 问题
### VapourSynth 破坏性更新
> Tue May 5 09:08:30 CEST 2026
- `extra/vapoursynth` 包更新至 75 版本后 (此问题其实是 R74 引入的, 但他们似乎跳过了 R74 直接在近几天更新至 R75), vsscript 库文件符号链接关系如下:
- `/usr/lib/libvapoursynth-script.so` -> `python3.14/site-packages/vapoursynth/libvsscript.so`
- `/usr/lib/libvapoursynth-script.so.0` -> `python3.14/site-packages/vapoursynth/libvsscript.so`
这导致 ldconfig 根据 SONAME 字段建立的缓存条目变化, 例如从 `libvapoursynth-script.so.0 (libc,x86-64) => /usr/lib/libvapoursynth-script.so.0` 变为 `libvsscript.so (libc6,x86-64) => /usr/lib/libvsscript.so`, 可能会使其他未能重新链接的程序找不到对应库.
但该问题影响范围比较有限, 因为动态库并不完全根据 ldconfig 缓存条目加载 —— 如果文件名完全匹配也能正确加载, 毕竟 `/usr/lib/libvapoursynth-script.so.0` 仍然存在.
- 同时, 插件目录也从 `/usr/lib/vapoursynth/` 改为 `/usr/lib/python3.14/site-packages/vapoursynth/plugins/`, 很多包未能及时更新插件安装路径, 导致 vapoursynth 插件丢失.
extra 仓库中的 vapoursynth-plugin-\* 包均已改为类似如下动态查找插件安装路径的方式:
```bash
install -Dm 755 libxxx.so -t "${pkgdir}"/$(python -c 'import vapoursynth;print(vapoursynth.get_plugin_dir())')/
```
所以不会出问题. 主要影响范围是打包者或上游硬编码插件安装路径为 `/usr/lib/vapoursynth` 的包, 其中包括少数 extra 仓库的包如 `extra/ffms2` 和众多 AUR 包.
临时修复方法:
```bash
old_dir="/usr/lib/vapoursynth"
new_dir="$(python -c 'import vapoursynth;print(vapoursynth.get_plugin_dir())')"
if [ "$(realpath "$old_dir" 2>/dev/null)" != "$(realpath "$new_dir")" ] && [ -d "$old_dir" ]; then
for f in "$old_dir"/*.so; do
if [ -L "$f" ]; then p="$(readlink -m "$f")"; elif [ -f "$f" ]; then p="$f"; else continue; fi
ln -svr "$p" "$new_dir/$(basename "$f")"
done
fi
unset old_dir new_dir f p
```
- vapoursynth 不再在编译期链接 libpython, 而必须在加载 libvsscript.so 时选择 python. 选哪个 python 由 `$HOME/.config/vapoursynth/vapoursynth.toml` 维护的映射关系决定, 格式类似:
```toml
"/usr/lib/python3.14/site-packages/vapoursynth/libvsscript.so" = ["/usr/bin/python","/usr/lib/libpython3.14.so.1.0"]
```
可以运行 `vapoursynth config` 自动更新.
然而, 上文提到过新的 libvsscript.so 的 ldconfig 条目是 `libvsscript.so (libc6,x86-64) => /usr/lib/libvsscript.so`, 而 `vapoursynth config` 只会在 `vapoursynth.toml` 写入 `/usr/lib/python3.14/site-packages/vapoursynth/libvsscript.so` 的条目. 此时, 如果加载 libvsscript.so, 会从 ldconfig 拿到 `/usr/lib/libvsscript.so`,而 vapoursynth 在拿到此路径后不解 symlink, 查 `vapoursynth.toml` 时和任何条目都对不上, 导致加载失败. 报错类似:
```
Python executable and library path couldn't be determined despite automatic configuration. Run `vapoursynth config` to set it for this Python installation and then try again.
```
临时修复方式为在 `$HOME/.config/vapoursynth/vapoursynth.toml` 里手动加上针对 `/usr/lib/libvsscript.so` 符号链接的条目:
```toml
"/usr/lib/libvsscript.so" = ["/usr/bin/python","/usr/lib/libpython3.14.so.1.0"]
```
如果运行 vapoursynth 此次更新前构建并链接的程序, 可能同样需要为 `/usr/lib/libvapoursynth-script.so.0` 准备对应条目:
```toml
"/usr/lib/libvapoursynth-script.so.0" = ["/usr/bin/python","/usr/lib/libpython3.14.so.1.0"]
```
影响范围为所有动态链接 vapoursynth 的二进制文件.
### CUDA 13.2 不兼容 GCC 16.1
> Mon May 4 15:39:17 CEST 2026
nvcc 和 gcc 兼容问题的历史重演. 随 GCC 16.1 发布, 以前用 GCC 15.2 能够编译的 CUDA 包会报一堆错误, 影响范围非常大.
解决方法为装 gcc15 等旧版本工具链, 并修改编译流程使 nvcc 使用指定编译器. 例如对于部分 Makefile:
```makefile
CUDA_CCBIN ?=
cudaccbin = $(if $(CUDA_CCBIN),-ccbin $(CUDA_CCBIN),)
...
nvcc $(cudaccbin) ...
```
但这样会带来一个问题: `gcc15` 是 AUR 包, 需要编译. 而这并不会是一个很愉快的过程. 除去超大的仓库体积, 超长时间的编译测试和超高的资源占用外, 过程中还可能会因为各种问题失败, 修复问题后可能还需要从头再来, 成本过高.
但好在 cachyos 有打包 `gcc14` 二进制包, 因此再降一个版本即可绕过编译过程. 但 AUR 上的众多打包者应该还是会选择 `gcc15`, 因此在有仓库打包 `gcc15` 二进制包或 NVIDIA 更新 CUDA 支持 GCC 16 之前, 几乎所有涉及 CUDA 的包仍然需要手动修改 PKGBUILD 构建.
另外还有几个可选方案:
- 可以用 clang++ 代替 nvcc, 但支持程度似乎有限 (`clang++: warning: CUDA version is newer than the latest partially supported version 12.9 [-Wunknown-cuda-version]`), 且对于部分已经在使用 nvcc 构建的项目可能需要较大幅度地修改编译参数和流程, 实用价值不高.
+64 -78
View File
@@ -1,18 +1,19 @@
### Font packages (involved in fontconfig)
- `extra/ttf-sarasa-gothic`
- `aur/ttf-symbola`
- `extra/noto-fonts`
- `extra/noto-fonts-cjk`
- `extra/noto-fonts-emoji`
- `extra/ttf-nerd-fonts-symbols`
- `aur/maplemono-nf-cn`
- `aur/ttf-lxgw-wenkai`
- `aur/ttf-symbola`
### Other fonts (used but not involved in fontconfig)
- [Sour Gummy](https://fonts.google.com/specimen/Sour+Gummy): used in quickshell
- Font Awesome 6 Free: used in waybar & some other desktop components
- `extra/ttf-meslo-nerd`: for its `Mono` variant, nerd-font icons with 1-cell width
- Sour Gummy (from [Google Fonts](https://fonts.google.com/specimen/Sour+Gummy))
- Font Awesome 6 Free (extracted from an AUR package that no longer exists)
- `extra/ttf-meslo-nerd`
- `archlinuxcn/ttf-lxgw-wenkai`
### Font configuration
@@ -20,80 +21,65 @@
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'>
<fontconfig>
<match target="font">
<edit mode="assign" name="antialias">
<bool>true</bool>
</edit>
<edit mode="assign" name="hinting">
<bool>true</bool>
</edit>
<edit mode="assign" name="hintstyle">
<const>hintslight</const>
</edit>
<edit mode="assign" name="rgba">
<const>none</const>
</edit>
<!-- <edit mode="assign" name="embeddedbitmap"><bool>false</bool></edit> -->
</match>
<alias>
<family>sans-serif</family>
<prefer>
<family>Noto Sans</family>
<family>Noto Sans CJK SC</family>
<family>Noto Sans CJK JP</family>
<family>Noto Sans CJK KR</family>
<family>Noto Color Emoji</family>
<family>Symbols Nerd Font</family>
</prefer>
</alias>
<alias>
<family>danmaku</family>
<prefer>
<family>Noto Sans</family>
<family>Noto Sans CJK SC</family>
<family>Noto Sans CJK JP</family>
<family>Noto Sans CJK KR</family>
<family>Symbola</family>
</prefer>
</alias>
<alias>
<family>system-ui</family>
<prefer>
<family>sans-serif</family>
</prefer>
</alias>
<alias>
<family>serif</family>
<prefer>
<family>Noto Serif</family>
<family>Noto Serif CJK SC</family>
<family>Noto Serif CJK JP</family>
<family>Noto Serif CJK KR</family>
<family>Noto Color Emoji</family>
<family>Symbols Nerd Font</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>Maple Mono NF CN</family>
<family>Noto Sans Mono</family>
<family>Noto Sans Mono CJK SC</family>
<family>Noto Sans Mono CJK JP</family>
<family>Noto Sans Mono CJK KR</family>
<family>Noto Color Emoji</family>
<family>Symbols Nerd Font</family>
</prefer>
</alias>
<alias>
<family>標楷體</family>
<prefer>
<family>LXGW WenKai</family>
</prefer>
</alias>
<dir>~/.local/share/fonts</dir>
</fontconfig>
<match target="font">
<edit mode="assign" name="antialias"><bool>true</bool></edit>
<edit mode="assign" name="hinting"><bool>true</bool></edit>
<edit mode="assign" name="hintstyle"><const>hintslight</const></edit>
<edit mode="assign" name="rgba"><const>none</const></edit>
</match>
<!-- For danmuku -->
<match target="pattern">
<test name="family">
<string>Noto Sans CJK SC</string>
</test>
<edit name="family" mode="append">
<string>Symbola</string>
</edit>
</match>
<alias>
<family>sans-serif</family>
<prefer>
<family>Sarasa UI SC</family>
<family>Sarasa UI J</family>
<family>Noto Color Emoji</family>
<family>Symbols Nerd Font</family>
</prefer>
</alias>
<alias>
<family>system-ui</family>
<prefer>
<family>Sarasa UI SC</family>
<family>Sarasa UI J</family>
<family>Noto Color Emoji</family>
<family>Symbols Nerd Font</family>
</prefer>
</alias>
<alias>
<family>serif</family>
<prefer>
<family>Noto Serif</family>
<family>Noto Serif CJK SC</family>
<family>Noto Serif CJK JP</family>
<family>Noto Color Emoji</family>
<family>Symbols Nerd Font</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>Maple Mono NF CN</family>
<family>Sarasa Mono SC</family>
<family>Sarasa Mono J</family>
<family>Noto Color Emoji</family>
<family>Symbols Nerd Font</family>
</prefer>
</alias>
</fontconfig>
```
### Notes
+75
View File
@@ -0,0 +1,75 @@
things I have installed:
full KDE Plasma 6 setup
which can provide:
SDDM theme # Breeze is enough
kcalc/kalc # calculator(s), what's the difference?
kcolorchooser # or hyprpicker
pipewire & friends
...
# hypr*
hyprland
hypridle
hyprlock
hyprshot
hyprpicker
plugin hyprexpo # workspaces overview
plugin hyprorganize # https://github.com/Uyanide/hyprplug
# xdg-desktop-portal*
xdg-desktop-portal
xdg-desktop-portal-hyprland # not working with my Intel iGPU, but fine with NVIDIA dGPU
xdg-desktop-portal-gtk # for file picker
xdg-desktop-portal-gnome # why not?
# terminal emulator(s)
kitty # normal terminal
ghostty # floating terminal, for btop for example
# under surface
swww # wallpaper daemon
mako # notification daemon
gnome-keyring # --password-store=gnome-libsecret
wl-clipboard
cliphist # clipboard history
slurp # region selector
wf-recorder # screen recorder
brightnessctl
playerctl
pamixer
zoxide # better cd
eza # better ls
bat # better cat
# GUI
waybar
eww
wlogout
rofi(-wayland)
mpv
network-manager-applet # nm-applet
blueman # bluetooth GUI & applet
pwvucontrol
gnome-text-editor # or kwrite, notepad replacement
btop # system monitor
activate-linux # :/
polkit-gnome # polkit authentication agent
gradia # screenshots editor
# fonts & themes
maplemono-nf-cn / ttf-maplemono-nf-cn-unhinted (archlinuxcn)
Sour Gummy
ttf-meslo-nerd
ttf-jetbrains-mono-nerd
spicetify # spotify tweaks
spicetify-maketplace # spotify themes
nwg-look # theme of GTK apps
catppuccin-gtk-theme-mocha # theme of GTK apps
kvantum
# utils
bc
jq
python-colorthief
python-watchdog
+1 -1
View File
@@ -60,7 +60,7 @@ font-size=14
如果想让 kmscon 在自动登录的同时启动非登陆 shell (例如 fish),可以将配置改为:
```conf
login=/usr/bin/su -s /usr/local/bin/fish-login-wrapper - kolkas
login=/usr/bin/su - kolkas -s /usr/local/bin/fish-login-wrapper
```
其中 `fish-login-wrapper` 内容为:
+7
View File
@@ -0,0 +1,7 @@
things I have installed:
in addition to everything in `./hyprland-ricing.txt`:
xwayland-satellite
wlsunset
wezterm # replaces ghostty
+64 -86
View File
@@ -7,6 +7,49 @@ grab
| bash -s -- "$0"
exit $?
> [!NOTE]
> The gibberish above is **NOT** meant to be copy-pasted into the terminal. It is a script that updates the [Full list](#full-list) section below, and should be run as:
>
> ```bash
> bash /path/to/dotfiles/memo/packages.md
> ```
## Notes
| | |
| --------- | ---------------------------- |
| alass | Subtitle sync; used in mpv |
| axel | CLI download accelerator |
| figlet | Draw large letters |
| foliate | GTK eBook reader |
| gearlever | AppImage manager |
| gping | Ping with better looking TUI |
| jp2a | JPEG to ASCII |
| nethogs | Network top |
| picard | Music tagger (MusicBrainz) |
| toilet | Better FIGlet |
| wev | Debug wayland events |
| yad | Fork of zenity |
| zenity | Display dialog boxes via cli |
## Some useful commands
Show packages sorted by size, with a preview of their info:
```bash
expac -H M '%m\t%n' \
| sort -hr \
| fzf --delimiter='\t' --with-nth=1,2 --multi \
--preview 'yay -Qi {2}' \
--preview-window='right,70%,wrap'
```
Update the list below:
```bash
bash /path/to/dotfiles/memo/packages.md
```
<!-- update-full-list:start
set -euo pipefail
@@ -51,53 +94,11 @@ echo "Updated Full list in: $script_path"
update-full-list:end -->
> [!NOTE]
> The gibberish above is **NOT** meant to be copy-pasted into the terminal. It is a script that updates the [Full list](#full-list) section below, and should be run as:
>
> ```bash
> bash /path/to/dotfiles/memo/packages.md
> ```
## Notes
| | |
| --------- | ---------------------------- |
| alass | Subtitle sync; used in mpv |
| axel | CLI download accelerator |
| figlet | Draw large letters |
| foliate | GTK eBook reader |
| gearlever | AppImage manager |
| gping | Ping with better looking TUI |
| jp2a | JPEG to ASCII |
| nethogs | Network top |
| picard | Music tagger (MusicBrainz) |
| toilet | Better FIGlet |
| wev | Debug wayland events |
| yad | Fork of zenity |
| zenity | Display dialog boxes via cli |
## Some useful commands
Show packages sorted by size, with a preview of their info:
```bash
expac -H M '%m\t%n' \
| sort -hr \
| fzf --delimiter='\t' --with-nth=1,2 --multi \
--preview 'yay -Qi {2}' \
--preview-window='right,70%,wrap'
```
Update the list below:
```bash
bash /path/to/dotfiles/memo/packages.md
```
## Full list
```
7zip
aarch64-linux-gnu-gcc
alacritty
alass
arch-install-scripts
@@ -105,7 +106,6 @@ archiso
archlinux-contrib
archlinuxcn-keyring
ark
av1an
awww
axel
base
@@ -119,7 +119,7 @@ bluez-tools
bluez-utils
bootconfig
bpf
bpftrace
bridge-utils
brightnessctl
bsd-games
btop
@@ -138,17 +138,13 @@ chafa
chaotic-keyring
chaotic-mirrorlist
chromium
chwd
claude-code
cli11
cloc
cmake
cmatrix-git
composer
compsize
corectrl
cowfortune
cpptrace
cpu-x
cpupower
cuda
@@ -157,15 +153,12 @@ cython
deno
devtools
digital
discord
dnsmasq
docker
docker-buildx
docker-compose
dolphin
dotnet-sdk
doxygen
drawio-desktop
drm-info
dwarfs
ed
@@ -182,16 +175,13 @@ fcitx5
fcitx5-chinese-addons
fcitx5-configtool
fcitx5-gtk
fcitx5-mozc
fcitx5-pinyin-moegirl
fcitx5-pinyin-zhwiki
fcitx5-qt
fd
fdkaac
ffmpeg-full
ffms2
ffnvcodec-headers
ffvship
figlet
filelight
fish
@@ -204,7 +194,6 @@ font-manager
fontforge
foot
frei0r-plugins
fssimu2
fuzzel
fzf
gamemode
@@ -224,7 +213,6 @@ glaze
gnome-keyring
gnome-text-editor
go
gpac
gping
gradia
gradle
@@ -232,11 +220,11 @@ grim
grub
grub-btrfs
gst-plugins-bad
gtkwave
gucharmap
gvfs-smb
gwenview
handbrake
hashclash-cuda-git
helix
hmcl
htop
@@ -255,7 +243,6 @@ intel-gpu-tools
intel-media-sdk
intel-speed-select
intel-ucode
inxi
iperf3
jdk-openjdk
jdk17-openjdk
@@ -287,21 +274,23 @@ lib32-nvidia-utils
lib32-opencl-nvidia
lib32-vulkan-icd-loader
lib32-vulkan-intel
libc++
libdbusmenu-lxqt
libggml-git
libguestfs
libreoffice-still-zh-cn
libspng
libva-intel-driver
libva-nvidia-driver
libva-utils
libvips
libvirt
lightdm
linux-cachyos
linux-cachyos-headers
linux-firmware
linux-lts
linux-lts-headers
linuxqq-nt
llama.cpp-cuda-git
lldb
llama-cpp-git
llmfit-bin
localsend
lolcat
@@ -314,9 +303,8 @@ man-db
man-pages
mangohud
matugen
mesa
meson
mkvtoolnix-cli
mission-center
modprobed-db
moonlight-qt
moreutils
@@ -325,7 +313,7 @@ mpd
mpd-mpris
mpv-full
mpv-mpris
namcap
msedit
nasm
nautilus
nautilus-share
@@ -338,22 +326,21 @@ niri
nmap
nordvpn-bin
noto-fonts-cjk
ntfsprogs-plus
nvidia-container-toolkit
nvidia-open-dkms
nvidia-prime
nvidia-settings
nvidia-utils
nvme-cli
nvtop
nwg-look
oavif-git
obs-studio
obsidian
okular
opam
openbsd-netcat
opencl-headers
opencl-nvidia
openlist-bin
openssh
os-prober
pacman-contrib
@@ -382,7 +369,6 @@ python-chardet
python-colorthief
python-darkdetect
python-fonttools
python-huggingface-hub
python-lxml
python-opencv-cuda
python-pygments
@@ -395,8 +381,6 @@ python-yaml
qbittorrent-enhanced
qdiskinfo
qemu-full
qemu-user-static
qemu-user-static-binfmt
qt5-graphicaleffects
qt5-quickcontrols
qt5-quickcontrols2
@@ -419,19 +403,16 @@ qt6-serialbus
qt6ct
qtcreator
qtrvsim
quickemu
quickshell-git
qutebrowser
rclone
reflector
resources
riscv64-linux-gnu-binutils
riscv64-linux-gnu-gcc
rsync
ruff
rust
rustdesk
rustup
scnlib
scrcpy
sd
seahorse
@@ -452,9 +433,8 @@ stow
sudo
sunshine
sushi
svt-av1-hdr-git
sysbench
systemc2.3.4
systemc
tailscale
tcpdump
telegram-desktop
@@ -488,7 +468,6 @@ tmon
tmux
toilet
tombi
tpm2-tools
trash-cli
tree
ttf-comic-shanns-nerd
@@ -497,8 +476,8 @@ ttf-lxgw-wenkai
ttf-lxgw-wenkai-tc
ttf-maplemono-nf-cn
ttf-meslo-nerd
ttf-ms-fonts
ttf-noto-sans-cjk-vf
ttf-sarasa-gothic
ttf-symbola
tty-clock
turbostat
@@ -507,11 +486,12 @@ unrar
usbip
uv
valgrind
vapoursynth-plugin-vship-cuda-git
ventoy-bin
vesktop-bin
vicinae
vim
virt-install
virt-manager
visual-studio-code-bin
vk-hdr-layer-kwin6-git
vlc
@@ -520,18 +500,17 @@ vulkan-extra-tools
vulkan-gfxstream
vulkan-headers
vulkan-intel
vulkan-mesa-implicit-layers
vulkan-mesa-layers
vulkan-swrast
vulkan-validation-layers
vvenc
wallreel
waybar
waydroid
waydroid-helper
waypaper
wev
wezterm
wf-recorder-git
wf-recorder
wget
whisper.cpp-model-large-v3-turbo
wine
@@ -541,7 +520,6 @@ wl-clipboard
wl-mirror
wlogout
wlsunset
words
wqy-bitmapfont
wqy-microhei
wqy-zenhei
@@ -584,12 +562,12 @@ xpadneo-dkms
xwayland-satellite
yad
yay
yay-debug
yazi
yt-dlp
zellij
zen-browser-bin
zenity
zig
zoxide
zram-generator
zsh
-18
View File
@@ -1,18 +0,0 @@
走 DMA-BUF 零拷贝导入的消费端 (如 OBS 和浏览器录屏), 其渲染 GPU 必须能导入合成器分配的缓冲区. 最省心的方法是让这些应用和 WM 用同一块 GPU 渲染. 跨 GPU 时可能因为无法导入而捕获失败. 另外, wf-recorder 会根据合成器的渲染设备自动决定分配 buffer 的位置且消费端是编码器而不是某张卡上的渲染上下文所以不受影响.
例如, 如果指定
```kdl
debug {
render-drm-device "/dev/dri/renderD128"
}
```
`renderD128` 表示 Intel 显卡, 那么当设置有
```bash
__NV_PRIME_RENDER_OFFLOAD="1"
__GLX_VENDOR_LIBRARY_NAME="nvidia"
```
环境变量时启动 obs 就会无法捕获屏幕.