[+] Fish (#7)

This commit is contained in:
2026-05-06 12:56:55 -04:00
committed by GitHub
parent f1bba8b7a5
commit 5a70fba83b
21 changed files with 1217 additions and 276 deletions
+138
View File
@@ -0,0 +1,138 @@
# 好用的简写
if has xdg-open
alias open xdg-open
end
alias ll 'ls -l'
alias l ll
alias llg 'll --git --git-repos'
alias lla 'ls -la'
alias grep 'grep --color=auto'
alias rm 'rm -ir'
alias mkdirs 'mkdir -p'
alias ip 'ip -c -h -p'
alias ipa 'ip -br a'
function ports --description 'Show listening ports'
if has ss
ss -tulpn
else
netstat -tulpn | grep LISTEN
end
end
function suports --description 'Show listening ports with root privileges when needed'
if has ss
__fishrc_as_root ss -tulpn
else
__fishrc_as_root netstat -tulpn | grep LISTEN
end
end
function findtxt --description 'Search for text under /'
if test (count $argv) -eq 0
echo 'Usage: findtxt <pattern>'
return 1
end
set -l pattern (string join ' ' -- $argv)
if has rg
rg -n --no-messages -- "$pattern" /
else
grep -IHrnws -s -e "$pattern" /
end
end
alias clr reset
alias please sudo
if test "$IS_SANDBOX" = 1
alias codex 'codex --dangerously-bypass-approvals-and-sandbox'
alias claude 'claude --dangerously-skip-permissions'
end
alias du 'du -h'
alias ffmpeg 'ffmpeg -hide_banner'
alias ffprobe 'ffprobe -hide_banner'
function ts --description 'Run tailscale with root privileges when needed'
__fishrc_as_root tailscale $argv
end
alias ts-install 'curl -fsSL https://tailscale.com/install.sh | sh'
alias visucode 'env EDITOR="code --wait" sudoedit'
alias cpu-temp s-tui
function gpu-temp --description 'Watch GPU temperatures with gpustat'
while sleep 1
clear
gpustat
end
end
function ipv4 --description 'Show public IPv4 from Cloudflare trace'
curl https://1.0.0.1/cdn-cgi/trace -4 | grep ip
end
function ipv6 --description 'Show public IPv6 from Cloudflare trace'
curl 'https://[2606:4700:4700::1111]/cdn-cgi/trace' -6 | grep ip
end
function compress-json --description 'Zstd-compress JSON files below the current directory'
find . -name '*.json' -print0 | parallel --jobs 80% -0 zstd -z -19 -v -f --rm '{}'
end
function dotclean --description 'Remove macOS metadata files below the current directory'
find . \( -name '.DS_Store' -o -name '._*' \) -delete -print
end
alias clean-empty-dir 'find . -type d -empty -delete -print'
function mkfs.fat32 --description 'Format FAT32 with root privileges when needed'
__fishrc_as_root mkfs.fat -F 32 $argv
end
# Rsync aliases by 依云, for synching (keep hard links, ACL, atime, xattr, etc)
# Deletes files in destination that are not in source
alias xcp "rsync -aviHAXKhS --one-file-system --partial --info=progress2 --atimes --open-noatime --delete --exclude='*~' --exclude=__pycache__"
alias xcpz 'xcp --compress-choice=zstd --compress-level=3 --checksum-choice=xxh3'
alias xmv 'xcp --remove-source-files'
alias xmvz 'xcpz --remove-source-files'
# Rsync aliases by Azalea, for file transfer (do not keep hard links, ACL, atime, etc.)
# Will not delete files in destination that are not in source
alias rcp "rsync -avihS --partial --info=progress2 --exclude='*~' --exclude=__pycache__"
alias rcpz 'rcp --compress --compress-level=3 --checksum-choice=xxh3'
alias rmv 'rcp --remove-source-files'
alias rmvz 'rcpz --remove-source-files'
alias tmuxs 'tmux new-session -s'
alias tmuxr 'tmux attach-session -t'
alias tmuxl 'tmux list-sessions'
alias catt 'echo 🐱'
alias old-update-ssh-keys 'curl -L https://github.com/Hykilpikonna.keys > ~/.ssh/authorized_keys'
alias colors "color '&000&111&222&333&444&555&666&777&888&999&aaa&bbb&ccc&ddd&eee&fff'"
alias tar-kill-progress 'watch -n 60 killall tar -SIGUSR1'
alias valgrin 'valgrind --leak-check=full --show-leak-kinds=all --leak-resolution=med --track-origins=yes --vgdb=no'
# Automatic sudo aliases.
if test (id -u) -ne 0
alias sctl 'sudo systemctl'
alias sctlu 'systemctl --user'
alias jctl 'sudo journalctl'
alias jctlu 'journalctl --user-unit'
alias ufw 'sudo ufw'
alias nginx 'sudo nginx'
alias certbot 'sudo certbot'
alias apt 'sudo apt'
alias dpkg 'sudo dpkg'
else
alias sctl systemctl
alias sctlu 'systemctl --user'
alias jctl journalctl
alias jctlu 'journalctl --user-unit'
end
+62
View File
@@ -0,0 +1,62 @@
# Config sync, matching the zsh setup for Linux-relevant files.
set -g __fishrc_config_prefix '&7[&3fishrc&7]'
function __fishrc_check_config --description 'Ensure a config path is a symlink to this repo'
set -l file $argv[1]
set -l sync $argv[2]
if test -z "$file"; or test -z "$sync"
return 1
end
if not test -L "$file"
if has color
color "$__fishrc_config_prefix &c$file is not a symlink, creating symlink"
else
echo "$file is not a symlink, creating symlink"
end
if test -f "$file"; or test -d "$file"
echo "> Original file $file exists."
echo '> Diff:'
diff "$file" "$sync"
set -l bak "$file.bak"
echo "> Moving $file to $bak..."
mv "$file" "$bak"
end
echo "> Creating symlink from $sync to $file..."
mkdir -p (dirname "$file")
ln -sf "$sync" "$file"
if has color
color "$__fishrc_config_prefix &aDone!"
end
end
end
function __fishrc_check_inject --description 'Append a config line if it is missing'
set -l file $argv[1]
set -l config $argv[2]
grep -Fxq "$config" "$file"; or begin
echo "$config" >>"$file"
has color; and color "$__fishrc_config_prefix &aLines injected for $file"
end
end
set -gx CFGSYNC "$ZSHRC_ROOT/config-sync"
if status is-interactive
__fishrc_check_config "$HOME/.ssh/config" "$CFGSYNC/ssh-config"
__fishrc_check_config "$HOME/.ssh/rc" "$CFGSYNC/ssh-rc"
chmod +x "$CFGSYNC/ssh-rc"
__fishrc_check_config "$HOME/.nanorc" "$CFGSYNC/nanorc"
__fishrc_check_config "$HOME/.condarc" "$CFGSYNC/.condarc"
__fishrc_check_config "$HOME/.java/.userPrefs/com/cburch/logisim/prefs.xml" "$CFGSYNC/.java/.userPrefs/com/cburch/logisim/prefs.xml"
__fishrc_check_config "$HOME/.config/micro" "$CFGSYNC/.config/micro"
__fishrc_check_config "$HOME/.config/mako" "$CFGSYNC/.config/mako"
__fishrc_check_config "$HOME/.config/kitty" "$CFGSYNC/.config/kitty"
__fishrc_check_config "$HOME/.config/tmux" "$CFGSYNC/.config/tmux"
__fishrc_check_config "$HOME/.ipython/profile_default/startup/ipython_init.py" "$CFGSYNC/ipython_init.py"
__fishrc_check_config "$HOME/.local/share/fcitx5/rime" "$CFGSYNC/.config/ibus/rime"
__fishrc_check_config "$HOME/.local/share/fcitx5/themes" "$CFGSYNC/.config/fcitx5/themes"
end
+39
View File
@@ -0,0 +1,39 @@
set -gx LANG en_US.UTF-8
set -gx LC_ALL en_US.UTF-8
function has --description 'Return success if a command exists'
test (count $argv) -gt 0; and command -sq -- $argv[1]
end
function __fishrc_as_root --description 'Run a command through sudo only when not root'
if test (id -u) -eq 0
command $argv
else
sudo $argv
end
end
function __fishrc_prepend_path --description 'Prepend directories to PATH if they exist'
for dir in $argv
if test -d "$dir"
if type -q fish_add_path
fish_add_path -g -p "$dir"
else if not contains -- "$dir" $PATH
set -gx PATH "$dir" $PATH
end
end
end
end
__fishrc_prepend_path \
"$SCR/bin" \
"$HOME/.local/bin" \
"$HOME/.cargo/bin"
if test (uname -s) = Linux; and test (uname -m) = x86_64
__fishrc_prepend_path "$SCR/bin/linux-x64"
end
if not contains -- . $PATH
set -gx PATH $PATH .
end
+22
View File
@@ -0,0 +1,22 @@
# Docker setup.
if has docker-compose
alias dc docker-compose
else
alias dc 'docker compose'
end
if test (id -u) -ne 0
alias docker 'sudo docker'
alias docker-compose 'sudo docker-compose'
end
alias docker-ip "docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}'"
alias dockers "docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}'"
function docker-compose-path --description 'Show docker compose working directory for a container'
if test (count $argv) -eq 0
echo 'Usage: docker-compose-path <container-name>'
return 1
end
docker inspect "$argv[1]" | grep 'com.docker.compose.project.working_dir'
end
+14
View File
@@ -0,0 +1,14 @@
if has thefuck
thefuck --alias | source
end
# Reuse the existing zsh updater if zsh is installed. It runs in the background
# and preserves the repository's current update semantics without duplicating it.
if status is-interactive; and has zsh; and not set -q FISHRC_UPDATE_DISABLED
set -l __fishrc_update_path (string join : "$SCR/bin" $PATH)
env SCR="$SCR" ZSHRC_UPDATE_ASYNC_CHILD=1 PATH="$__fishrc_update_path" zsh -f "$SCR/includes/init/update.sh" >/dev/null 2>&1 &
end
if test -f "$HOME/extra.rc.fish"
source "$HOME/extra.rc.fish"
end
+125
View File
@@ -0,0 +1,125 @@
function mkcd --description 'Create a directory and cd into it'
if test (count $argv) -eq 0
echo 'Usage: mkcd <directory>'
return 1
end
mkdir -p "$argv[1]"; and cd "$argv[1]"
end
function set-java --description 'Set JAVA_HOME and PATH to an installed JDK version'
if test (count $argv) -eq 0
echo 'Usage: set-java <version>'
return 1
end
set -l java_home
if test -d /usr/lib/jvm
set java_home (find /usr/lib/jvm -maxdepth 1 -type d -name "*$argv[1]*" -name '*jdk*' | head -n 1)
end
if test -z "$java_home"
echo "Error: Java version $argv[1] not found in /usr/lib/jvm"
return 1
end
set -gx JAVA_HOME "$java_home"
__fishrc_prepend_path "$JAVA_HOME/bin"
end
function upload-daisy --description 'Upload a file to daisy-ddns'
set -l file (string join ' ' -- $argv)
curl -u azalea -F "path=@$file" 'https://daisy-ddns.hydev.org/upload?path=/'
end
function ttmp --description 'Go to /tmp/tmp'
mkdir -p /tmp/tmp; and cd /tmp/tmp
end
if has micro
set -gx EDITOR micro
else if has nano
set -gx EDITOR nano
end
# Use the stable SSH agent socket maintained by ~/.ssh/rc inside SSH/tmux sessions.
if test -n "$SSH_TTY"; or test -n "$SSH_CONNECTION"
if test -n "$SSH_AUTH_SOCK"; and test "$SSH_AUTH_SOCK" != "$HOME/.ssh/current_agent.sock"; and test -S "$SSH_AUTH_SOCK"
mkdir -p "$HOME/.ssh"
ln -sf "$SSH_AUTH_SOCK" "$HOME/.ssh/current_agent.sock"
end
if test -S "$HOME/.ssh/current_agent.sock"
set -gx SSH_AUTH_SOCK "$HOME/.ssh/current_agent.sock"
end
end
if not set -q GRADLE; and has gradle
set -gx GRADLE (command -s gradle)
end
function gradle --description 'Use ./gradlew when present, otherwise system gradle'
if test -f ./gradlew
./gradlew $argv
else if set -q GRADLE; and test -n "$GRADLE"
$GRADLE $argv
else
echo 'Neither gradle nor ./gradlew is found, please install it and restart fish.'
return 1
end
end
function 7z --description 'Block the dangerous 7z d command'
if test (count $argv) -gt 0; and test "$argv[1]" = d
echo "7z d is blocked. It does not stand for decompress, it stands for delete."
else
command 7z $argv
end
end
function reset-permissions-dangerous --description 'Reset file and directory permissions below the current directory'
__fishrc_as_root find . -type d -exec chmod 755 '{}' ';'
__fishrc_as_root find . -type f -exec chmod 644 '{}' ';'
end
function lisp --description 'Run a lisp file through roswell'
ros run --load "$argv[1]" --quit
end
function adblan --description 'Connect adb over LAN on port 16523'
adb connect "$argv[1]:16523"
end
alias adblan-start 'adb tcpip 16523'
function addline --description 'Add a line to a file if it does not already exist'
if test (count $argv) -lt 2
echo 'Usage: addline <file> <line>'
return 1
end
grep -qxF "$argv[2]" "$argv[1]"; or echo "$argv[2]" >>"$argv[1]"
end
function spushd --description 'Silent pushd'
pushd $argv >/dev/null; or return 1
end
function spopd --description 'Silent popd'
popd $argv >/dev/null; or return 1
end
function modern-replace --description 'Alias a command to a modern replacement when installed'
set -l orig_cmd $argv[1]
set -l new_cmd $argv[2]
set -l orig_cmd_with_args $argv[3]
set -l new_cmd_with_args $argv[4]
test -n "$orig_cmd_with_args"; or set orig_cmd_with_args $orig_cmd
test -n "$new_cmd_with_args"; or set new_cmd_with_args $new_cmd
if has "$new_cmd"
alias "$orig_cmd" "$new_cmd_with_args"
else
alias "$orig_cmd" "$orig_cmd_with_args"
end
end
+152
View File
@@ -0,0 +1,152 @@
# Git helpers.
function commit --description 'git commit wrapper'
if test (count $argv) -eq 0
git commit
else
git commit -m (string join ' ' -- $argv)
end
end
function commitall --description 'git add . and commit'
git add .
commit $argv
end
alias commita commitall
function compush --description 'commitall and push'
commitall $argv
git push
end
function git-ida --description 'Set git identity from git-id-list'
if test (count $argv) -eq 0
echo 'Usage: git-ida <identity>'
return 1
end
set -l identity (git-id-list get "$argv[1]")
git-id $identity[1] $identity[2]
end
function git-id --description 'Set git identity for this shell'
set -gx GIT_USER "$argv[1]"
set -gx GIT_EMAIL "$argv[2]"
git-id-prompt
end
function git-id-prompt --description 'Refresh git identity prompt segment'
if test -z "$GIT_USER"; and test -z "$GIT_EMAIL"
set -g __fishrc_git_id_segment ''
else
set -g __fishrc_git_id_segment "Git ID: $GIT_USER | $GIT_EMAIL "
end
end
function git --description 'git wrapper with per-shell identity override'
if test -z "$GIT_USER"
command git $argv
else
command git -c "user.name=$GIT_USER" -c "user.email=$GIT_EMAIL" -c commit.gpgsign=false $argv
end
end
function git-require-clean --description 'Require a clean git worktree'
command git rev-parse --is-inside-work-tree >/dev/null 2>&1; or return 1
set -l status_lines (command git status --porcelain 2>/dev/null)
if test (count $status_lines) -ne 0
echo 'Workspace is not clean.'
command git status --short
return 1
end
end
function git-main-branch --description 'Print the repository main branch name'
set -l remote_head (command git symbolic-ref --quiet --short refs/remotes/origin/HEAD 2>/dev/null)
if test -n "$remote_head"
string replace -r '^origin/' '' -- "$remote_head"
return 0
end
for branch in main master trunk develop
if command git show-ref --verify --quiet refs/heads/$branch
printf '%s\n' "$branch"
return 0
end
if command git show-ref --verify --quiet refs/remotes/origin/$branch
printf '%s\n' "$branch"
return 0
end
end
echo 'Could not determine main branch.' >&2
return 1
end
function git-update-main --description 'Checkout and fast-forward the main branch'
set -l main_branch $argv[1]
if test -z "$main_branch"
set main_branch (git-main-branch); or return 1
end
command git checkout "$main_branch"; or return 1
command git pull --ff-only
end
function br --description 'Switch to an existing branch, or create one from updated main'
if test (count $argv) -ne 1
echo 'Usage: br <branch-name>'
return 1
end
set -l branch "$argv[1]"
git-require-clean; or return 1
if command git show-ref --verify --quiet "refs/heads/$branch"; or command git show-ref --verify --quiet "refs/remotes/origin/$branch"
command git checkout "$branch"
return $status
end
set -l main_branch (git-main-branch); or return 1
git-update-main "$main_branch"; or return 1
command git checkout -b "$branch"
end
function bru --description 'Update the current branch by rebasing it on updated main'
set -l current_branch (command git symbolic-ref --quiet --short HEAD 2>/dev/null)
if test -z "$current_branch"
echo 'Could not determine current branch.'
return 1
end
git-require-clean; or return 1
set -l main_branch (git-main-branch); or return 1
if test "$current_branch" = "$main_branch"
echo "Already on $main_branch."
return 1
end
git-update-main "$main_branch"; or return 1
command git checkout "$current_branch"; or return 1
command git rebase "$main_branch"
end
function git-env --description 'Alias common git subcommands into the shell'
set -l git_commands add bisect branch checkout clone commit diff fetch grep init log merge pull push rebase reset restore show stash tag
for cmd in $git_commands
alias "$cmd" "git $cmd"
end
alias grm 'git rm'
alias gmv 'git mv'
alias st 'git status'
end
function git-unenv --description 'Remove aliases created by git-env'
set -l git_commands add bisect branch checkout clone commit diff fetch grep init log merge pull push rebase reset restore show stash tag grm gmv st
for cmd in $git_commands
functions -q "$cmd"; and functions -e "$cmd"
end
end
git-id-prompt
+19
View File
@@ -0,0 +1,19 @@
# Modern unix replacements.
modern-replace ls eza 'ls -h --color=auto' eza
modern-replace df duf 'df -h' duf
modern-replace cat bat cat bat
modern-replace man tldr man tldr
modern-replace top btop top btop
modern-replace nano micro nano micro
modern-replace curl curlie curl curlie
modern-replace pacman paru 'pacman --color always' 'paru --color always'
modern-replace vi nvim vi nvim
modern-replace vim nvim vim nvim
modern-replace code visual-studio-code-electron code visual-studio-code-electron
if not has docker; and has podman
alias docker podman
if has podman-compose
alias docker-compose podman-compose
end
end
+73
View File
@@ -0,0 +1,73 @@
# Application aliases.
alias va-restart 'sctl restart va'
alias va-log-all 'jctl -u va --output cat'
alias va-log 'va-log-all -f'
alias jctlog 'jctl --output cat -f -u'
# Arch Linux setup.
if has pacman
if test (id -u) -eq 0
alias upgrade 'pacman -Syu'
else
alias upgrade 'sudo pacman -Syu'
end
alias install 'pacman -Sy'
alias uninstall 'pacman -Rsn'
alias list-unused 'pacman -Qdtq'
end
if test -f /etc/arch-release
__fishrc_prepend_path "$HOME/.local/share/JetBrains/Toolbox/scripts"
alias gpg-init "echo hi | gpg --status-fd=2 -bsau E289FAC0DA92DD2B"
alias ibus-init 'ibus-daemon -drxR'
alias autoremove 'yay -c'
function clean-cache --description 'Clean common package manager caches'
has yay; and yay -Sc --noconfirm
has pacman; and __fishrc_as_root pacman -Sc --noconfirm
has pacman; and __fishrc_as_root rm -rf /var/cache/pacman
has paru; and rm -rf "$HOME/.cache/paru"
has yarn; and yarn cache clean
has conda; and conda clean -a
has pip; and pip cache remove '*'
end
if test -f "$ZSHRC_ROOT/plugins/find-the-command/usr/share/doc/find-the-command/ftc.fish"
source "$ZSHRC_ROOT/plugins/find-the-command/usr/share/doc/find-the-command/ftc.fish"
end
end
# Mamba and Python environment setup.
alias mamba-install 'curl -L micro.mamba.pm/install.sh | bash'
set -q MAMBA_ROOT_PREFIX; or set -gx MAMBA_ROOT_PREFIX "$HOME/.conda"
function mamba-init --description 'Initialize micromamba for fish'
set -l mamba_exe (command -s micromamba)
if test -z "$mamba_exe"
echo 'Failed to initialize mamba: micromamba not found.'
return 1
end
$mamba_exe shell hook --shell fish --root-prefix "$HOME/micromamba" | source
set -l ret $pipestatus[1]
if test $ret -ne 0
echo "Failed to initialize mamba: Return code $ret."
echo "Note: this uses '--root-prefix' for mamba 2.0+. Upgrade with mamba-install if needed."
return $ret
end
end
if has micromamba
mamba-init
if not has conda
alias conda mamba
end
end
if has pyenv
pyenv init - fish | source
__fishrc_prepend_path (pyenv root)/shims
end
alias mamba micromamba
+241
View File
@@ -0,0 +1,241 @@
alias prompt "$SCR/helpers/prompt.py"
function pcolor --description 'Colorize text using the repository prompt helper'
"$SCR/helpers/prompt.py" (string join ' ' -- $argv) color
end
function prompt-reset --description 'Reset fish prompt state used by this rc'
set -g __fishrc_proxy_segment ''
git-id-prompt
end
function __fishrc_prompt_pr_state --description 'Set GitHub PR prompt state for a branch'
set -l branch $argv[1]
test -n "$branch"; or return 1
command -sq gh; or return 1
set -l repo_key (command git rev-parse --show-toplevel 2>/dev/null)
if test -z "$repo_key"
set repo_key (command jj root --ignore-working-copy 2>/dev/null)
end
set -l cache_key "$repo_key:$branch"
set -l now (date +%s)
if test "$__fishrc_prompt_pr_cache_key" = "$cache_key"
if string match -qr '^[0-9]+$' -- "$__fishrc_prompt_pr_cache_time"
set -l cache_age (math "$now - $__fishrc_prompt_pr_cache_time" 2>/dev/null)
if string match -qr '^[0-9]+$' -- "$cache_age"
if test "$cache_age" -lt 300
set -l cached_pr $__fishrc_prompt_pr_cache_value
test "$cached_pr[1]" != __none; or return 1
if test -z "$cached_pr[2]"
set cached_pr[2] green
end
set -g __fishrc_vcs_pr_number "$cached_pr[1]"
set -g __fishrc_vcs_pr_color "$cached_pr[2]"
return 0
end
end
end
end
set -l pr_line
if command -sq timeout
set pr_line (command timeout 1s gh pr list --head "$branch" --state all --limit 20 --json number,state,updatedAt --jq 'map(select(.state == "OPEN" or .state == "MERGED")) | sort_by(.updatedAt) | reverse | .[0] | select(.number != null) | .number, .state' 2>/dev/null)
else
set pr_line (command gh pr list --head "$branch" --state all --limit 20 --json number,state,updatedAt --jq 'map(select(.state == "OPEN" or .state == "MERGED")) | sort_by(.updatedAt) | reverse | .[0] | select(.number != null) | .number, .state' 2>/dev/null)
end
set -l pr_number (string trim -- "$pr_line[1]")
set -l pr_state (string trim -- "$pr_line[2]")
set -l pr_color green
if test "$pr_state" = MERGED
set pr_color purple
end
set -g __fishrc_prompt_pr_cache_key "$cache_key"
set -g __fishrc_prompt_pr_cache_time "$now"
if not string match -qr '^[0-9]+$' -- "$pr_number"
set -g __fishrc_prompt_pr_cache_value __none
return 1
end
set -g __fishrc_prompt_pr_cache_value "$pr_number" "$pr_color"
set -g __fishrc_vcs_pr_number "$pr_number"
set -g __fishrc_vcs_pr_color "$pr_color"
end
function __fishrc_git_unpushed_count --description 'Print commits ahead of the git upstream or remotes'
set -l upstream (command git rev-parse --abbrev-ref --symbolic-full-name '@{upstream}' 2>/dev/null)
if test -n "$upstream"
command git rev-list --count "$upstream"..HEAD 2>/dev/null
return
end
command git rev-list --count HEAD --not --remotes 2>/dev/null
end
function __fishrc_git_prompt_state --description 'Set compact git repository state for the prompt'
command -sq git; or return 1
command git rev-parse --is-inside-work-tree >/dev/null 2>&1; or return 1
set -l branch (command git symbolic-ref --quiet --short HEAD 2>/dev/null)
set -l pr_branch "$branch"
if test -z "$branch"
set branch (command git rev-parse --short HEAD 2>/dev/null)
end
test -n "$branch"; or return 1
set -l git_status (command git status --porcelain=v1 --branch 2>/dev/null)
set -l flags
set -l changed 0
set -l header $git_status[1]
set -l behind (string match -r 'behind [0-9]+' -- "$header" | string replace 'behind ' 'v')
set -l ahead_count (__fishrc_git_unpushed_count)
if string match -qr '^[0-9]+$' -- "$ahead_count"
if test "$ahead_count" -gt 0
set -a flags ^$ahead_count
set changed 1
end
end
test -n "$behind"; and set -a flags $behind
for line in $git_status[2..-1]
set changed 1
set -l index (string sub -s 1 -l 1 -- "$line")
set -l worktree (string sub -s 2 -l 1 -- "$line")
switch "$line"
case 'UU*' 'AA*' 'DD*' 'AU*' 'UA*' 'DU*' 'UD*'
contains x $flags; or set -a flags x
continue
case '??*'
contains '?' $flags; or set -a flags '?'
continue
end
if test "$index" != ' '
contains + $flags; or set -a flags +
end
if test "$worktree" != ' '
contains '!' $flags; or set -a flags '!'
end
end
set -l segment "git:$branch"
if test (count $flags) -gt 0
set segment "$segment "(string join '' -- $flags)
end
set -g __fishrc_vcs_segment "$segment"
set -g __fishrc_vcs_color 777777
if test "$changed" -eq 1
set -g __fishrc_vcs_color yellow
end
__fishrc_prompt_pr_state "$pr_branch"
return 0
end
function __fishrc_jj_prompt_state --description 'Set compact jj workspace state for the prompt'
command -sq jj; or return 1
command jj root --ignore-working-copy >/dev/null 2>&1; or return 1
set -l info (command jj log --no-graph --ignore-working-copy --color=never -r @ --template 'separate(" ", change_id.shortest(8), bookmarks.join("|"), if(conflict, "x")) ++ "\n"' 2>/dev/null)
test -n "$info"; or return 1
set -g __fishrc_vcs_segment "jj:$info"
set -g __fishrc_vcs_color 777777
set -l diff_summary (command jj diff --summary --ignore-working-copy 2>/dev/null)
if test -n "$diff_summary"
set -g __fishrc_vcs_color yellow
end
set -l pr_branch (command jj log --no-graph --ignore-working-copy --color=never -r 'bookmarks() & @' --template 'bookmarks.join("\n") ++ "\n"' 2>/dev/null)[1]
set pr_branch (string replace -r '\*$' '' -- "$pr_branch")
__fishrc_prompt_pr_state "$pr_branch"
return 0
end
function __fishrc_vcs_prompt_state --description 'Set prompt VCS segment state'
set -g __fishrc_vcs_segment ''
set -g __fishrc_vcs_color 777777
set -g __fishrc_vcs_pr_number ''
set -g __fishrc_vcs_pr_color green
__fishrc_jj_prompt_state; or __fishrc_git_prompt_state
end
function fish_prompt --description 'Repository fish prompt'
set -l host (prompt_hostname)
set host (string replace -r '^HyDEV-' '' -- "$host")
printf '\n'
if test "$host" = HyDEV
set_color magenta
printf '%s ' (date '+%a %m-%d %H:%M')
else
set_color 55CDFC
printf '%s ' (date '+%a')
set_color F7A8B8
printf '%s' (date '+%m-')
set_color FFFFFF
printf '%s ' (date '+%d')
set_color F7A8B8
printf '%s' (date '+%H:')
set_color 55CDFC
printf '%s ' (date '+%M')
end
set_color blue
if test "$host" = HyDEV
set_color 55CDFC
printf H
set_color F7A8B8
printf y
set_color FFFFFF
printf D
set_color F7A8B8
printf E
set_color 55CDFC
printf 'V '
else
printf '%s ' "$host"
end
set_color yellow
if test -n "$__fishrc_git_id_segment"
printf '%s' "$__fishrc_git_id_segment"
else
printf '%s ' "$USER"
end
set_color brgreen
printf '%s' "$__fishrc_proxy_segment"
set_color normal
printf '%s' (prompt_pwd)
__fishrc_vcs_prompt_state
if test -n "$__fishrc_vcs_segment"
printf ' '
set_color $__fishrc_vcs_color
printf '[%s' "$__fishrc_vcs_segment"
if test -n "$__fishrc_vcs_pr_number"
printf ' '
set_color $__fishrc_vcs_pr_color
printf '#%s' "$__fishrc_vcs_pr_number"
set_color $__fishrc_vcs_color
end
printf ']'
set_color normal
end
printf '\n> '
end
+63
View File
@@ -0,0 +1,63 @@
set -g __fishrc_proxy_segment ''
set -g __fishrc_git_id_segment ''
function setproxy --description 'Set common proxy environment variables'
set -l addr 127.0.0.1
set -l port 7890
test (count $argv) -ge 1; and set addr $argv[1]
test (count $argv) -ge 2; and set port $argv[2]
set -l full "$addr:$port"
set -gx https_proxy "http://$full"
set -gx http_proxy "http://$full"
set -gx all_proxy "http://$full"
set -gx HTTPS_PROXY "http://$full"
set -gx HTTP_PROXY "http://$full"
set -gx ALL_PROXY "http://$full"
set -g __fishrc_proxy_segment "proxy $full "
if has color
color "&aUsing proxy! $full&r"
else
echo "Using proxy! $full"
end
end
function ssh --description 'Use xterm-256color when connecting from kitty'
if test "$TERM" = xterm-kitty
env TERM=xterm-256color command ssh $argv
else
command ssh $argv
end
end
if status is-interactive; and test -z "$TMUX"; and test -n "$SSH_TTY"; and has tmux
tmux attach-session -t ssh_tmux; or tmux new-session -s ssh_tmux
end
function subtitle --description 'Generate subtitles with auto_subtitle'
env CUDA_VISIBLE_DEVICES=1 auto_subtitle --srt_only True --model large "$argv[1]"
end
function upload --description 'Upload a file to HyDEV daisy'
if test (count $argv) -eq 0
echo 'Usage: upload <file>'
return 1
end
if not set -q UP_PASSWORD; or test -z "$UP_PASSWORD"
echo 'Error: Password not set, please export UP_PASSWORD=xxx'
return 1
end
set -l file $argv[1]
set -l server_url 'https://daisy.hydev.org/upload?path=/'
set -l up_username azalea
if test -f "$file"
curl -u "$up_username:$UP_PASSWORD" -F "path=@$file" "$server_url"
else
echo 'Error: File not found.'
return 1
end
end
+28
View File
@@ -0,0 +1,28 @@
# Fish rc for this repository.
# Source this from ~/.config/fish/config.fish:
# source /path/to/zshrc/fish/rc.fish
#
# Fish already provides shared history, autosuggestions, syntax highlighting,
# completions, and good command-line editing, so the zsh-only equivalents are
# intentionally not ported here. macOS-only setup is also omitted.
set -l __fishrc_dir (dirname (status --current-filename))
set -gx FISHRC_DIR "$__fishrc_dir"
set -gx ZSHRC_ROOT (path resolve "$__fishrc_dir/..")
set -q SCR; or set -gx SCR "$ZSHRC_ROOT/scripts"
set -q BASEDIR; or set -gx BASEDIR "$ZSHRC_ROOT"
for include in \
core \
aliases \
functions \
platform \
config-sync \
docker-nix \
modern \
session \
git \
prompt \
final
source "$FISHRC_DIR/includes/$include.fish"
end
Executable
+71
View File
@@ -0,0 +1,71 @@
#!/usr/bin/env bash
set -euo pipefail
usage() {
echo "Usage: install-fish [--uninstall]"
}
repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
rc_file="$repo_dir/fish/rc.fish"
config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/fish"
config_file="$config_dir/config.fish"
escaped_rc_file="${rc_file//\\/\\\\}"
escaped_rc_file="${escaped_rc_file//\"/\\\"}"
source_line="source \"$escaped_rc_file\""
legacy_source_line="source $rc_file"
install_fish_rc() {
if [[ ! -f "$rc_file" ]]; then
echo "Fish rc not found: $rc_file" >&2
exit 1
fi
mkdir -p "$config_dir"
touch "$config_file"
if grep -Fxq "$source_line" "$config_file" || grep -Fxq "$legacy_source_line" "$config_file"; then
echo "Already installed in $config_file"
return
fi
if [[ -s "$config_file" && $(tail -c 1 "$config_file") != "" ]]; then
printf '\n' >>"$config_file"
fi
printf '%s\n' "$source_line" >>"$config_file"
echo "Installed fish rc in $config_file"
}
uninstall_fish_rc() {
if [[ ! -f "$config_file" ]]; then
echo "Fish rc is not installed in $config_file"
return
fi
if ! grep -Fxq "$source_line" "$config_file" && ! grep -Fxq "$legacy_source_line" "$config_file"; then
echo "Fish rc is not installed in $config_file"
return
fi
tmp_file="$(mktemp)"
grep -Fxv "$source_line" "$config_file" | grep -Fxv "$legacy_source_line" >"$tmp_file" || true
mv "$tmp_file" "$config_file"
echo "Uninstalled fish rc from $config_file"
}
case "${1:-}" in
"")
install_fish_rc
;;
--uninstall)
uninstall_fish_rc
;;
-h | --help)
usage
;;
*)
usage >&2
exit 1
;;
esac
+8 -3
View File
@@ -1,8 +1,13 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail
if [[ $# -eq 0 ]]; then
echo "Usage: compress-7zst <7z args...>"
exit 1
fi
level="${level:-15}" level="${level:-15}"
cores=$(python3 -c "import os; print(os.cpu_count())") cores=$(python3 -c "import os; print(os.cpu_count())")
echo "Starting ZSTD compression with $cores cores and level $level" echo "Starting ZSTD compression with $cores cores and level $level"
# "$cmd" -I "zstd -T$cores -$level" --checkpoint=.1024 --totals --totals=SIGUSR1 -c -f "$@" exec 7z a -m0=zstd -mx"$level" -mmt"$cores" "$@"
7z a -m0=zstd -mx"$level" -mmt"$cores" "$@"
-136
View File
@@ -1,136 +0,0 @@
#!/usr/bin/env python3
from __future__ import annotations
import os
import platform
import re
import shutil
from subprocess import Popen, check_call
import sys
import shlex
from datetime import datetime
from pathlib import Path
def comp(input: str = 'latest', proc: str = 'cpu', codec: str = 'x264', crf: int = 24, br: int = None,
cmd: bool = False, aargs: str = '', suffix: str = 'mp4'):
"""
Compress video
:param input: Input file (Default: latest)
:param proc: cpu (c) or gpu (g)
:param codec: x264 (4) or x265 (5)
:param crf: CRF (quality) for cpu encoding
:param cmd: Whether to output command directly
:param aargs: Additional args
:param suffix: File suffix (Default mp4)
:return:
"""
if input == 'latest':
rename()
i = sorted([s for s in os.listdir('.') if s.startswith('Rec') and s.endswith('mov')])[-1]
else:
i = input
proc = proc[0]
codec = {'4': {'c': 'x264', 'g': 'h264'}, '5': {'c': 'x265', 'g': 'hevc'}}[codec[-1]][proc]
out = i[:i.rindex('.')] + f'.{codec}'
if proc == 'c':
out += f'-{crf}'
out += f'.{suffix}'
c = ['ffmpeg', '-i', i]
if proc == 'c':
c += ['-c:v', f'lib{codec}', '-crf', str(crf)]
elif proc == 'g':
if platform.system() == 'Darwin':
c += ['-c:v', f'{codec}_videotoolbox']
else:
c += ['-c:v', f'{codec}_nvenc', '-cq', str(crf)]
else:
raise AssertionError(f'Processor is invalid ({codec}[0] not in "cg")')
if br:
c += ['-b:v', f'{br}k', '-maxrate', f'{br}k', '-bufsize', f'2M']
c += shlex.split(aargs) + [out]
print(c)
if not cmd:
Popen(c).wait()
def combine(format: str, output: str | Path):
"""
Combine videos
:param format: Regex pattern
:param output: Output file name
"""
pattern = re.compile(format)
# Find video files
print()
files = [f for f in os.listdir('.') if pattern.match(f)]
print(f'Combining these files: {files}')
if len(files) == 0:
return print('No files to combine')
# Write files to text
txt = Path('./temp.txt')
txt.write_text('\n'.join(f"file '{f}'" for f in files))
# Infer extension
if '.' not in output:
output = str(Path(output).with_suffix(Path(files[0]).suffix))
# Run FFmpeg
print('Running FFmpeg')
os.system(f'ffmpeg -f concat -safe 0 -i temp.txt -c copy {output}')
# Remove temprary file
os.remove(txt)
def rename():
for file in os.listdir('.'):
if file.startswith('Screen Recording ') or file.startswith('Screen Shot '):
pre = 'Rec' if 'Recording' in file else 'Shot'
end_index = (file.index('AM') if 'AM' in file else file.index('PM')) + 2
datestr = file[17 if pre == 'Rec' else 12:end_index]
dt = datetime.strptime(datestr, '%Y-%m-%d at %I.%M.%S %p')
date = dt.strftime(f'{pre} %Y-%m-%d %H-%M' + file[end_index:])
print(f'Renaming {file} to {date}')
os.rename(file, date)
def convert_gnome():
rec_dir = Path.home() / "Videos/Screencasts"
fs = [rec_dir / str(f) for f in os.listdir(rec_dir) if str(f).startswith("Screencast") and str(f).endswith(".webm")]
for inf in fs:
sp = inf.stem.split(" ")
ouf = rec_dir / f"Rec {sp[2]} {sp[3][:sp[3].rindex('-')]}.mp4"
if ouf.is_file():
print(f"Already converted: {inf}")
continue
print(f"Converting '{inf}' to '{ouf}'")
check_call(['ffmpeg', '-i', inf,
'-c:v', 'libx264',
'-vf', 'crop=trunc(iw/2)*2:trunc(ih/2)*2, fps=30',
'-y',
ouf])
if input("Remove files? [y/N]") == "y":
[os.remove(f) for f in fs]
if __name__ == '__main__':
args = sys.argv[1:]
if args:
v = eval(args[0])
if v:
print(v)
+3 -17
View File
@@ -1,25 +1,11 @@
if command -v pacman &> /dev/null; then if command -v pacman &> /dev/null; then
alias upgrade='sudo pacman -Syu' alias upgrade="${ZSHRC_SUDO}pacman -Syu"
alias install='pacman -Sy' alias install='pacman -Sy'
alias uninstall='pacman -Rsn' alias uninstall='pacman -Rsn'
alias list-unused='pacman -Qdtq' alias list-unused='pacman -Qdtq'
fi fi
if [ -f "/etc/arch-release" ]; then if [ -f "/etc/arch-release" ]; then
# Java paths
export JDK8="/usr/lib/jvm/java-8-openjdk/"
export JDK11="/usr/lib/jvm/java-11-openjdk/"
export JDK17="/usr/lib/jvm/java-17-openjdk/"
export JDK18="/usr/lib/jvm/java-18-j9/"
export JDK19="/usr/lib/jvm/java-19-openjdk/"
alias java8="${JDK8}/bin/java"
alias java11="${JDK11}/bin/java"
alias java17="${JDK17}/bin/java"
alias java18="${JDK18}/bin/java"
alias java19="${JDK19}/bin/java"
export JAVA_HOME=${JDK17}
export PATH="${JDK17}/bin:$PATH"
export PATH="$HOME/.local/share/JetBrains/Toolbox/scripts:$PATH" export PATH="$HOME/.local/share/JetBrains/Toolbox/scripts:$PATH"
# GPG Init # GPG Init
@@ -32,8 +18,8 @@ if [ -f "/etc/arch-release" ]; then
# Free up cache # Free up cache
clean-cache() { clean-cache() {
has yay && yay -Sc --noconfirm has yay && yay -Sc --noconfirm
has pacman && sudo pacman -Sc --noconfirm has pacman && _zshrc_as_root pacman -Sc --noconfirm
has pacman && rm -rf /var/cache/pacman has pacman && _zshrc_as_root rm -rf /var/cache/pacman
has paru && rm -rf "$HOME/.cache/paru" has paru && rm -rf "$HOME/.cache/paru"
has yarn && yarn cache clean has yarn && yarn cache clean
has conda && conda clean -a has conda && conda clean -a
+1 -17
View File
@@ -4,7 +4,7 @@ else
alias dc='docker compose' alias dc='docker compose'
fi fi
if [[ $OSTYPE != 'darwin'* ]]; then if [[ $OSTYPE != 'darwin'* && $EUID -ne 0 ]]; then
alias docker="sudo docker" alias docker="sudo docker"
alias docker-compose="sudo docker-compose" alias docker-compose="sudo docker-compose"
fi fi
@@ -21,19 +21,3 @@ docker-compose-path()
docker inspect "$1" | grep "com.docker.compose.project.working_dir" docker inspect "$1" | grep "com.docker.compose.project.working_dir"
} }
# Docker linux containers
alpine-create()
{
docker rmi azalea/alpine
docker run -it --name alpine-init --hostname alpine alpine \
/bin/sh -c 'apk add zsh bash git curl wget tar zstd python3 && bash <(curl -sL hydev.org/zsh)'
docker commit alpine-init azalea/alpine
docker rm alpine-init
}
alias alpine="docker start -ai alpine"
alias alpine-init="docker run -it --name alpine --hostname alpine azalea/alpine zsh"
alias psqlt+="docker run --rm -dit --name psql-test --hostname psql -e POSTGRES_HOST_AUTH_METHOD=trust postgres && echo 'Created'"
alias psqlt-="docker stop psql-test && echo 'Deleted'"
alias psqlt='psql -h $(docker-ip psql-test) -p 5432 -U postgres'
+95 -4
View File
@@ -1,7 +1,11 @@
# Git commit wrapper # Git commit wrapper
commit() { commit() {
msg="$@" if [[ $# -eq 0 ]]; then
git commit -m "$msg" git commit
else
msg="$@"
git commit -m "$msg"
fi
} }
commitall() { commitall() {
@@ -44,18 +48,105 @@ git() {
fi fi
} }
git-require-clean() {
command git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 1
if [[ -n "$(command git status --porcelain 2>/dev/null)" ]]; then
echo 'Workspace is not clean.'
command git status --short
return 1
fi
}
git-main-branch() {
local remote_head
remote_head=$(command git symbolic-ref --quiet --short refs/remotes/origin/HEAD 2>/dev/null)
if [[ -n "$remote_head" ]]; then
echo "${remote_head#origin/}"
return 0
fi
local branch
for branch in main master trunk develop; do
if command git show-ref --verify --quiet "refs/heads/$branch"; then
echo "$branch"
return 0
fi
if command git show-ref --verify --quiet "refs/remotes/origin/$branch"; then
echo "$branch"
return 0
fi
done
echo 'Could not determine main branch.' >&2
return 1
}
git-update-main() {
local main_branch="$1"
if [[ -z "$main_branch" ]]; then
main_branch=$(git-main-branch) || return 1
fi
command git checkout "$main_branch" || return 1
command git pull --ff-only
}
br() {
if [[ $# -ne 1 ]]; then
echo 'Usage: br <branch-name>'
return 1
fi
local branch="$1"
git-require-clean || return 1
if command git show-ref --verify --quiet "refs/heads/$branch" || command git show-ref --verify --quiet "refs/remotes/origin/$branch"; then
command git checkout "$branch"
return $?
fi
local main_branch
main_branch=$(git-main-branch) || return 1
git-update-main "$main_branch" || return 1
command git checkout -b "$branch"
}
bru() {
local current_branch
current_branch=$(command git symbolic-ref --quiet --short HEAD 2>/dev/null)
if [[ -z "$current_branch" ]]; then
echo 'Could not determine current branch.'
return 1
fi
git-require-clean || return 1
local main_branch
main_branch=$(git-main-branch) || return 1
if [[ "$current_branch" == "$main_branch" ]]; then
echo "Already on $main_branch."
return 1
fi
git-update-main "$main_branch" || return 1
command git checkout "$current_branch" || return 1
command git rebase "$main_branch"
}
# Git environment # Git environment
git-env() { git-env() {
git_commands=( add bisect branch checkout clone commit diff fetch grep init log merge pull push rebase reset restore show status tag ) git_commands=( add bisect branch checkout clone commit diff fetch grep init log merge pull push rebase reset restore show stash tag )
for i in "${git_commands[@]}" for i in "${git_commands[@]}"
do do
alias "$i"="git $i" alias "$i"="git $i"
done done
alias 'grm'='git rm' alias 'grm'='git rm'
alias 'gmv'='git mv' alias 'gmv'='git mv'
alias 'st'='git status'
} }
git-unenv() { git-unenv() {
git_commands=( add bisect branch checkout clone commit diff fetch grep init log merge pull push rebase reset restore show status tag grm gmv ) git_commands=( add bisect branch checkout clone commit diff fetch grep init log merge pull push rebase reset restore show stash tag grm gmv st )
for i in "${git_commands[@]}" for i in "${git_commands[@]}"
do do
unalias "$i" unalias "$i"
-21
View File
@@ -1,21 +0,0 @@
# Cut videos - cut <file name> <end time> [start time (default 00:00:00)]
cutv() {
if [ "$#" -lt 2 ]; then
echo "Usage: cut <file name> <end time (hh:mm:ss)> [start time (00:00:00)]"
return 2
fi
local start="${3:-00:00:00}"
echo "$1"
echo "$2"
echo "$start"
ffmpeg -i "$1" -codec copy -ss "$start" -t "$2" Cut\ "$1"
}
alias vcomp="$BASEDIR/scripts/bin/video.py"
alias vcompy="ipython -i $BASEDIR/scripts/bin/video.py"
flac2mp3() {
for file in *.flac; do
ffmpeg -i "$file" -ab 320k -map_metadata 0 -id3v2_version 3 "${file%.flac}.mp3"
done
}
-35
View File
@@ -1,35 +0,0 @@
# Nixos only
if command -v nixos-rebuild &> /dev/null; then
alias rebuild="sudo nixos-rebuild switch"
alias gc="sudo nix-collect-garbage -d"
alias rebuild-gc="rebuild; gc"
# Update git
nix-git-update() {
pushd /etc/nixos
# Make sure there aren't any other changes
if git diff-index --quiet HEAD --; then
# No changes
update-nix-fetchgit *.nix
# If there are changes after updating
if ! git diff-index --quiet HEAD --; then
# Has changes
rebuild-gc
git add *.nix
git commit -m "[U] Update fetchgit refs"
git push
echo "Successfully updated fetchgit refs"
else
echo "There aren't any updates"
fi
else
# Changes
echo "Error: There are uncommitted changes"
git status
fi
popd
}
fi
+63 -43
View File
@@ -8,6 +8,20 @@ setopt SHARE_HISTORY
export LANG=en_US.UTF-8 export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8 export LC_ALL=en_US.UTF-8
if [[ $EUID -eq 0 ]]; then
ZSHRC_SUDO=""
else
ZSHRC_SUDO="sudo "
fi
_zshrc_as_root() {
if [[ $EUID -eq 0 ]]; then
command "$@"
else
sudo "$@"
fi
}
BASEDIR="$(dirname "$(dirname "$0")")" BASEDIR="$(dirname "$(dirname "$0")")"
# Bash-like shortcuts # Bash-like shortcuts
@@ -34,9 +48,10 @@ if command -v 'xdg-open' &> /dev/null; then
alias open="xdg-open" alias open="xdg-open"
fi fi
# 好用的简写w # 好用的简写
alias ll='ls -l' alias ll='ls -l'
alias l='ll' alias l='ll'
alias llg='ll --git --git-repos'
alias lla='ls -la' alias lla='ls -la'
alias grep='grep --color' alias grep='grep --color'
alias rm='rm -ir' alias rm='rm -ir'
@@ -44,46 +59,66 @@ alias mkdirs='mkdir -p'
alias ip='ip -c -h -p' alias ip='ip -c -h -p'
alias ipa='ip -br a' alias ipa='ip -br a'
alias ipj='ip -j'
alias ipv4="curl https://1.0.0.1/cdn-cgi/trace -4 | grep ip" alias ipv4="curl https://1.0.0.1/cdn-cgi/trace -4 | grep ip"
alias ipv6="curl 'https://[2606:4700:4700::1111]/cdn-cgi/trace' -6 | grep ip" alias ipv6="curl 'https://[2606:4700:4700::1111]/cdn-cgi/trace' -6 | grep ip"
alias ports='netstat -tulpn | grep LISTEN' ports() {
alias suports='sudo netstat -tulpn | grep LISTEN' if command -v ss &> /dev/null; then
alias findtxt='grep -IHrnws --exclude=\*.log -s '/' -e' ss -tulpn
else
netstat -tulpn | grep LISTEN
fi
}
suports() {
if command -v ss &> /dev/null; then
_zshrc_as_root ss -tulpn
else
_zshrc_as_root netstat -tulpn | grep LISTEN
fi
}
findtxt() {
if [[ -z $1 ]]; then
echo "Usage: findtxt <pattern>"
return 1
fi
local pattern="$*"
if command -v rg &> /dev/null; then
rg -n --no-messages -- "$pattern" /
else
grep -IHrnws -s -e "$pattern" /
fi
}
alias clr='reset' alias clr='reset'
alias please='sudo' alias please='sudo'
alias tar-create='tar -cvf' if [[ "$IS_SANDBOX" == "1" ]]; then
alias tar-expand='tar -zxvf' alias codex='codex --dangerously-bypass-approvals-and-sandbox'
alias claude='claude --dangerously-skip-permissions'
fi
alias du='du -h' alias du='du -h'
alias sortsize='sort -hr'
alias dus='du -shc * | sortsize'
alias dusa='du -hc --max-depth=1 | sortsize'
alias ffmpeg="ffmpeg -hide_banner" alias ffmpeg="ffmpeg -hide_banner"
alias ffprobe="ffprobe -hide_banner" alias ffprobe="ffprobe -hide_banner"
alias ts='sudo tailscale' alias ts="${ZSHRC_SUDO}tailscale"
alias ts-install='curl -fsSL https://tailscale.com/install.sh | sh' alias ts-install='curl -fsSL https://tailscale.com/install.sh | sh'
alias vsucode='sudo code --user-data-dir /root/.config/vscode --no-sandbox'
alias visucode='EDITOR="code --wait" sudoedit' alias visucode='EDITOR="code --wait" sudoedit'
alias gpu-temp='while sleep 1; do clear; gpustat; done' alias gpu-temp='while sleep 1; do clear; gpustat; done'
alias cpu-temp='s-tui' alias cpu-temp='s-tui'
alias mount-external='sudo mount -t cifs //192.168.2.1/external /smb/external -o rw,user=azalea,uid=1000,gid=1000,pass='
alias compress-json="find -name '*.json' -print0 | parallel --jobs 80% -0 zstd -z -19 -v -f --rm {}" alias compress-json="find -name '*.json' -print0 | parallel --jobs 80% -0 zstd -z -19 -v -f --rm {}"
alias ds-clean="find . -name '.DS_Store' -delete -print" dotclean() {
alias dotclean="find . -name '._*' -delete -print" find . \( -name '.DS_Store' -o -name '._*' \) -delete -print
}
alias clean-empty-dir="find . -type d -empty -delete -print" alias clean-empty-dir="find . -type d -empty -delete -print"
alias restart-kwin="DISPLAY=:0 setsid kwin_x11 --replace"
alias mkfs.fat32="sudo mkfs.fat -F 32" alias mkfs.fat32="${ZSHRC_SUDO}mkfs.fat -F 32"
alias btrfs-fs-progress="sudo watch -d sudo btrfs fi us"
alias btrfs-balance-progress="sudo watch -d btrfs balance status"
# Rsync aliases by 依云, for synching (keep hard links, ACL, atime, xattr, etc) # Rsync aliases by 依云, for synching (keep hard links, ACL, atime, xattr, etc)
# Deletes files in destination that are not in source # Deletes files in destination that are not in source
@@ -135,6 +170,7 @@ upload-daisy() {
} }
# Automatic sudo # Automatic sudo
if [[ $EUID -ne 0 ]]; then
alias sctl="sudo systemctl" alias sctl="sudo systemctl"
alias sctlu="systemctl --user" alias sctlu="systemctl --user"
alias jctl="sudo journalctl" alias jctl="sudo journalctl"
@@ -144,33 +180,17 @@ alias nginx="sudo nginx"
alias certbot="sudo certbot" alias certbot="sudo certbot"
alias apt="sudo apt" alias apt="sudo apt"
alias dpkg="sudo dpkg" alias dpkg="sudo dpkg"
else
alias sctl="systemctl"
alias sctlu="systemctl --user"
alias jctl="journalctl"
alias jctlu="journalctl --user-unit"
fi
has() { has() {
command -v "$1" &> /dev/null command -v "$1" &> /dev/null
} }
# Compress 7z zstd <out_file> <in_files...>
compress-7zst() {
if [ -z "$1" ]; then
echo "Usage: compress-7zst <out_file> <in_files...>"
return
fi
7z a -m0=zstd -mx17 -mmt35 "$1" "$2"
}
# Install using system package manager
install-package() {
if has pacman; then
pacman -Sy "$1"
elif has apt; then
apt install "$1"
elif has dnf; then
dnf install "$1"
elif has brew; then
brew install "$1"
fi
}
ttmp() { ttmp() {
mkdir -p /tmp/tmp mkdir -p /tmp/tmp
cd /tmp/tmp || return cd /tmp/tmp || return
@@ -223,8 +243,8 @@ gradle() {
# Unix permissions reset (Dangerous! This will make executable files no longer executable) # Unix permissions reset (Dangerous! This will make executable files no longer executable)
reset-permissions-dangerous() { reset-permissions-dangerous() {
sudo find . -type d -exec chmod 755 {} \; _zshrc_as_root find . -type d -exec chmod 755 {} \;
sudo find . -type f -exec chmod 644 {} \; _zshrc_as_root find . -type f -exec chmod 644 {} \;
} }
export PATH="$SCR/bin:$PATH" export PATH="$SCR/bin:$PATH"