diff --git a/.config/brave-flags.conf b/.config/brave-flags.conf new file mode 100644 index 0000000..d6d120e --- /dev/null +++ b/.config/brave-flags.conf @@ -0,0 +1,3 @@ +--ozone-platform=wayland +--ozone-platform-hint=wayland +--enable-features=TouchpadOverscrollHistoryNavigation diff --git a/.config/btop/btop.conf b/.config/btop/btop.conf new file mode 100644 index 0000000..1c6f653 --- /dev/null +++ b/.config/btop/btop.conf @@ -0,0 +1,257 @@ +#? Config file for btop v. 1.4.5 + +#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes. +#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes" +color_theme = "current" + +#* If the theme set background should be shown, set to False if you want terminal background transparency. +theme_background = True + +#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false. +truecolor = True + +#* Set to true to force tty mode regardless if a real tty has been detected or not. +#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols. +force_tty = False + +#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets. +#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box. +#* Use whitespace " " as separator between different presets. +#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty" +presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty" + +#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists. +#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift. +vim_keys = True + +#* Rounded corners on boxes, is ignored if TTY mode is ON. +rounded_corners = True + +#* Default symbols to use for graph creation, "braille", "block" or "tty". +#* "braille" offers the highest resolution but might not be included in all fonts. +#* "block" has half the resolution of braille but uses more common characters. +#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY. +#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view. +graph_symbol = "braille" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_cpu = "default" + +# Graph symbol to use for graphs in gpu box, "default", "braille", "block" or "tty". +graph_symbol_gpu = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_mem = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_net = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_proc = "default" + +#* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace. +shown_boxes = "cpu mem net proc" + +#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs. +update_ms = 2000 + +#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct", +#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly. +proc_sorting = "cpu lazy" + +#* Reverse sorting order, True or False. +proc_reversed = False + +#* Show processes as a tree. +proc_tree = False + +#* Use the cpu graph colors in the process list. +proc_colors = True + +#* Use a darkening gradient in the process list. +proc_gradient = True + +#* If process cpu usage should be of the core it's running on or usage of the total available cpu power. +proc_per_core = False + +#* Show process memory as bytes instead of percent. +proc_mem_bytes = True + +#* Show cpu graph for each process. +proc_cpu_graphs = True + +#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate) +proc_info_smaps = False + +#* Show proc box on left side of screen instead of right. +proc_left = False + +#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop). +proc_filter_kernel = False + +#* In tree-view, always accumulate child process resources in the parent process. +proc_aggregate = False + +#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available. +#* Select from a list of detected attributes from the options menu. +cpu_graph_upper = "Auto" + +#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available. +#* Select from a list of detected attributes from the options menu. +cpu_graph_lower = "Auto" + +#* If gpu info should be shown in the cpu box. Available values = "Auto", "On" and "Off". +show_gpu_info = "Auto" + +#* Toggles if the lower CPU graph should be inverted. +cpu_invert_lower = True + +#* Set to True to completely disable the lower CPU graph. +cpu_single_graph = False + +#* Show cpu box at bottom of screen instead of top. +cpu_bottom = False + +#* Shows the system uptime in the CPU box. +show_uptime = True + +#* Shows the CPU package current power consumption in watts. Requires running `make setcap` or `make setuid` or running with sudo. +show_cpu_watts = True + +#* Show cpu temperature. +check_temp = True + +#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors. +cpu_sensor = "Auto" + +#* Show temperatures for cpu cores also if check_temp is True and sensors has been found. +show_coretemp = True + +#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core. +#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine. +#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries. +#* Example: "4:0 5:1 6:3" +cpu_core_map = "" + +#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine". +temp_scale = "celsius" + +#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024. +base_10_sizes = False + +#* Show CPU frequency. +show_cpu_freq = True + +#* Draw a clock at top of screen, formatting according to strftime, empty string to disable. +#* Special formatting: /host = hostname | /user = username | /uptime = system uptime +clock_format = "%X" + +#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort. +background_update = True + +#* Custom cpu model name, empty string to disable. +custom_cpu_name = "" + +#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ". +#* Only disks matching the filter will be shown. Prepend exclude= to only show disks not matching the filter. Examples: disk_filter="/boot /home/user", disks_filter="exclude=/boot /home/user" +disks_filter = "" + +#* Show graphs instead of meters for memory values. +mem_graphs = True + +#* Show mem box below net box instead of above. +mem_below_net = False + +#* Count ZFS ARC in cached and available memory. +zfs_arc_cached = True + +#* If swap memory should be shown in memory box. +show_swap = True + +#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk. +swap_disk = True + +#* If mem box should be split to also show disks info. +show_disks = True + +#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar. +only_physical = True + +#* Read disks list from /etc/fstab. This also disables only_physical. +use_fstab = True + +#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool) +zfs_hide_datasets = False + +#* Set to true to show available disk space for privileged users. +disk_free_priv = False + +#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view. +show_io_stat = True + +#* Toggles io mode for disks, showing big graphs for disk read/write speeds. +io_mode = False + +#* Set to True to show combined read/write io graphs in io mode. +io_graph_combined = False + +#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ". +#* Example: "/mnt/media:100 /:20 /boot:1". +io_graph_speeds = "" + +#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False. +net_download = 100 + +net_upload = 100 + +#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest. +net_auto = True + +#* Sync the auto scaling for download and upload to whichever currently has the highest scale. +net_sync = True + +#* Starts with the Network Interface specified here. +net_iface = "" + +#* "True" shows bitrates in base 10 (Kbps, Mbps). "False" shows bitrates in binary sizes (Kibps, Mibps, etc.). "Auto" uses base_10_sizes. +base_10_bitrate = "Auto" + +#* Show battery stats in top right if battery is present. +show_battery = True + +#* Which battery to use if multiple are present. "Auto" for auto detection. +selected_battery = "Auto" + +#* Show power stats of battery next to charge indicator. +show_battery_watts = True + +#* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG". +#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info. +log_level = "WARNING" + +#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards. +nvml_measure_pcie_speeds = True + +#* Measure PCIe throughput on AMD cards, may impact performance on certain cards. +rsmi_measure_pcie_speeds = True + +#* Horizontally mirror the GPU graph. +gpu_mirror_graph = True + +#* Custom gpu0 model name, empty string to disable. +custom_gpu_name0 = "" + +#* Custom gpu1 model name, empty string to disable. +custom_gpu_name1 = "" + +#* Custom gpu2 model name, empty string to disable. +custom_gpu_name2 = "" + +#* Custom gpu3 model name, empty string to disable. +custom_gpu_name3 = "" + +#* Custom gpu4 model name, empty string to disable. +custom_gpu_name4 = "" + +#* Custom gpu5 model name, empty string to disable. +custom_gpu_name5 = "" diff --git a/.config/chromium-flags.conf b/.config/chromium-flags.conf new file mode 100644 index 0000000..d6d120e --- /dev/null +++ b/.config/chromium-flags.conf @@ -0,0 +1,3 @@ +--ozone-platform=wayland +--ozone-platform-hint=wayland +--enable-features=TouchpadOverscrollHistoryNavigation diff --git a/.config/chromium/Default/Preferences b/.config/chromium/Default/Preferences new file mode 100644 index 0000000..3b4bc82 --- /dev/null +++ b/.config/chromium/Default/Preferences @@ -0,0 +1,15 @@ +{ + "extensions": { + "theme": { + "id": "", + "use_system": false, + "use_custom": false + } + }, + "browser": { + "theme": { + "color_scheme": 2, + "user_color": 2 + } + } +} diff --git a/.config/elephant/calc.toml b/.config/elephant/calc.toml new file mode 100644 index 0000000..95d00d1 --- /dev/null +++ b/.config/elephant/calc.toml @@ -0,0 +1 @@ +async = false diff --git a/.config/elephant/desktopapplications.toml b/.config/elephant/desktopapplications.toml new file mode 100644 index 0000000..de17325 --- /dev/null +++ b/.config/elephant/desktopapplications.toml @@ -0,0 +1,3 @@ +show_actions = false +only_search_title = true +history = false diff --git a/.config/elephant/symbols.toml b/.config/elephant/symbols.toml new file mode 100644 index 0000000..3144c15 --- /dev/null +++ b/.config/elephant/symbols.toml @@ -0,0 +1 @@ +command = 'wl-copy && hyprctl dispatch sendshortcut "SHIFT, Insert,"' diff --git a/.config/environment.d/fcitx.conf b/.config/environment.d/fcitx.conf new file mode 100644 index 0000000..ecedbcc --- /dev/null +++ b/.config/environment.d/fcitx.conf @@ -0,0 +1,4 @@ +INPUT_METHOD=fcitx +QT_IM_MODULE=fcitx +XMODIFIERS=@im=fcitx +SDL_IM_MODULE=fcitx diff --git a/.config/fcitx5/conf/clipboard.conf b/.config/fcitx5/conf/clipboard.conf new file mode 100644 index 0000000..8aef5a8 --- /dev/null +++ b/.config/fcitx5/conf/clipboard.conf @@ -0,0 +1,2 @@ +TriggerKey= +PastePrimaryKey= diff --git a/.config/fcitx5/conf/xcb.conf b/.config/fcitx5/conf/xcb.conf new file mode 100644 index 0000000..90f5316 --- /dev/null +++ b/.config/fcitx5/conf/xcb.conf @@ -0,0 +1 @@ +Allow Overriding System XKB Settings=False diff --git a/.config/ghostty/config b/.config/ghostty/config index d073e6b..bf05926 100644 --- a/.config/ghostty/config +++ b/.config/ghostty/config @@ -1,3 +1,6 @@ +# Dynamic theme colors +config-file = ?"~/.local/state/station/theme/ghostty.conf" + confirm-close-surface=false keybind = all:unconsumed:ctrl+shift+,=reload_config @@ -133,3 +136,34 @@ keybind = all:unconsumed:shift+arrow_left=unbind keybind = all:unconsumed:shift+arrow_right=unbind #adjust_selection:up keybind = all:unconsumed:shift+arrow_up=unbind + +# Font +font-family = "Fira Code Nerd Font" +font-style = Regular +font-size = 9 + +# Window +window-theme = ghostty +window-padding-x = 14 +window-padding-y = 14 +confirm-close-surface=false +resize-overlay = never +gtk-toolbar-style = flat + +# Cursor styling +cursor-style = "block" +cursor-style-blink = false + +# Cursor styling + SSH session terminfo +# (all shell integration options must be passed together) +shell-integration-features = no-cursor,ssh-env + +# Keyboard bindings +keybind = shift+insert=paste_from_clipboard +keybind = control+insert=copy_to_clipboard + +# Slowdown mouse scrolling +mouse-scroll-multiplier = 0.95 + +# Fix general slowness on hyprland (https://github.com/ghostty-org/ghostty/discussions/3224) +async-backend = epoll diff --git a/.config/git/config b/.config/git/config index 14c2795..73453ba 100644 --- a/.config/git/config +++ b/.config/git/config @@ -1,14 +1,36 @@ [user] - email = stofflees@gmail.com - name = Chris + email = stofflees@gmail.com + name = Chris [pull] - rebase = true + rebase = true +[push] + autoSetupRemote = true [init] - defaultBranch = main + defaultBranch = main [core] - excludesfile = /home/chris/.config/git/ignore + excludesfile = /home/chris/.config/git/ignore [filter "lfs"] - clean = git-lfs clean -- %f - smudge = git-lfs smudge -- %f - process = git-lfs filter-process - required = true + clean = git-lfs clean -- %f + smudge = git-lfs smudge -- %f + process = git-lfs filter-process + required = true +[alias] + co = checkout + br = branch + ci = commit + st = status +[diff] + algorithm = histogram # Clearer diffs on moved/edited lines + colorMoved = plain # Highlight moved blocks in diffs + mnemonicPrefix = true # More intuitive refs in diff output +[commit] + verbose = true # Include diff comment in commit message template +[column] + ui = auto # Output in columns when possible +[branch] + sort = -committerdate # Sort branches by most recent commit first +[tag] + sort = -version:refname # Sort version numbers as you would expect +[rerere] + enabled = true # Record and reuse conflict resolutions + autoupdate = true # Apply stored conflict resolutions automatically diff --git a/.config/hyprland-preview-share-picker/config.yaml b/.config/hyprland-preview-share-picker/config.yaml new file mode 100644 index 0000000..a9557c2 --- /dev/null +++ b/.config/hyprland-preview-share-picker/config.yaml @@ -0,0 +1,71 @@ +# paths to stylesheets on the filesystem which should be applied to the application +# +# relative paths are resolved relative to the location of the config file +stylesheets: ["../../.local/state/station/theme/hyprland-preview-share-picker.css"] +# default page selected when the picker is opened +default_page: windows + +window: + # height of the application window + height: 500 + # width of the application window +width: 1000 + +image: + # size to which the images should be internally resized to reduce the memory footprint + resize_size: 500 + # target size of the longer side of the image widget +widget_size: 150 + +classes: + # css classname of the window + window: window + # css classname of the card containing an image and a label +image_card: card +# css classname of the card containing an image and a label when the image is still being loaded +image_card_loading: card-loading +# css classname of the image inside the card +image: image +# css classname of the label inside the card +image_label: image-label +# css classname of the notebook containing all pages +notebook: notebook +# css classname of a label of the notebook +tab_label: tab-label +# css classname of a notebook page (e.g. windows container) +notebook_page: page +# css classname of the region selection button +region_button: region-button +# css classname of the button containing the session restore checkbox and label +restore_button: restore-button + +windows: + # minimum amount of image cards per row on the windows page + min_per_row: 3 + # maximum amount of image cards per row on the windows page +max_per_row: 999 +# number of clicks needed to select a window +clicks: 1 +# spacing in pixels between the window cards +spacing: 12 + +outputs: + # number of clicks needed to select an output + clicks: 1 + # spacing in pixels between the outputs in the layout + # note: the spacing is applied from both sides (the gap is `spacing * 2`) +spacing: 6 +# show the label with the output name +show_label: false +# size the output cards respectively to their scaling +respect_output_scaling: true + +region: + # command to run for region selection + # the output needs to be in the @,,, (e.g. DP-3@2789,436,756,576) format + command: slurp -f '%o@%x,%y,%w,%h' + + # hide the token restore checkbox and use the default value instead +hide_token_restore: true +# enable debug logs by default +debug: false diff --git a/.config/imv/config b/.config/imv/config new file mode 100644 index 0000000..4649324 --- /dev/null +++ b/.config/imv/config @@ -0,0 +1,13 @@ +[binds] + +# Print the current image file + = exec lp "$imv_current_file" + +# Delete the current image and quit the viewer + = exec rm "$imv_current_file"; quit + +# Delete the current image and move to the next one + = exec rm "$imv_current_file"; close + +# Rotate the currently open image by 90 degrees + = exec mogrify -rotate 90 "$imv_current_file" diff --git a/.config/mako/core.ini b/.config/mako/core.ini new file mode 100644 index 0000000..139f38e --- /dev/null +++ b/.config/mako/core.ini @@ -0,0 +1,32 @@ +anchor=top-right +default-timeout=5000 +width=420 +outer-margin=20 +padding=10,15 +border-size=2 +max-icon-size=32 +font=sans-serif 14px + +[app-name=Spotify] +invisible=1 + +[mode=do-not-disturb] +invisible=true + +[mode=do-not-disturb app-name=notify-send] +invisible=false + +[urgency=critical] +default-timeout=0 +layer=overlay + +[summary~="Setup Wi-Fi"] +on-button-left=exec sh -c 'station-notification-dismiss "Setup Wi-Fi"; station-launch-wifi' + +[summary~="Screenshot copied & saved"] +max-icon-size=80 +format=%s\n%b + +; text-color={{ foreground }} +; border-color={{ accent }} +; background-color={{ background }} diff --git a/.config/sddm/station/Main.qml b/.config/sddm/station/Main.qml new file mode 100644 index 0000000..c3ec59c --- /dev/null +++ b/.config/sddm/station/Main.qml @@ -0,0 +1,99 @@ +import QtQuick 2.0 +import SddmComponents 2.0 + +Rectangle { + id: root + width: 640 + height: 480 + color: "#000000" + + property string currentUser: userModel.lastUser + property int sessionIndex: { + for (var i = 0; i < sessionModel.rowCount(); i++) { + var name = (sessionModel.data(sessionModel.index(i, 0), Qt.DisplayRole) || "").toString() + if (name.indexOf("uwsm") !== -1) + return i + } + return sessionModel.lastIndex + } + + Connections { + target: sddm + function onLoginFailed() { + errorMessage.text = "Login failed" + password.text = "" + password.focus = true + } + function onLoginSucceeded() { + errorMessage.text = "" + } + } + + Column { + anchors.centerIn: parent + spacing: root.height * 0.04 + width: parent.width + + // Image { + // source: "logo.svg" + // width: root.width * 0.35 + // height: Math.round(width * sourceSize.height / sourceSize.width) + // fillMode: Image.PreserveAspectFit + // anchors.horizontalCenter: parent.horizontalCenter + // } + + Row { + anchors.horizontalCenter: parent.horizontalCenter + spacing: root.width * 0.007 + + Text { + text: "\uf023" + color: "#ffffff" + font.family: "JetBrainsMono Nerd Font" + font.pixelSize: root.height * 0.025 + anchors.verticalCenter: parent.verticalCenter + } + + Rectangle { + width: root.width * 0.17 + height: root.height * 0.04 + color: "#000000" + border.color: "#ffffff" + border.width: 1 + clip: true + + TextInput { + id: password + anchors.fill: parent + anchors.margins: root.height * 0.008 + verticalAlignment: TextInput.AlignVCenter + echoMode: TextInput.Password + font.family: "JetBrainsMono Nerd Font" + font.pixelSize: root.height * 0.02 + font.letterSpacing: root.height * 0.004 + passwordCharacter: "\u2022" + color: "#ffffff" + focus: true + + Keys.onPressed: { + if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { + sddm.login(root.currentUser, password.text, root.sessionIndex) + event.accepted = true + } + } + } + } + } + + Text { + id: errorMessage + text: "" + color: "#f7768e" + font.family: "JetBrainsMono Nerd Font" + font.pixelSize: root.height * 0.018 + anchors.horizontalCenter: parent.horizontalCenter + } + } + + Component.onCompleted: password.forceActiveFocus() +} diff --git a/.config/sddm/station/metadata.desktop b/.config/sddm/station/metadata.desktop new file mode 100644 index 0000000..d1eb6ca --- /dev/null +++ b/.config/sddm/station/metadata.desktop @@ -0,0 +1,6 @@ +[SddmGreeterTheme] +Name=Station +Description=Minimal terminal-style login theme matching the Limine bootloader aesthetic +Author=Station +Type=sddm-theme +Version=1.0 diff --git a/.config/sddm/station/theme.conf b/.config/sddm/station/theme.conf new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/.config/sddm/station/theme.conf @@ -0,0 +1 @@ +[General] diff --git a/.config/shell/aliasrc b/.config/shell/aliasrc index c25d528..4b26be8 100644 --- a/.config/shell/aliasrc +++ b/.config/shell/aliasrc @@ -1,6 +1,5 @@ #!/bin/sh - # Use neovim for vim if present [ -x "$(command -v nvim)" ] && alias vim="nvim" vimdiff="nvim -d" @@ -14,6 +13,13 @@ done # Verbosity and settings that you pretty much just always are going to want. alias \ + ...="cd .." \ + ...="cd ../.." \ + ....="cd ../../.." \ + .....="cd ../../../.." \ + df="df -h" \ + du="du -h" \ + free="free -m" \ cp="cp -iv" \ mv="mv -iv" \ rm="rm -vI" \ @@ -25,45 +31,41 @@ alias \ tmux="tmux -f ~/.config/tmux/tmux.conf" \ aider="aider --config ~/.config/aider/aider.yaml" +alias ff="fzf --preview 'bat --style=numbers --color=always {}'" +alias eff='$EDITOR "$(ff)"' + +if command -v eza &> /dev/null; then + alias ls='eza -lh --group-directories-first --icons=auto' + alias lsa='ls -a' + alias lt='eza --tree --level=2 --long --icons --git' + alias lta='lt -a' +fi + +if command -v zoxide &> /dev/null; then + alias cd="zd" + zd() { + if (( $# == 0 )); then + builtin cd ~ || return + elif [[ -d $1 ]]; then + builtin cd "$1" || return + else + if ! z "$@"; then + echo "Error: Directory not found" + return 1 + fi + + printf "\U000F17A9 " + pwd + fi + + if [[ -n $TMUX ]]; then + tmux rename-window "$(basename "$PWD")" + fi + } +fi # Colorize commands when possible. alias \ - ls="ls -hAN --color=auto --group-directories-first"\ - li="ls -AhgGFt --group-directories-first --time=atime --color=auto --time-style=long-iso \ - | sed 's/^[^ ][^ ]* *[^ ][^ ]* //' \ - | awk '\ - /^total/ { next }\ - {\ - filename = \$NF;\ - icon = \"📄\";\ - if (filename ~ /\/$/) {\ - icon = \"📁\";\ - } else if (filename ~ /\*$/) {\ - icon = \"⚙️ \";\ - } else if (filename ~ /@$/) {\ - icon = \"🔗\";\ - } else {\ - ext = tolower(cleanName);\ - if (ext ~ /\./) {\ - sub(/^.*\./, \"\", ext);\ - } else {\ - ext = \"\";\ - }\ - if (ext ~ /^(jpg|jpeg|png|gif)$/) {\ - icon = \"🖼\";\ - } else if (ext ~ /^(mp3|wav|flac)$/) {\ - icon = \"🎵\";\ - } else if (ext ~ /^(pdf)$/) {\ - icon = \"📕\";\ - } else if (ext ~ /^(txt|md)$/) {\ - icon = \"📝\";\ - } else if (ext ~ /^(js|py|sh|c|cpp|java)$/) {\ - icon = \"⚡\";\ - }\ - }\ - print icon \" \" \$0;\ - }\ - '" \ grep="grep --color=auto" \ diff="diff --color=auto" \ ccat="highlight --out-format=ansi" @@ -73,7 +75,6 @@ alias \ ka="killall" \ YT="youtube-viewer" \ sdn="sudo shutdown -h now" \ - e="$EDITOR" \ v="$EDITOR" \ cl="clear" \ p="sudo pacman" \ @@ -112,15 +113,19 @@ alias \ enr="trans en:ro -j -- " \ enri="trans en:ro -i" +alias d='docker' +alias dc='docker compose' +alias t='tmux attach || tmux new -s Work' +e() { if [ "$#" -eq 0 ]; then command nvim . ; else command nvim "$@"; fi; } + +open() ( + xdg-open "$@" >/dev/null 2>&1 & +) + function tf() { php artisan test --filter="$*" } -function cdj() { - dir=$1 - cd $1 2>/dev/null || autojump $1 -} - function dut() { threshold=${1:-5} sudo du -hax -t"${threshold}G" /* --exclude=/{proc,sys,dev,run} @@ -246,7 +251,6 @@ alias \ alias \ - docker-compose="podman-compose" \ cat="bat" \ ls="eza --icons=always" \ fullClean="nix-collect-garbage --delete-old; sudo nix-collect-garbage -d; sudo /run/current-system/bin/switch-to-configuration boot" \ diff --git a/.config/shell/fns b/.config/shell/fns new file mode 100755 index 0000000..baa50b3 --- /dev/null +++ b/.config/shell/fns @@ -0,0 +1,265 @@ +# Compression +compress() { tar -czf "${1%/}.tar.gz" "${1%/}"; } +alias decompress="tar -xzf" + +# Write iso file to sd card +iso2sd() { + if (( $# < 1 )); then + echo "Usage: iso2sd [output_device]" + echo "Example: iso2sd ~/Downloads/ubuntu-25.04-desktop-amd64.iso /dev/sda" + return 1 + fi + + local iso="$1" + local drive="$2" + + if [[ -z $drive ]]; then + local available_sds=$(lsblk -dpno NAME | grep -E '/dev/sd') + + if [[ -z $available_sds ]]; then + echo "No SD drives found and no drive specified" + return 1 + fi + + drive=$(omarchy-drive-select "$available_sds") + + if [[ -z $drive ]]; then + echo "No drive selected" + return 1 + fi + fi + + sudo dd bs=4M status=progress oflag=sync if="$iso" of="$drive" + sudo eject "$drive" +} + +# Format an entire drive for a single partition using exFAT +format-drive() { + if (( $# != 2 )); then + echo "Usage: format-drive " + echo "Example: format-drive /dev/sda 'My Stuff'" + echo -e "\nAvailable drives:" + lsblk -d -o NAME -n | awk '{print "/dev/"$1}' + else + echo "WARNING: This will completely erase all data on $1 and label it '$2'." + read -rp "Are you sure you want to continue? (y/N): " confirm + + if [[ $confirm =~ ^[Yy]$ ]]; then + sudo wipefs -a "$1" + sudo dd if=/dev/zero of="$1" bs=1M count=100 status=progress + sudo parted -s "$1" mklabel gpt + sudo parted -s "$1" mkpart primary 1MiB 100% + sudo parted -s "$1" set 1 msftdata on + + partition="$([[ $1 == *"nvme"* ]] && echo "${1}p1" || echo "${1}1")" + sudo partprobe "$1" || true + sudo udevadm settle || true + + sudo mkfs.exfat -n "$2" "$partition" + + echo "Drive $1 formatted as exFAT and labeled '$2'." + fi + fi +} + +# SSH Port Forwarding Functions +fip() { + (( $# < 2 )) && echo "Usage: fip [port2] ..." && return 1 + local host="$1" + shift + for port in "$@"; do + ssh -f -N -L "$port:localhost:$port" "$host" && echo "Forwarding localhost:$port -> $host:$port" + done +} + +dip() { + (( $# == 0 )) && echo "Usage: dip [port2] ..." && return 1 + for port in "$@"; do + pkill -f "ssh.*-L $port:localhost:$port" && echo "Stopped forwarding port $port" || echo "No forwarding on port $port" + done +} + +lip() { + pgrep -af "ssh.*-L [0-9]+:localhost:[0-9]+" || echo "No active forwards" +} + +# Create a Tmux Dev Layout with editor, ai, and terminal +# Usage: tdl [] +tdl() { + [[ -z $1 ]] && { echo "Usage: tdl []"; return 1; } + [[ -z $TMUX ]] && { echo "You must start tmux to use tdl."; return 1; } + + local current_dir="${PWD}" + local editor_pane ai_pane ai2_pane + local ai="$1" + local ai2="$2" + + # Use TMUX_PANE for the pane we're running in (stable even if active window changes) + editor_pane="$TMUX_PANE" + + # Name the current window after the base directory name + tmux rename-window -t "$editor_pane" "$(basename "$current_dir")" + + # Split window vertically - top 85%, bottom 15% (target editor pane explicitly) + tmux split-window -v -p 15 -t "$editor_pane" -c "$current_dir" + + # Split editor pane horizontally - AI on right 30% (capture new pane ID directly) + ai_pane=$(tmux split-window -h -p 30 -t "$editor_pane" -c "$current_dir" -P -F '#{pane_id}') + + # If second AI provided, split the AI pane vertically + if [[ -n $ai2 ]]; then + ai2_pane=$(tmux split-window -v -t "$ai_pane" -c "$current_dir" -P -F '#{pane_id}') + tmux send-keys -t "$ai2_pane" "$ai2" C-m + fi + + # Run ai in the right pane + tmux send-keys -t "$ai_pane" "$ai" C-m + + # Run nvim in the left pane + tmux send-keys -t "$editor_pane" "$EDITOR ." C-m + + # Select the nvim pane for focus + tmux select-pane -t "$editor_pane" +} + +# Create multiple tdl windows with one per subdirectory in the current directory +# Usage: tdlm [] +tdlm() { + [[ -z $1 ]] && { echo "Usage: tdlm []"; return 1; } + [[ -z $TMUX ]] && { echo "You must start tmux to use tdlm."; return 1; } + + local ai="$1" + local ai2="$2" + local base_dir="$PWD" + local first=true + + # Rename the session to the current directory name (replace dots/colons which tmux disallows) + tmux rename-session "$(basename "$base_dir" | tr '.:' '--')" + + for dir in "$base_dir"/*/; do + [[ -d $dir ]] || continue + local dirpath="${dir%/}" + + if $first; then + # Reuse the current window for the first project + tmux send-keys -t "$TMUX_PANE" "cd '$dirpath' && tdl $ai $ai2" C-m + first=false + else + local pane_id=$(tmux new-window -c "$dirpath" -P -F '#{pane_id}') + tmux send-keys -t "$pane_id" "tdl $ai $ai2" C-m + fi + done +} + +# Create a multi-pane swarm layout with the same command started in each pane (great for AI) +# Usage: tsl +tsl() { + [[ -z $1 || -z $2 ]] && { echo "Usage: tsl "; return 1; } + [[ -z $TMUX ]] && { echo "You must start tmux to use tsl."; return 1; } + + local count="$1" + local cmd="$2" + local current_dir="${PWD}" + local -a panes + + tmux rename-window -t "$TMUX_PANE" "$(basename "$current_dir")" + + panes+=("$TMUX_PANE") + + while (( ${#panes[@]} < count )); do + local new_pane + local split_target="${panes[-1]}" + new_pane=$(tmux split-window -h -t "$split_target" -c "$current_dir" -P -F '#{pane_id}') + panes+=("$new_pane") + tmux select-layout -t "${panes[0]}" tiled + done + + for pane in "${panes[@]}"; do + tmux send-keys -t "$pane" "$cmd" C-m + done + + tmux select-pane -t "${panes[0]}" +} + +# Transcode a video to a good-balance 1080p that's great for sharing online +transcode-video-1080p() { + ffmpeg -i "$1" -vf scale=1920:1080 -c:v libx264 -preset fast -crf 23 -c:a copy "${1%.*}-1080p.mp4" +} + +# Transcode a video to a good-balance 4K that's great for sharing online +transcode-video-4K() { + ffmpeg -i "$1" -c:v libx265 -preset slow -crf 24 -c:a aac -b:a 192k "${1%.*}-optimized.mp4" +} + +# Transcode any image to JPG image that's great for shrinking wallpapers +img2jpg() { + img="$1" + shift + + magick "$img" "$@" -quality 95 -strip "${img%.*}-converted.jpg" +} + +# Transcode any image to a small JPG (max 1080px wide) that's great for sharing online +img2jpg-small() { + img="$1" + shift + + magick "$img" "$@" -resize 1080x\> -quality 95 -strip "${img%.*}-small.jpg" +} + +# Transcode any image to a medium JPG (max 1800px wide) that's great for sharing online +img2jpg-medium() { + img="$1" + shift + + magick "$img" "$@" -resize 1800x\> -quality 95 -strip "${img%.*}-medium.jpg" +} + +# Transcode any image to compressed-but-lossless PNG +img2png() { + img="$1" + shift + + magick "$img" "$@" -strip -define png:compression-filter=5 \ + -define png:compression-level=9 \ + -define png:compression-strategy=1 \ + -define png:exclude-chunk=all \ + "${img%.*}-optimized.png" + } + +# Create a new worktree and branch from within current git directory. +ga() { + if [[ -z "$1" ]]; then + echo "Usage: ga [branch name]" + return 1 + fi + + local branch="$1" + local base="$(basename "$PWD")" + local path="../${base}--${branch}" + + git worktree add -b "$branch" "$path" + mise trust "$path" + cd "$path" +} + +# Remove worktree and branch from within active worktree directory. +gd() { + if gum confirm "Remove worktree and branch?"; then + local cwd base branch root + + cwd="$(pwd)" + worktree="$(basename "$cwd")" + + # split on first `--` + root="${worktree%%--*}" + branch="${worktree#*--}" + + # Protect against accidentially nuking a non-worktree directory + if [[ "$root" != "$worktree" ]]; then + cd "../$root" + git worktree remove "$worktree" --force + git branch -D "$branch" + fi + fi +} diff --git a/.config/tmux/tmux.conf b/.config/tmux/tmux.conf index 407c95c..5421f52 100644 --- a/.config/tmux/tmux.conf +++ b/.config/tmux/tmux.conf @@ -49,13 +49,13 @@ bind-key -T copy-mode-vi 'v' send -X begin-selection bind-key -T copy-mode-vi 'y' send -X copy-selection-and-cancel # Status bar -set -g status-left-length 52 -set -g status-right-length 451 -set -g status-style fg="white",bg="colour234" -set -g window-status-activity-style bold -set -g pane-border-style fg="colour245" -set -g pane-active-border-style fg="colour39" -set -g message-style bold,fg="colour16",bg="colour221" +# set -g status-left-length 52 +# set -g status-right-length 451 +# set -g status-style fg="white",bg="colour234" +# set -g window-status-activity-style bold +# set -g pane-border-style fg="colour245" +# set -g pane-active-border-style fg="colour39" +# set -g message-style bold,fg="colour16",bg="colour221" # set -g status-left '#[fg=colour235,bg=colour252,bold] ❐ #S#[fg=colour252,bg=colour238,nobold]⮀#[fg=colour245,bg=colour238,bold] #(hostname)#[fg=colour238,bg=colour234,nobold]⮀' # set -g status-right "#[fg=colour39, bg=colour234]⮂#[fg=colour234,bg=colour39] 🐳 " # set -g window-status-format "#[fg=white,bg=colour234] #I #W " @@ -81,3 +81,86 @@ bind-key -n User0 send-keys C-S-o bind-key -n User0 send-keys C-S-y bind-key -n User0 send-keys C-S-a + +# Prefix +set -g prefix C-Space +set -g prefix2 C-b +bind C-Space send-prefix + +# Reload config +bind q source-file ~/.config/tmux/tmux.conf + +# Pane Controls +bind x kill-pane + +bind -n C-M-Left select-pane -L +bind -n C-M-Right select-pane -R +bind -n C-M-Up select-pane -U +bind -n C-M-Down select-pane -D + +bind -n C-M-S-Left resize-pane -L 5 +bind -n C-M-S-Down resize-pane -D 5 +bind -n C-M-S-Up resize-pane -U 5 +bind -n C-M-S-Right resize-pane -R 5 + +# Window navigation +bind r command-prompt -I "#W" "rename-window -- '%%'" +bind c new-window -c "#{pane_current_path}" +bind k kill-window + +bind -n M-1 select-window -t 1 +bind -n M-2 select-window -t 2 +bind -n M-3 select-window -t 3 +bind -n M-4 select-window -t 4 +bind -n M-5 select-window -t 5 +bind -n M-6 select-window -t 6 +bind -n M-7 select-window -t 7 +bind -n M-8 select-window -t 8 +bind -n M-9 select-window -t 9 + +bind -n M-Left select-window -t -1 +bind -n M-Right select-window -t +1 +bind -n M-S-Left swap-window -t -1 \; select-window -t -1 +bind -n M-S-Right swap-window -t +1 \; select-window -t +1 + +# Session controls +bind R command-prompt -I "#S" "rename-session -- '%%'" +bind C new-session -c "#{pane_current_path}" +bind K kill-session +bind P switch-client -p +bind N switch-client -n + +bind -n M-Up switch-client -p +bind -n M-Down switch-client -n + +# General +set -g mouse on +set -g base-index 1 +setw -g pane-base-index 1 +set -g renumber-windows on +set -g history-limit 50000 +set -g focus-events on +set -g set-clipboard on +set -g allow-passthrough on +setw -g aggressive-resize on +set -g detach-on-destroy off + +# Status bar +set -g status-position top +set -g status-interval 5 +set -g status-left-length 30 +set -g status-right-length 50 +set -g window-status-separator "" + +# Theme +set -g status-style "bg=default,fg=default" +set -g status-left "#[fg=black,bg=blue,bold] #S #[bg=default] " +set -g status-right "#[fg=blue]#{?client_prefix,PREFIX ,}#{?window_zoomed_flag,ZOOM ,}#[fg=brightblack]#h " +set -g window-status-format "#[fg=brightblack] #I:#W " +set -g window-status-current-format "#[fg=blue,bold] #I:#W " +set -g pane-border-style "fg=brightblack" +set -g pane-active-border-style "fg=blue" +set -g message-style "bg=default,fg=blue" +set -g message-command-style "bg=default,fg=blue" +set -g mode-style "bg=blue,fg=black" +setw -g clock-mode-colour blue diff --git a/.config/uwsm/default b/.config/uwsm/default new file mode 100644 index 0000000..8b5b138 --- /dev/null +++ b/.config/uwsm/default @@ -0,0 +1,13 @@ +# Changes require a restart to take effect. + +# Install other terminals via Install > Terminal +export TERMINAL=xdg-terminal-exec + +# Use code for VSCode +export EDITOR=nvim + +# Use a custom directory for screenshots (remember to make the directory!) +# export STATION_SCREENSHOT_DIR="$HOME/Pictures/Screenshots" + +# Use a custom directory for screenrecordings (remember to make the directory!) +# export STATION_SCREENRECORD_DIR="$HOME/Videos/Screencasts" diff --git a/.config/uwsm/env b/.config/uwsm/env new file mode 100644 index 0000000..506a6be --- /dev/null +++ b/.config/uwsm/env @@ -0,0 +1,11 @@ +# Changes require a restart to take effect. + +# Ensure Omarchy bins are in the path +export STATION_PATH=$HOME/.local/share/station +export PATH=$STATION_PATH/bin:$PATH + +# Set default terminal and editor +source ~/.config/uwsm/default + +# Activate mise if present on the system +station-cmd-present mise && eval "$(mise activate bash --shims)" diff --git a/.config/wiremix/wiremix.toml b/.config/wiremix/wiremix.toml new file mode 100644 index 0000000..07f9747 --- /dev/null +++ b/.config/wiremix/wiremix.toml @@ -0,0 +1,5 @@ +# overwrites default wiremix configuration +# defaults: https://github.com/tsowell/wiremix/blob/main/wiremix.toml + +[char_sets.default] +default_device = "⮞" diff --git a/.config/xournalpp/settings.xml b/.config/xournalpp/settings.xml new file mode 100644 index 0000000..5f98a90 --- /dev/null +++ b/.config/xournalpp/settings.xml @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +