Showing preview only (291K chars total). Download the full file or copy to clipboard to get everything.
Repository: Speyll/dotfiles
Branch: main
Commit: 45a4914cf020
Files: 160
Total size: 252.3 KB
Directory structure:
gitextract_qfp0rn95/
├── .bashrc
├── .config/
│ ├── DankMaterialShell/
│ │ └── settings.json
│ ├── MangoHud/
│ │ └── MangoHud.conf
│ ├── alacritty/
│ │ ├── alacritty.toml
│ │ └── colors.toml
│ ├── aliasrc
│ ├── autostart/
│ │ ├── autostart
│ │ └── openrgb.desktop
│ ├── flavours/
│ │ ├── config.toml
│ │ ├── schemes/
│ │ │ ├── catppuccin/
│ │ │ │ ├── catppuccin-dark.yaml
│ │ │ │ └── catppuccin-light.yaml
│ │ │ ├── gruvbox/
│ │ │ │ ├── gruvbox-dark-medium.yaml
│ │ │ │ └── gruvbox-light-medium.yaml
│ │ │ └── solarized/
│ │ │ ├── solarized-dark.yaml
│ │ │ └── solarized-light.yaml
│ │ └── templates/
│ │ ├── ags/
│ │ │ └── templates/
│ │ │ ├── config.yaml
│ │ │ └── default.mustache
│ │ ├── alacritty/
│ │ │ └── templates/
│ │ │ ├── config.yaml
│ │ │ ├── default-256.mustache
│ │ │ └── default.mustache
│ │ ├── fnott/
│ │ │ └── templates/
│ │ │ ├── config.yaml
│ │ │ └── default.mustache
│ │ ├── foot/
│ │ │ └── templates/
│ │ │ ├── config.yaml
│ │ │ └── default.mustache
│ │ ├── fuzzel/
│ │ │ └── templates/
│ │ │ ├── config.yaml
│ │ │ └── default.mustache
│ │ ├── gtk-flatcolor/
│ │ │ └── templates/
│ │ │ ├── config.yaml
│ │ │ ├── gtk-2.mustache
│ │ │ └── gtk-3.mustache
│ │ ├── hyprland/
│ │ │ └── templates/
│ │ │ ├── colors.mustache
│ │ │ └── config.yaml
│ │ ├── imv/
│ │ │ └── templates/
│ │ │ ├── config.yaml
│ │ │ └── default.mustache
│ │ ├── labwc/
│ │ │ └── templates/
│ │ │ ├── config.yaml
│ │ │ └── default.mustache
│ │ ├── nvim/
│ │ │ └── templates/
│ │ │ ├── config.yaml
│ │ │ └── default.mustache
│ │ ├── nvim-hardline/
│ │ │ └── templates/
│ │ │ ├── config.yaml
│ │ │ └── default.mustache
│ │ ├── river/
│ │ │ └── templates/
│ │ │ ├── config.yaml
│ │ │ └── default.mustache
│ │ ├── sway/
│ │ │ └── templates/
│ │ │ ├── colors.mustache
│ │ │ └── config.yaml
│ │ ├── swayimg/
│ │ │ └── templates/
│ │ │ ├── config.yaml
│ │ │ └── default.mustache
│ │ ├── tmux/
│ │ │ └── templates/
│ │ │ ├── config.yaml
│ │ │ └── default.mustache
│ │ ├── waybar/
│ │ │ └── templates/
│ │ │ ├── config.yaml
│ │ │ └── default.mustache
│ │ └── wayfire/
│ │ └── templates/
│ │ ├── config.yaml
│ │ └── default.mustache
│ ├── fontconfig/
│ │ └── fonts.conf
│ ├── gtk-2.0/
│ │ ├── gtkfilechooser.ini
│ │ └── gtkrc-2.0
│ ├── gtk-3.0/
│ │ └── settings.ini
│ ├── gtk-4.0/
│ │ └── settings.ini
│ ├── htop/
│ │ └── htoprc
│ ├── mimeapps.list
│ ├── mpv/
│ │ ├── input.conf
│ │ ├── mpv.conf
│ │ ├── script-modules/
│ │ │ └── user-input-module.lua
│ │ └── scripts/
│ │ ├── delete-current-video.lua
│ │ ├── keep-session.lua
│ │ ├── mpv-scut.lua
│ │ ├── mpv-splice.lua
│ │ ├── playlist-shuffle.lua
│ │ ├── save-playlist.lua
│ │ └── user-input.lua
│ ├── nano/
│ │ └── nanorc
│ ├── niri/
│ │ ├── config.kdl
│ │ ├── dms.kdl
│ │ ├── keybinds.kdl
│ │ ├── layout.kdl
│ │ ├── outputs.kdl
│ │ ├── rules.kdl
│ │ └── scripts/
│ │ ├── obs-replay
│ │ └── waybar
│ ├── nvim/
│ │ ├── init.lua
│ │ └── lua/
│ │ └── speyll/
│ │ ├── commands.lua
│ │ ├── lazy.lua
│ │ ├── plugins/
│ │ │ ├── autopairs.lua
│ │ │ ├── cmp.lua
│ │ │ ├── colorscheme.lua
│ │ │ ├── nvim-hardline.lua
│ │ │ ├── nvim-highlight-colors.lua
│ │ │ ├── telescope.lua
│ │ │ ├── treesitter.lua
│ │ │ └── undotree.lua
│ │ ├── remap.lua
│ │ └── settings.lua
│ ├── pcmanfm-qt/
│ │ └── default/
│ │ ├── recent-files.conf
│ │ └── settings.conf
│ ├── pipewire/
│ │ ├── pipewire-pulse.conf.d/
│ │ │ └── switch-on-connect.conf
│ │ └── pipewire.conf
│ ├── qt5ct/
│ │ └── qt5ct.conf
│ ├── qt6ct/
│ │ ├── qt6ct.conf
│ │ └── style-colors.conf
│ ├── swayimg/
│ │ ├── config
│ │ └── set-wall
│ ├── tmux/
│ │ └── tmux.conf
│ ├── user-dirs.dirs
│ ├── user-dirs.locale
│ ├── wireplumber/
│ │ └── wireplumber.conf.d/
│ │ └── 51-disable-suspension.conf
│ ├── xdg-desktop-portal/
│ │ ├── kde-portals.conf
│ │ ├── niri-portals.conf
│ │ └── portals.conf
│ └── xsettingsd/
│ └── xsettingsd.conf
├── .inputrc
├── .local/
│ ├── bin/
│ │ ├── archive
│ │ ├── aria2-grabber
│ │ ├── aria2-lynx-downloader
│ │ ├── bemoji
│ │ ├── clip-manager
│ │ ├── dircomp
│ │ ├── exefind
│ │ ├── ff-concat
│ │ ├── ff-crop
│ │ ├── ff-diff
│ │ ├── ff-enc
│ │ ├── font-char-list
│ │ ├── font-unicode
│ │ ├── fuzz-launcher
│ │ ├── get-steamid
│ │ ├── git-ops
│ │ ├── grim-print
│ │ ├── img-dupes
│ │ ├── img-duprestore
│ │ ├── img-enc
│ │ ├── imv-mass
│ │ ├── mass-mpv
│ │ ├── mem
│ │ ├── mvToParent
│ │ ├── net-menu
│ │ ├── reload-wall
│ │ ├── spefetch
│ │ ├── start-comp
│ │ ├── updtscan
│ │ ├── usb-mnt
│ │ ├── vertsearch-lf
│ │ └── yt-search
│ └── share/
│ ├── applications/
│ │ ├── browser.desktop
│ │ ├── file.desktop
│ │ ├── img.desktop
│ │ ├── text.desktop
│ │ └── video.desktop
│ ├── fonts/
│ │ └── git-fonts.sh
│ ├── icons/
│ │ └── git-cursors.sh
│ └── themes/
│ └── Base16/
│ └── openbox-3/
│ ├── bullet.xbm
│ ├── close.xbm
│ ├── desk.xbm
│ ├── desk_toggled.xbm
│ ├── iconify.xbm
│ ├── max.xbm
│ ├── max_disabled.xbm
│ ├── max_toggled.xbm
│ ├── menu.xbm
│ ├── shade.xbm
│ └── themerc
├── .profile
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .bashrc
================================================
# ~/.bashrc: executed by bash(1) for non-login shells.
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
# History settings
export HISTCONTROL=ignoreboth:erasedups
export HISTIGNORE="ls:cd:exit:history*"
export HISTSIZE=1000
export HISTFILESIZE=2000
shopt -s histappend
# Check window size after each command
shopt -s checkwinsize
# Git branch function
git_branch() {
local branch
branch=$(git branch --show-current 2>/dev/null)
if [[ -n "$branch" ]]; then
# Purple color for git branch
echo -e "\[\e[35m\]$branch\[\e[0m\] "
fi
}
# Color prompt setup
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
set_prompt() {
local branch=$(git_branch)
local title="\[\e]0;\u@\h: \w\a\]"
PS1="${title}[\[\e[32m\]\A\[\e[0m\]][\[\e[34m\]\h\[\e[0m\]][${branch}\[\e[33m\]\w\[\e[0m\]]\$ "
}
prompt_command() {
history -a # Append current session history to file
history -n # Read new history entries from file
cleanup-history # Clean up the history file
set_prompt # Set the prompt dynamically
}
PROMPT_COMMAND=prompt_command
else
PS1='[\A][\h][\w]\$ '
fi
# Enable programmable completion
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
# Load aliases
[[ -f ~/.config/aliasrc ]] && . ~/.config/aliasrc
# Proper FZF integration
if [[ -f /usr/share/doc/fzf/examples/key-bindings.bash ]]; then
source /usr/share/doc/fzf/examples/key-bindings.bash
elif [[ -f ~/.fzf.bash ]]; then
source ~/.fzf.bash
elif [[ -f /usr/share/fzf/key-bindings.bash ]]; then
source /usr/share/fzf/key-bindings.bash
fi
# Keep bash history clean
cleanup-history() {
local histfile="$HOME/.bash_history"
[[ -r "$histfile" ]] || return
awk '
{
cleaned = $0
gsub(/[[:space:]]*$/, "", cleaned)
if (cleaned != "") {
last[cleaned] = NR
line[NR] = cleaned
}
}
END {
for (i = 1; i <= NR; i++) {
if (i in line && last[line[i]] == i) {
print line[i]
}
}
}
' "$histfile" > "${histfile}.tmp"
if [[ -s "${histfile}.tmp" ]]; then
command mv -f "${histfile}.tmp" "$histfile" >/dev/null 2>&1
else
rm -f "${histfile}.tmp" >/dev/null 2>&1
fi
history -c
history -r
}
# Enhanced history search (CTRL-R)
__fzf_history__() {
history -a
history -c
history -r
local line
line=$(history | fzf --height 100% --tac --tiebreak=index --no-sort --exact \
--bind 'ctrl-d:page-down,ctrl-u:page-up' | sed 's/^ *[0-9]* *//')
if [[ -n "$line" ]]; then
READLINE_LINE=$line
READLINE_POINT=${#line}
fi
}
# Bind CTRL-R to the history search function in interactive shells
if [[ $- == *i* ]]; then
bind -x '"\C-r": __fzf_history__'
fi
# FZF preview with bat if available, otherwise cat
if command -v bat >/dev/null 2>&1; then
export FZF_CTRL_T_OPTS="--preview 'bat --color=always --line-range :500 {}'"
else
export FZF_CTRL_T_OPTS="--preview 'cat {}'"
fi
================================================
FILE: .config/DankMaterialShell/settings.json
================================================
{
"currentThemeName": "blue",
"customThemeFile": "",
"matugenScheme": "scheme-tonal-spot",
"runUserMatugenTemplates": true,
"matugenTargetMonitor": "",
"popupTransparency": 1,
"dockTransparency": 0.5,
"widgetBackgroundColor": "sch",
"widgetColorMode": "default",
"cornerRadius": 5,
"use24HourClock": true,
"showSeconds": false,
"useFahrenheit": false,
"nightModeEnabled": false,
"animationSpeed": 1,
"customAnimationDuration": 500,
"wallpaperFillMode": "Fill",
"blurredWallpaperLayer": false,
"blurWallpaperOnOverview": false,
"showLauncherButton": true,
"showWorkspaceSwitcher": true,
"showFocusedWindow": true,
"showWeather": true,
"showMusic": true,
"showClipboard": true,
"showCpuUsage": true,
"showMemUsage": true,
"showCpuTemp": true,
"showGpuTemp": true,
"selectedGpuIndex": 0,
"enabledGpuPciIds": [],
"showSystemTray": true,
"showClock": true,
"showNotificationButton": true,
"showBattery": true,
"showControlCenterButton": true,
"showCapsLockIndicator": true,
"controlCenterShowNetworkIcon": true,
"controlCenterShowBluetoothIcon": true,
"controlCenterShowAudioIcon": true,
"controlCenterShowVpnIcon": true,
"controlCenterShowBrightnessIcon": false,
"controlCenterShowMicIcon": false,
"controlCenterShowBatteryIcon": false,
"controlCenterShowPrinterIcon": false,
"showPrivacyButton": true,
"privacyShowMicIcon": false,
"privacyShowCameraIcon": false,
"privacyShowScreenShareIcon": false,
"controlCenterWidgets": [
{
"id": "volumeSlider",
"enabled": true,
"width": 50
},
{
"id": "brightnessSlider",
"enabled": true,
"width": 50
},
{
"id": "wifi",
"enabled": true,
"width": 50
},
{
"id": "bluetooth",
"enabled": true,
"width": 50
},
{
"id": "audioOutput",
"enabled": true,
"width": 50
},
{
"id": "audioInput",
"enabled": true,
"width": 50
},
{
"id": "builtin_vpn",
"enabled": true,
"width": 50
},
{
"id": "doNotDisturb",
"enabled": true,
"width": 50
},
{
"id": "nightMode",
"enabled": true,
"width": 50
},
{
"id": "darkMode",
"enabled": true,
"width": 50
}
],
"showWorkspaceIndex": false,
"showWorkspacePadding": false,
"workspaceScrolling": false,
"showWorkspaceApps": false,
"maxWorkspaceIcons": 3,
"workspacesPerMonitor": true,
"showOccupiedWorkspacesOnly": false,
"dwlShowAllTags": false,
"workspaceNameIcons": {},
"waveProgressEnabled": true,
"scrollTitleEnabled": true,
"clockCompactMode": true,
"focusedWindowCompactMode": true,
"runningAppsCompactMode": true,
"keyboardLayoutNameCompactMode": true,
"runningAppsCurrentWorkspace": false,
"runningAppsGroupByApp": false,
"centeringMode": "index",
"clockDateFormat": "",
"lockDateFormat": "",
"mediaSize": 0,
"appLauncherViewMode": "list",
"spotlightModalViewMode": "list",
"sortAppsAlphabetically": false,
"appLauncherGridColumns": 4,
"spotlightCloseNiriOverview": true,
"niriOverviewOverlayEnabled": true,
"weatherLocation": "New York, NY",
"weatherCoordinates": "40.7128,-74.0060",
"useAutoLocation": true,
"weatherEnabled": true,
"networkPreference": "wifi",
"vpnLastConnected": "400fa537-b18c-4a96-b670-3f3713232299",
"iconTheme": "breeze",
"launcherLogoMode": "apps",
"launcherLogoCustomPath": "",
"launcherLogoColorOverride": "surface",
"launcherLogoColorInvertOnMode": false,
"launcherLogoBrightness": 0.5,
"launcherLogoContrast": 1,
"launcherLogoSizeOffset": 0,
"fontFamily": "Inter Variable",
"monoFontFamily": "Monospace",
"fontWeight": 400,
"fontScale": 1,
"notepadUseMonospace": true,
"notepadFontFamily": "",
"notepadFontSize": 14,
"notepadShowLineNumbers": false,
"notepadTransparencyOverride": -1,
"notepadLastCustomTransparency": 0.7,
"soundsEnabled": true,
"useSystemSoundTheme": false,
"soundNewNotification": true,
"soundVolumeChanged": true,
"soundPluggedIn": true,
"acMonitorTimeout": 0,
"acLockTimeout": 0,
"acSuspendTimeout": 0,
"acSuspendBehavior": 0,
"acProfileName": "",
"batteryMonitorTimeout": 0,
"batteryLockTimeout": 0,
"batterySuspendTimeout": 0,
"batterySuspendBehavior": 0,
"batteryProfileName": "",
"lockBeforeSuspend": false,
"loginctlLockIntegration": true,
"fadeToLockEnabled": false,
"fadeToLockGracePeriod": 5,
"launchPrefix": "",
"brightnessDevicePins": {},
"wifiNetworkPins": {
"preferredWifi": "Void"
},
"bluetoothDevicePins": {},
"audioInputDevicePins": {},
"audioOutputDevicePins": {},
"gtkThemingEnabled": false,
"qtThemingEnabled": false,
"syncModeWithPortal": true,
"terminalsAlwaysDark": false,
"showDock": false,
"dockAutoHide": false,
"dockGroupByApp": true,
"dockOpenOnOverview": false,
"dockPosition": 1,
"dockSpacing": 4,
"dockBottomGap": -13,
"dockMargin": 0,
"dockIconSize": 34,
"dockIndicatorStyle": "circle",
"dockBorderEnabled": false,
"dockBorderColor": "surfaceText",
"dockBorderOpacity": 1,
"dockBorderThickness": 1,
"notificationOverlayEnabled": false,
"modalDarkenBackground": true,
"lockScreenShowPowerActions": true,
"enableFprint": false,
"maxFprintTries": 3,
"lockScreenActiveMonitor": "all",
"lockScreenInactiveColor": "#000000",
"hideBrightnessSlider": false,
"notificationTimeoutLow": 5000,
"notificationTimeoutNormal": 5000,
"notificationTimeoutCritical": 0,
"notificationPopupPosition": 0,
"osdAlwaysShowValue": false,
"osdPosition": 5,
"osdVolumeEnabled": true,
"osdMediaVolumeEnabled": true,
"osdBrightnessEnabled": true,
"osdIdleInhibitorEnabled": true,
"osdMicMuteEnabled": true,
"osdCapsLockEnabled": true,
"osdPowerProfileEnabled": true,
"osdAudioOutputEnabled": true,
"powerActionConfirm": true,
"powerActionHoldDuration": 0.5,
"powerMenuActions": [
"reboot",
"logout",
"poweroff",
"lock",
"suspend",
"restart"
],
"powerMenuDefaultAction": "logout",
"powerMenuGridLayout": false,
"customPowerActionLock": "",
"customPowerActionLogout": "",
"customPowerActionSuspend": "",
"customPowerActionHibernate": "",
"customPowerActionReboot": "",
"customPowerActionPowerOff": "",
"updaterUseCustomCommand": false,
"updaterCustomCommand": "",
"updaterTerminalAdditionalParams": "",
"displayNameMode": "model",
"screenPreferences": {
"dock": []
},
"showOnLastDisplay": {
"dock": false
},
"barConfigs": [
{
"id": "default",
"name": "Main Bar",
"enabled": true,
"position": 2,
"screenPreferences": [
{
"name": "DP-2",
"model": "24G4"
}
],
"showOnLastDisplay": true,
"leftWidgets": [
"launcherButton",
"workspaceSwitcher",
{
"id": "runningApps",
"enabled": true
}
],
"centerWidgets": [],
"rightWidgets": [
{
"id": "systemTray",
"enabled": true
},
{
"id": "clipboard",
"enabled": true
},
{
"id": "notificationButton",
"enabled": true
},
{
"id": "weather",
"enabled": true
},
{
"id": "controlCenterButton",
"enabled": true
},
{
"id": "clock",
"enabled": true
},
{
"id": "spacer",
"enabled": true,
"size": 5
}
],
"spacing": 5,
"innerPadding": 0,
"bottomGap": 0,
"transparency": 1,
"widgetTransparency": 1,
"squareCorners": false,
"noBackground": false,
"gothCornersEnabled": false,
"gothCornerRadiusOverride": false,
"gothCornerRadiusValue": 12,
"borderEnabled": false,
"borderColor": "surfaceText",
"borderOpacity": 1,
"borderThickness": 1,
"fontScale": 1,
"autoHide": false,
"autoHideDelay": 250,
"openOnOverview": false,
"visible": true,
"popupGapsAuto": true,
"popupGapsManual": 4,
"maximizeDetection": false,
"widgetOutlineEnabled": false,
"widgetOutlineColor": "primary"
},
{
"id": "bar1765687519252",
"name": "Bar 2",
"enabled": true,
"position": 0,
"screenPreferences": [
{
"name": "HDMI-A-1",
"model": "LG FULL HD"
}
],
"showOnLastDisplay": false,
"leftWidgets": [
"launcherButton",
"workspaceSwitcher",
{
"id": "runningApps",
"enabled": true
}
],
"centerWidgets": [],
"rightWidgets": [
{
"id": "systemTray",
"enabled": true
},
{
"id": "clipboard",
"enabled": true
},
{
"id": "notificationButton",
"enabled": true
},
{
"id": "weather",
"enabled": true
},
{
"id": "controlCenterButton",
"enabled": true
},
{
"id": "clock",
"enabled": true
},
{
"id": "spacer",
"enabled": true,
"size": 5
}
],
"spacing": 5,
"innerPadding": 0,
"bottomGap": 0,
"transparency": 1,
"widgetTransparency": 1,
"squareCorners": false,
"noBackground": false,
"gothCornersEnabled": false,
"gothCornerRadiusOverride": false,
"gothCornerRadiusValue": 12,
"borderEnabled": false,
"borderColor": "surfaceText",
"borderOpacity": 1,
"borderThickness": 1,
"widgetOutlineEnabled": false,
"widgetOutlineColor": "primary",
"widgetOutlineOpacity": 1,
"widgetOutlineThickness": 1,
"fontScale": 1,
"autoHide": false,
"autoHideDelay": 250,
"openOnOverview": false,
"visible": true,
"popupGapsAuto": true,
"popupGapsManual": 4,
"maximizeDetection": false
}
],
"configVersion": 2
}
================================================
FILE: .config/MangoHud/MangoHud.conf
================================================
################### File Generated by Goverlay ###################
legacy_layout=false
horizontal
horizontal_stretch=0
background_alpha=0.3
round_corners=10
background_alpha=0.3
background_color=000000
font_size=24
font_size_text=24
text_color=FFFFFF
position=top-left
hud_compact
hud_no_margin
pci_dev=0:2d:00.0
table_columns=2
gpu_text=GPU
gpu_stats
gpu_load_change
gpu_load_value=50,90
gpu_load_color=FFFFFF,FFAA7F,CC0000
gpu_temp
gpu_mem_temp
gpu_color=2E9762
cpu_text=CPU
cpu_stats
cpu_load_change
cpu_load_value=50,90
cpu_load_color=FFFFFF,FFAA7F,CC0000
cpu_temp
cpu_color=2E97CB
vram
vram_color=AD64C1
vram_color=AD64C1
ram
ram_color=C26693
fps
frame_timing
frametime_color=00FF00
fps_limit_method=early
show_fps_limit
fps_limit=119,59,48,30
fsr
fps_color_change
fps_color=B22222,FDFD09,39F900
fps_value=60,120
#offset=-1
vsync=0
gl_vsync=-1
time#
output_folder=$HOME/.cache
log_duration=30
autostart_log=0
log_interval=100
blacklist=protonplus,lsfg-vk-ui,bazzar,gnome-calculator,pamac-manager,lact,ghb,bitwig-studio,ptyxis,yumex
toggle_logging=Shift_L+F2
================================================
FILE: .config/alacritty/alacritty.toml
================================================
[general]
import = [ "~/.config/alacritty/colors.toml" ]
[window]
opacity = 0.96
padding.x = 24
padding.y = 24
[font]
normal = { family = "monospace", style = "Regular" }
size = 12.0
[cursor]
style = { shape = "Block", blinking = "On" }
================================================
FILE: .config/alacritty/colors.toml
================================================
# Base16 Gruvbox dark, medium - alacritty color config
# Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/morhetz/gruvbox)
[colors]
draw_bold_text_with_bright_colors = false
# Default colors
[colors.primary]
background = '0x282828'
foreground = '0xd5c4a1'
# Colors the cursor will use if `custom_cursor_colors` is true
[colors.cursor]
text = '0x282828'
cursor = '0xd5c4a1'
# Normal colors
[colors.normal]
black = '0x282828'
red = '0xfb4934'
green = '0xb8bb26'
yellow = '0xfabd2f'
blue = '0x83a598'
magenta = '0xd3869b'
cyan = '0x8ec07c'
white = '0xd5c4a1'
# Bright colors
[colors.bright]
black = '0x665c54'
red = '0xfe8019'
green = '0x3c3836'
yellow = '0x504945'
blue = '0xbdae93'
magenta = '0xebdbb2'
cyan = '0xd65d0e'
white = '0xfbf1c7'
================================================
FILE: .config/aliasrc
================================================
#!/bin/sh
# Colorized commands
alias \
ls="ls -shA --color=auto" \
dir="dir --color=auto" \
vdir="vdir --color=auto" \
grep="grep --color=auto" \
fgrep="fgrep --color=auto" \
egrep="egrep --color=auto" \
diff="diff --color=auto" \
ccat="highlight --out-format=ansi" \
dfg="df -BG" \
dfm="df -BM" \
ip="ip --color=auto"
# LS aliases with preserved color flags
alias \
ll="ls -l --color=auto" \
la="ls -A --color=auto" \
llt="ls -latrG --color=auto"
# Package management
alias \
xbs="sudo xbps-install" \
xbr="sudo xbps-remove -Rv" \
xbq="xbps-query -Rs" \
pac="sudo pacman" \
prm="sudo pacman -Rns" \
pror="sudo pacman -Rns $(pacman -Qtdq)" \
apti="sudo apt-get install --no-install-recommends" \
aptr="sudo apt-get --purge autoremove" \
zyi="sudo zypper install --no-recommends" \
zyr="sudo zypper remove --clean-deps --no-confirm" \
flinst="flatpak install" \
flrem="flatpak uninstall --delete-data" \
flclean="flatpak uninstall --unused --delete-data -y && flatpak repair"
# Network aliases
alias \
rsync="rsync -avh --progress" \
rsync-ssh="rsync -avzh --progress -e ssh" \
rsync-net="rsync -avzh --progress" \
nfs-mount="sudo mount -t nfs -o hard,tcp,rsize=32768,wsize=32768,actimeo=30" \
ssh-mount="sshfs -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,sshfs_sync"
# Safe file operations
alias \
cp="cp -iv" \
mv="mv -iv" \
rm="rm -vI" \
mkd="mkdir -pv" \
clear="tput clear" \
reset="tput reset"
# System utilities
alias \
pyserv="python3 -m http.server" \
pyenv="python -m venv" \
cleanup-gamescope='pkill -9 -f "wine|wineserver|winedevice.exe|explorer.exe|gamescope-wl"' \
reset="tput reset"
# Version control
alias gcl='git clone --depth 1'
# Use neovim if available
command -v nvim >/dev/null && alias vim="nvim" vimdiff="nvim -d"
# XDG-compliant tmux configuration
alias tmux="tmux -f ${XDG_CONFIG_HOME:-$HOME/.config}/tmux/tmux.conf"
================================================
FILE: .config/autostart/autostart
================================================
#!/bin/sh
LOG="/tmp/autostart.log"
# Config
AUDIO=false
MODE="swaybg-random-online" # swaybg, swaybg-random, mpvpaper-local, mpvpaper-online, swaybg-random-online, wallhaven, none
THEME_MODE="none" # auto, fixed, none
THEME_NAME="gruvbox-dark-medium"
CURSOR="Kaela-Kovalskia-v2"
WAYBAR_STYLE="none" # stacking, tiling, none
UPDATE_SCAN=true
# Defaults local
DWALL="$HOME/pictures/walls/wall.jpg"
DVWALL="$HOME/pictures/walls/vert-wall.jpg"
# Pastebin URLs
P_WALL="https://pastebin.com/raw/7YwMgZXg"
P_VWALL="https://pastebin.com/raw/Q8GUUAse"
P_VID="https://pastebin.com/raw/yHFpxMDB"
P_VVID="https://pastebin.com/raw/NTVA8RMd"
# Wait for Wayland compositor to be ready (max 10s)
timeout=20
while { [ -z "$WAYLAND_DISPLAY" ] || [ ! -S "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" ]; } && [ "$timeout" -gt 0 ]; do
sleep 0.5
timeout=$((timeout - 1))
done
# --- Env setup ---
dbus-update-activation-environment --all >>"$LOG" 2>&1 &
#/usr/libexec/polkit-gnome-authentication-agent-1 >>"$LOG" 2>&1 &
/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 >>"$LOG" 2>&1 &
# --- Monitor layout ---
#wlr-randr --output DP-2 --on --mode 1920x1080@120 --pos 0,0 --transform normal --scale 1 --adaptive-sync enabled >>"$LOG" 2>&1
#wlr-randr --output HDMI-A-1 --on --mode 1920x1080@60 --pos -1080,-840 --transform 270 --scale 1 --adaptive-sync enabled >>"$LOG" 2>&1 &
# --- Process Management ---
for p in flavours mpvpaper swaybg fnott wlsunset cliphist; do
pkill -x "$p" >>"$LOG" 2>&1 || :
done
# --- Audio ---
if [ "$AUDIO" = true ]; then
for p in pipewire wireplumber pipewire-pulse; do pkill -x "$p" >>"$LOG" 2>&1 || :; done
pipewire >>"$LOG" 2>&1 &
sleep 1
wireplumber >>"$LOG" 2>&1 &
pipewire-pulse >>"$LOG" 2>&1 &
fi
# --- OpenRGB ---
if command -v openrgb >/dev/null 2>&1; then
openrgb --server -p pureWhite >>"$LOG" 2>&1 &
else
echo "OpenRGB not found" >>"$LOG"
fi
# --- Helpers ---
get_orient() {
wlr-randr | awk '
/^[A-Za-z0-9-]+/ { o = $1 }
/Transform:/ {
t = $2
if (t ~ /90|270/)
print o ":portrait"
else
print o ":landscape"
}
'
}
fetch_url() {
curl -fsSL "$1" | shuf -n1 | tr -d '\r\n' | xargs
}
download_wallhaven() {
r=$1
out=$2
fb=$3
res=$4
pg=$(shuf -i1-5 -n1)
json=$(curl -sf "https://wallhaven.cc/api/v1/search?categories=110&purity=100&sorting=toplist&topRange=1y&ratios=$r&atleast=$res&page=$pg&per_page=24") || {
echo "Wallhaven fail $r" >>"$LOG"
cp "$fb" "$out"
return
}
cnt=$(echo "$json" | jq '.data|length')
if [ "$cnt" -eq 0 ]; then
cp "$fb" "$out"
return
fi
idx=$(shuf -i0-$((cnt - 1)) -n1)
url=$(echo "$json" | jq -r ".data[$idx].path")
curl -sfL "$url" -o "$out" || cp "$fb" "$out"
}
apply_swaybg() {
w=$1
vw=$2
while IFS=: read -r o or; do
if [ "$or" = "portrait" ]; then
swaybg -o "$o" -i "$vw" -m fill >>"$LOG" 2>&1 &
else
swaybg -o "$o" -i "$w" -m fill >>"$LOG" 2>&1 &
fi
done <<EOF
$(get_orient)
EOF
}
apply_mpvpaper() {
for entry in $(get_orient); do
o=${entry%%:*}
or=${entry##*:}
if [ "$MODE" = "mpvpaper-local" ]; then
v=$(find "$HOME/pictures/walls/" -type f -name "*.mp4" | shuf -n1)
if [ -z "$v" ]; then
echo "No local vid found" >>"$LOG"
continue
fi
mpvpaper -vsp -o "no-audio pause=no --loop --ytdl-format='bestvideo[height<=1080]+bestaudio/best'" "$o" "$v" >>"$LOG" 2>&1 &
else
if [ "$or" = "portrait" ]; then
u=$(fetch_url "$P_VVID")
else
u=$(fetch_url "$P_VID")
fi
mpvpaper -vsp -o "no-audio pause=no --loop --ytdl-format='bestvideo[height<=1080]+bestaudio/best'" "$o" "$u" >>"$LOG" 2>&1 &
fi
done
}
configure_theme() {
case "$THEME_MODE" in
auto)
if [ -f /tmp/wall.jpg ]; then
flavours generate dark /tmp/wall.jpg >>"$LOG" 2>&1
flavours apply generated >>"$LOG" 2>&1 &
fi
;;
fixed)
flavours apply "$THEME_NAME" >>"$LOG" 2>&1 &
;;
none)
;;
esac
}
configure_waybar() {
case "$WAYBAR_STYLE" in
stacking)
pkill -x waybar >>"$LOG" 2>&1 || :
waybar -c "$HOME/.config/waybar/stacking-config" -s "$HOME/.config/waybar/style.css" >>"$LOG" 2>&1 &
;;
tiling)
pkill -x waybar >>"$LOG" 2>&1 || :
waybar -c "$HOME/.config/waybar/tiling-config" -s "$HOME/.config/waybar/style.css" >>"$LOG" 2>&1 &
;;
none)
;;
esac
}
# --- Main ---
case "$MODE" in
swaybg-random-online)
w=$(fetch_url "$P_WALL")
curl -fsSL "$w" -o /tmp/wall.jpg || cp "$DWALL" /tmp/wall.jpg
vw=$(fetch_url "$P_VWALL")
curl -fsSL "$vw" -o /tmp/vert_wall.jpg || cp "$DVWALL" /tmp/vert_wall.jpg
apply_swaybg /tmp/wall.jpg /tmp/vert_wall.jpg
;;
swaybg-random)
w=$(find "$HOME/pictures/walls/"*.jpg -type f | shuf -n1)
[ -z "$w" ] && w="$DWALL"
vw=$(find "$HOME/pictures/walls/"vert-*.jpg -type f | shuf -n1)
[ -z "$vw" ] && vw="$DVWALL"
apply_swaybg "$w" "$vw"
;;
swaybg)
apply_swaybg "$DWALL" "$DVWALL"
;;
mpvpaper-local|mpvpaper-online)
apply_mpvpaper
;;
wallhaven)
download_wallhaven "16x9" /tmp/wall.jpg "$DWALL" "1920x1080"
download_wallhaven "9x16" /tmp/vert_wall.jpg "$DVWALL" "1080x1920"
apply_swaybg /tmp/wall.jpg /tmp/vert_wall.jpg
;;
none)
;;
*)
echo "Unknown MODE: $MODE" >>"$LOG"
;;
esac
configure_theme
configure_waybar
# --- Cursor ---
gsettings set org.gnome.desktop.interface cursor-theme "$CURSOR" >>"$LOG" 2>&1 &
seat seat0 xcursor_theme "$CURSOR" >>"$LOG" 2>&1 &
# --- Extras ---
#fnott >>"$LOG" 2>&1 &
wlsunset -l 36.7 -L 3.08 >>"$LOG" 2>&1 &
wl-paste --watch cliphist store -max-items 100 >>"$LOG" 2>&1 &
gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark' &
# --- Updates ---
if [ "$UPDATE_SCAN" = true ]; then
sleep 2
"$HOME/.local/bin/updtscan" >>"$LOG" 2>&1 &
fi
================================================
FILE: .config/autostart/openrgb.desktop
================================================
[Desktop Entry]
Type=Application
Exec=bash -c 'if command -v openrgb >/dev/null 2>&1; then openrgb --server -p pureWhite >>"$HOME/openrgb.log" 2>&1 & else echo "OpenRGB is not installed, skipping RGB startup." >>"$HOME/openrgb.log"; fi'
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=OpenRGB Autostart
Comment=Start OpenRGB server with pureWhite profile at login
================================================
FILE: .config/flavours/config.toml
================================================
shell = "bash -c '{}'"
[[item]]
file = "~/.config/waybar/colors.css"
template = "waybar"
hook = "pkill -SIGRTMIN+7 waybar"
rewrite = true
[[item]]
file = "~/.config/foot/colors.ini"
template = "foot"
hook = "footclient -e 'source ~/.config/foot/colors.ini'"
rewrite = true
[[item]]
file = "~/.config/alacritty/colors.toml"
template = "alacritty"
rewrite = true
[[items]]
file = "~/.config/fuzzel/colors.ini"
template = "fuzzel"
rewrite = true
[[items]]
file = "/home/lyes/.local/share/themes/Base16/openbox-3/themerc"
template = "labwc"
hook = "labwc -r"
start= "!! Start flavours"
end = "!! End flavours"
[[items]]
file = "/home/lyes/.config/nvim/lua/speyll/plugins/colorscheme.lua"
template = "nvim"
hook = "nvim --server /tmp/nvim-server --remote-send ':source ~/.config/nvim/lua/speyll/plugins/colorscheme.lua<CR>:lua require(\"base16-colorscheme\").setup()<CR>'"
start= "-- Start flavours"
end = "-- End flavours"
[[items]]
file = "/home/lyes/.config/nvim/lua/speyll/plugins/nvim-hardline.lua"
template = "nvim-hardline"
start= "-- Start flavours"
end = "-- End flavours"
[[items]]
file = "~/.config/imv/config"
template = "imv"
[[items]]
file = "~/.config/fnott/fnott.ini"
template = "fnott"
[[item]]
file = "~/.config/swayimg/config"
template = "swayimg"
[[item]]
file = "~/.config/sway/config.d/colors"
template = "sway"
subtemplate = "colors"
rewrite = true
light = false
hook = "swaymsg reload"
[[items]]
file = "~/.config/hypr/colors.conf"
template = "hyprland"
subtemplate = "colors"
rewrite = true
hook = "hyprctl reload"
[[item]]
file = "~/.config/river/init"
template = "river"
[[item]]
file = "~/.config/wayfire.ini"
template = "wayfire"
================================================
FILE: .config/flavours/schemes/catppuccin/catppuccin-dark.yaml
================================================
scheme: "Catppuccin Mocha"
author: "https://github.com/catppuccin/catppuccin"
base00: "1e1e2e" # base
base01: "181825" # mantle
base02: "313244" # surface0
base03: "45475a" # surface1
base04: "585b70" # surface2
base05: "cdd6f4" # text
base06: "f5e0dc" # rosewater
base07: "b4befe" # lavender
base08: "f38ba8" # red
base09: "fab387" # peach
base0A: "f9e2af" # yellow
base0B: "a6e3a1" # green
base0C: "94e2d5" # teal
base0D: "89b4fa" # blue
base0E: "cba6f7" # mauve
base0F: "f2cdcd" # flamingo
================================================
FILE: .config/flavours/schemes/catppuccin/catppuccin-light.yaml
================================================
scheme: "Catppuccin Latte"
author: "https://github.com/catppuccin/catppuccin"
base00: "eff1f5" # base
base01: "e6e9ef" # mantle
base02: "ccd0da" # surface0
base03: "bcc0cc" # surface1
base04: "acb0be" # surface2
base05: "4c4f69" # text
base06: "dc8a78" # rosewater
base07: "7287fd" # lavender
base08: "d20f39" # red
base09: "fe640b" # peach
base0A: "df8e1d" # yellow
base0B: "40a02b" # green
base0C: "179299" # teal
base0D: "1e66f5" # blue
base0E: "8839ef" # mauve
base0F: "dd7878" # flamingo
================================================
FILE: .config/flavours/schemes/gruvbox/gruvbox-dark-medium.yaml
================================================
scheme: "Gruvbox dark, medium"
author: "Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/morhetz/gruvbox)"
base00: "282828" # ----
base01: "3c3836" # ---
base02: "504945" # --
base03: "665c54" # -
base04: "bdae93" # +
base05: "d5c4a1" # ++
base06: "ebdbb2" # +++
base07: "fbf1c7" # ++++
base08: "fb4934" # red
base09: "fe8019" # orange
base0A: "fabd2f" # yellow
base0B: "b8bb26" # green
base0C: "8ec07c" # aqua/cyan
base0D: "83a598" # blue
base0E: "d3869b" # purple
base0F: "d65d0e" # brown
================================================
FILE: .config/flavours/schemes/gruvbox/gruvbox-light-medium.yaml
================================================
scheme: "Gruvbox light, medium"
author: "Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/morhetz/gruvbox)"
base00: "fbf1c7" # ----
base01: "ebdbb2" # ---
base02: "d5c4a1" # --
base03: "bdae93" # -
base04: "665c54" # +
base05: "504945" # ++
base06: "3c3836" # +++
base07: "282828" # ++++
base08: "9d0006" # red
base09: "af3a03" # orange
base0A: "b57614" # yellow
base0B: "79740e" # green
base0C: "427b58" # aqua/cyan
base0D: "076678" # blue
base0E: "8f3f71" # purple
base0F: "d65d0e" # brown
================================================
FILE: .config/flavours/schemes/solarized/solarized-dark.yaml
================================================
scheme: "Solarized Dark"
author: "Ethan Schoonover (modified by aramisgithub)"
base00: "002b36"
base01: "073642"
base02: "586e75"
base03: "657b83"
base04: "839496"
base05: "93a1a1"
base06: "eee8d5"
base07: "fdf6e3"
base08: "dc322f"
base09: "cb4b16"
base0A: "b58900"
base0B: "859900"
base0C: "2aa198"
base0D: "268bd2"
base0E: "6c71c4"
base0F: "d33682"
================================================
FILE: .config/flavours/schemes/solarized/solarized-light.yaml
================================================
scheme: "Solarized Light"
author: "Ethan Schoonover (modified by aramisgithub)"
base00: "fdf6e3"
base01: "eee8d5"
base02: "93a1a1"
base03: "839496"
base04: "657b83"
base05: "586e75"
base06: "073642"
base07: "002b36"
base08: "dc322f"
base09: "cb4b16"
base0A: "b58900"
base0B: "859900"
base0C: "2aa198"
base0D: "268bd2"
base0E: "6c71c4"
base0F: "d33682"
================================================
FILE: .config/flavours/templates/ags/templates/config.yaml
================================================
colors:
extension: .scss
output: colors
================================================
FILE: .config/flavours/templates/ags/templates/default.mustache
================================================
@define-color theme-base00 #{{base00-hex}};
@define-color theme-base01 #{{base01-hex}};
@define-color theme-base02 #{{base02-hex}};
@define-color theme-base03 #{{base03-hex}};
@define-color theme-base04 #{{base04-hex}};
@define-color theme-base05 #{{base05-hex}};
@define-color theme-base06 #{{base06-hex}};
@define-color theme-base07 #{{base07-hex}};
@define-color theme-base08 #{{base08-hex}};
@define-color theme-base09 #{{base09-hex}};
@define-color theme-base0A #{{base0A-hex}};
@define-color theme-base0B #{{base0B-hex}};
@define-color theme-base0C #{{base0C-hex}};
@define-color theme-base0D #{{base0D-hex}};
@define-color theme-base0E #{{base0E-hex}};
@define-color theme-base0F #{{base0F-hex}};
================================================
FILE: .config/flavours/templates/alacritty/templates/config.yaml
================================================
default:
extension: .toml
output: colors
default-256:
extension: -256.toml
output: colors
================================================
FILE: .config/flavours/templates/alacritty/templates/default-256.mustache
================================================
# Base16 {{scheme-name}} 256 - alacritty color config
# {{scheme-author}}
# Default colors
[colors.primary]
background = '0x{{base00-hex}}'
foreground = '0x{{base05-hex}}'
# Colors the cursor will use if `custom_cursor_colors` is true
[colors.cursor]
text = '0x{{base00-hex}}'
cursor = '0x{{base05-hex}}'
# Normal colors
[colors.normal]
black = '0x{{base00-hex}}'
red = '0x{{base08-hex}}'
green = '0x{{base0B-hex}}'
yellow = '0x{{base0A-hex}}'
blue = '0x{{base0D-hex}}'
magenta = '0x{{base0E-hex}}'
cyan = '0x{{base0C-hex}}'
white = '0x{{base05-hex}}'
# Bright colors
[colors.bright]
black = '0x{{base03-hex}}'
red = '0x{{base08-hex}}'
green = '0x{{base0B-hex}}'
yellow = '0x{{base0A-hex}}'
blue = '0x{{base0D-hex}}'
magenta = '0x{{base0E-hex}}'
cyan = '0x{{base0C-hex}}'
white = '0x{{base07-hex}}'
[[colors.indexed_colors]]
index = 16
color = "0x{{base09-hex}}"
[[colors.indexed_colors]]
index = 17
color = "0x{{base0F-hex}}"
[[colors.indexed_colors]]
index = 18
color = "0x{{base01-hex}}"
[[colors.indexed_colors]]
index = 19
color = "0x{{base02-hex}}"
[[colors.indexed_colors]]
index = 20
color = "0x{{base04-hex}}"
[[colors.indexed_colors]]
index = 21
color = "0x{{base06-hex}}"
================================================
FILE: .config/flavours/templates/alacritty/templates/default.mustache
================================================
# Base16 {{scheme-name}} - alacritty color config
# {{scheme-author}}
[colors]
draw_bold_text_with_bright_colors = false
# Default colors
[colors.primary]
background = '0x{{base00-hex}}'
foreground = '0x{{base05-hex}}'
# Colors the cursor will use if `custom_cursor_colors` is true
[colors.cursor]
text = '0x{{base00-hex}}'
cursor = '0x{{base05-hex}}'
# Normal colors
[colors.normal]
black = '0x{{base00-hex}}'
red = '0x{{base08-hex}}'
green = '0x{{base0B-hex}}'
yellow = '0x{{base0A-hex}}'
blue = '0x{{base0D-hex}}'
magenta = '0x{{base0E-hex}}'
cyan = '0x{{base0C-hex}}'
white = '0x{{base05-hex}}'
# Bright colors
[colors.bright]
black = '0x{{base03-hex}}'
red = '0x{{base09-hex}}'
green = '0x{{base01-hex}}'
yellow = '0x{{base02-hex}}'
blue = '0x{{base04-hex}}'
magenta = '0x{{base06-hex}}'
cyan = '0x{{base0F-hex}}'
white = '0x{{base07-hex}}'
================================================
FILE: .config/flavours/templates/fnott/templates/config.yaml
================================================
default:
extension: .ini
output: colors
================================================
FILE: .config/flavours/templates/fnott/templates/default.mustache
================================================
background={{base00-hex}}bf
border-color={{base0B-hex}}ff
title-color={{base0B-hex}}ff
progress-bar-color={{base0B-hex}}ff
[low]
background={{base00-hex}}bf
title-color={{base0D-hex}}ff
summary-color={{base05-hex}}ff
body-color={{base05-hex}}ff
# [normal]
[critical]
title-color={{base0A-hex}}ff
================================================
FILE: .config/flavours/templates/foot/templates/config.yaml
================================================
default:
extension: .ini
output: colors
================================================
FILE: .config/flavours/templates/foot/templates/default.mustache
================================================
# Base16 {{scheme-name}} - foot color config
# {{scheme-author}}
[colors]
background={{base00-hex}}
foreground={{base06-hex}}
# Normal colors
regular0={{base00-hex}} # Black, could also be base01
regular1={{base08-hex}} # Red
regular2={{base0B-hex}} # Green
regular3={{base0A-hex}} # Yellow
regular4={{base0D-hex}} # Blue
regular5={{base0E-hex}} # Magenta
regular6={{base0C-hex}} # Cyan
regular7={{base06-hex}} # White
# Bright colors
bright0={{base03-hex}}
bright1={{base09-hex}}
bright2={{base01-hex}}
bright3={{base02-hex}}
bright4={{base04-hex}}
bright5={{base06-hex}}
bright6={{base0F-hex}}
bright7={{base07-hex}}
================================================
FILE: .config/flavours/templates/fuzzel/templates/config.yaml
================================================
default:
extension: .ini
output: colors
================================================
FILE: .config/flavours/templates/fuzzel/templates/default.mustache
================================================
[colors]
background=#{{base00-hex}}df
text=#{{base06-hex}}ff
input=#{{base06-hex}}ff
match=#{{base08-hex}}ff
selection=#{{base0C-hex}}ff
selection-text=#{{base00-hex}}df
selection-match=#{{base08-hex}}ff
border=#{{base0C-hex}}ff
================================================
FILE: .config/flavours/templates/gtk-flatcolor/templates/config.yaml
================================================
gtk-2:
extension: -gtkrc
output: gtk-2
gtk-3:
extension: -gtk.css
output: gtk-3
================================================
FILE: .config/flavours/templates/gtk-flatcolor/templates/gtk-2.mustache
================================================
## Base16 {{scheme-name}}
# Scheme author: {{scheme-author}}
# Template author: Tinted Theming (https://github.com/tinted-theming)
# In file gtk-2.0/gtkrc, delete "gtk-color-scheme" including everything between quotes (don't delete gtk-auto-mnemonics) and inject this.
gtk-color-scheme = "bg_color:#{{base00-hex}}
color0:#{{base00-hex}}
text_color:#{{base05-hex}}
selected_bg_color:#{{base02-hex}}
selected_fg_color:#{{base05-hex}}
tooltip_bg_color:#{{base00-hex}}
tooltip_fg_color:#{{base05-hex}}
titlebar_bg_color:#{{base00-hex}}
titlebar_fg_color:#{{base05-hex}}
menu_bg_color:#{{base00-hex}}
menu_fg_color:#{{base05-hex}}
link_color:#{{base02-hex}}"
================================================
FILE: .config/flavours/templates/gtk-flatcolor/templates/gtk-3.mustache
================================================
/*
Base16 {{scheme-name}}
Scheme author: {{scheme-author}}
Template author: Tinted Theming (https://github.com/tinted-theming)
In files gtk-3.0/gtk.css and gtk-3.20/gtk.css, delete section "Default color scheme" and inject this
*/
@define-color bg_color #{{base00-hex}};
@define-color fg_color #{{base05-hex}};
@define-color base_color #{{base01-hex}};
@define-color text_color #{{base05-hex}};
@define-color text_color_disabled #{{base03-hex}};
@define-color selected_bg_color #{{base02-hex}};
@define-color selected_fg_color #{{base05-hex}};
@define-color tooltip_bg_color #{{base00-hex}};
@define-color tooltip_fg_color #{{base05-hex}};
================================================
FILE: .config/flavours/templates/hyprland/templates/colors.mustache
================================================
# Base16 {{scheme-name}}
# Author: {{scheme-author}}
$base00 = 0xff{{base00-hex}}
$base01 = 0xff{{base01-hex}}
$base02 = 0xff{{base02-hex}}
$base03 = 0xff{{base03-hex}}
$base04 = 0xff{{base04-hex}}
$base05 = 0xff{{base05-hex}}
$base06 = 0xff{{base06-hex}}
$base07 = 0xff{{base07-hex}}
$base08 = 0xff{{base08-hex}}
$base09 = 0xff{{base09-hex}}
$base0A = 0xff{{base0A-hex}}
$base0B = 0xff{{base0B-hex}}
$base0C = 0xff{{base0C-hex}}
$base0D = 0xff{{base0D-hex}}
$base0E = 0xff{{base0E-hex}}
$base0F = 0xff{{base0F-hex}}
================================================
FILE: .config/flavours/templates/hyprland/templates/config.yaml
================================================
colors:
extension: .conf
output: themes
================================================
FILE: .config/flavours/templates/imv/templates/config.yaml
================================================
default:
extension: .ini
output: colors
================================================
FILE: .config/flavours/templates/imv/templates/default.mustache
================================================
background = {{base00-hex}}
overlay_text_color = {{base06-hex}}
overlay_background_color = {{base00-hex}}
================================================
FILE: .config/flavours/templates/labwc/templates/config.yaml
================================================
default:
output: colors
================================================
FILE: .config/flavours/templates/labwc/templates/default.mustache
================================================
!! Window colors
window.active.title.bg.color: #{{base05-hex}}
window.inactive.title.bg.color: #{{base00-hex}}
window.active.label.text.color: #{{base00-hex}}
window.inactive.label.text.color: #{{base05-hex}}
window.active.border.color: #{{base05-hex}}
window.inactive.border.color: #{{base00-hex}}
window.active.button.iconify.pressed.image.color: #{{base00-hex}}
window.active.button.iconify.disabled.image.color: #{{base0D-hex}}
window.active.button.iconify.unpressed.image.color: #{{base00-hex}}
window.active.button.iconify.toggled.pressed.image.color: #{{base00-hex}}
window.active.button.iconify.toggled.unpressed.image.color: #{{base00-hex}}
window.active.button.max.pressed.image.color: #{{base00-hex}}
window.active.button.max.disabled.image.color: #{{base0D-hex}}
window.active.button.max.unpressed.image.color: #{{base00-hex}}
window.active.button.max.toggled.pressed.image.color: #{{base00-hex}}
window.active.button.max.toggled.unpressed.image.color: #{{base00-hex}}
window.active.button.close.pressed.image.color: #{{base00-hex}}
window.active.button.close.disabled.image.color: #{{base0D-hex}}
window.active.button.close.unpressed.image.color: #{{base00-hex}}
window.active.button.close.toggled.pressed.image.color: #{{base00-hex}}
window.active.button.close.toggled.unpressed.image.color: #{{base00-hex}}
window.active.button.menu.pressed.image.color: #{{base00-hex}}
window.active.button.menu.disabled.image.color: #{{base0D-hex}}
window.active.button.menu.unpressed.image.color: #{{base00-hex}}
window.active.button.menu.toggled.pressed.image.color: #{{base00-hex}}
window.active.button.menu.toggled.unpressed.image.color: #{{base00-hex}}
window.inactive.button.iconify.pressed.image.color: #{{base03-hex}}
window.inactive.button.iconify.disabled.image.color: #{{base0D-hex}}
window.inactive.button.iconify.unpressed.image.color: #{{base03-hex}}
window.inactive.button.iconify.toggled.pressed.image.color: #{{base03-hex}}
window.inactive.button.iconify.toggled.unpressed.image.color: #{{base03-hex}}
window.inactive.button.max.pressed.image.color: #{{base03-hex}}
window.inactive.button.max.disabled.image.color: #{{base0D-hex}}
window.inactive.button.max.unpressed.image.color: #{{base03-hex}}
window.inactive.button.max.toggled.pressed.image.color: #{{base06-hex}}
window.inactive.button.max.toggled.unpressed.image.color: #{{base06-hex}}
window.inactive.button.close.pressed.image.color: #{{base03-hex}}
window.inactive.button.close.disabled.image.color: #{{base0D-hex}}
window.inactive.button.close.unpressed.image.color: #{{base03-hex}}
window.inactive.button.close.toggled.pressed.image.color: #{{base03-hex}}
window.inactive.button.close.toggled.unpressed.image.color: #{{base03-hex}}
window.inactive.button.menu.pressed.image.color: #{{base03-hex}}
window.inactive.button.menu.disabled.image.color: #{{base0D-hex}}
window.inactive.button.menu.unpressed.image.color: #{{base03-hex}}
window.inactive.button.menu.toggled.pressed.image.color: #{{base03-hex}}
window.inactive.button.menu.toggled.unpressed.image.color: #{{base03-hex}}
!! Menu colors
menu.items.bg.color: #{{base00-hex}}
menu.items.text.color: #{{base05-hex}}
menu.items.disabled.text.color: #{{base03-hex}}
menu.items.active.bg.color: #{{base05-hex}}
menu.items.active.text.color: #{{base00-hex}}
menu.separator.color: #{{base05-hex}}
menu.border.color: #{{base05-hex}}
menu.title.bg.color: #{{base05-hex}}
menu.title.text.color: #{{base00-hex}}
!! OSD colors
osd.border.color: #{{base05-hex}}
osd.label.text.color: #{{base05-hex}}
osd.bg.color: #{{base00-hex}}
================================================
FILE: .config/flavours/templates/nvim/templates/config.yaml
================================================
default:
extension: .lua
output: colors
================================================
FILE: .config/flavours/templates/nvim/templates/default.mustache
================================================
base00 = "none", base01 = "#{{base01-hex}}", base02 = "#{{base02-hex}}", base03 = "#{{base03-hex}}",
base04 = "#{{base04-hex}}", base05 = "#{{base05-hex}}", base06 = "#{{base06-hex}}", base07 = "#{{base07-hex}}",
base08 = "#{{base08-hex}}", base09 = "#{{base09-hex}}", base0A = "#{{base0A-hex}}", base0B = "#{{base0B-hex}}",
base0C = "#{{base0C-hex}}", base0D = "#{{base0D-hex}}", base0E = "#{{base0E-hex}}", base0F = "#{{base0F-hex}}"
================================================
FILE: .config/flavours/templates/nvim-hardline/templates/config.yaml
================================================
default:
extension: .lua
output: colors
================================================
FILE: .config/flavours/templates/nvim-hardline/templates/default.mustache
================================================
custom_theme = {
text = {gui = "#{{base00-hex}}", cterm = "235", cterm16 = "0"},
normal = {gui = "#{{base0D-hex}}", cterm = "109", cterm16 = "6"},
insert = {gui = "#{{base0B-hex}}", cterm = "142", cterm16 = "2"},
replace = {gui = "#{{base0A-hex}}", cterm = "214", cterm16 = "3"},
inactive_comment = {gui = "NONE", cterm = "NONE", cterm16 = "NONE"},
inactive_cursor = {gui = "NONE", cterm = "NONE", cterm16 = "NONE"},
inactive_menu = {gui = "NONE", cterm = "NONE", cterm16 = "NONE"},
visual = {gui = "#{{base0C-hex}}", cterm = "108", cterm16 = "6"},
command = {gui = "#{{base0E-hex}}", cterm = "132", cterm16 = "5"},
alt_text = {gui = "#{{base06-hex}}", cterm = "223", cterm16 = "7"},
warning = {gui = "#{{base08-hex}}", cterm = "167", cterm16 = "1"},
},
================================================
FILE: .config/flavours/templates/river/templates/config.yaml
================================================
colors:
extension: .sh
output: colors
================================================
FILE: .config/flavours/templates/river/templates/default.mustache
================================================
riverctl background-color 0x{{base00-hex}}ff
riverctl border-color-focused 0x{{base0C-hex}}ff
riverctl border-color-unfocused 0x{{base00-hex}}ff
================================================
FILE: .config/flavours/templates/sway/templates/colors.mustache
================================================
## Base16 {{scheme-name}}
# Author: {{scheme-author}}
set $base00 #{{base00-hex}}
set $base01 #{{base01-hex}}
set $base02 #{{base02-hex}}
set $base03 #{{base03-hex}}
set $base04 #{{base04-hex}}
set $base05 #{{base05-hex}}
set $base06 #{{base06-hex}}
set $base07 #{{base07-hex}}
set $base08 #{{base08-hex}}
set $base09 #{{base09-hex}}
set $base0A #{{base0A-hex}}
set $base0B #{{base0B-hex}}
set $base0C #{{base0C-hex}}
set $base0D #{{base0D-hex}}
set $base0E #{{base0E-hex}}
set $base0F #{{base0F-hex}}
================================================
FILE: .config/flavours/templates/sway/templates/config.yaml
================================================
colors:
extension: .config
output: themes
================================================
FILE: .config/flavours/templates/swayimg/templates/config.yaml
================================================
colors:
output: colors
================================================
FILE: .config/flavours/templates/swayimg/templates/default.mustache
================================================
[viewer]
window = {{base00-hex}}
transparency = grid
scale = optimal
fixed = yes
antialiasing = yes
slideshow = no
slideshow_time = 7
history = 1
preload = 1
[gallery]
size = 200
cache = 100
fill = yes
antialiasing = no
window = {{base00-hex}}
background = {{base00-hex}}
select = {{base06-hex}}
border = {{base0C-hex}}
shadow = {{base03-hex}}
[list]
order = alpha
loop = yes
recursive = no
all = yes
[font]
name = monospace
size = 14
color = {{base06-hex}}
shadow = {{base03-hex}}
================================================
FILE: .config/flavours/templates/tmux/templates/config.yaml
================================================
default:
output: colors
================================================
FILE: .config/flavours/templates/tmux/templates/default.mustache
================================================
custom_theme = {
text = {gui = "#{{base00-hex}}", cterm = "235", cterm16 = "0"},
normal = {gui = "#{{base0D-hex}}", cterm = "109", cterm16 = "6"},
insert = {gui = "#{{base0B-hex}}", cterm = "142", cterm16 = "2"},
replace = {gui = "#{{base0A-hex}}", cterm = "214", cterm16 = "3"},
inactive_comment = {gui = "NONE", cterm = "NONE", cterm16 = "NONE"},
inactive_cursor = {gui = "NONE", cterm = "NONE", cterm16 = "NONE"},
inactive_menu = {gui = "NONE", cterm = "NONE", cterm16 = "NONE"},
visual = {gui = "#{{base0C-hex}}", cterm = "108", cterm16 = "6"},
command = {gui = "#{{base0E-hex}}", cterm = "132", cterm16 = "5"},
alt_text = {gui = "#{{base06-hex}}", cterm = "223", cterm16 = "7"},
warning = {gui = "#{{base08-hex}}", cterm = "167", cterm16 = "1"},
},
================================================
FILE: .config/flavours/templates/waybar/templates/config.yaml
================================================
default:
extension: .css
output: colors
================================================
FILE: .config/flavours/templates/waybar/templates/default.mustache
================================================
/*
*
* Base16 {{scheme-name}}
* Author: {{scheme-author}}
*
*/
@define-color base00 #{{base00-hex}};
@define-color base01 #{{base01-hex}};
@define-color base02 #{{base02-hex}};
@define-color base03 #{{base03-hex}};
@define-color base04 #{{base04-hex}};
@define-color base05 #{{base05-hex}};
@define-color base06 #{{base06-hex}};
@define-color base07 #{{base07-hex}};
@define-color base08 #{{base08-hex}};
@define-color base09 #{{base09-hex}};
@define-color base0A #{{base0A-hex}};
@define-color base0B #{{base0B-hex}};
@define-color base0C #{{base0C-hex}};
@define-color base0D #{{base0D-hex}};
@define-color base0E #{{base0E-hex}};
@define-color base0F #{{base0F-hex}};
@define-color bg rgba({{base00-rgb-r}}, {{base00-rgb-g}}, {{base00-rgb-b}}, 0.90);
@define-color accentDim rgba({{base0C-rgb-r}}, {{base0C-rgb-g}}, {{base0C-rgb-b}}, 0.35);
================================================
FILE: .config/flavours/templates/wayfire/templates/config.yaml
================================================
colors:
extension: .ini
output: colors
================================================
FILE: .config/flavours/templates/wayfire/templates/default.mustache
================================================
active_color = \#{{base0C-hex}FF
inactive_color = \#{{base00-hex}}FF
================================================
FILE: .config/fontconfig/fonts.conf
================================================
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- Enable sub-pixel rendering for LCD screens -->
<match target="font">
<edit mode="assign" name="rgba">
<const>rgb</const>
</edit>
</match>
<!-- Enable anti-aliasing for smoother font rendering -->
<match target="font">
<edit mode="assign" name="antialias">
<bool>true</bool>
</edit>
</match>
<!-- Hint style can be set to hintfull, hintmedium, or hintslight -->
<match target="font">
<edit mode="assign" name="hintstyle">
<const>hintfull</const>
</edit>
</match>
<!-- Subpixel hinting type can be set to rgb, bgr, vrgb, vbgr -->
<match target="font">
<edit mode="assign" name="hinting" >
<bool>true</bool>
</edit>
</match>
<!-- Adjust the hinting strength for your preference -->
<match target="font">
<edit mode="assign" name="hinting-factors">
<double>8</double>
</edit>
</match>
<!-- Set the default sans-serif font -->
<alias>
<family>sans-serif</family>
<prefer>
<family>Noto Sans</family>
<family>Ubuntu</family>
</prefer>
</alias>
<!-- Set the default serif font -->
<alias>
<family>serif</family>
<prefer>
<family>Noto Serif</family>
</prefer>
</alias>
<!-- Set the default monospace font -->
<alias>
<family>monospace</family>
<prefer>
<family>Cascadia Mono</family>
<family>Terminus (TTF)</family>
<family>Hack</family>
<family>Noto Sans Mono</family>
<family>Ubuntu Mono</family>
</prefer>
</alias>
<!-- Set the emoji font -->
<alias>
<family>emoji</family>
<prefer>
<family>Noto Color Emoji</family>
<family>Twemoji</family>
</prefer>
</alias>
</fontconfig>
================================================
FILE: .config/gtk-2.0/gtkfilechooser.ini
================================================
[Filechooser Settings]
LocationMode=path-bar
ShowHidden=true
ShowSizeColumn=true
GeometryX=0
GeometryY=0
GeometryWidth=889
GeometryHeight=662
SortColumn=name
SortOrder=ascending
StartupMode=recent
================================================
FILE: .config/gtk-2.0/gtkrc-2.0
================================================
gtk-theme-name="Breeze"
gtk-icon-theme-name="Breeze"
gtk-font-name="Sans 11"
gtk-cursor-theme-name="Kaela-Kovalskia-v2"
gtk-cursor-theme-size=24
gtk-toolbar-style=GTK_TOOLBAR_BOTH_HORIZ
gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
gtk-button-images=0
gtk-menu-images=0
gtk-enable-event-sounds=1
gtk-enable-input-feedback-sounds=0
gtk-xft-antialias=1
gtk-xft-hinting=1
gtk-xft-hintstyle="hintslight"
gtk-xft-rgba="rgb"
================================================
FILE: .config/gtk-3.0/settings.ini
================================================
[Settings]
gtk-button-images=1
gtk-theme-name=Breeze
gtk-icon-theme-name=Breeze
gtk-font-name=Sans 11
gtk-cursor-theme-name=Kaela-Kovalskia-v2
gtk-cursor-theme-size=24
gtk-decoration-layout=icon:minimize,maximize,close
gtk-toolbar-style=GTK_TOOLBAR_BOTH_HORIZ
gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
gtk-menu-images=1
gtk-enable-event-sounds=1
gtk-enable-input-feedback-sounds=0
gtk-xft-antialias=1
gtk-xft-hinting=1
gtk-xft-hintstyle=hintsmedium
gtk-xft-rgba=rgb
gtk-application-prefer-dark-theme=1
================================================
FILE: .config/gtk-4.0/settings.ini
================================================
[Settings]
gtk-application-prefer-dark-theme=true
gtk-theme-name="Breeze"
gtk-icon-theme-name=Breeze
gtk-cursor-theme-name=Kaela-Kovalskia-v2
gtk-cursor-theme-size=24
gtk-can-change-accels=1
gtk-xft-antialias=1
gtk-xft-hinting=1
gtk-xft-hintstyle=hintmedium
gtk-xft-rgba=rgb
================================================
FILE: .config/htop/htoprc
================================================
# Beware! This file is rewritten by htop when settings are changed in the interface.
# The parser is also very primitive, and not human-friendly.
htop_version=3.3.0
config_reader_min_version=3
fields=0 48 17 18 38 39 40 2 46 47 49 1
hide_kernel_threads=1
hide_userland_threads=1
hide_running_in_container=1
shadow_other_users=0
show_thread_names=0
show_program_path=1
highlight_base_name=1
highlight_deleted_exe=1
shadow_distribution_path_prefix=0
highlight_megabytes=1
highlight_threads=1
highlight_changes=0
highlight_changes_delay_secs=5
find_comm_in_cmdline=1
strip_exe_from_cmdline=1
show_merged_command=0
header_margin=1
screen_tabs=1
detailed_cpu_time=0
cpu_count_from_one=0
show_cpu_usage=1
show_cpu_frequency=0
show_cpu_temperature=1
degree_fahrenheit=0
update_process_names=0
account_guest_in_cpu_meter=0
color_scheme=0
enable_mouse=1
delay=15
hide_function_bar=0
topology_affinity=0
header_layout=two_50_50
column_meters_0=CPU Memory Swap NetworkIO
column_meter_modes_0=1 1 1 2
column_meters_1=Tasks LoadAverage Uptime DiskIO
column_meter_modes_1=2 2 2 2
tree_view=0
sort_key=47
tree_sort_key=47
sort_direction=-1
tree_sort_direction=-1
tree_view_always_by_pid=0
all_branches_collapsed=0
screen:Main=PID USER PRIORITY NICE M_VIRT M_RESIDENT M_SHARE STATE PERCENT_CPU PERCENT_MEM TIME Command
.sort_key=PERCENT_MEM
.tree_sort_key=PERCENT_MEM
.tree_view_always_by_pid=0
.tree_view=0
.sort_direction=-1
.tree_sort_direction=-1
.all_branches_collapsed=0
screen:I/O=PID USER IO_PRIORITY IO_RATE IO_READ_RATE IO_WRITE_RATE PERCENT_SWAP_DELAY PERCENT_IO_DELAY Command
.sort_key=PID
.tree_sort_key=PID
.tree_view_always_by_pid=0
.tree_view=0
.sort_direction=1
.tree_sort_direction=1
.all_branches_collapsed=0
================================================
FILE: .config/mimeapps.list
================================================
[Added Associations]
image/gif=video.desktop;
application/zip=lxqt-archiver.desktop;
application/x-zerosize=text.desktop;
application/x-trash=text.desktop;
inode/symlink=text.desktop;
application/xml=nvim.desktop;
application/x-executable=nvim.desktop;
image/webp=img.desktop;
image/png=img.desktop;
image/jpg=img.desktop;
image/jpeg=img.desktop;
[Default Applications]
text/*=text.desktop;
application/x-shellscript=text.desktop;
application/octet-stream=text.desktop;
application/x-wine-extension-ini=text.desktop;
image/*=img.desktop;
video/*=video.desktop;
audio/*=video.desktop;
x-scheme-handler/magnet=torrent.desktop;
application/x-bittorrent=torrent.desktop;
x-scheme-handler/mailto=mail.desktop;
application/postscript=pdf.desktop;
application/pdf=pdf.desktop;
application/rss+xml=rss.desktop;
x-scheme-handler/lbry=lbry.desktop;
inode/directory=file.desktop;
application/xml=nvim.desktop;
x-scheme-handler/http=browser.desktop
x-scheme-handler/https=browser.desktop
x-scheme-handler/about=browser.desktop;
x-scheme-handler/unknown=browser.desktop;
text/html=browser.desktop
================================================
FILE: .config/mpv/input.conf
================================================
Ctrl+Shift+R write-watch-later-config ; loadfile ${path}
F10 cycle_values video-rotate 90 180 270 0
F11 cycle-values loop-playlist yes no
F12 playlist-shuffle ; show-text "${playlist}" 4000
Alt+P script-message save-playlist
================================================
FILE: .config/mpv/mpv.conf
================================================
# general
hwdec=auto-safe
hwdec-codecs=all
deband=no
interpolation=no
vd-lavc-dr=yes
drag-and-drop=append
input-ipc-server=/tmp/mpvsocket
screenshot-directory=pictures
# window
geometry=50%:50%
autofit-larger=60%x60%
autofit-smaller=60%x60%
# video control
keep-open=yes
pause=yes
volume=50
# cache
cache=yes
demuxer-max-bytes=20480KiB
# youtube-dl
ytdl-format=best[height<=?480]+bestaudio/best
ytdl-raw-options=no-check-certificate=
# osd
osd-playing-msg = '${filename}'
[protocol.https]
osd-playing-msg = '${media-title}'
term-playing-msg='$(media-title)'
================================================
FILE: .config/mpv/script-modules/user-input-module.lua
================================================
--[[
This is a module designed to interface with mpv-user-input
https://github.com/CogentRedTester/mpv-user-input
Loading this script as a module will return a table with two functions to format
requests to get and cancel user-input requests. See the README for details.
Alternatively, developers can just paste these functions directly into their script,
however this is not recommended as there is no guarantee that the formatting of
these requests will remain the same for future versions of user-input.
]]
local API_VERSION = "0.1.0"
local mp = require 'mp'
local msg = require "mp.msg"
local utils = require 'mp.utils'
local mod = {}
local name = mp.get_script_name()
local counter = 1
local function pack(...)
local t = {...}
t.n = select("#", ...)
return t
end
local request_mt = {}
-- ensures the option tables are correctly formatted based on the input
local function format_options(options, response_string)
return {
response = response_string,
version = API_VERSION,
id = name..'/'..(options.id or ""),
source = name,
request_text = ("[%s] %s"):format(options.source or name, options.request_text or options.text or "requesting user input:"),
default_input = options.default_input,
cursor_pos = tonumber(options.cursor_pos),
queueable = options.queueable and true,
replace = options.replace and true
}
end
-- cancels the request
function request_mt:cancel()
assert(self.uid, "request object missing UID")
mp.commandv("script-message-to", "user_input", "cancel-user-input/uid", self.uid)
end
-- updates the options for the request
function request_mt:update(options)
assert(self.uid, "request object missing UID")
options = utils.format_json( format_options(options) )
mp.commandv("script-message-to", "user_input", "update-user-input/uid", self.uid, options)
end
-- sends a request to ask the user for input using formatted options provided
-- creates a script message to recieve the response and call fn
function mod.get_user_input(fn, options, ...)
options = options or {}
local response_string = name.."/__user_input_request/"..counter
counter = counter + 1
local request = {
uid = response_string,
passthrough_args = pack(...),
callback = fn,
pending = true
}
-- create a callback for user-input to respond to
mp.register_script_message(response_string, function(response)
mp.unregister_script_message(response_string)
request.pending = false
response = utils.parse_json(response)
request.callback(response.line, response.err, unpack(request.passthrough_args, 1, request.passthrough_args.n))
end)
-- send the input command
options = utils.format_json( format_options(options, response_string) )
mp.commandv("script-message-to", "user_input", "request-user-input", options)
return setmetatable(request, { __index = request_mt })
end
-- runs the request synchronously using coroutines
-- takes the option table and an optional coroutine resume function
function mod.get_user_input_co(options, co_resume)
local co, main = coroutine.running()
assert(not main and co, "get_user_input_co must be run from within a coroutine")
local uid = {}
local request = mod.get_user_input(function(line, err)
if co_resume then
co_resume(uid, line, err)
else
local success, er = coroutine.resume(co, uid, line, err)
if not success then
msg.warn(debug.traceback(co))
msg.error(er)
end
end
end, options)
-- if the uid was not sent then the coroutine was resumed by the user.
-- we will treat this as a cancellation request
local success, line, err = coroutine.yield(request)
if success ~= uid then
request:cancel()
request.callback = function() end
return nil, "cancelled"
end
return line, err
end
-- sends a request to cancel all input requests with the given id
function mod.cancel_user_input(id)
id = name .. '/' .. (id or "")
mp.commandv("script-message-to", "user_input", "cancel-user-input/id", id)
end
return mod
================================================
FILE: .config/mpv/scripts/delete-current-video.lua
================================================
local utils = require 'mp.utils'
function delete_current_file()
local file_path = mp.get_property("path")
if file_path == nil then
mp.msg.error("No file is currently loaded.")
return
end
local args = {"rm", file_path}
local res = utils.subprocess({ args = args, cancellable = false })
if res.status == 0 then
mp.msg.info("Deleted file: " .. file_path)
-- Move to the next file in the playlist
mp.command("playlist-next")
else
mp.msg.error("Failed to delete file: " .. file_path)
end
end
mp.register_command("delete-current", delete_current_file, "Delete the currently playing file.")
================================================
FILE: .config/mpv/scripts/keep-session.lua
================================================
--[[
This script automatically saves the current playlist and can reload it if the player is started in idle mode (specifically
if there are 0 files in the playlist), or if the correct command is sent via script-messages.
It remembers the playlist position the player was in when shutdown and reloads the playlist at that entry.
This can be disabled with script-opts
The script saves a text file containing the previous session playlist in the watch_later directory (changeable via opts)
This file is saved in plaintext with the exact file paths of each playlist entry.
Note that since it uses the same file, only the latest mpv window to be closed will be saved
The script attempts to correct relative playlist paths using the utils.join_path function. I've tried to automatically
detect when any non-files are loaded (if it has the sequence :// in the path), so that it'll work with URLs
You can disable the automatic stuff and use script messages to load/save playlists as well
script-message save-session [session-file]
script-message reload-session [session-file] [load_playlist]
If not included `session-file` will use the default file specified in script-opts.
`load_playlist` controls whether the whole playlist should be restored or just the one file,
the value can be `yes` or `no`. If not included it defaults to the value of the `load_playlist` script opt.
available at: https://github.com/CogentRedTester/mpv-scripts
]]--
local mp = require 'mp'
local utils = require 'mp.utils'
local opt = require 'mp.options'
local msg = require 'mp.msg'
local o = {
--automatically save the prev session
auto_save = true,
--runs the script automatically when started in idle mode and no files are in the playlist
auto_load = true,
--reloads the full playlist from the previous session
--can be individually overwritten when sending script-messages
load_playlist = true,
--file path of the default session file
--save it as a .pls file to be able to open directly (though it will not maintain the playlist positions)
session_file = "",
--maintain position in the playlist
--does nothing if load_playlist is disabled
maintain_pos = true,
}
opt.read_options(o, 'keep_session', function() end)
--sets the default session file to the watch_later directory or ~~/watch_later/
if o.session_file == "" then
local watch_later = mp.get_property('watch-later-directory', "")
if watch_later == "" then watch_later = "~~state/watch_later/" end
if not watch_later:find("[/\\]$") then watch_later = watch_later..'/' end
o.session_file = watch_later.."prev-session"
end
local save_file = mp.command_native({"expand-path", o.session_file})
--saves the current playlist as a json string
local function save_playlist(file)
if not file then file = save_file end
msg.verbose('saving current session to', file)
local playlist = mp.get_property_native('playlist')
if #playlist == 0 then
msg.verbose('session empty, aborting save')
return
end
local session = io.open(file, 'w')
if not session then return msg.error("Failed to write to file", file) end
session:write("[playlist]\n")
session:write(mp.get_property('playlist-pos') .. "\n")
local working_directory = mp.get_property('working-directory')
for _, v in ipairs(playlist) do
msg.debug('adding ' .. v.filename .. ' to playlist')
--if the file is available then it attempts to expand the path in-case of relative playlists
--presumably if the file contains a protocol then it shouldn't be expanded
if not v.filename:find("^%a*://") then
v.filename = utils.join_path(working_directory, v.filename)
msg.debug('expanded path: ' .. v.filename)
end
session:write("File=" .. v.filename .. "\n")
end
session:close()
end
--turns the previous json string into a table and adds all the files to the playlist
local function load_prev_session(file, load_playlist)
if not file or file == '' then file = save_file end
if load_playlist == 'yes' then load_playlist = true
elseif load_playlist == 'no' then load_playlist = false
else load_playlist = o.load_playlist end
--loads the previous session file
msg.verbose('loading previous session from', file)
local session = io.open(file, "r+")
--this should only occur when loading the script for the first time,
--or if someone manually deletes the previous session file
if session == nil or session:read() ~= "[playlist]" then
msg.verbose('no previous session, cancelling load')
if session then session:close() end
return
end
local previous_playlist_pos = session:read('*n')
if load_playlist then
msg.debug('reloading playlist')
if not o.maintain_pos then
mp.commandv('loadlist', file)
else
local prev_playlist_start = mp.get_property('playlist-start')
msg.verbose("restoring playlist position", previous_playlist_pos)
mp.set_property_number('playlist-start', previous_playlist_pos)
mp.commandv('loadlist', file)
-- restore the original value unless the `playlist-start` property has been otherwise modified
if mp.get_property_number('playlist-start') ~= previous_playlist_pos then
mp.set_property('playlist-start', prev_playlist_start)
end
end
else
msg.debug('discarding playlist')
local files = {}
for line in session:lines() do
table.insert(files, string.match(line, 'File=(.+)'))
end
-- mpv and keep-session uses 0 based array indices, but lua uses 1-based
mp.commandv('loadfile', files[previous_playlist_pos+1])
end
session:close()
end
local function shutdown()
if o.auto_save then
save_playlist()
end
end
mp.register_script_message('save-session', save_playlist)
mp.register_script_message('reload-session', load_prev_session)
mp.register_event('shutdown', shutdown)
--Load the previous session if auto_load is enabled and the playlist is empty
--the function is not called until the first property observation is triggered to let everything initialise
--otherwise modifying playlist-start becomes unreliable
if o.auto_load and (mp.get_property_number('playlist-count', 0) == 0) then
local function temp()
load_prev_session()
mp.unobserve_property(temp)
end
mp.observe_property("idle", "string", temp)
end
================================================
FILE: .config/mpv/scripts/mpv-scut.lua
================================================
local start_time = nil
local segments = {}
local osd_message_id = nil
local osd_persistent = false
local segments_file_path = nil
-- Get the path for the segments file based on the video file name
function getSegmentsFilePath()
local input_file = mp.get_property("path")
input_file = mp.command_native({"expand-path", input_file})
local file_dir = input_file:match("(.*/)")
local file_name = input_file:match("([^/]+)%.%w+$")
return string.format("%s/%s_segments.txt", file_dir, file_name)
end
-- Start segment at the current playback position
function startSegment()
start_time = mp.get_property_number("time-pos")
osd_persistent = true
osd_message_id = mp.osd_message("Segment start point set")
end
-- End segment at the current playback position
function endSegment()
local end_time = mp.get_property_number("time-pos")
if start_time then
table.insert(segments, {start = start_time, stop = end_time})
start_time = nil
osd_persistent = true
osd_message_id = mp.osd_message("Segment end point set")
else
osd_persistent = false
osd_message_id = mp.osd_message("No start point set")
end
end
-- Save segments to file
function saveSegmentsToFile()
if #segments == 0 then
osd_persistent = false
osd_message_id = mp.osd_message("No segments to save")
return
end
segments_file_path = getSegmentsFilePath()
local segments_file = io.open(segments_file_path, "w")
if not segments_file then
osd_persistent = false
osd_message_id = mp.osd_message("Failed to create segments file")
return
end
for _, segment in ipairs(segments) do
segments_file:write(string.format("%s,%s\n", segment.start, segment.stop))
end
segments_file:close()
osd_persistent = true
osd_message_id = mp.osd_message("Segments saved to file")
end
-- Load segments from file
function loadSegmentsFromFile()
segments_file_path = getSegmentsFilePath()
local segments_file = io.open(segments_file_path, "r")
if not segments_file then
osd_persistent = false
osd_message_id = mp.osd_message("Failed to read segments file")
return
end
segments = {}
for line in segments_file:lines() do
local start, stop = line:match("([^,]+),([^,]+)")
table.insert(segments, {start = tonumber(start), stop = tonumber(stop)})
end
segments_file:close()
end
-- Process segments (cut and merge)
function processSegments()
if #segments == 0 then
osd_persistent = false
osd_message_id = mp.osd_message("No segments to process")
return
end
saveSegmentsToFile()
local input_file = mp.get_property("path")
input_file = mp.command_native({"expand-path", input_file})
local file_dir = input_file:match("(.*/)")
local file_name = input_file:match("([^/]+)%.%w+$")
if not file_dir or not file_name then
osd_persistent = false
osd_message_id = mp.osd_message("Failed to determine video directory or file name")
return
end
for i, segment in ipairs(segments) do
local segment_file = string.format("%s/%s_segment_%d.mp4", file_dir, file_name, i)
local command = string.format('ffmpeg -i "%s" -ss %s -to %s -c copy "%s"', input_file, segment.start, segment.stop, segment_file)
print("Executing command:", command)
os.execute(command)
end
local concat_file_path = string.format("%s/%s_concat.txt", file_dir, file_name)
local concat_file = io.open(concat_file_path, "w")
if not concat_file then
osd_persistent = false
osd_message_id = mp.osd_message("Failed to create concat file")
return
end
for i, _ in ipairs(segments) do
local segment_file = string.format("%s_segment_%d.mp4", file_name, i)
concat_file:write(string.format("file '%s'\n", segment_file))
end
concat_file:close()
local output_file = string.format("%s/%s_merged.mp4", file_dir, file_name)
local concat_command = string.format('ffmpeg -f concat -safe 0 -i "%s" -c copy "%s"', concat_file_path, output_file)
print("Executing concat command:", concat_command)
osd_persistent = true
osd_message_id = mp.osd_message("Merging segments...")
os.execute(concat_command)
osd_message_id = mp.osd_message("Segments merged")
os.remove(concat_file_path)
for i, _ in ipairs(segments) do
local segment_file = string.format("%s/%s_segment_%d.mp4", file_dir, file_name, i)
os.remove(segment_file)
end
osd_persistent = false
osd_message_id = mp.osd_message("Segments processed, temporary files deleted")
end
-- Retry processing segments using the segments file
function retryProcessSegments()
loadSegmentsFromFile()
processSegments()
end
-- Update OSD message if persistent
function updateOSDMessage(message)
if osd_persistent then
osd_message_id = mp.osd_message(message, osd_message_id)
end
end
-- Key bindings
mp.add_key_binding("c", "start_segment", startSegment)
mp.add_key_binding("x", "end_segment", endSegment)
mp.add_key_binding("z", "process_segments", processSegments)
mp.add_key_binding("r", "retry_process_segments", retryProcessSegments)
mp.add_key_binding("s", "save_segments_to_file", saveSegmentsToFile)
-- Clear OSD on shutdown
mp.register_event("shutdown", function()
if osd_message_id then
mp.osd_message("")
end
end)
-- Periodic OSD update
mp.add_periodic_timer(0.5, function()
if osd_persistent and start_time then
updateOSDMessage("Segment in progress...")
end
end)
================================================
FILE: .config/mpv/scripts/mpv-splice.lua
================================================
-- -----------------------------------------------------------------------------
--
-- MPV Splice
-- URL: https://github.com/pvpscript/mpv-video-splice
--
-- Requires: ffmpeg
--
-- Description:
--
-- This script provides the hability to create video slices by grabbing two
-- timestamps, which generate a slice from timestamp A[i] to timestamp B[i],
-- e.g.:
-- -> Slice 1: 00:10:34.25 -> 00:15:00.00.
-- -> Slice 2: 00:23:00.84 -> 00:24:10.00.
-- ...
-- -> Slice n: 01:44:22.47 -> 01:56:00.00.
--
-- Then, all the slices from 1 to n are joined together, creating a new
-- video.
--
-- The output file will appear at the directory that the mpv command was ran,
-- or in the environment variable set for it (see Environment variables below)
--
-- Note: This script prevents the mpv player from closing when the video ends,
-- so that the slices don't get lost. Keep this in mind if there's the option
-- 'keep-open=no' in the current config file.
--
-- Note: This script will also silence the terminal, so the script messages
-- can be seen more clearly.
--
-- -----------------------------------------------------------------------------
--
--
-- Usage:
--
-- In the video screen, press Alt + T to grab the first timestamp and then
-- press Alt + T again to get the second timestamp. This process will generate
-- a time range, which represents a video slice. Repeat this process to create
-- more slices.
--
-- To see all the slices made, press Alt + P. All of the slices will appear
-- in the terminal in order of creation, with their corresponding timestamps.
-- Incomplete slices will show up as 'Slice N in progress', where N is the
-- slice number.
--
-- To reset an incomplete slice, press Alt + R. If the first part of a slice
-- was created at the wrong time, this will reset the current slice.
--
-- To delete a whole slice, start the slice deletion mode by pressing Alt + D.
-- When in this mode, it's possible to press Alt + NUM, where NUM is any
-- number between 0 inclusive and 9 inclusive. For each Alt + NUM pressed, a
-- number will be concatenated to make the final number referring to the slice
-- to be removed, then press Alt + D again to stop the slicing deletion mode
-- and delete the slice corresponding to the formed number.
--
-- Example 1: Deleting slice number 3
-- -> Alt + D # Start slice deletion mode
-- -> Alt + 3 # Concatenate number 3
-- -> Alt + D # Exit slice deletion mode
--
-- Example 2> Deleting slice number 76
-- -> Alt + D # Start slice deletion mode
-- -> Alt + 7 # Concatenate number 7
-- -> Alt + 6 # Concatenate number 6
-- -> Alt + D # Exit slice deletion mode
--
-- To fire up ffmpeg, which will slice up the video and concatenate the slices
-- together, press Alt + C. It's important that there are at least one
-- slice, otherwise no video will be created.
--
-- Note: No cut will be made unless the user presses Alt + C.
-- Also, the original video file won't be affected by the cutting.
--
--
-- -----------------------------------------------------------------------------
--
--
-- Log level:
--
-- Everytime a timestamp is grabbed, a text will appear on the screen showing
-- the selected time.
-- When Alt + P is pressed, besides showing the slices in the terminal,
-- it will also show on the screen the total number of cuts (or slices)
-- that were made.
-- When the actual cutting and joining process begins, a message will be shown
-- on the screen and the terminal telling that it began. When the process ends,
-- a message will appear on the screen and the terminal displaying the full path
-- of the generated video. It will also appear a message in the terminal telling
-- that the process ended.
--
-- Note: Every message that appears on the terminal has the log level of 'info'.
--
--
-- -----------------------------------------------------------------------------
--
--
-- Environment Variables:
--
-- This script uses environment variables to allow the user to
-- set the temporary location of the video cuts and for setting the location for
-- the resulting video.
--
-- To set the temporary directory, set the variable MPV_SPLICE_TEMP;
-- e.g.: export MPV_SPLICE_TEMP="$HOME/temporary_location"
--
-- To set the video output directory, set the variable MPV_SPLICE_OUTPUT;
-- e.g.: export MPV_SPLICE_OUTPUT="$HOME/output_location"
--
-- Make sure the directories set in the variables really exist, or else the
-- script might fail.
--
-- -----------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Importing the mpv libraries
local mp = require 'mp'
local msg = require 'mp.msg'
local opt = require 'mp.options'
local utils = require 'mp.utils'
--------------------------------------------------------------------------------
-- Setup os dependent stuff
-- Not the best way to check OS, but it should work
local _os = package.config:sub(1, 1) == "/" and "unix" or "windows"
local _default_output_path = mp.get_property("working-directory")
system_dependent = {
default_output_path = _os == "unix"
and _default_output_path
or _default_output_path:gsub("\\", "/"),
tmp_path = _os == "unix"
and "/tmp"
or string.format("%s/Temp", os.getenv("LOCALAPPDATA"):gsub("\\", "/")),
mkdir = _os == "unix" and "mkdir" or "md",
rm = _os == "unix" and "rm -rf" or "rd /s /q",
}
--------------------------------------------------------------------------------
-- Setup config
local SCRIPT_NAME = "mpv-splice"
local config = {
concat_file_name = "concat",
ffmpeg_cmd = "ffmpeg -hide_banner -loglevel warning",
ffmpeg_filter = "-c copy -copyts -avoid_negative_ts make_zero",
tmp_path = system_dependent.tmp_path,
output_path = system_dependent.default_output_path,
}
opt.read_options(config, SCRIPT_NAME)
--------------------------------------------------------------------------------
local function notify(message, duration)
local duration = duration or 2
msg.info(message)
mp.osd_message(message, duration)
end
local function seconds_to_clock(secs)
local hours = math.floor(secs / 3600)
local mins = math.floor((secs - hours * 3600) / 60)
local secs = secs - hours * 3600 - mins * 60
return {
h = hours,
m = mins,
s = secs,
}
end
local function current_timestamp()
local seconds = mp.get_property_number('time-pos')
local time_data = seconds_to_clock(seconds)
return string.format('%02d:%02d:%05.2f', time_data.h, time_data.m, time_data.s)
end
slice_data = {
_start_timestamp_message = "[START TIMESTAMP]",
_end_timestamp_message = "[END TIMESTAMP]",
_timestamps = {},
_pieces = function(self)
return #self._timestamps
end,
pieces = function(self)
return self:_pieces()
end,
remove = {
_ongoing = false,
to_be_removed = "",
append = function(self, value)
self.to_be_removed = self.to_be_removed .. value
end,
is_ongoing = function(self)
return self._ongoing
end,
is_empty = function(self)
return self.to_be_removed == ""
end,
set_ongoing = function(self)
self._ongoing = true
end,
clear = function(self)
self._ongoing = false
self.to_be_removed = ""
notify("Exited slice deletion mode.")
end,
},
_pairs = function(self)
return math.floor(self:_pieces() / 2)
end,
_has_incomplete_slice = function(self)
return not (self:_pieces() % 2 == 0)
end,
_put_time = function(self, value)
table.insert(self._timestamps, value)
end,
_add_piece = function(self, timestamp)
self:_put_time(timestamp)
local message = self:_has_incomplete_slice()
and self._start_timestamp_message
or self._end_timestamp_message
notify(message)
end,
_as_pairs_coroutine_handler = nil,
_as_pairs_coroutine_create = function(self)
local function _as_pairs_coroutine_closure(self)
local pair = 1
for piece = 1, self:_pieces(), 2 do
coroutine.yield({
index = pair,
p_start = self._timestamps[piece],
p_end = self._timestamps[piece + 1],
})
pair = pair + 1
end
end
self._as_pairs_coroutine_handler =
coroutine.create(_as_pairs_coroutine_closure)
end,
as_pairs = function(self)
self:_as_pairs_coroutine_create()
return function()
local _, ret = coroutine.resume(self._as_pairs_coroutine_handler, self)
return ret
end
end,
add_time = function(self)
local timestamp = current_timestamp()
slice_data:_add_piece(timestamp)
end,
show_timestamps = function(self)
notify(string.format("Total cuts: %d", self:_pairs()))
local pair = 1
for piece = 1, self:_pieces(), 2 do
local t_start = self._timestamps[piece]
local t_end = self._timestamps[piece + 1]
msg.info(string.format("Slice %d: %s -> %s", pair, t_start, t_end))
pair = pair + 1
end
if self:_has_incomplete_slice() then
notify(string.format("Slice %d in progress.", self:_pairs() + 1))
end
end,
reset_current_slice = function(self)
if self:_has_incomplete_slice() then
notify(string.format("Slice %d reset.", self:_pairs() + 1))
table.remove(self._timestamps)
end
end,
remove_slice = function(self)
local pair_index = tonumber(self.remove.to_be_removed)
local piece_index = pair_index * 2 - 1
if pair_index > 0 and pair_index <= self:_pairs() then
table.remove(self._timestamps, piece_index)
table.remove(self._timestamps, piece_index)
notify(string.format("Removed slice %d", pair_index))
end
end,
add_number_key_bindings = function(self)
-- Add shortcut keys to the interval {0..9}.
for i = 0, 9, 1 do
local key_code = "Alt+" .. i
local binding_name = "num_key_" .. i
local key_action = function()
self.remove:append(i)
notify(string.format("Slice to remove: %d", self.remove.to_be_removed), 1)
end
mp.add_key_binding(key_code, binding_name, key_action)
end
end,
remove_number_key_bindings = function(self)
for i = 0, 9, 1 do
mp.remove_key_binding("num_key_" .. i)
end
end,
delete_slice = function(self, index)
if not self.remove:is_ongoing() then
self.remove:set_ongoing()
notify("Entered slice deletion mode.")
self:add_number_key_bindings()
elseif self.remove:is_ongoing() and self.remove:is_empty() then
self.remove:clear()
else
self:remove_number_key_bindings()
self:remove_slice()
self.remove:clear()
end
end,
}
local quit = {
_exit_count = 0,
prevent_quit = function(self, pieces, name)
if pieces > 0 then
if self._exit_count >= 1 then
mp.command(name)
else
notify("There are timestamp pieces set. Press again to quit.", 3)
self._exit_count = self._exit_count + 1
end
else
mp.command(name)
end
end,
}
local random = {
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
_started = false,
-- Better seed randomization
_first_startup = function(self)
if not self._started then
math.randomseed(os.time())
for i = 1, 3, 1 do
math.random()
end
self._started = true
end
end,
random_string = function(self, size)
self:_first_startup()
local rnd_str = ""
for i = 1, size, 1 do
local rnd_index = math.floor(math.random() * #self.alphabet + 0.5)
rnd_str = rnd_str .. self.alphabet:sub(rnd_index, rnd_index)
end
return rnd_str
end,
}
concat_file = {
_path = nil,
_handler = nil,
_create_file_path = function(self, tmp_path, name)
local name = name or "concat"
local file_name = string.format("%s.txt", name)
return utils.join_path(tmp_path, file_name)
end,
get_path = function(self)
return self._path
end,
create = function(self, tmp_path, name)
self._path = self:_create_file_path(tmp_path, name)
self._handler = io.open(self._path, "w")
end,
add_file = function(self, path)
local path_line = string.format("file '%s'\n", path)
self._handler:write(path_line)
end,
close = function(self)
self._handler:close()
end,
}
--------------------------------------------------------------------------------
local function add_time()
slice_data:add_time()
end
local function show_timestamps()
slice_data:show_timestamps()
end
local function reset_current_slice()
slice_data:reset_current_slice()
end
local function delete_slice()
slice_data:delete_slice()
end
--------------------------------------------------------------------------------
local function file_info()
local path = mp.get_property('path')
local name = mp.get_property('filename')
local name_without_ext = mp.get_property('filename/no-ext')
local ext = name == name_without_ext
and ""
or string.gsub(name, '.*%.(.*)$', '%1')
return {
path = path,
full_name = name,
name_only = name_without_ext,
ext = ext
}
end
local function make_temp_dir(tmp_path)
local tmp_path_name = string.format(
"%s_%s",
"video-splice-tmp", random:random_string(10)
)
local full_tmp_path = utils.join_path(tmp_path, tmp_path_name)
local mkdir_cmd = string.format(
"%s \"%s\" 2>&1",
system_dependent.mkdir, full_tmp_path
)
local handler = io.popen(mkdir_cmd)
local cmd_output = handler:read("*l")
handler:close()
if cmd_output ~= nil then
error(cmd_output)
end
return full_tmp_path
end
local function output_file_path(file_name, ext)
local random_string = random:random_string(10)
local output_file = string.format(
"%s_%s_cut.%s",
file_name, random_string, ext
)
return utils.join_path(config.output_path, output_file)
end
local function make_cut_path(tmp_path, piece_index, ext)
local random_string = random:random_string(10)
local file_name = string.format(
"slice_%s_%d.%s",
random_string, piece_index, ext
)
return utils.join_path(tmp_path, file_name)
end
local function run_ffmpeg_cut(piece, input_file_path, output_cut_path)
local cmd = string.format(
"%s -ss %s -i \"%s\" -to %s %s %s",
config.ffmpeg_cmd,
piece.p_start, input_file_path, piece.p_end,
config.ffmpeg_filter,
output_cut_path
)
os.execute(cmd)
end
local function make_timestamp_cuts(tmp_path, curr_file_path, curr_file_ext)
for piece in slice_data:as_pairs() do
local cut_path = make_cut_path(tmp_path, piece.index, curr_file_ext)
run_ffmpeg_cut(piece, curr_file_path, cut_path)
concat_file:add_file(cut_path)
end
concat_file:close()
end
local function concat_pieces(cat_file_path, output_file)
cmd = string.format(
"%s -f concat -safe 0 -i \"%s\" -c copy \"%s\"",
config.ffmpeg_cmd, cat_file_path, output_file
)
os.execute(cmd)
end
local function cleanup(path)
cmd = string.format(
"%s \"%s\"",
system_dependent.rm, path
)
os.execute(cmd)
msg.info(string.format("Directory \"%s\" removed!", path))
end
function process_video()
local file_info = file_info()
local output_file = output_file_path(file_info.name_only, file_info.ext)
local tmp_path = make_temp_dir(config.tmp_path)
-- Make concat file
concat_file:create(tmp_path, config.concat_file_name)
notify("Process started!")
-- Make timestamp cuts
make_timestamp_cuts(tmp_path, file_info.path, file_info.ext)
-- Make the concat cmd, using the concat.txt file
concat_pieces(concat_file:get_path(), output_file)
notify(string.format("File saved as: %s", output_file), 10)
msg.info("Process ended!")
-- Cleanup
cleanup(tmp_path)
end
mp.set_property("keep-open", "yes") -- Prevent mpv from exiting when the video ends
mp.set_property("quiet", "yes") -- Silence terminal.
mp.add_key_binding('q', "quit", function()
quit:prevent_quit(slice_data:pieces(), "quit")
end)
mp.add_key_binding('Shift+q', "quit-watch-later", function()
quit:prevent_quit(slice_data:pieces(), "quit-watch-later")
end)
mp.add_key_binding('Alt+t', "put_time", add_time)
mp.add_key_binding('Alt+p', "show_times", show_timestamps)
mp.add_key_binding('Alt+c', "process_video", process_video)
mp.add_key_binding('Alt+r', "reset_current_slice", reset_current_slice)
mp.add_key_binding('Alt+d', "delete_slice", delete_slice)
================================================
FILE: .config/mpv/scripts/playlist-shuffle.lua
================================================
--[[
shuffles the playlist and moves the currently playing file to the start of the playlist
available at: https://github.com/CogentRedTester/mpv-scripts
]]--
function main()
mp.command('playlist-shuffle')
local pos = mp.get_property_number('playlist-pos')
mp.commandv('playlist-move', pos, 0)
mp.osd_message('playlist shuffled')
end
mp.register_script_message('playlist-shuffle', main)
================================================
FILE: .config/mpv/scripts/save-playlist.lua
================================================
--[[
A script for saving m3u playlists based on mpvs current internal playlist.
Users can set the name and directory to save the file in the initial script message,
or can enter custom strings in the osd.
Available at: https://github.com/CogentRedTester/mpv-scripts
To support requesting user input this script requires that the script mpv-user-input be
loaded by mpv in the ~~/scripts directory, and that user-input-module is in the ~~/script-modules directory.
mpv-user-input is available here: https://github.com/CogentRedTester/mpv-user-input
Syntax:
script-message save-playlist [directory] [filename] [flags]
If the directory and/or filename are missing, or are empty strings, then the user will be
prompted for input. The filename will be appended with the .m3u extension.
The flags are a string of options
Flags:
Currently there is only one flag: `relative`
When relative is passed to the script the playlist will use paths relative to the saved playlist.
This is currently very primitive, and only works with files that are children of the save directory.
]]--
local mp = require "mp"
local msg = require "mp.msg"
local utils = require "mp.utils"
local input = dofile(mp.command_native({"expand-path", "~~/script-modules/user-input-module.lua"}))
local working = mp.get_property("working-directory", "")
local function save_playlist(directory, name, relative)
if not directory or not name then return end
directory = mp.command_native({"expand-path", directory})
local path = directory.."/"..name..".m3u"
local file = io.open(path, "w")
if not file then msg.error("could not open file '"..path.."' for writing") ; return end
local playlist = mp.get_property_native("playlist")
for _, item in ipairs(playlist) do
local path = item.filename
if not path:find("^%a+://") then
path = utils.join_path(working, path)
path = path:gsub("\\", "/")
path = path:gsub("/./", "/")
if relative then
local _, finish = path:find(directory, 1, true)
if finish then path = path:sub(finish+1) end
end
end
msg.verbose("wrote", '"'..path..'"', "to playlist")
file:write(path.."\n")
end
msg.info("Saved", #playlist, "files to", '"'..directory..'"')
mp.osd_message("Saved "..(#playlist).." files to playlist")
file:close()
end
local function handle_save_request(directory, name, relative)
local need_dir = not directory or directory == ""
local need_name = not name or name == ""
relative = relative == "relative"
if need_dir then
input.get_user_input(function(res)
if not need_name then save_playlist(res, name, relative)
else directory = res end
end, {id = "dir", text = "Enter save directory:"})
end
if need_name then
input.get_user_input(function(res)
save_playlist(directory, res, relative)
end, {id = "name", text = "Enter playlist name:"})
end
end
mp.add_key_binding("Ctrl+p", "save-playlist", handle_save_request)
================================================
FILE: .config/mpv/scripts/user-input.lua
================================================
local mp = require 'mp'
local msg = require 'mp.msg'
local utils = require 'mp.utils'
local options = require 'mp.options'
-- Default options
local opts = {
-- All drawing is scaled by this value, including the text borders and the
-- cursor. Change it if you have a high-DPI display.
scale = 1,
-- Set the font used for the REPL and the console. This probably doesn't
-- have to be a monospaced font.
font = "",
-- Set the font size used for the REPL and the console. This will be
-- multiplied by "scale."
font_size = 16,
}
options.read_options(opts, "user_input")
local API_VERSION = "0.1.0"
local API_MAJOR_MINOR = API_VERSION:match("%d+%.%d+")
local co = nil
local queue = {}
local active_ids = {}
local histories = {}
local request = nil
local line = ''
--[[
The below code is a modified implementation of text input from mpv's console.lua:
https://github.com/mpv-player/mpv/blob/7ca14d646c7e405f3fb1e44600e2a67fc4607238/player/lua/console.lua
Modifications:
removed support for log messages, sending commands, tab complete, help commands
removed update timer
Changed esc key to call handle_esc function
handle_esc and handle_enter now resume the main coroutine with a response table
made history specific to request ids
localised all functions - reordered some to fit
keybindings use new names
]]--
------------------------------START ORIGINAL MPV CODE-----------------------------------
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
-- Copyright (C) 2019 the mpv developers
--
-- Permission to use, copy, modify, and/or distribute this software for any
-- purpose with or without fee is hereby granted, provided that the above
-- copyright notice and this permission notice appear in all copies.
--
-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-- SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
-- OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
local assdraw = require 'mp.assdraw'
local function detect_platform()
local o = {}
-- Kind of a dumb way of detecting the platform but whatever
if mp.get_property_native('options/vo-mmcss-profile', o) ~= o then
return 'windows'
elseif mp.get_property_native('options/macos-force-dedicated-gpu', o) ~= o then
return 'macos'
elseif os.getenv('WAYLAND_DISPLAY') then
return 'wayland'
end
return 'x11'
end
-- Pick a better default font for Windows and macOS
local platform = detect_platform()
if platform == 'windows' then
opts.font = 'Consolas'
elseif platform == 'macos' then
opts.font = 'Menlo'
else
opts.font = 'monospace'
end
local repl_active = false
local insert_mode = false
local cursor = 1
local key_bindings = {}
local global_margin_y = 0
-- Escape a string for verbatim display on the OSD
local function ass_escape(str)
-- There is no escape for '\' in ASS (I think?) but '\' is used verbatim if
-- it isn't followed by a recognised character, so add a zero-width
-- non-breaking space
str = str:gsub('\\', '\\\239\187\191')
str = str:gsub('{', '\\{')
str = str:gsub('}', '\\}')
-- Precede newlines with a ZWNBSP to prevent ASS's weird collapsing of
-- consecutive newlines
str = str:gsub('\n', '\239\187\191\\N')
-- Turn leading spaces into hard spaces to prevent ASS from stripping them
str = str:gsub('\\N ', '\\N\\h')
str = str:gsub('^ ', '\\h')
return str
end
-- Render the REPL and console as an ASS OSD
local function update()
local dpi_scale = mp.get_property_native("display-hidpi-scale", 1.0)
dpi_scale = dpi_scale * opts.scale
local screenx, screeny, aspect = mp.get_osd_size()
screenx = screenx / dpi_scale
screeny = screeny / dpi_scale
-- Clear the OSD if the REPL is not active
if not repl_active then
mp.set_osd_ass(screenx, screeny, '')
return
end
local ass = assdraw.ass_new()
local style = '{\\r' ..
'\\1a&H00&\\3a&H00&\\4a&H99&' ..
'\\1c&Heeeeee&\\3c&H111111&\\4c&H000000&' ..
'\\fn' .. opts.font .. '\\fs' .. opts.font_size ..
'\\bord1\\xshad0\\yshad1\\fsp0\\q1}'
local queue_style = '{\\r' ..
'\\1a&H00&\\3a&H00&\\4a&H99&' ..
'\\1c&Heeeeee&\\3c&H111111&\\4c&H000000&' ..
'\\fn' .. opts.font .. '\\fs' .. opts.font_size .. '\\c&H66ccff&' ..
'\\bord1\\xshad0\\yshad1\\fsp0\\q1}'
-- Create the cursor glyph as an ASS drawing. ASS will draw the cursor
-- inline with the surrounding text, but it sets the advance to the width
-- of the drawing. So the cursor doesn't affect layout too much, make it as
-- thin as possible and make it appear to be 1px wide by giving it 0.5px
-- horizontal borders.
local cheight = opts.font_size * 8
local cglyph = '{\\r' ..
'\\1a&H44&\\3a&H44&\\4a&H99&' ..
'\\1c&Heeeeee&\\3c&Heeeeee&\\4c&H000000&' ..
'\\xbord0.5\\ybord0\\xshad0\\yshad1\\p4\\pbo24}' ..
'm 0 0 l 1 0 l 1 ' .. cheight .. ' l 0 ' .. cheight ..
'{\\p0}'
local before_cur = ass_escape(line:sub(1, cursor - 1))
local after_cur = ass_escape(line:sub(cursor))
ass:new_event()
ass:an(1)
ass:pos(2, screeny - 2 - global_margin_y * screeny)
if (#queue == 2) then ass:append(queue_style .. string.format("There is 1 more request queued\\N"))
elseif (#queue > 2) then ass:append(queue_style .. string.format("There are %d more requests queued\\N", #queue-1)) end
ass:append(style .. request.text .. '\\N')
ass:append('> ' .. before_cur)
ass:append(cglyph)
ass:append(style .. after_cur)
-- Redraw the cursor with the REPL text invisible. This will make the
-- cursor appear in front of the text.
ass:new_event()
ass:an(1)
ass:pos(2, screeny - 2)
ass:append(style .. '{\\alpha&HFF&}> ' .. before_cur)
ass:append(cglyph)
ass:append(style .. '{\\alpha&HFF&}' .. after_cur)
mp.set_osd_ass(screenx, screeny, ass.text)
end
-- Naive helper function to find the next UTF-8 character in 'str' after 'pos'
-- by skipping continuation bytes. Assumes 'str' contains valid UTF-8.
local function next_utf8(str, pos)
if pos > str:len() then return pos end
repeat
pos = pos + 1
until pos > str:len() or str:byte(pos) < 0x80 or str:byte(pos) > 0xbf
return pos
end
-- As above, but finds the previous UTF-8 charcter in 'str' before 'pos'
local function prev_utf8(str, pos)
if pos <= 1 then return pos end
repeat
pos = pos - 1
until pos <= 1 or str:byte(pos) < 0x80 or str:byte(pos) > 0xbf
return pos
end
-- Insert a character at the current cursor position (any_unicode)
local function handle_char_input(c)
if insert_mode then
line = line:sub(1, cursor - 1) .. c .. line:sub(next_utf8(line, cursor))
else
line = line:sub(1, cursor - 1) .. c .. line:sub(cursor)
end
cursor = cursor + #c
update()
end
-- Remove the character behind the cursor (Backspace)
local function handle_backspace()
if cursor <= 1 then return end
local prev = prev_utf8(line, cursor)
line = line:sub(1, prev - 1) .. line:sub(cursor)
cursor = prev
update()
end
-- Remove the character in front of the cursor (Del)
local function handle_del()
if cursor > line:len() then return end
line = line:sub(1, cursor - 1) .. line:sub(next_utf8(line, cursor))
update()
end
-- Toggle insert mode (Ins)
local function handle_ins()
insert_mode = not insert_mode
end
-- Move the cursor to the next character (Right)
local function next_char(amount)
cursor = next_utf8(line, cursor)
update()
end
-- Move the cursor to the previous character (Left)
local function prev_char(amount)
cursor = prev_utf8(line, cursor)
update()
end
-- Clear the current line (Ctrl+C)
local function clear()
line = ''
cursor = 1
insert_mode = false
request.history.pos = #request.history.list + 1
update()
end
-- Close the REPL if the current line is empty, otherwise do nothing (Ctrl+D)
local function maybe_exit()
if line == '' then
else
handle_del()
end
end
local function handle_esc()
coroutine.resume(co, {
line = nil,
err = "exited"
})
end
-- Run the current command and clear the line (Enter)
local function handle_enter()
if request.history.list[#request.history.list] ~= line and line ~= "" then
request.history.list[#request.history.list + 1] = line
end
coroutine.resume(co, {
line = line
})
end
-- Go to the specified position in the command history
local function go_history(new_pos)
local old_pos = request.history.pos
request.history.pos = new_pos
-- Restrict the position to a legal value
if request.history.pos > #request.history.list + 1 then
request.history.pos = #request.history.list + 1
elseif request.history.pos < 1 then
request.history.pos = 1
end
-- Do nothing if the history position didn't actually change
if request.history.pos == old_pos then
return
end
-- If the user was editing a non-history line, save it as the last history
-- entry. This makes it much less frustrating to accidentally hit Up/Down
-- while editing a line.
if old_pos == #request.history.list + 1 and line ~= '' and request.history.list[#request.history.list] ~= line then
request.history.list[#request.history.list + 1] = line
end
-- Now show the history line (or a blank line for #history + 1)
if request.history.pos <= #request.history.list then
line = request.history.list[request.history.pos]
else
line = ''
end
cursor = line:len() + 1
insert_mode = false
update()
end
-- Go to the specified relative position in the command history (Up, Down)
local function move_history(amount)
go_history(request.history.pos + amount)
end
-- Go to the first command in the command history (PgUp)
local function handle_pgup()
go_history(1)
end
-- Stop browsing history and start editing a blank line (PgDown)
local function handle_pgdown()
go_history(#request.history.list + 1)
end
-- Move to the start of the current word, or if already at the start, the start
-- of the previous word. (Ctrl+Left)
local function prev_word()
-- This is basically the same as next_word() but backwards, so reverse the
-- string in order to do a "backwards" find. This wouldn't be as annoying
-- to do if Lua didn't insist on 1-based indexing.
cursor = line:len() - select(2, line:reverse():find('%s*[^%s]*', line:len() - cursor + 2)) + 1
update()
end
-- Move to the end of the current word, or if already at the end, the end of
-- the next word. (Ctrl+Right)
local function next_word()
cursor = select(2, line:find('%s*[^%s]*', cursor)) + 1
update()
end
-- Move the cursor to the beginning of the line (HOME)
local function go_home()
cursor = 1
update()
end
-- Move the cursor to the end of the line (END)
local function go_end()
cursor = line:len() + 1
update()
end
-- Delete from the cursor to the beginning of the word (Ctrl+Backspace)
local function del_word()
local before_cur = line:sub(1, cursor - 1)
local after_cur = line:sub(cursor)
before_cur = before_cur:gsub('[^%s]+%s*$', '', 1)
line = before_cur .. after_cur
cursor = before_cur:len() + 1
update()
end
-- Delete from the cursor to the end of the word (Ctrl+Del)
local function del_next_word()
if cursor > line:len() then return end
local before_cur = line:sub(1, cursor - 1)
local after_cur = line:sub(cursor)
after_cur = after_cur:gsub('^%s*[^%s]+', '', 1)
line = before_cur .. after_cur
update()
end
-- Delete from the cursor to the end of the line (Ctrl+K)
local function del_to_eol()
line = line:sub(1, cursor - 1)
update()
end
-- Delete from the cursor back to the start of the line (Ctrl+U)
local function del_to_start()
line = line:sub(cursor)
cursor = 1
update()
end
-- Returns a string of UTF-8 text from the clipboard (or the primary selection)
local function get_clipboard(clip)
if platform == 'x11' then
local res = utils.subprocess({
args = { 'xclip', '-selection', clip and 'clipboard' or 'primary', '-out' },
playback_only = false,
})
if not res.error then
return res.stdout
end
elseif platform == 'wayland' then
local res = utils.subprocess({
args = { 'wl-paste', clip and '-n' or '-np' },
playback_only = false,
})
if not res.error then
return res.stdout
end
elseif platform == 'windows' then
local res = utils.subprocess({
args = { 'powershell', '-NoProfile', '-Command', [[& {
Trap {
Write-Error -ErrorRecord $_
Exit 1
}
$clip = ""
if (Get-Command "Get-Clipboard" -errorAction SilentlyContinue) {
$clip = Get-Clipboard -Raw -Format Text -TextFormatType UnicodeText
} else {
Add-Type -AssemblyName PresentationCore
$clip = [Windows.Clipboard]::GetText()
}
$clip = $clip -Replace "`r",""
$u8clip = [System.Text.Encoding]::UTF8.GetBytes($clip)
[Console]::OpenStandardOutput().Write($u8clip, 0, $u8clip.Length)
}]] },
playback_only = false,
})
if not res.error then
return res.stdout
end
elseif platform == 'macos' then
local res = utils.subprocess({
args = { 'pbpaste' },
playback_only = false,
})
if not res.error then
return res.stdout
end
end
return ''
end
-- Paste text from the window-system's clipboard. 'clip' determines whether the
-- clipboard or the primary selection buffer is used (on X11 and Wayland only.)
local function paste(clip)
local text = get_clipboard(clip)
local before_cur = line:sub(1, cursor - 1)
local after_cur = line:sub(cursor)
line = before_cur .. text .. after_cur
cursor = cursor + text:len()
update()
end
-- List of input bindings. This is a weird mashup between common GUI text-input
-- bindings and readline bindings.
local function get_bindings()
local bindings = {
{ 'esc', handle_esc },
{ 'enter', handle_enter },
{ 'kp_enter', handle_enter },
{ 'shift+enter', function() handle_char_input('\n') end },
{ 'ctrl+j', handle_enter },
{ 'ctrl+m', handle_enter },
{ 'bs', handle_backspace },
{ 'shift+bs', handle_backspace },
{ 'ctrl+h', handle_backspace },
{ 'del', handle_del },
{ 'shift+del', handle_del },
{ 'ins', handle_ins },
{ 'shift+ins', function() paste(false) end },
{ 'mbtn_mid', function() paste(false) end },
{ 'left', function() prev_char() end },
{ 'ctrl+b', function() prev_char() end },
{ 'right', function() next_char() end },
{ 'ctrl+f', function() next_char() end },
{ 'up', function() move_history(-1) end },
{ 'ctrl+p', function() move_history(-1) end },
{ 'wheel_up', function() move_history(-1) end },
{ 'down', function() move_history(1) end },
{ 'ctrl+n', function() move_history(1) end },
{ 'wheel_down', function() move_history(1) end },
{ 'wheel_left', function() end },
{ 'wheel_right', function() end },
{ 'ctrl+left', prev_word },
{ 'alt+b', prev_word },
{ 'ctrl+right', next_word },
{ 'alt+f', next_word },
{ 'ctrl+a', go_home },
{ 'home', go_home },
{ 'ctrl+e', go_end },
{ 'end', go_end },
{ 'pgup', handle_pgup },
{ 'pgdwn', handle_pgdown },
{ 'ctrl+c', clear },
{ 'ctrl+d', maybe_exit },
{ 'ctrl+k', del_to_eol },
{ 'ctrl+u', del_to_start },
{ 'ctrl+v', function() paste(true) end },
{ 'meta+v', function() paste(true) end },
{ 'ctrl+bs', del_word },
{ 'ctrl+w', del_word },
{ 'ctrl+del', del_next_word },
{ 'alt+d', del_next_word },
{ 'kp_dec', function() handle_char_input('.') end },
}
for i = 0, 9 do
bindings[#bindings + 1] =
{'kp' .. i, function() handle_char_input('' .. i) end}
end
return bindings
end
local function text_input(info)
if info.key_text and (info.event == "press" or info.event == "down"
or info.event == "repeat")
then
handle_char_input(info.key_text)
end
end
local function define_key_bindings()
if #key_bindings > 0 then
return
end
for _, bind in ipairs(get_bindings()) do
-- Generate arbitrary name for removing the bindings later.
local name = "_userinput_" .. bind[1]
key_bindings[#key_bindings + 1] = name
mp.add_forced_key_binding(bind[1], name, bind[2], {repeatable = true})
end
mp.add_forced_key_binding("any_unicode", "_userinput_text", text_input,
{repeatable = true, complex = true})
key_bindings[#key_bindings + 1] = "_userinput_text"
end
local function undefine_key_bindings()
for _, name in ipairs(key_bindings) do
mp.remove_key_binding(name)
end
key_bindings = {}
end
-- Set the REPL visibility ("enable", Esc)
local function set_active(active)
if active == repl_active then return end
if active then
repl_active = true
insert_mode = false
define_key_bindings()
else
clear()
repl_active = false
undefine_key_bindings()
collectgarbage()
end
update()
end
mp.observe_property("user-data/osc/margins", "native", function(_, val)
if val then
global_margins = val
else
global_margins = { t = 0, b = 0 }
end
update()
end)
-- Redraw the REPL when the OSD size changes. This is needed because the
-- PlayRes of the OSD will need to be adjusted.
mp.observe_property('osd-width', 'native', update)
mp.observe_property('osd-height', 'native', update)
mp.observe_property('display-hidpi-scale', 'native', update)
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
-------------------------------END ORIGINAL MPV CODE------------------------------------
--[[
sends a response to the original script in the form of a json string
it is expected that all requests get a response, if the input is nil then err should say why
current error codes are:
exited the user closed the input instead of pressing Enter
already_queued a request with the specified id was already in the queue
cancelled a script cancelled the request
replace replaced by another request
]]
local function send_response(res)
if res.source then
mp.commandv("script-message-to", res.source, res.response, (utils.format_json(res)))
else
mp.commandv("script-message", res.response, (utils.format_json(res)))
end
end
-- push new request onto the queue
-- if a request with the same id already exists and the queueable flag is not enabled then
-- a nil result will be returned to the function
function push_request(req)
if active_ids[req.id] then
if req.replace then
for i, q_req in ipairs(queue) do
if q_req.id == req.id then
send_response{ err = "replaced", response = q_req.response, source = q_req.source }
queue[i] = req
if i == 1 then request = req end
end
end
update()
return
end
if not req.queueable then
send_response{ err = "already_queued", response = req.response, source = req.source }
return
end
end
table.insert(queue, req)
active_ids[req.id] = (active_ids[req.id] or 0) + 1
if #queue == 1 then coroutine.resume(co) end
update()
end
-- safely removes an item from the queue and updates the set of active requests
function remove_request(index)
local req = table.remove(queue, index)
active_ids[req.id] = active_ids[req.id] - 1
if active_ids[req.id] == 0 then active_ids[req.id] = nil end
return req
end
--an infinite loop that moves through the request queue
--uses a coroutine to handle asynchronous operations
local function driver()
while (true) do
while queue[1] do
request = queue[1]
line = request.default_input
cursor = request.cursor_pos
if repl_active then update()
else set_active(true) end
res = coroutine.yield()
if res then
res.source, res.response = request.source, request.response
send_response(res)
remove_request(1)
end
end
set_active(false)
coroutine.yield()
end
end
co = coroutine.create(driver)
--cancels any input request that returns true for the given predicate function
local function cancel_input_request(pred)
for i = #queue, 1, -1 do
if pred(i) then
req = remove_request(i)
send_response{ err = "cancelled", response = req.response, source = req.source }
--if we're removing the first item then that means the coroutine is waiting for a response
--we will need to tell the coroutine to resume, upon which it will move to the next request
--if there is something in the buffer then save it to the history before erasing it
if i == 1 then
local old_line = line
if old_line ~= "" then table.insert(histories[req.id].list, old_line) end
clear()
coroutine.resume(co)
end
end
end
end
mp.register_script_message("cancel-user-input/uid", function(uid)
cancel_input_request(function(i) return queue[i].response == uid end)
end)
-- removes all requests with the specified id from the queue
mp.register_script_message("cancel-user-input/id", function(id)
cancel_input_request(function(i) return queue[i].id == id end)
end)
-- ensures a request has the correct fields and is correctly formatted
local function format_request_fields(req)
assert(req.version, "input requests require an API version string")
if not string.find(req.version, API_MAJOR_MINOR, 1, true) then
error(("input request has invalid version: expected %s.x, got %s"):format(API_MAJOR_MINOR, req.version))
end
assert(req.response, "input requests require a response string")
assert(req.id, "input requests require an id string")
req.text = ass_escape(req.request_text or "")
req.default_input = req.default_input or ""
req.cursor_pos = tonumber(req.cursor_pos) or 1
req.id = req.id or "mpv"
if req.cursor_pos ~= 1 then
if req.cursor_pos < 1 then req.cursor_pos = 1
elseif req.cursor_pos > #req.default_input then req.cursor_pos = #req.default_input + 1 end
end
if not histories[req.id] then histories[req.id] = {pos = 1, list = {}} end
req.history = histories[req.id]
return req
end
-- updates the fields of a specific request
mp.register_script_message("update-user-input/uid", function(uid, req_opts)
req_opts = utils.parse_json(req_opts)
req_opts.response = uid
for i, req in ipairs(queue) do
if req.response == uid then
local success, result = pcall(format_request_fields, req_opts)
if not success then return msg.error(result) end
queue[i] = result
if i == 1 then request = queue[1] end
update()
return
end
end
end)
--the function that parses the input requests
local function input_request(req)
req = format_request_fields(req)
push_request(req)
end
-- script message to recieve input requests, get-user-input.lua acts as an interface to call this script message
mp.register_script_message("request-user-input", function(req)
msg.debug(req)
req = utils.parse_json(req)
local success, err = pcall(input_request, req)
if not success then
send_response{ err = err, response = req.response, source = req.source}
msg.error(err)
end
end)
================================================
FILE: .config/nano/nanorc
================================================
## Sample initialization file for GNU nano.
##
## For the options that take parameters, the default value is shown.
## Other options are unset by default. To make sure that an option
## is disabled, you can use "unset <option>".
##
## Characters that are special in a shell should not be escaped here.
## Inside string parameters, quotes should not be escaped -- the last
## double quote on the line will be seen as the closing quote.
## Make 'nextword' (Ctrl+Right) and 'chopwordright' (Ctrl+Delete)
## stop at word ends instead of at beginnings.
# set afterends
## When soft line wrapping is enabled, make it wrap lines at blanks
## (tabs and spaces) instead of always at the edge of the screen.
set atblanks
## Automatically indent a newly created line to the same number of
## tabs and/or spaces as the preceding line -- or as the next line
## if the preceding line is the beginning of a paragraph.
set autoindent
## Back up files to the current filename plus a tilde.
# set backup
## The directory to put unique backup files in.
# set backupdir ""
## Use bold text instead of reverse video text.
# set boldtext
## Treat any line with leading whitespace as the beginning of a paragraph.
# set bookstyle
## The characters treated as closing brackets when justifying paragraphs.
## This may not include any blank characters. Only closing punctuation,
## optionally followed by these closing brackets, can end sentences.
# set brackets ""')>]}"
## Automatically hard-wrap the current line when it becomes overlong.
# set breaklonglines
## Do case-sensitive searches by default.
# set casesensitive
## Constantly display the cursor position in the status bar or minibar.
# set constantshow
## Use cut-from-cursor-to-end-of-line by default.
# set cutfromcursor
## Do not use the line below the title bar, leaving it entirely blank.
# set emptyline
## Set the target width for automatic hard-wrapping and for justifying
## paragraphs. If the specified value is 0 or less, the wrapping point
## will be the terminal's width minus this number.
# set fill -8
## Draw a vertical stripe at the given column, to help judge text width.
## (This option does not have a default value.)
# set guidestripe 75
## Remember the used search/replace strings for the next session.
set historylog
## Display a "scrollbar" on the righthand side of the edit window.
# set indicator
## Scroll the buffer contents per half-screen instead of per line.
# set jumpyscrolling
## Display line numbers to the left (and any anchors in the margin).
set linenumbers
## Enable vim-style lock-files. This is just to let a vim user know you
## are editing a file [s]he is trying to edit and vice versa. There are
## no plans to implement vim-style undo state in these files.
set locking
## Fall back to slow libmagic to try and determine an applicable syntax.
# set magic
## The opening and closing brackets that are found by a matching-bracket
## search. This may not contain blank characters. The opening brackets
## must come before the closing ones, and they must be in the same order.
# set matchbrackets "(<[{)>]}"
## Suppress the title bar and show the filename plus a cursor-position
## percentage in the space of the status bar.
set minibar
## Enable mouse support, if available for your system. When enabled,
## mouse clicks can be used to place the cursor, set the mark (with a
## double click), and execute shortcuts. The mouse will work in the
## X Window System, and on the console when gpm is running.
set mouse
## Switch on multiple file buffers (inserting a file will put it into
## a separate buffer).
set multibuffer
## Don't convert files from DOS/Mac format.
# set noconvert
## Don't display the helpful shortcut lists at the bottom of the screen.
set nohelp
## Don't automatically add a newline when a file does not end with one.
# set nonewlines
## Set operating directory. nano will not read or write files outside
## this directory and its subdirectories. Also, the current directory
## is changed to here, so any files are inserted from this dir. A blank
## string means the operating-directory feature is turned off.
# set operatingdir ""
## Remember the cursor position in each file for the next editing session.
# set positionlog
## Preserve the XON and XOFF keys (^Q and ^S).
# set preserve
## The characters treated as closing punctuation when justifying paragraphs.
## This may not contain blank characters. Only these closing punctuations,
## optionally followed by closing brackets, can end sentences.
# set punct "!.?"
## Make status-bar messages disappear after 1 keystroke instead of after 20.
# set quickblank
## The regular expression that matches quoting characters in email
## or line-comment introducers in source code. The default is:
# set quotestr "^([ ]*([!#%:;>|}]|//))+"
## Try to work around a mismatching terminfo terminal description.
# set rawsequences
## Fix Backspace/Delete confusion problem.
# set rebinddelete
## Do regular-expression searches by default.
## Regular expressions are of the extended type (ERE).
# set regexp
## Save a changed buffer automatically on exit; don't prompt.
# set saveonexit
## Put the cursor on the highlighted item in the file browser, and
## show the cursor in the help viewer; useful for people who use a
## braille display and people with poor vision.
# set showcursor
## Make the Home key smarter: when Home is pressed anywhere but at the
## very beginning of non-whitespace characters on a line, the cursor
## will jump to that beginning (either forwards or backwards). If the
## cursor is already at that position, it will jump to the true start
## of the line (the left edge).
# set smarthome
## Spread overlong lines over multiple screen lines.
set softwrap
## Use this spelling checker instead of the internal one. This option
## does not have a default value.
# set speller "aspell -x -c"
## Use the end of the title bar for some state flags: I = auto-indenting,
## M = mark, L = hard-wrapping long lines, R = recording, S = soft-wrapping.
set stateflags
## Use this tab size instead of the default; it must be greater than 0.
# set tabsize 8
## Convert each typed tab to the fitting number of spaces.
# set tabstospaces
## Snip whitespace at the end of lines when justifying or hard-wrapping.
# set trimblanks
## Save files by default in Unix format (also when they were DOS or Mac).
# set unix
## The two single-column characters used to display the first characters
## of tabs and spaces. 187 in ISO 8859-1 (0000BB in Unicode) and 183 in
## ISO-8859-1 (0000B7 in Unicode) seem to be good values for these.
## The default when in a UTF-8 locale:
# set whitespace "»·"
## The default otherwise:
# set whitespace ">."
## Detect word boundaries differently by treating punctuation
## characters as parts of words.
# set wordbounds
## The characters (besides alphanumeric ones) that should be considered
## as parts of words. This option does not have a default value. When
## set, it overrides option 'set wordbounds'.
# set wordchars "<_>."
## Let an unmodified Backspace or Delete erase the marked region (instead
## of a single character, and without affecting the cutbuffer).
# set zap
## Hide the bars plus help lines and use the whole terminal as edit area.
# set zero
## Paint the interface elements of nano. These are examples; there are
## no colors by default, except for errorcolor and spotlightcolor.
# set titlecolor bold,white,blue
# set promptcolor lightwhite,grey
# set statuscolor bold,white,green
# set errorcolor bold,white,red
# set spotlightcolor black,lightyellow
# set selectedcolor lightwhite,magenta
# set stripecolor ,yellow
# set scrollercolor cyan
# set numbercolor cyan
# set keycolor cyan
# set functioncolor green
## In root's .nanorc you might want to use:
# set titlecolor bold,white,magenta
# set promptcolor black,yellow
# set statuscolor bold,white,magenta
# set errorcolor bold,white,red
# set spotlightcolor black,orange
# set selectedcolor lightwhite,cyan
# set stripecolor ,yellow
# set scrollercolor magenta
# set numbercolor magenta
# set keycolor lightmagenta
# set functioncolor magenta
## === Syntax coloring ===
## For all details, see 'man nanorc', section SYNTAX HIGHLIGHTING.
## To include most of the existing syntax definitions, you can do:
include "/usr/share/nano/*.nanorc"
## Or you can select just the ones you need. For example:
# include "/usr/share/nano/html.nanorc"
# include "/usr/share/nano/python.nanorc"
# include "/usr/share/nano/sh.nanorc"
## In /usr/share/nano/extra/ you can find some syntaxes that are
## specific for certain distros or for some less common languages.
## If <Tab> should always produce four spaces when editing a Python file,
## independent of the settings of 'tabsize' and 'tabstospaces':
# extendsyntax python tabgives " "
## If <Tab> should always produce an actual TAB when editing a Makefile:
# extendsyntax makefile tabgives " "
## === Key bindings ===
## For all details, see 'man nanorc', section REBINDING KEYS.
## If you want to suspend nano with one keystroke (instead of with ^T^Z):
# bind ^Z suspend main
## The <Ctrl+Delete> keystroke deletes the word to the right of the cursor.
## On some terminals the <Ctrl+Backspace> keystroke produces ^H, which is
## the ASCII character for backspace, so it is bound by default to the
## backspace function. The <Backspace> key itself produces a different
## keycode, which is hard-bound to the backspace function. So, if you
## normally use <Backspace> for backspacing and not ^H, you can make
## <Ctrl+Backspace> delete the word to the left of the cursor with:
# bind ^H chopwordleft main
## For a more mnemonic Comment keystroke (overriding Cut-from-cursor):
# bind M-K comment main
## If you want ^L to just refresh the screen and not center the cursor:
# bind ^L refresh main
## When you sometimes type M-J instead of M-K, or M-T instead of M-R:
# unbind M-J main
# unbind M-T main
## (Those functions are still accessible through ^T^J and ^T^V.)
## For quickly uppercasing or lowercasing the word under or after the cursor.
## (These effectively select a word and pipe it through a sed command.)
# bind Sh-M-U "Oc[1;6D|sed 's/.*/\U&/'
# bind Sh-M-L "Oc[1;6D|sed 's/.*/\L&/'
## For copying a marked region to the system clipboard:
# bind Sh-M-T "{execute}|xsel -ib{enter}{undo}" main
## For snipping trailing blanks when you save a file:
# bind ^S "{execute}| sed 's/\s\+$//' {enter}{savefile}" main
# bind Sh-M-T "|xsel -ib
## If you would like nano to have keybindings that are more "usual",
## such as ^O for Open, ^F for Find, ^H for Help, and ^Q for Quit,
## then uncomment these:
#bind ^X cut main
bind ^C copy main
bind ^V paste all
#bind ^Q exit all
bind ^S savefile main
bind ^W writeout main
#bind ^O insert main
#set multibuffer
#bind ^H help all
#bind ^H exit help
bind ^F whereis all
#bind ^G findnext all
#bind ^B wherewas all
#bind ^D findprevious all
#bind ^R replace main
#unbind ^U all
#unbind ^N main
#unbind ^Y all
#unbind M-J main
#unbind M-T main
#bind ^A mark main
#bind ^P location main
#bind ^T gotoline main
#bind ^T gotodir browser
#bind ^T cutrestoffile execute
#bind ^L linter execute
#bind ^E execute main
#bind ^K "{mark}{end}{zap}" main
#bind ^U "{mark}{home}{zap}" main
bind ^Z undo main
bind ^Y redo main
================================================
FILE: .config/niri/config.kdl
================================================
prefer-no-csd
// Includes
include "outputs.kdl"
include "layout.kdl"
include "dms.kdl"
include "keybinds.kdl"
include "rules.kdl"
// Input & Cursor (core, stay inline)
input {
keyboard {
xkb {
layout "us,fr"
options "grp:rctrl_rshift_toggle,numpad:mac,compose:ralt"
}
}
touchpad {
tap
accel-speed 0.2
accel-profile "adaptive"
scroll-method "two-finger"
}
mouse {
accel-profile "flat"
}
tablet {
map-to-output "DP-2"
}
}
cursor {
xcursor-theme "Kaela-Kovalskia-v2"
xcursor-size 24
}
// Core spawns & globals
spawn-at-startup "xwayland-satellite"
environment {
DISPLAY ":0"
}
spawn-at-startup "~/.config/autostart/autostart"
screenshot-path "~/Pictures/grim/%Y-%m-%d %H-%M-%S.png"
hotkey-overlay {
skip-at-startup
}
config-notification {
disable-failed
}
debug {
honor-xdg-activation-with-invalid-serial
}
================================================
FILE: .config/niri/dms.kdl
================================================
spawn-at-startup "dms" "run"
binds {
Mod+D hotkey-overlay-title="Application Launcher" {
spawn "dms" "ipc" "call" "spotlight" "toggle"
}
Mod+comma hotkey-overlay-title="Clipboard Manager" {
spawn "dms" "ipc" "call" "clipboard" "toggle"
}
Mod+M hotkey-overlay-title="Task Manager" {
spawn "dms" "ipc" "call" "processlist" "toggle"
}
Mod+N hotkey-overlay-title="Notification Center" {
spawn "dms" "ipc" "call" "notifications" "toggle"
}
Mod+P hotkey-overlay-title="Notepad" {
spawn "dms" "ipc" "call" "notepad" "toggle"
}
Super+Alt+L hotkey-overlay-title="Lock Screen" {
spawn "dms" "ipc" "call" "lock" "lock"
}
Mod+X hotkey-overlay-title="Power Menu" {
spawn "dms" "ipc" "call" "powermenu" "toggle"
}
Mod+Y hotkey-overlay-title="Browse Wallpapers" {
spawn "dms" "ipc" "call" "dankdash" "wallpaper"
}
XF86AudioRaiseVolume allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "increment" "3"
}
XF86AudioLowerVolume allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "decrement" "3"
}
XF86AudioMute allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "mute"
}
XF86AudioMicMute allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "micmute"
}
XF86MonBrightnessUp allow-when-locked=true {
spawn "dms" "ipc" "call" "brightness" "increment" "5" ""
}
XF86MonBrightnessDown allow-when-locked=true {
spawn "dms" "ipc" "call" "brightness" "decrement" "5" ""
}
Mod+Shift+N allow-when-locked=true {
spawn "dms" "ipc" "call" "night" "toggle"
}
}
================================================
FILE: .config/niri/keybinds.kdl
================================================
binds {
// Personal
Mod+Return { spawn "alacritty"; }
F10 { spawn "~/.config/niri/scripts/obs-replay"; }
// Niri Actions
Mod+Shift+Q { close-window; }
Mod+Tab { toggle-overview; }
Mod+Shift+Slash { show-hotkey-overlay; }
Mod+T { toggle-column-tabbed-display; }
Mod+Shift+E { quit; }
Ctrl+Alt+Delete { quit; }
Mod+Shift+P { power-off-monitors; }
// Float
Mod+V { toggle-window-floating; }
Mod+Shift+V { switch-focus-between-floating-and-tiling; }
// Focus - Window/Columns
Mod+Left { focus-column-left; }
Mod+Down { focus-window-down; }
Mod+Up { focus-window-up; }
Mod+Right { focus-column-right; }
Mod+H { focus-column-left; }
Mod+J { focus-window-down; }
Mod+K { focus-window-up; }
Mod+L { focus-column-right; }
Mod+Home { focus-column-first; }
Mod+End { focus-column-last; }
// Focus - Workspace
Mod+1 { focus-workspace 1; }
Mod+2 { focus-workspace 2; }
Mod+3 { focus-workspace 3; }
Mod+4 { focus-workspace 4; }
Mod+5 { focus-workspace 5; }
Mod+6 { focus-workspace 6; }
Mod+7 { focus-workspace 7; }
Mod+8 { focus-workspace 8; }
Mod+9 { focus-workspace 9; }
Mod+Page_Down { focus-workspace-down; }
Mod+Page_Up { focus-workspace-up; }
// Focus - Monitor
Ctrl+Left { focus-monitor-left; }
Ctrl+Down { focus-monitor-down; }
Ctrl+Up { focus-monitor-up; }
Ctrl+Right { focus-monitor-right; }
// Move - Window/Column
Mod+Shift+Left { move-column-left; }
Mod+Shift+Down { move-window-down; }
Mod+Shift+Up { move-window-up; }
Mod+Shift+Right { move-column-right; }
Mod+Shift+H { move-column-left; }
Mod+Shift+J { move-window-down; }
Mod+Shift+K { move-window-up; }
Mod+Shift+L { move-column-right; }
Mod+Ctrl+Home { move-column-to-first; }
Mod+Ctrl+End { move-column-to-last; }
// Move - Workspace
Mod+Shift+1 { move-column-to-workspace 1; }
Mod+Shift+2 { move-column-to-workspace 2; }
Mod+Shift+3 { move-column-to-workspace 3; }
Mod+Shift+4 { move-column-to-workspace 4; }
Mod+Shift+5 { move-column-to-workspace 5; }
Mod+Shift+6 { move-column-to-workspace 6; }
Mod+Shift+7 { move-column-to-workspace 7; }
Mod+Shift+8 { move-column-to-workspace 8; }
Mod+Shift+9 { move-column-to-workspace 9; }
Alt+Up { move-column-to-workspace-up; }
Alt+Down { move-column-to-workspace-down; }
Alt+Left { consume-or-expel-window-left; }
Alt+Right { consume-or-expel-window-right; }
// Move - Monitor
Shift+Ctrl+Left { move-column-to-monitor-left; }
Shift+Ctrl+Down { move-column-to-monitor-down; }
Shift+Ctrl+Up { move-column-to-monitor-up; }
Shift+Ctrl+Right { move-column-to-monitor-right; }
// Consume/Expel
Mod+BracketLeft { consume-window-into-column; }
Mod+BracketRight { expel-window-from-column; }
// Size
Mod+F { maximize-column; }
Mod+Shift+F { fullscreen-window; }
Mod+Ctrl+F { expand-column-to-available-width; }
Mod+Alt+F { toggle-windowed-fullscreen; }
Mod+R { switch-preset-column-width; }
Mod+Shift+R { switch-preset-window-height; }
Mod+Ctrl+R { reset-window-height; }
Mod+C { center-column; }
Mod+Minus { set-column-width "-10%"; }
Mod+Equal { set-column-width "+10%"; }
Mod+Shift+Minus { set-window-height "-10%"; }
Mod+Shift+Equal { set-window-height "+10%"; }
// Mouse
Mod+Alt+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
Mod+Alt+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
Mod+WheelScrollRight { focus-column-right; }
Mod+WheelScrollLeft { focus-column-left; }
Mod+Shift+WheelScrollRight { move-column-right; }
Mod+Shift+WheelScrollLeft { move-column-left; }
Mod+WheelScrollDown { focus-column-right; }
Mod+WheelScrollUp { focus-column-left; }
Mod+Shift+WheelScrollDown { move-column-right; }
Mod+Shift+WheelScrollUp { move-column-left; }
// Screenshots
Print { screenshot; }
Mod+Shift+S { screenshot; }
Mod+Print { screenshot-screen; }
Alt+Print { screenshot-window; }
}
================================================
FILE: .config/niri/layout.kdl
================================================
layout {
gaps 3.5
center-focused-column "never"
always-center-single-column
preset-column-widths {
proportion 0.33333
proportion 0.5
proportion 0.66667
}
default-column-width { proportion 0.5; }
focus-ring {
off
width 1.5
active-color "#d5c4a1"
inactive-color "#282828"
}
border {
off
width 2
active-color "#d5c4a1"
inactive-color "#282828"
}
tab-indicator {
hide-when-single-tab
place-within-column
gap 2
width 8
length total-proportion=0.5
position "left"
gaps-between-tabs 8
corner-radius 5
active-color "#d5c4a1"
inactive-color "#282828"
urgent-color "blue"
}
insert-hint {
// off
on
color "#ffc87f80"
// gradient from="#ffbb6680" to="#ffc88080" angle=45 relative-to="workspace-view"
}
}
overview {
zoom 0.50
backdrop-color "#282828"
}
recent-windows {
debounce-ms 750
open-delay-ms 50
highlight {
active-color "#999999ff"
urgent-color "#ff9999ff"
padding 30
corner-radius 8
}
previews {
max-height 480
max-scale 0.5
}
binds {
Alt+Tab { next-window; }
Alt+Shift+Tab { previous-window; }
Alt+grave { next-window filter="app-id"; }
Alt+Shift+grave { previous-window filter="app-id"; }
}
}
================================================
FILE: .config/niri/outputs.kdl
================================================
output "DP-2" {
mode "1920x1080@120.000"
scale 1.0
transform "normal"
position x=1080 y=840
variable-refresh-rate on-demand=true
focus-at-startup
}
output "HDMI-A-1" {
mode "1920x1080@60.000"
scale 1.0
transform "270"
position x=-0 y=0
variable-refresh-rate on-demand=true
}
output "eDP-1" {
mode "1920x1200@60.003"
scale 1.25
variable-refresh-rate on-demand=true
}
================================================
FILE: .config/niri/rules.kdl
================================================
window-rule {
geometry-corner-radius 8
clip-to-geometry true
draw-border-with-background false
}
window-rule {
match app-id="alacritty"
default-column-width {
proportion 0.5
}
}
window-rule {
match app-id="chatterino"
match app-id="com.chatterino.chatterino"
default-column-width {
proportion 0.298
}
}
window-rule {
match app-id="pcmanfm-qt"
match app-id="dolphin$"
match app-id="librewolf$"
match app-id="firefox$"
open-maximized true
default-column-width {
proportion 1.0;
}
}
window-rule {
match app-id="librewolf$"
match app-id="pcmanfm-qt"
match app-id="com.chatterino.chatterino"
match app-id="spotube"
//opacity 0.95
}
window-rule {
match app-id="firefox$" title="^Picture-in-Picture$"
match app-id="librewolf$" title="^Picture-in-Picture$"
open-floating true
default-floating-position x=16 y=16 relative-to="bottom-left"
}
window-rule {
match app-id=r#"xdg-desktop-portal-.*"#
match title=r#"(?i)dialog"#
match title=r#"^Extension: "#
match title=r#"^File Properties"#
open-floating true
default-column-width {
proportion 0.65
}
default-window-height {
proportion 0.35
}
}
window-rule {
match app-id=r#"^steam_app_.*$"#
match app-id="gamescope"
// This catches Wine/Proton games:
match app-id=r#".*\.exe$"#
match title=r#"(?i)emulator|yuzu|ryujinx|pcsx2|rpcs3|edin|dolphin|retroarch"#
variable-refresh-rate true
}
================================================
FILE: .config/niri/scripts/obs-replay
================================================
#!/bin/sh
/home/lyes/Videos/rec/pipobs/bin/python3 /home/lyes/Videos/rec/pipobs/replay.py
================================================
FILE: .config/niri/scripts/waybar
================================================
#!/bin/sh
waybar -c "$HOME/.config/waybar/stacking-config" -s "$HOME/.config/waybar/style.css" >/dev/null 2>&1 &
================================================
FILE: .config/nvim/init.lua
================================================
require("speyll.settings")
require("speyll.remap")
require("speyll.commands")
require("speyll.lazy")
================================================
FILE: .config/nvim/lua/speyll/commands.lua
================================================
-- Trim trailing whitespace from the current file
vim.api.nvim_create_user_command(
'TrimWhitespace',
function()
local save_search = vim.fn.getreg('/')
vim.cmd([[%s/\s\+$//e]])
vim.fn.setreg('/', save_search)
end,
{}
)
-- Toggle spell checking in the current buffer
vim.api.nvim_create_user_command(
'ToggleSpell',
function()
vim.wo.spell = not vim.wo.spell
end,
{}
)
-- Toggle text wrapping in the current buffer
vim.api.nvim_create_user_command(
'ToggleWrap',
function()
vim.wo.wrap = not vim.wo.wrap
end,
{}
)
-- Project-wide search without moving from the current buffer
vim.api.nvim_create_user_command(
'PGrep', 'silent grep! <args> | copen', { nargs = 1 }
)
-- Toggle relative line numbers
vim.api.nvim_create_user_command(
'ToggleRelNum',
function()
vim.wo.relativenumber = not vim.wo.relativenumber
end,
{}
)
-- Replace all occurrences of a term in the document
vim.api.nvim_create_user_command(
'ReplaceAll',
function(opts)
local search = opts.fargs[1]
local replace = opts.fargs[2] or ''
vim.cmd(string.format("%%s/%s/%s/g", vim.fn.escape(search, "/\\"), vim.fn.escape(replace, "/\\")))
end,
{ nargs = '+' }
)
-- Quick diff view
vim.api.nvim_create_user_command(
'ToggleDiff',
function()
vim.wo.diff = not vim.wo.diff
end,
{}
)
-- Delete all empty lines
vim.api.nvim_create_user_command(
'DelEmptyLines',
function()
vim.cmd([[%s/^\n//]])
end,
{}
)
================================================
FILE: .config/nvim/lua/speyll/lazy.lua
================================================
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
vim.fn.system({
"git",
"clone",
"--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable", -- latest stable release
lazypath,
})
end
vim.opt.rtp:prepend(lazypath)
require("lazy").setup("speyll.plugins")
================================================
FILE: .config/nvim/lua/speyll/plugins/autopairs.lua
================================================
return {
"windwp/nvim-autopairs",
event = "InsertEnter",
config = function()
require("nvim-autopairs").setup({
disable_filetype = { "TelescopePrompt", "vim" },
})
end,
}
================================================
FILE: .config/nvim/lua/speyll/plugins/cmp.lua
================================================
return {
"hrsh7th/nvim-cmp",
event = "InsertEnter",
dependencies = {
"hrsh7th/cmp-buffer", -- source for text in buffer
"hrsh7th/cmp-path", -- source for file system paths
{
"L3MON4D3/LuaSnip",
version = "v2.*",
-- install jsregexp (optional!).
build = "make install_jsregexp",
},
"rafamadriz/friendly-snippets",
"onsails/lspkind.nvim", -- vs-code like pictograms
},
config = function()
local cmp = require("cmp")
local lspkind = require("lspkind")
local luasnip = require("luasnip")
require("luasnip.loaders.from_vscode").lazy_load()
cmp.setup({
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
mapping = cmp.mapping.preset.insert({
["<C-d>"] = cmp.mapping.scroll_docs(-4),
["<C-f>"] = cmp.mapping.scroll_docs(4),
["<C-Space>"] = cmp.mapping.complete(),
["<C-e>"] = cmp.mapping.close(),
["<CR>"] = cmp.mapping.confirm({
behavior = cmp.ConfirmBehavior.Replace,
select = true,
}),
}),
sources = cmp.config.sources({
{ name = "nvim_lsp" },
{ name = "luasnip" },
{ name = "buffer" },
{ name = "path" },
}),
})
vim.cmd([[
set completeopt=menuone,noinsert,noselect
highlight! default link CmpItemKind CmpItemMenuDefault
]])
end,
}
================================================
FILE: .config/nvim/lua/speyll/plugins/colorscheme.lua
================================================
return {
'RRethy/nvim-base16',
config = function()
require('base16-colorscheme').setup({
-- Start flavours
base00 = "none", base01 = "#3c3836", base02 = "#504945", base03 = "#665c54",
base04 = "#bdae93", base05 = "#d5c4a1", base06 = "#ebdbb2", base07 = "#fbf1c7",
base08 = "#fb4934", base09 = "#fe8019", base0A = "#fabd2f", base0B = "#b8bb26",
base0C = "#8ec07c", base0D = "#83a598", base0E = "#d3869b", base0F = "#d65d0e"
-- End flavours
})
-- Ensure that Normal background is set to transparent
vim.cmd("highlight Normal guibg=none")
end
}
================================================
FILE: .config/nvim/lua/speyll/plugins/nvim-hardline.lua
================================================
return {
'ojroques/nvim-hardline',
config = function()
require('hardline').setup {
bufferline = false, -- disable bufferline
bufferline_settings = {
exclude_terminal = false, -- don't show terminal buffers in bufferline
show_index = false, -- show buffer indexes (not the actual buffer numbers) in bufferline
},
theme = 'custom',
-- Start flavours
custom_theme = {
text = {gui = "#282828", cterm = "235", cterm16 = "0"},
normal = {gui = "#83a598", cterm = "109", cterm16 = "6"},
insert = {gui = "#b8bb26", cterm = "142", cterm16 = "2"},
replace = {gui = "#fabd2f", cterm = "214", cterm16 = "3"},
inactive_comment = {gui = "NONE", cterm = "NONE", cterm16 = "NONE"},
inactive_cursor = {gui = "NONE", cterm = "NONE", cterm16 = "NONE"},
inactive_menu = {gui = "NONE", cterm = "NONE", cterm16 = "NONE"},
visual = {gui = "#8ec07c", cterm = "108", cterm16 = "6"},
command = {gui = "#d3869b", cterm = "132", cterm16 = "5"},
alt_text = {gui = "#ebdbb2", cterm = "223", cterm16 = "7"},
warning = {gui = "#fb4934", cterm = "167", cterm16 = "1"},
},
-- End flavours
sections = { -- define sections
{class = 'mode', item = require('hardline.parts.mode').get_item},
{class = 'high', item = require('hardline.parts.git').get_item, hide = 100},
{class = 'med', item = require('hardline.parts.filename').get_item},
'%<',
{class = 'med', item = '%='},
{class = 'low', item = require('hardline.parts.wordcount').get_item, hide = 100},
{class = 'error', item = require('hardline.parts.lsp').get_error},
{class = 'warning', item = require('hardline.parts.lsp').get_warning},
{class = 'warning', item = require('hardline.parts.whitespace').get_item},
{class = 'high', item = require('hardline.parts.filetype').get_item, hide = 60},
{class = 'mode', item = require('hardline.parts.line').get_item},
},
}
end
}
================================================
FILE: .config/nvim/lua/speyll/plugins/nvim-highlight-colors.lua
================================================
return {
'brenoprata10/nvim-highlight-colors',
config = function()
require('nvim-highlight-colors').setup {
render = 'background', -- Or 'foreground', depending on your preference
enable_named_colors = true, -- Enable parsing of named colors
enable_tailwind = true, -- Optional: Enable TailwindCSS color classes
}
end
}
================================================
FILE: .config/nvim/lua/speyll/plugins/telescope.lua
================================================
return {
'nvim-telescope/telescope.nvim', tag = '0.1.6',
dependencies = { 'nvim-lua/plenary.nvim' },
config = function()
local home = vim.fn.expand("~") -- Expands the home directory
require('telescope').setup{
defaults = {
file_ignore_patterns = {
"%.jpg", "%.jpeg", "%.png", "%.gif", "%.bmp", "%.tiff", "%.webp", "%.kra", -- image formats
"%.mp4", "%.mkv", "%.webm", "%.avi", "%.mov", "%.flv", "%.wmv", -- video formats
"%.mp3", "%.wav", "%.flac", "%.m4a", -- audio formats
}
}
}
local builtin = require('telescope.builtin')
vim.keymap.set('n', '<leader>pf', builtin.find_files, {})
vim.keymap.set('n', '<C-p>', builtin.git_files, {})
vim.keymap.set('n', '<leader>pws', function()
local word = vim.fn.expand("<cword>")
builtin.grep_string({ search = word })
end)
vim.keymap.set('n', '<leader>pWs', function()
local word = vim.fn.expand("<cWORD>")
builtin.grep_string({ search = word })
end)
vim.keymap.set('n', '<leader>ps', function()
builtin.grep_string({ search = vim.fn.input("Grep > ") })
end)
vim.keymap.set('n', '<leader>vh', builtin.help_tags, {})
end
}
================================================
FILE: .config/nvim/lua/speyll/plugins/treesitter.lua
================================================
return {
"nvim-treesitter/nvim-treesitter",
branch = "main", -- The new rewrite branch
build = ":TSUpdate",
event = { "BufReadPre", "BufNewFile" },
-- Configuration now happens directly in 'opts'
opts = {
ensure_installed = {
"json", "javascript", "typescript", "tsx", "yaml",
"html", "css", "markdown", "markdown_inline", "bash",
"lua", "vim", "dockerfile", "gitignore", "c", "rust",
},
highlight = { enable = true },
indent = { enable = true },
},
config = function(_, opts)
-- In the 'main' branch, use the core module directly
require("nvim-treesitter").setup(opts)
end,
}
================================================
FILE: .config/nvim/lua/speyll/plugins/undotree.lua
================================================
return {
"mbbill/undotree",
config = function()
vim.keymap.set("n", "<leader>u", vim.cmd.UndotreeToggle)
end
}
================================================
FILE: .config/nvim/lua/speyll/remap.lua
================================================
vim.g.mapleader = " "
vim.keymap.set("n", "<leader>pv", vim.cmd.Ex)
vim.keymap.set("v", "J", ":m '>+1<CR>gv=gv")
vim.keymap.set("v", "K", ":m '<-2<CR>gv=gv")
vim.keymap.set("n", "J", "mzJ`z")
vim.keymap.set("n", "<C-d>", "<C-d>zz")
vim.keymap.set("n", "<C-u>", "<C-u>zz")
vim.keymap.set("n", "n", "nzzzv")
vim.keymap.set("n", "N", "Nzzzv")
-- greatest remap ever
vim.keymap.set("x", "<leader>p", [["_dP]])
-- next greatest remap ever : asbjornHaland
vim.keymap.set({"n", "v"}, "<leader>y", [["+y]])
vim.keymap.set("n", "<leader>Y", [["+Y]])
vim.keymap.set({"n", "v"}, "<leader>d", [["_d]])
-- This is going to get me cancelled
vim.keymap.set("i", "<C-c>", "<Esc>")
vim.keymap.set("n", "Q", "<nop>")
vim.keymap.set("n", "<C-f>", "<cmd>silent !tmux neww tmux-sessionizer<CR>")
vim.keymap.set("n", "<leader>f", vim.lsp.buf.format)
vim.keymap.set("n", "<C-k>", "<cmd>cnext<CR>zz")
vim.keymap.set("n", "<C-j>", "<cmd>cprev<CR>zz")
vim.keymap.set("n", "<leader>k", "<cmd>lnext<CR>zz")
vim.keymap.set("n", "<leader>j", "<cmd>lprev<CR>zz")
vim.keymap.set("n", "<leader>s", [[:%s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>]])
vim.keymap.set("n", "<leader>x", "<cmd>!chmod +x %<CR>", { silent = true })
vim.keymap.set(
"n",
"<leader>ee",
"oif err != nil {<CR>}<Esc>Oreturn err<Esc>"
)
vim.keymap.set("n", "<leader><leader>", function()
vim.cmd("so")
end)
================================================
FILE: .config/nvim/lua/speyll/settings.lua
================================================
vim.opt.guicursor = ""
vim.opt.cursorline = false
vim.opt.nu = true
vim.opt.relativenumber = true
vim.opt.tabstop = 4
vim.opt.softtabstop = 4
vim.opt.shiftwidth = 4
vim.opt.expandtab = true
vim.opt.smartindent = true
vim.opt.wrap = true
vim.opt.swapfile = false
vim.opt.backup = false
vim.opt.undodir = os.getenv("HOME") .. "/.cache/nvim/undodir"
vim.opt.undofile = true
vim.opt.hlsearch = false
vim.opt.incsearch = true
vim.opt.termguicolors = true
vim.opt.scrolloff = 8
vim.opt.signcolumn = "yes"
vim.opt.isfname:append("@-@")
vim.opt.updatetime = 50
vim.opt.colorcolumn = "80"
================================================
FILE: .config/pcmanfm-qt/default/recent-files.conf
================================================
[Recent]
Files=@Invalid()
================================================
FILE: .config/pcmanfm-qt/default/settings.conf
================================================
[Behavior]
AutoSelectionDelay=600
BookmarkOpenMethod=current_tab
ConfirmDelete=true
ConfirmTrash=false
CtrlRightClick=false
NoUsbTrash=false
QuickExec=false
RecentFilesNumber=0
SelectNewFiles=false
SingleClick=false
SingleWindowMode=false
UseTrash=true
[Desktop]
AllSticky=false
BgColor=#000000
DesktopCellMargins=@Size(3 1)
DesktopIconSize=48
DesktopShortcuts=@Invalid()
FgColor=#ffffff
Font="Noto Sans,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1"
HideItems=false
LastSlide=
NoItemTooltip=false
OpenWithDefaultFileManager=false
PerScreenWallpaper=false
ShadowColor=#000000
ShowHidden=false
SlideShowInterval=0
SortColumn=name
SortFolderFirst=true
SortHiddenLast=false
SortOrder=ascending
TransformWallpaper=false
Wallpaper=
WallpaperDialogSize=@Size(700 500)
WallpaperDialogSplitterPos=200
WallpaperDirectory=
WallpaperMode=none
WallpaperRandomize=false
WorkAreaMargins=12, 12, 12, 12
[FolderView]
BackupAsHidden=false
BigIconSize=48
CustomColumnWidths=@Invalid()
FolderViewCellMargins=@Size(3 3)
HiddenColumns=@Invalid()
Mode=thumbnail
NoItemTooltip=false
ScrollPerPixel=true
ShadowHidden=true
ShowFilter=false
ShowFullNames=true
ShowHidden=true
SidePaneIconSize=24
SmallIconSize=24
SortCaseSensitive=false
SortColumn=name
SortFolderFirst=true
SortHiddenLast=false
SortOrder=ascending
ThumbnailIconSize=128
[Places]
HiddenPlaces=@Invalid()
[Search]
ContentPatterns=@Invalid()
MaxSearchHistory=0
NamePatterns=@Invalid()
searchContentCaseInsensitive=false
searchContentRegexp=true
searchNameCaseInsensitive=false
searchNameRegexp=true
searchRecursive=true
searchhHidden=true
[System]
Archiver=lxqt-archiver
FallbackIconThemeName=oxygen
OnlyUserTemplates=false
SIUnit=false
SuCommand=lxqt-sudo %s
TemplateRunApp=false
TemplateTypeOnce=false
Terminal=alacritty
[Thumbnail]
MaxExternalThumbnailFileSize=-1
MaxThumbnailFileSize=10240
ShowThumbnails=true
ThumbnailLocalFilesOnly=false
[Volume]
AutoRun=true
CloseOnUnmount=true
MountOnStartup=true
MountRemovable=true
[Window]
AlwaysShowTabs=true
FixedHeight=480
FixedWidth=640
LastWindowHeight=1072
LastWindowMaximized=false
LastWindowWidth=1214
PathBarButtons=false
RememberWindowSize=true
ReopenLastTabs=false
ShowMenuBar=true
ShowTabClose=true
SidePaneMode=places
SidePaneVisible=true
SplitView=false
SplitViewTabsNum=0
SplitterPos=145
SwitchToNewTab=false
TabPaths=@Invalid()
================================================
FILE: .config/pipewire/pipewire-pulse.conf.d/switch-on-connect.conf
================================================
pulse.cmd = [
{ cmd = "load-module" args = "module-always-sink" flags = [ ] }
{ cmd = "load-module" args = "module-switch-on-connect" }
]
================================================
FILE: .config/pipewire/pipewire.conf
================================================
# Daemon config file for PipeWire version "1.2.5" #
#
# Copy and edit this file in /etc/pipewire for system-wide changes
# or in ~/.config/pipewire for local changes.
#
# It is also possible to place a file with an updated section in
# /etc/pipewire/pipewire.conf.d/ for system-wide changes or in
# ~/.config/pipewire/pipewire.conf.d/ for local changes.
#
context.properties = {
## Configure properties in the system.
#library.name.system = support/libspa-support
#context.data-loop.library.name.system = support/libspa-support
#support.dbus = true
#link.max-buffers = 64
link.max-buffers = 16 # version < 3 clients can't handle more
#mem.warn-mlock = false
#mem.allow-mlock = true
#mem.mlock-all = false
#clock.power-of-two-quantum = true
#log.level = 2
#cpu.zero.denormals = false
#loop.rt-prio = -1 # -1 = use module-rt prio, 0 disable rt
#loop.class = data.rt
#thread.affinity = [ 0 1 ] # optional array of CPUs
#context.num-data-loops = 1 # -1 = num-cpus, 0 = no data loops
#
#context.data-loops = [
# { loop.rt-prio = -1
# loop.class = [ data.rt audio.rt ]
# #library.name.system = support/libspa-support
# thread.name = data-loop.0
# #thread.affinity = [ 0 1 ] # optional array of CPUs
# }
#]
core.daemon = true # listening for socket connections
core.name = pipewire-0 # core name and socket name
## Properties for the DSP configuration.
default.clock.rate = 48000
#default.clock.allowed-rates = [ 48000 ]
default.clock.quantum = 512
default.clock.min-quantum = 128
default.clock.max-quantumn = 2048
#default.clock.quantum-limit = 8192
#default.clock.quantum-floor = 4
#default.video.width = 640
#default.video.height = 480
#default.video.rate.num = 25
#default.video.rate.denom = 1
#
#settings.check-quantum = false
#settings.check-rate = false
# keys checked below to disable module loading
module.x11.bell = true
# enables autoloading of access module, when disabled an alternative
# access module needs to be loaded.
module.access = true
# enables autoloading of module-jackdbus-detect
module.jackdbus-detect = true
}
context.properties.rules = [
{ matches = [ { cpu.vm.name = !null } ]
actions = {
update-props = {
# These overrides are only applied when running in a vm.
default.clock.min-quantum = 1024
}
}
}
]
context.spa-libs = {
#<factory-name regex> = <library-name>
#
# Used to find spa factory names. It maps an spa factory name
# regular expression to a library name that should contain
# that factory.
#
audio.convert.* = audioconvert/libspa-audioconvert
avb.* = avb/libspa-avb
api.alsa.* = alsa/libspa-alsa
api.v4l2.* = v4l2/libspa-v4l2
api.libcamera.* = libcamera/libspa-libcamera
api.bluez5.* = bluez5/libspa-bluez5
api.vulkan.* = vulkan/libspa-vulkan
api.jack.* = jack/libspa-jack
support.* = support/libspa-support
video.convert.* = videoconvert/libspa-videoconvert
#videotestsrc = videotestsrc/libspa-videotestsrc
#audiotestsrc = audiotestsrc/libspa-audiotestsrc
}
context.modules = [
#{ name = <module-name>
# ( args = { <key> = <value> ... } )
# ( flags = [ ( ifexists ) ( nofail ) ] )
# ( condition = [ { <key> = <value> ... } ... ] )
#}
#
# Loads a module with the given parameters.
# If ifexists is given, the module is ignored when it is not found.
# If nofail is given, module initialization failures are ignored.
# If condition is given, the module is loaded only when the context
# properties all match the match rules.
#
# Uses realtime scheduling to boost the audio thread priorities. This uses
# RTKit if the user doesn't have permission to use regular realtime
# scheduling. You can also clamp utilisation values to improve scheduling
# on embedded and heterogeneous systems, e.g. Arm big.LITTLE devices.
{ name = libpipewire-module-rt
args = {
nice.level = -11
rt.prio = 88
#rt.time.soft = -1
#rt.time.hard = -1
#uclamp.min = 0
#uclamp.max = 1024
}
flags = [ ifexists nofail ]
}
# The native communication protocol.
{ name = libpipewire-module-protocol-native
args = {
# List of server Unix sockets, and optionally permissions
#sockets = [ { name = "pipewire-0" }, { name = "pipewire-0-manager" } ]
}
}
# The profile module. Allows application to access profiler
# and performance data. It provides an interface that is used
# by pw-top and pw-profiler.
{ name = libpipewire-module-profiler }
# Allows applications to create metadata objects. It creates
# a factory for Metadata objects.
{ name = libpipewire-module-metadata }
# Creates a factory for making devices that run in the
# context of the PipeWire server.
{ name = libpipewire-module-spa-device-factory }
# Creates a factory for making nodes that run in the
# context of the PipeWire server.
{ name = libpipewire-module-spa-node-factory }
# Allows creating nodes that run in the context of the
# client. Is used by all clients that want to provide
# data to PipeWire.
{ name = libpipewire-module-client-node }
# Allows creating devices that run in the context of the
# client. Is used by the session manager.
{ name = libpipewire-module-client-device }
# The portal module monitors the PID of the portal process
# and tags connections with the same PID as portal
# connections.
{ name = libpipewire-module-portal
flags = [ ifexists nofail ]
}
# The access module can perform access checks and block
# new clients.
{ name = libpipewire-module-access
args = {
# Socket-specific access permissions
#access.socket = { pipewire-0 = "default", pipewire-0-manager = "unrestricted" }
# Deprecated legacy mode (not socket-based),
# for now enabled by default if access.socket is not specified
#access.legacy = true
}
condition = [ { module.access = true } ]
}
# Makes a factory for wrapping nodes in an adapter with a
# converter and resampler.
{ name = libpipewire-module-adapter }
# Makes a factory for creating links between ports.
{ name = libpipewire-module-link-factory }
# Provides factories to make session manager objects.
{ name = libpipewire-module-session-manager }
# Use libcanberra to play X11 Bell
{ name = libpipewire-module-x11-bell
args = {
#sink.name = "@DEFAULT_SINK@"
#sample.name = "bell-window-system"
#x11.display = null
#x11.xauthority = null
}
flags = [ ifexists nofail ]
condition = [ { module.x11.bell = true } ]
}
{ name = libpipewire-module-jackdbus-detect
args = {
#jack.library = libjack.so.0
#jack.server = null
#jack.client-name = PipeWire
#jack.connect = true
#tunnel.mode = duplex # source|sink|duplex
source.props = {
#audio.channels = 2
#midi.ports = 1
#audio.position = [ FL FR ]
# extra sink properties
}
sink.props = {
#audio.channels = 2
#midi.ports = 1
#audio.position = [ FL FR ]
# extra sink properties
}
}
flags = [ ifexists nofail ]
condition = [ { module.jackdbus-detect = true } ]
}
]
context.objects = [
#{ factory = <factory-name>
# ( args = { <key> = <value> ... } )
# ( flags = [ ( nofail ) ] )
# ( condition = [ { <key> = <value> ... } ... ] )
#}
#
# Creates an object from a PipeWire factory with the given parameters.
# If nofail is given, errors are ignored (and no object is created).
# If condition is given, the object is created only when the context properties
# all match the match rules.
#
#{ factory = spa-node-factory args = { factory.name = videotestsrc node.name = videotestsrc node.description = videotestsrc "Spa:Pod:Object:Param:Props:patternType" = 1 } }
#{ factory = spa-device-factory args = { factory.name = api.jack.device foo=bar } flags = [ nofail ] }
#{ factory = spa-device-factory args = { factory.name = api.alsa.enum.udev } }
#{ factory = spa-node-factory args = { factory.name = api.alsa.seq.bridge node.name = Internal-MIDI-Bridge } }
#{ factory = adapter args = { factory.name = audiotestsrc node.name = my-test node.description = audiotestsrc } }
#{ factory = spa-node-factory args = { factory.name = api.vulkan.compute.source node.name = my-compute-source } }
# A default dummy driver. This handles nodes marked with the "node.always-process"
# property when no other driver is currently active. JACK clients need this.
{ factory = spa-node-factory
args = {
factory.name = support.node.driver
node.name = Dummy-Driver
node.group = pipewire.dummy
node.sync-group = sync.dummy
priority.driver = 200000
#clock.id = monotonic # realtime | tai | monotonic-raw | boottime
#clock.name = "clock.system.monotonic"
}
}
{ factory = spa-node-factory
args = {
factory.name = support.node.driver
node.name = Freewheel-Driver
priority.driver = 190000
node.group = pipewire.freewheel
node.sync-group = sync.dummy
node.freewheel = true
#freewheel.wait = 10
}
}
# This creates a new Source node. It will have input ports
# that you can link, to provide audio for this source.
#{ factory = adapter
# args = {
# factory.name = support.null-audio-sink
# node.name = "my-mic"
# node.description = "Microphone"
# media.class = "Audio/Source/Virtual"
# audio.position = "FL,FR"
# monitor.passthrough = true
# }
#}
# This creates a single PCM source device for the given
# alsa device path hw:0. You can change source to sink
# to make a sink in the same way.
#{ factory = adapter
# args = {
# factory.name = api.alsa.pcm.source
# node.name = "alsa-source"
# node.description = "PCM Source"
# media.class = "Audio/Source"
# api.alsa.path = "hw:0"
# api.alsa.period-size = 1024
# api.alsa.headroom = 0
# api.alsa.disable-mmap = false
# api.alsa.disable-batch = false
# audio.format = "S16LE"
# audio.rate = 48000
# audio.channels = 2
# audio.position = "FL,FR"
# }
#}
# Use the metadata factory to create metadata and some default values.
#{ factory = metadata
# args = {
# metadata.name = my-metadata
# metadata.values = [
# { key = default.audio.sink value = { name = somesink } }
# { key = default.audio.source value = { name = somesource } }
# ]
# }
#}
]
context.exec = [
#{ path = <program-name>
# ( args = "<arguments>" | [ <arg1> <arg2> ... ] )
# ( condition = [ { <key> = <value> ... } ... ] )
#}
#
# Execute the given program with arguments.
# If condition is given, the program is executed only when the context
# properties all match the match rules.
#
# You can optionally start the session manager here,
# but it is better to start it as a systemd service.
# Run the session manager with -h for options.
#
#{ path = "/usr/bin/pipewire-media-session" args = ""
# condition = [ { exec.session-manager = null } { exec.session-manager = true } ] }
#
# You can optionally start the pulseaudio-server here as well
# but it is better to start it as a systemd service.
# It can be interesting to start another daemon here that listens
# on another address with the -a option (eg. -a tcp:4713).
#
#{ path = "/usr/bin/pipewire" args = [ "-c" "pipewire-pulse.conf" ]
# condition = [ { exec.pipewire-pulse = null } { exec.pipewire-pulse = true } ] }
]
================================================
FILE: .config/qt5ct/qt5ct.conf
================================================
[Appearance]
color_scheme_path=/usr/share/qt5ct/colors/darker.conf
custom_palette=false
icon_theme=breeze
standard_dialogs=default
style=Fusion
[Fonts]
fixed="Noto Sans,12,-1,5,50,0,0,0,0,0"
general="Noto Sans,12,-1,5,50,0,0,0,0,0"
[Interface]
activate_item_on_single_click=1
buttonbox_layout=0
cursor_flash_time=1000
dialog_buttons_have_icons=1
double_click_interval=400
gui_effects=@Invalid()
keyboard_scheme=4
menus_have_icons=true
show_shortcuts_in_context_menus=true
stylesheets=@Invalid()
toolbutton_style=4
underline_shortcut=1
wheel_scroll_lines=3
[SettingsWindow]
geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x3,\0\0\x3!\0\0\0\0\0\0\0\0\0\0\x3,\0\0\x3!\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\x3,\0\0\x3!)"
[Troubleshooting]
force_raster_widgets=1
ignored_applications=@Invalid()
================================================
FILE: .config/qt6ct/qt6ct.conf
================================================
[Appearance]
color_scheme_path=/usr/share/color-schemes/BreezeDark.colors
custom_palette=true
icon_theme=breeze
standard_dialogs=xdgdesktopportal
style=Breeze
[Fonts]
fixed="Noto Sans,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1"
general="Noto Sans,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1"
[Interface]
activate_item_on_single_click=1
buttonbox_layout=0
cursor_flash_time=1000
dialog_buttons_have_icons=1
double_click_interval=400
gui_effects=@Invalid()
keyboard_scheme=2
menus_have_icons=true
show_shortcuts_in_context_menus=true
stylesheets=/usr/share/qt6ct/qss/fusion-fixes.qss, /usr/share/qt6ct/qss/scrollbar-simple.qss, /usr/share/qt6ct/qss/sliders-simple.qss, /usr/share/qt6ct/qss/tooltip-simple.qss, /usr/share/qt6ct/qss/traynotification-simple.qss
toolbutton_style=4
underline_shortcut=1
wheel_scroll_lines=3
[QSSEditor]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x2\x82\0\0\x1\xf2\0\0\0\0\0\0\0\0\0\0\x2\x82\0\0\x1\xf2\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\x2\x82\0\0\x1\xf2)
[SettingsWindow]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\xff\xff\xfb\xc8\xff\xff\xfc\xb8\xff\xff\xfe\xa6\0\0\x4\v\xff\xff\xfb\xc8\xff\xff\xfc\xb8\xff\xff\xfe\xa6\0\0\x4\v\0\0\0\0\0\0\0\0\x4\x38\xff\xff\xfb\xc8\xff\xff\xfc\xb8\xff\xff\xfe\xa6\0\0\x4\v)
[Troubleshooting]
force_raster_widgets=1
ignored_applications=@Invalid()
================================================
FILE: .config/qt6ct/style-colors.conf
================================================
[ColorScheme]
active_colors=#ffffffff, #ff494949, #ff626262, #ff555555, #ff171717, #ff3c3c3c, #ffffffff, #ffffffff, #ffffffff, #ff2e2e2e, #ff3d3d3e, #ff000000, #ff737373, #ffffffff, #ff2eb8e6, #ffff6666, #ff383838, #ffffffff, #ff000000, #ffffffff, #80ffffff, #ff3daee9
disabled_colors=#ff808080, #ff424245, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ff808080, #ffffffff, #ff808080, #ff3d3d3d, #ff222020, #ffe7e4e0, #ff12608a, #ff808080, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff3f3f36, #ffffffff, #80ffffff, #ff12608a
inactive_colors=#ffffffff, #ff494949, #ff626262, #ff555555, #ff171717, #ff3c3c3c, #ffffffff, #ffffffff, #ffffffff, #ff2e2e2e, #ff3d3d3e, #ff000000, #ff737373, #ffffffff, #ff2eb8e6, #ffff6666, #ff383838, #ffffffff, #ff000000, #ffffffff, #80ffffff, #ff3daee9
================================================
FILE: .config/swayimg/config
================================================
# vim: filetype=dosini
[general]
mode = viewer
position = auto
overlay = no
decoration = no
size = 800,800
sigusr1 = reload
sigusr2 = next_file
app_id = swayimg
# Start flavours
[viewer]
window = 282828
transparency = grid
scale = optimal
antialiasing = mks13
history = 1
preload = 1
[slideshow]
time = 5
window = auto
transparency = grid
scale = optimal
position = center
antialiasing = mks13
[gallery]
size = 200
cache = 100
fill = yes
antialiasing = none
window = 282828
background = 282828
select = ebdbb2
border = 8ec07c
shadow = 665c54
[list]
order = alpha
recursive = no
all = yes
[font]
name = monospace
size = 14
color = ebdbb2
shadow = 665c54
# End flavours
[info]
show = no
info_timeout = 5
status_timeout = 3
[info.viewer]
top_left = +name,+format,+filesize,+imagesize,+exif
top_right = index
bottom_left = scale,frame
bottom_right = status
[info.gallery]
top_left = none
top_right = none
bottom_left = none
bottom_right = name,status
[keys.viewer]
F1 = help
Home = first_file
End = last_file
Prior = prev_file
Next = next_file
Space = next_file
Shift+d = prev_dir
d = next_dir
Shift+o = prev_frame
o = next_frame
c = skip_file
t = mode slideshow
s = animation
f = fullscreen
Return = mode
Left = prev_file
Right = next_file
Up = step_up 10
Down = step_down 10
Ctrl+Left = step_left 10
Ctrl+Right = step_right 10
Equal = zoom +10
Plus = zoom +10
Minus = zoom -10
w = zoom width
Shift+w = zoom height
z = zoom fit
Shift+z = zoom fill
0 = zoom real
BackSpace = zoom optimal
bracketleft = rotate_left
bracketright = rotate_right
m = flip_vertical
Shift+m = flip_horizontal
a = antialiasing
r = reload
i = info
Shift+Delete = exec rm "%"; skip_file
Escape = exit
q = exit
Ctrl+w = exec ~/.config/swayimg/set-wall "%"
Ctrl+c = exec wl-copy < "%"
# Mouse bindings for viewer mode
ScrollLeft = step_right 5
ScrollRight = step_left 5
ScrollUp = zoom +10
ScrollDown = zoom -10
Ctrl+ScrollUp = step_up 5
Ctrl+ScrollDown = step_down 5
Shift+ScrollUp = prev_file
Shift+ScrollDown = next_file
Alt+ScrollUp = prev_frame
Alt+ScrollDown = next_frame
[keys.gallery]
F1 = help
Home = first_file
End = last_file
Left = step_left
Right = step_right
Up = step_up
Down = step_down
Prior = page_up
Next = page_down
c = skip_file
f = fullscreen
Return = mode
a = antialiasing
r = reload
i = info
Shift+Delete = exec rm "%"; skip_file
Escape = exit
q = exit
Ctrl+w = exec ~/.config/swayimg/set-wall "%"
Ctrl+c = exec wl-copy < "%"
[keys.slideshow]
F1 = help
Home = first_file
End = last_file
Prior = prev_file
Next = next_file
Space = next_file
Shift+d = prev_dir
d = next_dir
Shift+o = prev_frame
o = next_frame
c = skip_file
t = mode slideshow
s = animation
f = fullscreen
Return = mode
Left = prev_file
Right = next_file
Up = step_up 10
Down = step_down 10
Ctrl+Left = step_left 10
Ctrl+Right = step_right 10
Equal = zoom +10
Plus = zoom +10
Minus = zoom -10
w = zoom width
Shift+w = zoom height
z = zoom fit
Shift+z = zoom fill
0 = zoom real
BackSpace = zoom optimal
bracketleft = rotate_left
bracketright = rotate_right
m = flip_vertical
Shift+m = flip_horizontal
a = antialiasing
r = reload
i = info
Shift+Delete = exec rm "%"; skip_file
Escape = exit
q = exit
Ctrl+w = exec ~/.config/swayimg/set-wall "%"
Ctrl+c = exec wl-copy < "%"
# Mouse bindings for gallery mode
ScrollLeft = step_right
ScrollRight = step_left
ScrollUp = step_up
ScrollDown = step_down
================================================
FILE: .config/swayimg/set-wall
================================================
#!/bin/sh
selected_image="$1"
# Check if an image is provided and valid
if [ -n "$selected_image" ] && [ -f "$selected_image" ]; then
# Kill any existing swaybg instances
pkill swaybg
# Set the selected image as the wallpaper with swaybg
swaybg -i "$selected_image" -m fill &
echo "Wallpaper set to: $selected_image"
else
echo "No valid image provided."
fi
================================================
FILE: .config/tmux/tmux.conf
================================================
# Reload Configuration
bind-key r source-file $HOME/.config/tmux/tmux.conf
# Human Numbering
set -g base-index 1
setw -g pane-base-index 1 # Make pane numbering consistent with windows
set -g set-titles on
set-option -g set-titles-string '#{pane_current_command}'
set-option -g history-limit 5000
set-option -g visual-activity on
# UTF-8 Support
set -q -g status-utf8 on # Expect UTF-8 (tmux < 2.2)
setw -q -g utf8 on
# Activity Monitoring
set -g monitor-activity on
set -g visual-activity off
setw -g window-status-activity-style none
# Terminal Settings
set -g default-terminal "xterm-256color"
if 'infocmp -x tmux-256color > /dev/null 2>&1' 'set -g default-terminal "tmux-256color"'
set -g bell-action none
setw -g clock-mode-colour brightcyan
# Mouse and Escape Time
set-option -g mouse on
set -sg escape-time 0
# Clear Pane History
bind-key -n C-k clear-history
# Pane Creation
bind-key s split-window -h
bind-key v split-window -v
# Pane Management
bind-key < resize-pane -L 5
bind-key > resize-pane -R 5
bind-key + resize-pane -U 5
bind-key - resize-pane -D 5
bind-key = select-layout even-vertical
bind-key | select-layout even-horizontal
# Movement Bindings (vi-like)
bind-key -r k select-pane -U
bind-key -r j select-pane -D
bind-key -r h select-pane -L
bind-key -r l select-pane -R
# Movement Bindings (normal)
bind-key Up select-pane -U
bind-key Down select-pane -D
bind-key Left select-pane -L
bind-key Right select-pane -R
# Copy Mode (requires xclip)
bind-key -T copy-mode-vi 'v' send -X begin-selection
bind-key -T copy-mode-vi 'y' send -X copy-pipe "wl-copy"
# Status Bar Configuration
set -g status on
set -g status-position bottom
set -g status-interval 1
set -g status-justify left
set -g status-style fg=brightwhite
setw -g window-status-current-style fg=green,bg=default
set -g status-left-length 100
set -g status-left-style default
set -g status-left "#[fg=black]#[bg=orange] #S #[fg=default]#[bg=default] "
set -g status-right-length 100
set -g status-right-style default
set -g status-right "#[fg=brightblue]#[bg=default] #(ip addr | grep -e 'state UP' -A 2 | awk '/inet /{printf $2}') #[fg=black]#[bg=brightblue] #(date +'%H:%M') #[fg=default]#[bg=default]"
# Smart Pane Switching with Vim Awareness
is_vim="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
bind-key -n C-h if-shell "$is_vim" "send-keys C-h" "select-pane -L"
bind-key -n C-j if-shell "$is_vim" "send-keys C-j" "select-pane -D"
bind-key -n C-k if-shell "$is_vim" "send-keys C-k" "select-pane -U"
bind-key -n C-l if-shell "$is_vim" "send-keys C-l" "select-pane -R"
# Tmux Version Compatibility
tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")'
if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\' 'select-pane -l'"
if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\' 'select-pane -l'"
# Copy Mode Pane Movement
bind-key -T copy-mode-vi C-h select-pane -L
bind-key -T copy-mode-vi C-j select-pane -D
bind-key -T copy-mode-vi C-k select-pane -U
bind-key -T copy-mode-vi C-l select-pane -R
bind-key -T copy-mode-vi C-\\ select-pane -l
================================================
FILE: .config/user-dirs.dirs
================================================
# This file is written by xdg-user-dirs-update
# If you want to change or add directories, just edit the line you're
# interested in. All local changes will be retained on the next run.
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported.
#
XDG_DESKTOP_DIR="$HOME/"
XDG_DOCUMENTS_DIR="$HOME/Documents/"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"
XDG_RECORDINGS_DIR="$HOME/Videos/rec"
XDG_GAMES_DIR="$HOME/Games"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
================================================
FILE: .config/user-dirs.locale
================================================
en_US
================================================
FILE: .config/wireplumber/wireplumber.conf.d/51-disable-suspension.conf
================================================
monitor.alsa.rules = [
{
matches = [
{
# Matches all sources
node.name = "~alsa_input.*"
},
{
# Matches all sinks
node.name = "~alsa_output.*"
}
]
actions = {
update-props = {
session.suspend-timeout-seconds = 0
dither.method = "wannamaker3", # add dither of desired shape
dither.noise = 2, # add additional bits of noise
}
}
}
]
# bluetooth devices
monitor.bluez.rules = [
{
matches = [
{
# Matches all sources
node.name = "~bluez_input.*"
},
{
# Matches all sinks
node.name = "~bluez_output.*"
}
]
actions = {
update-props = {
session.suspend-timeout-seconds = 0
}
}
}
]
================================================
FILE: .config/xdg-desktop-portal/kde-portals.conf
================================================
[preferred]
default=kde
org.freedesktop.impl.portal.FileChooser=kde;
org.freedesktop.impl.portal.Screenshot=kde;
org.freedesktop.impl.portal.ScreenCast=kde;
org.freedesktop.impl.portal.RemoteDesktop=kde;
================================================
FILE: .config/xdg-desktop-portal/niri-portals.conf
================================================
[preferred]
default=wlr;gtk;gnome
org.freedesktop.impl.portal.FileChooser=gtk;
org.freedesktop.impl.portal.ScreenCast=wlr;
org.freedesktop.impl.portal.Screenshot=wlr;
org.freedesktop.impl.portal.RemoteDesktop=wlr;
================================================
FILE: .config/xdg-desktop-portal/portals.conf
================================================
[preferred]
default=gtk
org.freedesktop.impl.portal.FileChooser=gtk;
org.freedesktop.impl.portal.ScreenCast=wlr;
org.freedesktop.impl.portal.Screenshot=wlr;
org.freedesktop.impl.portal.RemoteDesktop=wlr;
================================================
FILE: .config/xsettingsd/xsettingsd.conf
================================================
Gdk/WindowScalingFactor 1
Net/ThemeName "FlatColor"
Net/IconThemeName "breeze-dark"
Gtk/ButtonImages 1
Gtk/CursorThemeSize 24
Gtk/CursorThemeName "Kaela-Kovalskia-v2"
Net/EnableEventSounds 1
EnableInputFeedbackSounds 0
Xft/Antialias 1
Xft/Hinting 1
Xft/HintStyle "hintmedium"
Xft/RGBA "rgb"
================================================
FILE: .inputrc
================================================
$include /etc/inputrc
================================================
FILE: .local/bin/archive
================================================
#!/bin/sh
# A combined script for extraction and compression with enhanced features
# Usage:
# - To extract: script_name -x [-c] [-v] archive1 [archive2 ...]
# - To compress: script_name -z -f FORMAT -l LEVEL [-v] [-o OUTPUT] DIR_TO_COMPRESS
format="zip"
level=5
verbose=false
extracthere=false
output=""
mode=""
exit_err() {
echo "$1" >&2
exit 1
}
show_help() {
echo "Usage: $0 [options] file_or_dir ..."
echo "Options for extraction:"
echo " -x Extract archive(s)"
echo " -c Extract into the current directory"
echo " -v Verbose output"
echo "Options for compression:"
echo " -z Compress a file/directory"
echo " -f FORMAT Choose format: zip,7z,tar.gz,tar.bz2,tar.xz,tar.zst (default: zip)"
echo " -l LEVEL Compression level (0-9, default: 5)"
echo " -o OUTPUT Custom output filename"
echo " -v Verbose output"
echo " -h Show this help"
exit 0
}
check_dependency() {
if ! command -v "$1" >/dev/null; then
exit_err "Error: Required command '$1' not found. Please install it."
fi
}
sanitize_name() {
echo "$1" | sed -e 's/[^[:alnum:].*-]/*/g'
}
sanitize_dir_contents() {
find . -depth \( -name '*[[:space:]]*' -o -name '*[^[:alnum:].\_-]*' \) | while IFS= read -r path; do
dir=$(dirname "$path")
name=$(basename "$path")
newname=$(echo "$name" | sed -e 's/[[:space:]]/*/g' -e 's/[^[:alnum:].*-]/_/g')
[ "$name" != "$newname" ] && mv -- "$path" "$dir/$newname"
done
}
while getopts "xczf:l:hvo:" opt; do
case "$opt" in
x) mode="extract" ;;
z) mode="compress" ;;
c) extracthere=true ;;
f) format=$OPTARG ;;
l)
if ! [ "$OPTARG" -eq "$OPTARG" ] 2>/dev/null || [ "$OPTARG" -lt 0 ] || [ "$OPTARG" -gt 9 ]; then
exit_err "Error: Compression level must be 0-9."
fi
level=$OPTARG
;;
o) output=$OPTARG ;;
v) verbose=true ;;
h) show_help ;;
*) exit_err "Invalid option" ;;
esac
done
shift $((OPTIND - 1))
if [ -z "$mode" ]; then
exit_err "Error: Specify either -x (extract) or -z (compress)."
fi
extract() {
[ "$#" -gt 0 ] || exit_err "Error: No files specified for extraction."
for archive_path in "$@"; do
[ -f "$archive_path" ] || { echo "Warning: File '$archive_path' not found, skipping." >&2; continue; }
archive="$(cd "$(dirname "$archive_path")" && pwd)/$(basename "$archive_path")"
original_name=$(basename "$archive")
safe_name=$(sanitize_name "$original_name")
if [ "$original_name" != "$safe_name" ]; then
mv "$archive" "${archive%/*}/$safe_name" || exit_err "Failed to sanitize filename."
archive="${archive%/*}/$safe_name"
trap 'mv "$archive" "${archive%/*}/$original_name"' EXIT
fi
if ! $extracthere; then
dir="${archive%.*}"
mkdir -p "$dir" && cd "$dir" || exit_err "Failed to create directory."
fi
case "$archive" in
*.tar.bz2|*.tbz2)
check_dependency tar
tar xjf "$archive" $([ "$verbose" = true ] && echo "v") || exit_err "Extraction failed."
;;
*.tar.xz)
check_dependency tar
tar xf "$archive" $([ "$verbose" = true ] && echo "v") || exit_err "Extraction failed."
;;
*.tar.gz|*.tgz)
check_dependency tar
tar xzf "$archive" $([ "$verbose" = true ] && echo "v") || exit_err "Extraction failed."
;;
*.tar.zst)
check_dependency tar
check_dependency zstd
tar -I zstd -xf "$archive" $([ "$verbose" = true ] && echo "v") || exit_err "Extraction failed."
;;
*.lzma)
check_dependency unlzma
unlzma "$archive" || exit_err "Extraction failed."
;;
*.bz2)
check_dependency bunzip2
bunzip2 "$archive" || exit_err "Extraction failed."
;;
*.rar)
check_dependency unrar
unrar x -ad "$archive" $([ "$verbose" = true ] && echo "-or") || exit_err "Extraction failed."
;;
*.gz)
check_dependency gunzip
gunzip "$archive" || exit_err "Extraction failed."
;;
*.tar)
check_dependency tar
tar xf "$archive" $([ "$verbose" = true ] && echo "v") || exit_err "Extraction failed."
;;
*.zip)
check_dependency unzip
if $verbose; then
unzip "$archive" -v || exit_err "Extraction failed."
else
unzip "$archive" || exit_err "Extraction failed."
fi
;;
*.Z)
check_dependency uncompress
uncompress "$archive" || exit_err "Extraction failed."
;;
*.7z)
check_dependency 7z
7z x "$archive" $([ "$verbose" = true ] && echo "" || echo "-bso0") || exit_err "Extraction failed."
;;
*.xz)
check_dependency unxz
unxz "$archive" || exit_err "Extraction failed."
;;
*.exe)
check_dependency cabextract
cabextract "$archive" || exit_err "Extraction failed."
;;
*)
echo "Warning: Unsupported archive format: $archive, skipping." >&2
;;
esac
sanitize_dir_contents
[ "$original_name" != "$safe_name" ] && mv "$archive" "${archive%/*}/$original_name"
trap - EXIT
if ! $extracthere; then
cd - >/dev/null || exit_err "Failed to return to original directory."
fi
done
}
compress() {
[ -e "$input" ] || exit_err "Error: Input '$input' not found."
[ -z "$output" ] && output="$(basename "$input").$format"
case $format in
zip)
check_dependency zip
zip -r -"$level" $([ "$verbose" = true ] && echo "" || echo "-q") "$output" "$input" || exit_err "Compression failed."
;;
7z)
check_dependency 7z
7z a -mx="$level" $([ "$verbose" = true ] && echo "" || echo "-bso0") "$output" "$input" || exit_err "Compression failed."
;;
tar.gz|tgz)
check_dependency tar
check_dependency gzip
GZIP=-"$level" tar czf $([ "$verbose" = true ] && echo "v" || echo "") "$output" "$input" || exit_err "Compression failed."
;;
tar.bz2)
check_dependency tar
check_dependency bzip2
BZIP2=-"$level" tar cjf $([ "$verbose" = true ] && echo "v" || echo "") "$output" "$input" || exit_err "Compression failed."
;;
tar.xz)
check_dependency tar
check_dependency xz
XZ_OPT=-"$level" tar cJf $([ "$verbose" = true ] && echo "v" || echo "") "$output" "$input" || exit_err "Compression failed."
;;
tar.zst)
check_dependency tar
check_dependency zstd
tar cf - "$input" | zstd -"$level" -o "$output" || exit_err "Compression failed."
;;
*)
exit_err "Error: Unsupported format '$format'"
;;
esac
echo "Created archive: $(readlink -f "$output")"
}
case $mode in
extract) extract "$@" ;;
compress)
input="$1"
[ -z "$input" ] && exit_err "Error: Please specify a file/directory to compress."
compress
;;
esac
================================================
FILE: .local/bin/aria2-grabber
================================================
#!/bin/sh
# Set the path for your text file
TEXT_FILE="$HOME/downloads/links.txt"
# Set the path for the downloaded links file
DOWNLOADED_FILE="$HOME/downloads/downloaded_links.txt"
# Set the download directory
DOWNLOAD_DIR="/media/BX200/pron/dump/0toEncode"
# Create an empty links.txt file if it doesn't exist
: > "$TEXT_FILE"
# Create an empty downloaded links file if it doesn't exist
: > "$DOWNLOADED_FILE"
# Function to check if a link is already downloaded
is_link_downloaded() {
grep -qF "$1" "$DOWNLOADED_FILE"
}
# Function to add a link to the text file and start download
add_link_and_download() {
link="$1"
if ! is_link_downloaded "$link"; then
echo "$link" >> "$TEXT_FILE"
gitextract_qfp0rn95/ ├── .bashrc ├── .config/ │ ├── DankMaterialShell/ │ │ └── settings.json │ ├── MangoHud/ │ │ └── MangoHud.conf │ ├── alacritty/ │ │ ├── alacritty.toml │ │ └── colors.toml │ ├── aliasrc │ ├── autostart/ │ │ ├── autostart │ │ └── openrgb.desktop │ ├── flavours/ │ │ ├── config.toml │ │ ├── schemes/ │ │ │ ├── catppuccin/ │ │ │ │ ├── catppuccin-dark.yaml │ │ │ │ └── catppuccin-light.yaml │ │ │ ├── gruvbox/ │ │ │ │ ├── gruvbox-dark-medium.yaml │ │ │ │ └── gruvbox-light-medium.yaml │ │ │ └── solarized/ │ │ │ ├── solarized-dark.yaml │ │ │ └── solarized-light.yaml │ │ └── templates/ │ │ ├── ags/ │ │ │ └── templates/ │ │ │ ├── config.yaml │ │ │ └── default.mustache │ │ ├── alacritty/ │ │ │ └── templates/ │ │ │ ├── config.yaml │ │ │ ├── default-256.mustache │ │ │ └── default.mustache │ │ ├── fnott/ │ │ │ └── templates/ │ │ │ ├── config.yaml │ │ │ └── default.mustache │ │ ├── foot/ │ │ │ └── templates/ │ │ │ ├── config.yaml │ │ │ └── default.mustache │ │ ├── fuzzel/ │ │ │ └── templates/ │ │ │ ├── config.yaml │ │ │ └── default.mustache │ │ ├── gtk-flatcolor/ │ │ │ └── templates/ │ │ │ ├── config.yaml │ │ │ ├── gtk-2.mustache │ │ │ └── gtk-3.mustache │ │ ├── hyprland/ │ │ │ └── templates/ │ │ │ ├── colors.mustache │ │ │ └── config.yaml │ │ ├── imv/ │ │ │ └── templates/ │ │ │ ├── config.yaml │ │ │ └── default.mustache │ │ ├── labwc/ │ │ │ └── templates/ │ │ │ ├── config.yaml │ │ │ └── default.mustache │ │ ├── nvim/ │ │ │ └── templates/ │ │ │ ├── config.yaml │ │ │ └── default.mustache │ │ ├── nvim-hardline/ │ │ │ └── templates/ │ │ │ ├── config.yaml │ │ │ └── default.mustache │ │ ├── river/ │ │ │ └── templates/ │ │ │ ├── config.yaml │ │ │ └── default.mustache │ │ ├── sway/ │ │ │ └── templates/ │ │ │ ├── colors.mustache │ │ │ └── config.yaml │ │ ├── swayimg/ │ │ │ └── templates/ │ │ │ ├── config.yaml │ │ │ └── default.mustache │ │ ├── tmux/ │ │ │ └── templates/ │ │ │ ├── config.yaml │ │ │ └── default.mustache │ │ ├── waybar/ │ │ │ └── templates/ │ │ │ ├── config.yaml │ │ │ └── default.mustache │ │ └── wayfire/ │ │ └── templates/ │ │ ├── config.yaml │ │ └── default.mustache │ ├── fontconfig/ │ │ └── fonts.conf │ ├── gtk-2.0/ │ │ ├── gtkfilechooser.ini │ │ └── gtkrc-2.0 │ ├── gtk-3.0/ │ │ └── settings.ini │ ├── gtk-4.0/ │ │ └── settings.ini │ ├── htop/ │ │ └── htoprc │ ├── mimeapps.list │ ├── mpv/ │ │ ├── input.conf │ │ ├── mpv.conf │ │ ├── script-modules/ │ │ │ └── user-input-module.lua │ │ └── scripts/ │ │ ├── delete-current-video.lua │ │ ├── keep-session.lua │ │ ├── mpv-scut.lua │ │ ├── mpv-splice.lua │ │ ├── playlist-shuffle.lua │ │ ├── save-playlist.lua │ │ └── user-input.lua │ ├── nano/ │ │ └── nanorc │ ├── niri/ │ │ ├── config.kdl │ │ ├── dms.kdl │ │ ├── keybinds.kdl │ │ ├── layout.kdl │ │ ├── outputs.kdl │ │ ├── rules.kdl │ │ └── scripts/ │ │ ├── obs-replay │ │ └── waybar │ ├── nvim/ │ │ ├── init.lua │ │ └── lua/ │ │ └── speyll/ │ │ ├── commands.lua │ │ ├── lazy.lua │ │ ├── plugins/ │ │ │ ├── autopairs.lua │ │ │ ├── cmp.lua │ │ │ ├── colorscheme.lua │ │ │ ├── nvim-hardline.lua │ │ │ ├── nvim-highlight-colors.lua │ │ │ ├── telescope.lua │ │ │ ├── treesitter.lua │ │ │ └── undotree.lua │ │ ├── remap.lua │ │ └── settings.lua │ ├── pcmanfm-qt/ │ │ └── default/ │ │ ├── recent-files.conf │ │ └── settings.conf │ ├── pipewire/ │ │ ├── pipewire-pulse.conf.d/ │ │ │ └── switch-on-connect.conf │ │ └── pipewire.conf │ ├── qt5ct/ │ │ └── qt5ct.conf │ ├── qt6ct/ │ │ ├── qt6ct.conf │ │ └── style-colors.conf │ ├── swayimg/ │ │ ├── config │ │ └── set-wall │ ├── tmux/ │ │ └── tmux.conf │ ├── user-dirs.dirs │ ├── user-dirs.locale │ ├── wireplumber/ │ │ └── wireplumber.conf.d/ │ │ └── 51-disable-suspension.conf │ ├── xdg-desktop-portal/ │ │ ├── kde-portals.conf │ │ ├── niri-portals.conf │ │ └── portals.conf │ └── xsettingsd/ │ └── xsettingsd.conf ├── .inputrc ├── .local/ │ ├── bin/ │ │ ├── archive │ │ ├── aria2-grabber │ │ ├── aria2-lynx-downloader │ │ ├── bemoji │ │ ├── clip-manager │ │ ├── dircomp │ │ ├── exefind │ │ ├── ff-concat │ │ ├── ff-crop │ │ ├── ff-diff │ │ ├── ff-enc │ │ ├── font-char-list │ │ ├── font-unicode │ │ ├── fuzz-launcher │ │ ├── get-steamid │ │ ├── git-ops │ │ ├── grim-print │ │ ├── img-dupes │ │ ├── img-duprestore │ │ ├── img-enc │ │ ├── imv-mass │ │ ├── mass-mpv │ │ ├── mem │ │ ├── mvToParent │ │ ├── net-menu │ │ ├── reload-wall │ │ ├── spefetch │ │ ├── start-comp │ │ ├── updtscan │ │ ├── usb-mnt │ │ ├── vertsearch-lf │ │ └── yt-search │ └── share/ │ ├── applications/ │ │ ├── browser.desktop │ │ ├── file.desktop │ │ ├── img.desktop │ │ ├── text.desktop │ │ └── video.desktop │ ├── fonts/ │ │ └── git-fonts.sh │ ├── icons/ │ │ └── git-cursors.sh │ └── themes/ │ └── Base16/ │ └── openbox-3/ │ ├── bullet.xbm │ ├── close.xbm │ ├── desk.xbm │ ├── desk_toggled.xbm │ ├── iconify.xbm │ ├── max.xbm │ ├── max_disabled.xbm │ ├── max_toggled.xbm │ ├── menu.xbm │ ├── shade.xbm │ └── themerc ├── .profile └── README.md
Condensed preview — 160 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (284K chars).
[
{
"path": ".bashrc",
"chars": 3305,
"preview": "# ~/.bashrc: executed by bash(1) for non-login shells.\n\n# If not running interactively, don't do anything\ncase $- in\n "
},
{
"path": ".config/DankMaterialShell/settings.json",
"chars": 10207,
"preview": "{\n \"currentThemeName\": \"blue\",\n \"customThemeFile\": \"\",\n \"matugenScheme\": \"scheme-tonal-spot\",\n \"runUserMatugenTempla"
},
{
"path": ".config/MangoHud/MangoHud.conf",
"chars": 1075,
"preview": "################### File Generated by Goverlay ###################\nlegacy_layout=false\n\nhorizontal\nhorizontal_stretch=0\n"
},
{
"path": ".config/alacritty/alacritty.toml",
"chars": 240,
"preview": "[general]\nimport = [ \"~/.config/alacritty/colors.toml\" ]\n\n[window]\nopacity = 0.96\npadding.x = 24\npadding.y = 24\n\n[font]\n"
},
{
"path": ".config/alacritty/colors.toml",
"chars": 755,
"preview": "# Base16 Gruvbox dark, medium - alacritty color config\n# Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/mo"
},
{
"path": ".config/aliasrc",
"chars": 2031,
"preview": "#!/bin/sh\n# Colorized commands\nalias \\\n ls=\"ls -shA --color=auto\" \\\n dir=\"dir --color=auto\" \\\n vdir=\"vdir --col"
},
{
"path": ".config/autostart/autostart",
"chars": 5901,
"preview": "#!/bin/sh\n\nLOG=\"/tmp/autostart.log\"\n\n# Config\nAUDIO=false\nMODE=\"swaybg-random-online\" # swaybg, swaybg-random, mpvpaper-"
},
{
"path": ".config/autostart/openrgb.desktop",
"chars": 381,
"preview": "[Desktop Entry]\nType=Application\nExec=bash -c 'if command -v openrgb >/dev/null 2>&1; then openrgb --server -p pureWhite"
},
{
"path": ".config/flavours/config.toml",
"chars": 1668,
"preview": "shell = \"bash -c '{}'\"\n\n[[item]]\nfile = \"~/.config/waybar/colors.css\"\ntemplate = \"waybar\"\nhook = \"pkill -SIGRTMIN+7 wayb"
},
{
"path": ".config/flavours/schemes/catppuccin/catppuccin-dark.yaml",
"chars": 493,
"preview": "scheme: \"Catppuccin Mocha\"\nauthor: \"https://github.com/catppuccin/catppuccin\"\nbase00: \"1e1e2e\" # base\nbase01: \"181825\" #"
},
{
"path": ".config/flavours/schemes/catppuccin/catppuccin-light.yaml",
"chars": 493,
"preview": "scheme: \"Catppuccin Latte\"\nauthor: \"https://github.com/catppuccin/catppuccin\"\nbase00: \"eff1f5\" # base\nbase01: \"e6e9ef\" #"
},
{
"path": ".config/flavours/schemes/gruvbox/gruvbox-dark-medium.yaml",
"chars": 503,
"preview": "scheme: \"Gruvbox dark, medium\"\nauthor: \"Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/morhetz/gruvbox)\"\nb"
},
{
"path": ".config/flavours/schemes/gruvbox/gruvbox-light-medium.yaml",
"chars": 504,
"preview": "scheme: \"Gruvbox light, medium\"\nauthor: \"Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/morhetz/gruvbox)\"\n"
},
{
"path": ".config/flavours/schemes/solarized/solarized-dark.yaml",
"chars": 351,
"preview": "scheme: \"Solarized Dark\"\nauthor: \"Ethan Schoonover (modified by aramisgithub)\"\nbase00: \"002b36\"\nbase01: \"073642\"\nbase02:"
},
{
"path": ".config/flavours/schemes/solarized/solarized-light.yaml",
"chars": 352,
"preview": "scheme: \"Solarized Light\"\nauthor: \"Ethan Schoonover (modified by aramisgithub)\"\nbase00: \"fdf6e3\"\nbase01: \"eee8d5\"\nbase02"
},
{
"path": ".config/flavours/templates/ags/templates/config.yaml",
"chars": 48,
"preview": "colors:\n extension: .scss\n output: colors\n"
},
{
"path": ".config/flavours/templates/ags/templates/default.mustache",
"chars": 704,
"preview": "@define-color theme-base00 #{{base00-hex}};\n@define-color theme-base01 #{{base01-hex}};\n@define-color theme-base02 #{{ba"
},
{
"path": ".config/flavours/templates/alacritty/templates/config.yaml",
"chars": 98,
"preview": "default:\n extension: .toml\n output: colors\ndefault-256:\n extension: -256.toml\n output: colors\n"
},
{
"path": ".config/flavours/templates/alacritty/templates/default-256.mustache",
"chars": 1193,
"preview": "# Base16 {{scheme-name}} 256 - alacritty color config\n# {{scheme-author}}\n\n# Default colors\n[colors.primary]\nbackground "
},
{
"path": ".config/flavours/templates/alacritty/templates/default.mustache",
"chars": 851,
"preview": "# Base16 {{scheme-name}} - alacritty color config\n# {{scheme-author}}\n\n[colors]\ndraw_bold_text_with_bright_colors = fals"
},
{
"path": ".config/flavours/templates/fnott/templates/config.yaml",
"chars": 44,
"preview": "default:\n extension: .ini\n output: colors\n"
},
{
"path": ".config/flavours/templates/fnott/templates/default.mustache",
"chars": 299,
"preview": "background={{base00-hex}}bf\nborder-color={{base0B-hex}}ff\ntitle-color={{base0B-hex}}ff\nprogress-bar-color={{base0B-hex}}"
},
{
"path": ".config/flavours/templates/foot/templates/config.yaml",
"chars": 44,
"preview": "default:\n extension: .ini\n output: colors\n"
},
{
"path": ".config/flavours/templates/foot/templates/default.mustache",
"chars": 621,
"preview": "# Base16 {{scheme-name}} - foot color config\n# {{scheme-author}}\n[colors]\nbackground={{base00-hex}}\nforeground={{base06-"
},
{
"path": ".config/flavours/templates/fuzzel/templates/config.yaml",
"chars": 44,
"preview": "default:\n extension: .ini\n output: colors\n"
},
{
"path": ".config/flavours/templates/fuzzel/templates/default.mustache",
"chars": 229,
"preview": "[colors]\nbackground=#{{base00-hex}}df\ntext=#{{base06-hex}}ff\ninput=#{{base06-hex}}ff\nmatch=#{{base08-hex}}ff\nselection=#"
},
{
"path": ".config/flavours/templates/gtk-flatcolor/templates/config.yaml",
"chars": 97,
"preview": "gtk-2:\n extension: -gtkrc\n output: gtk-2\n\ngtk-3:\n extension: -gtk.css\n output: gtk-3\n"
},
{
"path": ".config/flavours/templates/gtk-flatcolor/templates/gtk-2.mustache",
"chars": 654,
"preview": "## Base16 {{scheme-name}}\n# Scheme author: {{scheme-author}}\n# Template author: Tinted Theming (https://github.com/tinte"
},
{
"path": ".config/flavours/templates/gtk-flatcolor/templates/gtk-3.mustache",
"chars": 641,
"preview": "/*\nBase16 {{scheme-name}}\nScheme author: {{scheme-author}}\nTemplate author: Tinted Theming (https://github.com/tinted-th"
},
{
"path": ".config/flavours/templates/hyprland/templates/colors.mustache",
"chars": 518,
"preview": "# Base16 {{scheme-name}}\n# Author: {{scheme-author}}\n\n$base00 = 0xff{{base00-hex}}\n$base01 = 0xff{{base01-hex}}\n$base02 "
},
{
"path": ".config/flavours/templates/hyprland/templates/config.yaml",
"chars": 44,
"preview": "colors:\n extension: .conf\n output: themes\n"
},
{
"path": ".config/flavours/templates/imv/templates/config.yaml",
"chars": 44,
"preview": "default:\n extension: .ini\n output: colors\n"
},
{
"path": ".config/flavours/templates/imv/templates/default.mustache",
"chars": 106,
"preview": "background = {{base00-hex}}\noverlay_text_color = {{base06-hex}}\noverlay_background_color = {{base00-hex}}\n"
},
{
"path": ".config/flavours/templates/labwc/templates/config.yaml",
"chars": 26,
"preview": "default:\n output: colors\n"
},
{
"path": ".config/flavours/templates/labwc/templates/default.mustache",
"chars": 3553,
"preview": "!! Window colors\nwindow.active.title.bg.color: #{{base05-hex}}\nwindow.inactive.title.bg.color: #{{base00-hex}}\nwindow.ac"
},
{
"path": ".config/flavours/templates/nvim/templates/config.yaml",
"chars": 44,
"preview": "default:\n extension: .lua\n output: colors\n"
},
{
"path": ".config/flavours/templates/nvim/templates/default.mustache",
"chars": 484,
"preview": " base00 = \"none\", base01 = \"#{{base01-hex}}\", base02 = \"#{{base02-hex}}\", base03 = \"#{{base03-hex}}\",\n "
},
{
"path": ".config/flavours/templates/nvim-hardline/templates/config.yaml",
"chars": 44,
"preview": "default:\n extension: .lua\n output: colors\n"
},
{
"path": ".config/flavours/templates/nvim-hardline/templates/default.mustache",
"chars": 954,
"preview": " custom_theme = {\n text = {gui = \"#{{base00-hex}}\", cterm = \"235\", cterm16 = \"0\"},\n "
},
{
"path": ".config/flavours/templates/river/templates/config.yaml",
"chars": 46,
"preview": "colors:\n extension: .sh\n output: colors\n"
},
{
"path": ".config/flavours/templates/river/templates/default.mustache",
"chars": 145,
"preview": "riverctl background-color 0x{{base00-hex}}ff\nriverctl border-color-focused 0x{{base0C-hex}}ff\nriverctl border-color-unfo"
},
{
"path": ".config/flavours/templates/sway/templates/colors.mustache",
"chars": 503,
"preview": "## Base16 {{scheme-name}}\n# Author: {{scheme-author}}\n\nset $base00 #{{base00-hex}}\nset $base01 #{{base01-hex}}\nset $base"
},
{
"path": ".config/flavours/templates/sway/templates/config.yaml",
"chars": 50,
"preview": "colors:\n extension: .config\n output: themes\n"
},
{
"path": ".config/flavours/templates/swayimg/templates/config.yaml",
"chars": 27,
"preview": "colors:\n output: colors\n"
},
{
"path": ".config/flavours/templates/swayimg/templates/default.mustache",
"chars": 485,
"preview": "[viewer]\nwindow = {{base00-hex}}\ntransparency = grid\nscale = optimal\nfixed = yes\nantialiasing = yes\nslideshow = no\nslide"
},
{
"path": ".config/flavours/templates/tmux/templates/config.yaml",
"chars": 26,
"preview": "default:\n output: colors\n"
},
{
"path": ".config/flavours/templates/tmux/templates/default.mustache",
"chars": 954,
"preview": " custom_theme = {\n text = {gui = \"#{{base00-hex}}\", cterm = \"235\", cterm16 = \"0\"},\n "
},
{
"path": ".config/flavours/templates/waybar/templates/config.yaml",
"chars": 44,
"preview": "default:\n extension: .css\n output: colors\n"
},
{
"path": ".config/flavours/templates/waybar/templates/default.mustache",
"chars": 845,
"preview": "/*\n*\n* Base16 {{scheme-name}}\n* Author: {{scheme-author}}\n*\n*/\n\n@define-color base00 #{{base00-hex}};\n@define-color base"
},
{
"path": ".config/flavours/templates/wayfire/templates/config.yaml",
"chars": 47,
"preview": "colors:\n extension: .ini\n output: colors\n"
},
{
"path": ".config/flavours/templates/wayfire/templates/default.mustache",
"chars": 69,
"preview": "active_color = \\#{{base0C-hex}FF\ninactive_color = \\#{{base00-hex}}FF\n"
},
{
"path": ".config/fontconfig/fonts.conf",
"chars": 1792,
"preview": "<?xml version=\"1.0\"?>\n<!DOCTYPE fontconfig SYSTEM \"fonts.dtd\">\n<fontconfig>\n\n <!-- Enable sub-pixel rendering for LCD s"
},
{
"path": ".config/gtk-2.0/gtkfilechooser.ini",
"chars": 197,
"preview": "[Filechooser Settings]\nLocationMode=path-bar\nShowHidden=true\nShowSizeColumn=true\nGeometryX=0\nGeometryY=0\nGeometryWidth=8"
},
{
"path": ".config/gtk-2.0/gtkrc-2.0",
"chars": 423,
"preview": "gtk-theme-name=\"Breeze\"\ngtk-icon-theme-name=\"Breeze\"\ngtk-font-name=\"Sans 11\"\ngtk-cursor-theme-name=\"Kaela-Kovalskia-v2\"\n"
},
{
"path": ".config/gtk-3.0/settings.ini",
"chars": 510,
"preview": "[Settings]\ngtk-button-images=1\ngtk-theme-name=Breeze\ngtk-icon-theme-name=Breeze\ngtk-font-name=Sans 11\ngtk-cursor-theme-n"
},
{
"path": ".config/gtk-4.0/settings.ini",
"chars": 275,
"preview": "[Settings]\ngtk-application-prefer-dark-theme=true\ngtk-theme-name=\"Breeze\"\ngtk-icon-theme-name=Breeze\ngtk-cursor-theme-na"
},
{
"path": ".config/htop/htoprc",
"chars": 1712,
"preview": "# Beware! This file is rewritten by htop when settings are changed in the interface.\n# The parser is also very primitive"
},
{
"path": ".config/mimeapps.list",
"chars": 1085,
"preview": "[Added Associations]\nimage/gif=video.desktop;\napplication/zip=lxqt-archiver.desktop;\napplication/x-zerosize=text.desktop"
},
{
"path": ".config/mpv/input.conf",
"chars": 225,
"preview": "Ctrl+Shift+R write-watch-later-config ; loadfile ${path}\nF10 cycle_values video-rotate 90 180 270 0\nF11 cycle-values loo"
},
{
"path": ".config/mpv/mpv.conf",
"chars": 564,
"preview": "# general\nhwdec=auto-safe\nhwdec-codecs=all\ndeband=no\ninterpolation=no\nvd-lavc-dr=yes\ndrag-and-drop=append\ninput-ipc-serv"
},
{
"path": ".config/mpv/script-modules/user-input-module.lua",
"chars": 4266,
"preview": "--[[\n This is a module designed to interface with mpv-user-input\n https://github.com/CogentRedTester/mpv-user-inpu"
},
{
"path": ".config/mpv/scripts/delete-current-video.lua",
"chars": 668,
"preview": "local utils = require 'mp.utils'\n\nfunction delete_current_file()\n local file_path = mp.get_property(\"path\")\n if fi"
},
{
"path": ".config/mpv/scripts/keep-session.lua",
"chars": 6620,
"preview": "--[[\n This script automatically saves the current playlist and can reload it if the player is started in idle mode (s"
},
{
"path": ".config/mpv/scripts/mpv-scut.lua",
"chars": 5654,
"preview": "local start_time = nil\nlocal segments = {}\nlocal osd_message_id = nil\nlocal osd_persistent = false\nlocal segments_file_p"
},
{
"path": ".config/mpv/scripts/mpv-splice.lua",
"chars": 17506,
"preview": "-- -----------------------------------------------------------------------------\n--\n-- MPV Splice\n-- URL: https://github"
},
{
"path": ".config/mpv/scripts/playlist-shuffle.lua",
"chars": 414,
"preview": "--[[\n shuffles the playlist and moves the currently playing file to the start of the playlist\n available at: https"
},
{
"path": ".config/mpv/scripts/save-playlist.lua",
"chars": 3186,
"preview": "--[[\n A script for saving m3u playlists based on mpvs current internal playlist.\n Users can set the name and direc"
},
{
"path": ".config/mpv/scripts/user-input.lua",
"chars": 26735,
"preview": "local mp = require 'mp'\nlocal msg = require 'mp.msg'\nlocal utils = require 'mp.utils'\nlocal options = require 'mp.option"
},
{
"path": ".config/nano/nanorc",
"chars": 11351,
"preview": "## Sample initialization file for GNU nano.\n##\n## For the options that take parameters, the default value is shown.\n## O"
},
{
"path": ".config/niri/config.kdl",
"chars": 966,
"preview": "prefer-no-csd\n\n// Includes\ninclude \"outputs.kdl\"\ninclude \"layout.kdl\"\ninclude \"dms.kdl\"\ninclude \"keybinds.kdl\"\ninclude \""
},
{
"path": ".config/niri/dms.kdl",
"chars": 1695,
"preview": "spawn-at-startup \"dms\" \"run\"\n\nbinds {\n Mod+D hotkey-overlay-title=\"Application Launcher\" {\n spawn \"dms\" \"ipc\" "
},
{
"path": ".config/niri/keybinds.kdl",
"chars": 4257,
"preview": "binds {\n // Personal\n Mod+Return { spawn \"alacritty\"; }\n F10 { spawn \"~/.config/niri/scripts/obs-replay\"; }\n\n "
},
{
"path": ".config/niri/layout.kdl",
"chars": 1483,
"preview": "layout {\n gaps 3.5\n center-focused-column \"never\"\n always-center-single-column\n\n preset-column-widths {\n "
},
{
"path": ".config/niri/outputs.kdl",
"chars": 424,
"preview": "output \"DP-2\" {\n mode \"1920x1080@120.000\"\n scale 1.0\n transform \"normal\"\n position x=1080 y=840\n variable"
},
{
"path": ".config/niri/rules.kdl",
"chars": 1544,
"preview": "window-rule {\n geometry-corner-radius 8\n clip-to-geometry true\n draw-border-with-background false\n}\n\nwindow-rul"
},
{
"path": ".config/niri/scripts/obs-replay",
"chars": 91,
"preview": "#!/bin/sh\n\n/home/lyes/Videos/rec/pipobs/bin/python3 /home/lyes/Videos/rec/pipobs/replay.py\n"
},
{
"path": ".config/niri/scripts/waybar",
"chars": 113,
"preview": "#!/bin/sh\nwaybar -c \"$HOME/.config/waybar/stacking-config\" -s \"$HOME/.config/waybar/style.css\" >/dev/null 2>&1 &\n"
},
{
"path": ".config/nvim/init.lua",
"chars": 101,
"preview": "require(\"speyll.settings\")\nrequire(\"speyll.remap\")\nrequire(\"speyll.commands\")\nrequire(\"speyll.lazy\")\n"
},
{
"path": ".config/nvim/lua/speyll/commands.lua",
"chars": 1470,
"preview": "-- Trim trailing whitespace from the current file\nvim.api.nvim_create_user_command(\n 'TrimWhitespace',\n function()\n "
},
{
"path": ".config/nvim/lua/speyll/lazy.lua",
"chars": 368,
"preview": "local lazypath = vim.fn.stdpath(\"data\") .. \"/lazy/lazy.nvim\"\nif not (vim.uv or vim.loop).fs_stat(lazypath) then\n vim.fn"
},
{
"path": ".config/nvim/lua/speyll/plugins/autopairs.lua",
"chars": 214,
"preview": "return {\n \"windwp/nvim-autopairs\",\n event = \"InsertEnter\",\n config = function()\n require(\"nvim-autopairs"
},
{
"path": ".config/nvim/lua/speyll/plugins/cmp.lua",
"chars": 1670,
"preview": "return {\n \"hrsh7th/nvim-cmp\",\n event = \"InsertEnter\",\n dependencies = {\n \"hrsh7th/cmp-buffer\", -- source"
},
{
"path": ".config/nvim/lua/speyll/plugins/colorscheme.lua",
"chars": 658,
"preview": "return {\n 'RRethy/nvim-base16',\n config = function()\n require('base16-colorscheme').setup({\n -- "
},
{
"path": ".config/nvim/lua/speyll/plugins/nvim-hardline.lua",
"chars": 2336,
"preview": "return {\n 'ojroques/nvim-hardline',\n config = function()\n require('hardline').setup {\n bufferlin"
},
{
"path": ".config/nvim/lua/speyll/plugins/nvim-highlight-colors.lua",
"chars": 385,
"preview": "return {\n 'brenoprata10/nvim-highlight-colors',\n config = function()\n require('nvim-highlight-colors').setu"
},
{
"path": ".config/nvim/lua/speyll/plugins/telescope.lua",
"chars": 1363,
"preview": "return {\n 'nvim-telescope/telescope.nvim', tag = '0.1.6',\n dependencies = { 'nvim-lua/plenary.nvim' },\n config "
},
{
"path": ".config/nvim/lua/speyll/plugins/treesitter.lua",
"chars": 697,
"preview": "return {\n \"nvim-treesitter/nvim-treesitter\",\n branch = \"main\", -- The new rewrite branch\n build = \":TSUpdate\",\n"
},
{
"path": ".config/nvim/lua/speyll/plugins/undotree.lua",
"chars": 133,
"preview": "return {\n \"mbbill/undotree\",\n\n config = function() \n vim.keymap.set(\"n\", \"<leader>u\", vim.cmd.UndotreeToggl"
},
{
"path": ".config/nvim/lua/speyll/remap.lua",
"chars": 1376,
"preview": "vim.g.mapleader = \" \"\nvim.keymap.set(\"n\", \"<leader>pv\", vim.cmd.Ex)\n\nvim.keymap.set(\"v\", \"J\", \":m '>+1<CR>gv=gv\")\nvim.ke"
},
{
"path": ".config/nvim/lua/speyll/settings.lua",
"chars": 590,
"preview": "vim.opt.guicursor = \"\"\nvim.opt.cursorline = false\n\nvim.opt.nu = true\nvim.opt.relativenumber = true\n\nvim.opt.tabstop = 4\n"
},
{
"path": ".config/pcmanfm-qt/default/recent-files.conf",
"chars": 26,
"preview": "[Recent]\nFiles=@Invalid()\n"
},
{
"path": ".config/pcmanfm-qt/default/settings.conf",
"chars": 2323,
"preview": "[Behavior]\nAutoSelectionDelay=600\nBookmarkOpenMethod=current_tab\nConfirmDelete=true\nConfirmTrash=false\nCtrlRightClick=fa"
},
{
"path": ".config/pipewire/pipewire-pulse.conf.d/switch-on-connect.conf",
"chars": 146,
"preview": "pulse.cmd = [\n { cmd = \"load-module\" args = \"module-always-sink\" flags = [ ] }\n { cmd = \"load-module\" args = \"modu"
},
{
"path": ".config/pipewire/pipewire.conf",
"chars": 13143,
"preview": "# Daemon config file for PipeWire version \"1.2.5\" #\n#\n# Copy and edit this file in /etc/pipewire for system-wide changes"
},
{
"path": ".config/qt5ct/qt5ct.conf",
"chars": 816,
"preview": "[Appearance]\ncolor_scheme_path=/usr/share/qt5ct/colors/darker.conf\ncustom_palette=false\nicon_theme=breeze\nstandard_dialo"
},
{
"path": ".config/qt6ct/qt6ct.conf",
"chars": 1328,
"preview": "[Appearance]\ncolor_scheme_path=/usr/share/color-schemes/BreezeDark.colors\ncustom_palette=true\nicon_theme=breeze\nstandard"
},
{
"path": ".config/qt6ct/style-colors.conf",
"chars": 783,
"preview": "[ColorScheme]\nactive_colors=#ffffffff, #ff494949, #ff626262, #ff555555, #ff171717, #ff3c3c3c, #ffffffff, #ffffffff, #fff"
},
{
"path": ".config/swayimg/config",
"chars": 3365,
"preview": "# vim: filetype=dosini\n\n[general]\nmode = viewer\nposition = auto\noverlay = no\ndecoration = no\nsize = 800,800\nsigusr1 = re"
},
{
"path": ".config/swayimg/set-wall",
"chars": 383,
"preview": "#!/bin/sh\nselected_image=\"$1\"\n\n# Check if an image is provided and valid\nif [ -n \"$selected_image\" ] && [ -f \"$selected_"
},
{
"path": ".config/tmux/tmux.conf",
"chars": 3258,
"preview": "# Reload Configuration\nbind-key r source-file $HOME/.config/tmux/tmux.conf\n\n# Human Numbering\nset -g base-index 1\nsetw -"
},
{
"path": ".config/user-dirs.dirs",
"chars": 692,
"preview": "# This file is written by xdg-user-dirs-update\n# If you want to change or add directories, just edit the line you're\n# i"
},
{
"path": ".config/user-dirs.locale",
"chars": 5,
"preview": "en_US"
},
{
"path": ".config/wireplumber/wireplumber.conf.d/51-disable-suspension.conf",
"chars": 781,
"preview": "monitor.alsa.rules = [\n {\n matches = [\n {\n # Matches all sources\n node.name = \"~alsa_input.*\"\n "
},
{
"path": ".config/xdg-desktop-portal/kde-portals.conf",
"chars": 204,
"preview": "[preferred]\ndefault=kde\norg.freedesktop.impl.portal.FileChooser=kde;\norg.freedesktop.impl.portal.Screenshot=kde;\norg.fre"
},
{
"path": ".config/xdg-desktop-portal/niri-portals.conf",
"chars": 214,
"preview": "[preferred]\ndefault=wlr;gtk;gnome\norg.freedesktop.impl.portal.FileChooser=gtk;\norg.freedesktop.impl.portal.ScreenCast=wl"
},
{
"path": ".config/xdg-desktop-portal/portals.conf",
"chars": 204,
"preview": "[preferred]\ndefault=gtk\norg.freedesktop.impl.portal.FileChooser=gtk;\norg.freedesktop.impl.portal.ScreenCast=wlr;\norg.fre"
},
{
"path": ".config/xsettingsd/xsettingsd.conf",
"chars": 291,
"preview": "Gdk/WindowScalingFactor 1\nNet/ThemeName \"FlatColor\"\nNet/IconThemeName \"breeze-dark\"\nGtk/ButtonImages 1\nGtk/CursorThemeSi"
},
{
"path": ".inputrc",
"chars": 22,
"preview": "$include /etc/inputrc\n"
},
{
"path": ".local/bin/archive",
"chars": 6943,
"preview": "#!/bin/sh\n# A combined script for extraction and compression with enhanced features\n# Usage:\n# - To extract: script_na"
},
{
"path": ".local/bin/aria2-grabber",
"chars": 1380,
"preview": "#!/bin/sh\n\n# Set the path for your text file\nTEXT_FILE=\"$HOME/downloads/links.txt\"\n\n# Set the path for the downloaded li"
},
{
"path": ".local/bin/aria2-lynx-downloader",
"chars": 360,
"preview": "#!/bin/sh\n\n# Prompt user for URL\nprintf \"Enter the URL: \"\nread url\n\n# Prompt user for pattern to grep\nprintf \"Enter the "
},
{
"path": ".local/bin/bemoji",
"chars": 5023,
"preview": "#!/bin/sh\n\n# Version and configuration\nVERSION=\"0.4.1\"\nDB_DIR=\"${BEMOJI_DB_LOCATION:-${XDG_DATA_HOME:-$HOME/.local/share"
},
{
"path": ".local/bin/clip-manager",
"chars": 139,
"preview": "#!/bin/sh\ncliphist list | fuzzel -d -f monospace:size=14 -w 30 -l 10 -a bottom-right --x-margin 8 --y-margin 8 | cliphis"
},
{
"path": ".local/bin/dircomp",
"chars": 665,
"preview": "#!/bin/sh\n\n# Check if directories are provided\nif [ -z \"$1\" ] || [ -z \"$2\" ]; then\n echo \"Usage: $0 <dir1> <dir2>\"\n "
},
{
"path": ".local/bin/exefind",
"chars": 1885,
"preview": "#!/bin/bash\n\n# Expanded noise list\nIGNORE=\"librewolf|vesktop|alacritty|swaybg|gvfs|xdg|pipewire|wireplumber|lsfg-vk-ui|I"
},
{
"path": ".local/bin/ff-concat",
"chars": 725,
"preview": "#!/bin/bash\n\n# Check if there are video files in the directory\ntmpfile=$(mktemp)\n\n# Loop through video files (mp4, mov, "
},
{
"path": ".local/bin/ff-crop",
"chars": 625,
"preview": "#!/bin/bash\n\nif [ -z \"$1\" ]; then\n echo \"Usage: ff-crop <aspect_ratio>\"\n echo \"Example: ff-crop 0.75:1\"\n exit 1\nfi\n\n#"
},
{
"path": ".local/bin/ff-diff",
"chars": 1032,
"preview": "#!/bin/sh\nset -eu\n\nsrc_dir=\".\"\nout_dir=\"encVids\"\n\n[ -d \"$out_dir\" ] || { echo \"Output dir '$out_dir' not found\"; exit 1;"
},
{
"path": ".local/bin/ff-enc",
"chars": 6699,
"preview": "#!/bin/sh\nset -eu\n\n### CONFIGURATION ###\nvideo_output_dir=\"encVids\"\naudio_output_dir=\"extAudios\"\noptimized_audio_dir=\"op"
},
{
"path": ".local/bin/font-char-list",
"chars": 643,
"preview": "#!/bin/bash -\n\nUsage() { echo \"$0 FontFile\"; exit 1; }\nSayError() { local error=$1; shift; echo \"$0: $@\"; exit \"$error\";"
},
{
"path": ".local/bin/font-unicode",
"chars": 82,
"preview": "#!/bin/sh\nfor CODE in $@; do\n\t/usr/bin/printf \"%s - \\u$CODE\\n\" $CODE\ndone\n\nexit $?"
},
{
"path": ".local/bin/fuzz-launcher",
"chars": 4130,
"preview": "#!/bin/sh\n\n# Global Settings\nFONT=\"monospace:size=14\"\nALIGN=\"center\"\nFUZZEL_CMD=\"fuzzel -d -f $FONT -a $ALIGN\"\n\n# Functi"
},
{
"path": ".local/bin/get-steamid",
"chars": 775,
"preview": "#!/bin/sh\n\nsteamapps=\"$HOME/.var/app/com.valvesoftware.Steam/data/Steam/steamapps\"\n\n# Print header\nprintf \"Looking throu"
},
{
"path": ".local/bin/git-ops",
"chars": 1982,
"preview": "#!/bin/sh\n\n# Function to exit with an error message\nexit_err() {\n printf '%s\\n' \"$1\" >&2\n exit 1\n}\n\n# Check if origin "
},
{
"path": ".local/bin/grim-print",
"chars": 1503,
"preview": "#!/bin/sh\n\n# Check for required commands\nfor cmd in grim swayimg slurp wl-copy fuzzel; do\n command -v \"$cmd\" >/dev/nu"
},
{
"path": ".local/bin/img-dupes",
"chars": 1482,
"preview": "#!/bin/bash\n\n# --- CONFIGURATION ---\nTHRESHOLD=\"98%\" # 85-90% is ideal for \"near-duplicates\"\nDB_FILE=\"fingerprin"
},
{
"path": ".local/bin/img-duprestore",
"chars": 907,
"preview": "#!/bin/bash\nTHRESHOLD=\"70\"\nBACKUP_DIR=\"duplicates_backup\"\nTREE_EXCLUDE=\" -not -path \\\"./$BACKUP_DIR/*\\\"\"\n\necho \"Scanning"
},
{
"path": ".local/bin/img-enc",
"chars": 2106,
"preview": "#!/bin/sh\n\ntarget_format=\"${1:-webp}\" # Default to webp if not specified\noutput_dir=\"opt_${target_format}\"\nquality=82\nm"
},
{
"path": ".local/bin/imv-mass",
"chars": 759,
"preview": "#!/bin/bash\n\n# Set the target directory to the first argument, or use the current directory if no argument is provided\nT"
},
{
"path": ".local/bin/mass-mpv",
"chars": 855,
"preview": "#!/bin/bash\n\n# Convert TARGET_DIR to an absolute path immediately\nTARGET_DIR=\"$(realpath \"${1:-.}\")\"\n\nTMP_INPUT_CONF=$(m"
},
{
"path": ".local/bin/mem",
"chars": 845,
"preview": "#!/bin/sh\n\nps -e -o pgid= -o rss= -o comm= | awk '\n{\n pgid = $1\n rss = $2\n cmd = $3\n\n # Handle kernel thread"
},
{
"path": ".local/bin/mvToParent",
"chars": 345,
"preview": "#!/bin/sh\n\nparent_dir=$(pwd)\n\nfind \"$parent_dir\" -mindepth 2 -type f | while IFS= read -r filepath; do\n relative_path=$"
},
{
"path": ".local/bin/net-menu",
"chars": 6272,
"preview": "#!/bin/sh\n# POSIX-Compliant Network Manager Script with Wi-Fi and VPN features\n\nLOCKFILE=\"/tmp/network-manager.lock\"\n\n# "
},
{
"path": ".local/bin/reload-wall",
"chars": 3493,
"preview": "#!/bin/sh\n\n# Cache file lists sorted alphabetically\nIMG_FILES=$(find \"$HOME/pictures/walls\" -type f \\( -name \"*.jpg\" -o "
},
{
"path": ".local/bin/spefetch",
"chars": 3892,
"preview": "#!/bin/sh\n#\n# spefetch - precise system info display\n\n# Configuration\n: \"${USE_NERD_FONTS:=1}\" # Set to 0 for emoji fal"
},
{
"path": ".local/bin/start-comp",
"chars": 2064,
"preview": "#!/bin/sh\n# Unified compositor launcher with optional PipeWire support\n\n# --- Parse Arguments ---\nSTART_PIPEWIRE=false\nC"
},
{
"path": ".local/bin/updtscan",
"chars": 3385,
"preview": "#!/bin/sh\n\n# Configuration\nCHECK_INTERVAL=14400 # 4 hours in seconds\nNOTIFY_TIMEOUT=14400000 # Notification timeout in"
},
{
"path": ".local/bin/usb-mnt",
"chars": 2327,
"preview": "#!/bin/sh\n\n# Modified USB Mount Script with RW Access\n# Shows mount path and mounts read-write\n\nMOUNT_BASE=\"/tmp/usb-$(i"
},
{
"path": ".local/bin/vertsearch-lf",
"chars": 2491,
"preview": "#!/bin/bash\n\n# Path to the directory you want to search in\ndirectory=\"$1\"\ncache_dir=\"$HOME/.cache/vertical_videos\"\nproce"
},
{
"path": ".local/bin/yt-search",
"chars": 1051,
"preview": "#!/bin/sh\n\nif [ -z \"$1\" ]; then\n printf \"search query: \"\n read -r query\nelse\n query=\"$1\"\nfi\n\nquery=$(echo \"$query\" | "
},
{
"path": ".local/share/applications/browser.desktop",
"chars": 195,
"preview": "[Desktop Entry]\nName=Web Browser\nIcon=internet-web-browser\nExec=flatpak run io.gitlab.librewolf-community -new-tab %U\nTe"
},
{
"path": ".local/share/applications/file.desktop",
"chars": 246,
"preview": "[Desktop Entry]\nType=Application\nName=File manager\nComment=File manager\nIcon=folder\nExec=pcmanfm-qt\nTerminal=false\nMimeT"
},
{
"path": ".local/share/applications/img.desktop",
"chars": 527,
"preview": "[Desktop Entry]\nName=Image viewer\nGenericName=Image viewer\nGenericName[en_US]=Image viewer\nComment=Fast Image Viewer\nExe"
},
{
"path": ".local/share/applications/text.desktop",
"chars": 358,
"preview": "[Desktop Entry]\nType=Application\nName=Text editor\nIcon=nvim\nTryExec=nvim\nExec=nvim %F\nTerminal=true\nCategories=Utility;T"
},
{
"path": ".local/share/applications/video.desktop",
"chars": 2132,
"preview": "[Desktop Entry]\nType=Application\nName=Media Player\nGenericName=Multimedia player\nIcon=mpv\nTryExec=mpv\nExec=mpv --player-"
},
{
"path": ".local/share/fonts/git-fonts.sh",
"chars": 671,
"preview": "#!/bin/sh\n\n# Define the repository URL and the fonts directory\nREPO_URL=\"https://github.com/Speyll/fonts.git\"\nFONT_DIR=\""
},
{
"path": ".local/share/icons/git-cursors.sh",
"chars": 639,
"preview": "#!/bin/sh\n\n# Define the repository URL and the fonts directory\nREPO_URL=\"https://github.com/Speyll/cursors.git\"\nCUR_DIR="
},
{
"path": ".local/share/themes/Base16/openbox-3/bullet.xbm",
"chars": 216,
"preview": "#define bullet_width 10\n#define bullet_height 10\nstatic unsigned char bullet_bits[] = {\n 0x00, 0x00, 0x00, 0x00, 0x00,"
},
{
"path": ".local/share/themes/Base16/openbox-3/close.xbm",
"chars": 121,
"preview": "#define desk_width 6\n#define desk_height 6\nstatic unsigned char desk_bits[] = {\n 0x33, 0x33, 0x00, 0x00, 0x33, 0x33 };"
},
{
"path": ".local/share/themes/Base16/openbox-3/desk.xbm",
"chars": 121,
"preview": "#define desk_width 6\n#define desk_height 6\nstatic unsigned char desk_bits[] = {\n 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f };"
},
{
"path": ".local/share/themes/Base16/openbox-3/desk_toggled.xbm",
"chars": 121,
"preview": "#define desk_width 6\n#define desk_height 6\nstatic unsigned char desk_bits[] = {\n 0x3f, 0x3f, 0x33, 0x33, 0x3f, 0x3f };"
},
{
"path": ".local/share/themes/Base16/openbox-3/iconify.xbm",
"chars": 130,
"preview": "#define iconify_width 6\n#define iconify_height 6\nstatic unsigned char iconify_bits[] = {\n 0x00, 0x00, 0x00, 0x00, 0x0c"
},
{
"path": ".local/share/themes/Base16/openbox-3/max.xbm",
"chars": 121,
"preview": "#define max7_width 6\n#define max7_height 6\nstatic unsigned char max7_bits[] = {\n 0x33, 0x33, 0x00, 0x00, 0x30, 0x30 };"
},
{
"path": ".local/share/themes/Base16/openbox-3/max_disabled.xbm",
"chars": 145,
"preview": "#define max_disabled_width 6\n#define max_disabled_height 6\nstatic unsigned char max_disabled_bits[] = {\n 0x00, 0x00, 0"
},
{
"path": ".local/share/themes/Base16/openbox-3/max_toggled.xbm",
"chars": 133,
"preview": "#define iconify2_width 6\n#define iconify2_height 6\nstatic unsigned char iconify2_bits[] = {\n 0x03, 0x03, 0x00, 0x00, 0"
},
{
"path": ".local/share/themes/Base16/openbox-3/menu.xbm",
"chars": 133,
"preview": "#define iconify2_width 6\n#define iconify2_height 6\nstatic unsigned char iconify2_bits[] = {\n 0x03, 0x03, 0x00, 0x00, 0"
},
{
"path": ".local/share/themes/Base16/openbox-3/shade.xbm",
"chars": 124,
"preview": "#define shade_width 6\n#define shade_height 6\nstatic unsigned char shade_bits[] = {\n 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00"
},
{
"path": ".local/share/themes/Base16/openbox-3/themerc",
"chars": 3861,
"preview": "!! Colors\n!! Start flavours\n!! Window colors\nwindow.active.title.bg.color: #d5c4a1\nwindow.inactive.title.bg.color: #2828"
},
{
"path": ".profile",
"chars": 2542,
"preview": "# ~/.profile: executed by login shells\n\n# Source .bashrc if available\n[ -n \"$BASH_VERSION\" ] && [ -f \"$HOME/.bashrc\" ] &"
},
{
"path": "README.md",
"chars": 2998,
"preview": "## Table of Contents\n- [Introduction](#introduction)\n- [Software Used](#software-used)\n- [Special Scripts](#special-scri"
}
]
About this extraction
This page contains the full source code of the Speyll/dotfiles GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 160 files (252.3 KB), approximately 78.8k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.