mirror of
https://codeberg.org/hyperreal/dotfiles
synced 2024-11-25 11:53:43 +01:00
269 lines
6.6 KiB
Bash
269 lines
6.6 KiB
Bash
# Command checker helper
|
|
function check_cmd() {
|
|
test -x "$(command -v $1)"
|
|
}
|
|
|
|
## Nushell and jc functions
|
|
|
|
# nushell: df
|
|
function nudf() {
|
|
nu -c 'jc df | from json'
|
|
}
|
|
|
|
# nushell: free
|
|
function numem() {
|
|
nu -c 'jc free | from json'
|
|
}
|
|
|
|
# nushell: lsof -i
|
|
function nunetcons() {
|
|
nu -c 'jc lsof -i | from json'
|
|
}
|
|
|
|
# nushell: nutulp
|
|
function nutulp() {
|
|
nu -c 'jc ss -tulp | from json'
|
|
}
|
|
|
|
# nushell: openports
|
|
function nuopenports() {
|
|
nu -c 'sudo jc lsof -i | from json | find "LISTEN"'
|
|
}
|
|
|
|
# nushell: timestamp Z
|
|
function nutsz() {
|
|
nu -c 'date now | format date "%FT%T%:z"'
|
|
}
|
|
|
|
# watch directory listing, update every 0.1s
|
|
function watchdir() {
|
|
watch -n0,1 "ls -lh $1/ | tail"
|
|
}
|
|
|
|
# get time in timezone
|
|
function timein() {
|
|
continent=$(find /usr/share/zoneinfo -maxdepth 1 -mindepth 1 -type d -not -name "posix" -not -name "right" -exec basename {} \; | gum choose --limit=1)
|
|
city=$(find "/usr/share/zoneinfo/$continent" -type f -exec basename {} \; | gum choose --limit=1)
|
|
TZ="$continent/$city" date
|
|
}
|
|
|
|
# Generate a pseudo-random 16-character string.
|
|
function genrand() {
|
|
openssl rand -base64 16
|
|
}
|
|
|
|
# Remove ~/.ssh/known_hosts*
|
|
function rmknownhosts() {
|
|
rm -v "${HOME}/.ssh/known_hosts"*
|
|
}
|
|
|
|
# Empty trash
|
|
function trsh() {
|
|
if check_cmd trash-empty; then
|
|
trash-empty -f
|
|
fi
|
|
}
|
|
|
|
# Copy SSH public key to clipboard (requires wl-copy)
|
|
function pubkey() {
|
|
cat "${HOME}/.ssh/id_ed25519.pub" | tr -d '\n' | wl-copy
|
|
echo "--> SSH public key copied to clipboard"
|
|
}
|
|
|
|
# Compatibility with emacs-libvterm
|
|
function vterm_printf() {
|
|
if [ -n "$TMUX" ] && ([ "${TERM%%-*}" = "tmux" ] || [ "${TERM%%-*}" = "screen" ]); then
|
|
# Tell tmux to pass the escape sequences through
|
|
printf "\ePtmux;\e\e]%s\007\e\\" "$1"
|
|
elif [ "${TERM%%-*}" = "screen" ]; then
|
|
# GNU screen (screen, screen-256color, screen-256color-bce)
|
|
printf "\eP\e]%s\007\e\\" "$1"
|
|
else
|
|
printf "\e]%s\e\\" "$1"
|
|
fi
|
|
}
|
|
|
|
# Remove all .jpeg .jpg .png .svg .webp files from downloads
|
|
function rmpics() {
|
|
find "${HOME}/downloads" \
|
|
-maxdepth 1 \
|
|
-type f \
|
|
\( -name "*.jpg" -o -name "*.jpg_original" -o -name "*.jpeg" -o -name "*.svg" -o -name "*.png" -o -name "*.webp" \) \
|
|
-delete
|
|
}
|
|
|
|
# Remove all ISOs and disc images from downloads
|
|
function rmisos() {
|
|
find "${HOME}/downloads" \
|
|
-maxdepth 1 \
|
|
-type f \
|
|
\( -name "*.iso" -o -name "*.img" \) \
|
|
-delete
|
|
}
|
|
|
|
# Create a bookmark.
|
|
function mark() {
|
|
|
|
if ! test -f "${HOME}/.shellmarks"; then
|
|
touch "${HOME}/.shellmarks"
|
|
fi
|
|
|
|
mark_to_add="$(pwd)"
|
|
|
|
if grep -qxFe "${mark_to_add}" "${HOME}/.shellmarks"; then
|
|
gum style \
|
|
--foreground 210 \
|
|
--margin "1 2" \
|
|
"This bookmark already exists: ${mark_to_add}"
|
|
else
|
|
echo "${mark_to_add}" >> "${HOME}/.shellmarks"
|
|
gum style \
|
|
--foreground "#73F59F" \
|
|
--margin "1 2" \
|
|
"${mark_to_add} added to shellmarks file"
|
|
fi
|
|
|
|
cat "${HOME}/.shellmarks" | sort | tee "${HOME}/.shellmarks" >/dev/null
|
|
|
|
return 0
|
|
}
|
|
|
|
# List bookmarks.
|
|
function lsmarks() {
|
|
echo "# Shellmarks" | gum format
|
|
|
|
while IFS= read -r line; do
|
|
echo "- $line"
|
|
done < "${HOME}/.shellmarks" | gum format
|
|
}
|
|
|
|
# Remove bookmarks.
|
|
function delmark() {
|
|
selection=$(cat "${HOME}/.shellmarks" | gum choose --no-limit)
|
|
|
|
if test -n "${selection}"; then
|
|
while read -r line; do
|
|
perl -n -i -e "print unless /^\\Q${line//\//\\/}\\E\$/" "${HOME}/.shellmarks"
|
|
done <<< "${selection}"
|
|
else
|
|
return 0
|
|
fi
|
|
|
|
gum format -t markdown -- \
|
|
"# The following bookmarks were deleted:" \
|
|
"$(printf "%s\n" "${selection}")"
|
|
|
|
return 0
|
|
}
|
|
|
|
# Goto a bookmark.
|
|
function gotomark() {
|
|
if ! test -f "${HOME}/.shellmarks"; then
|
|
echo "No bookmarks exist yet. Add some!"
|
|
return 1
|
|
fi
|
|
|
|
echo
|
|
builtin cd $(cat "${HOME}/.shellmarks" | gum choose --limit=1)
|
|
|
|
local precmd
|
|
for precmd in $precmd_functions; do
|
|
$precmd
|
|
done
|
|
zle && zle reset-prompt
|
|
}
|
|
zle -N gotomark
|
|
bindkey '^[g' gotomark
|
|
|
|
# Choose a directory from the directory stack.
|
|
function dstack() {
|
|
echo "# Choose a directory" | gum format -t markdown
|
|
selection=$(dirs -lp | gum choose --limit=1)
|
|
cd $selection
|
|
}
|
|
|
|
# Print timestamp as %Y-%m-%d %H:%M:%S.
|
|
function tstamp() {
|
|
emulate -L zsh
|
|
date '+%Y-%m-%d %H:%M:%S' | tr -d '\n'
|
|
}
|
|
|
|
# Print timestamp as %Y-%m-%dT%H:%M:%S%:z
|
|
function tstampz() {
|
|
emulate -L zsh
|
|
date '+%Y-%m-%dT%H:%M:%S%:z' | tr -d '\n'
|
|
}
|
|
|
|
# Create a /overview/ of all available function()'s; the description for
|
|
# each funtion() *must* be the first line above the string `function'!
|
|
# Otherwise it wont work.
|
|
# Display all function()'s with their descriptions.
|
|
function funlist() {
|
|
grep -B 1 "^function" $HOME/.zshrc.d/functions.zsh | \
|
|
grep -v "^\-\-$" | \
|
|
awk '{ if(/^#/) { gsub(/^#[:space:]*/, ""); ht=$0 }; getline; gsub(/ ?\(\)/, ":"); printf("-> %-20s %s\n", $2, ht); }' | \
|
|
sort -u -k 3
|
|
}
|
|
|
|
# zrmcomp() remove *.zwc files.
|
|
function zrmcomp() {
|
|
local i
|
|
for i in ${HOME}/*.zwc(N); do
|
|
printf "Removing $i\n"
|
|
command rm -f $i
|
|
done
|
|
}
|
|
|
|
# Invoke this every time you change .zshrc to recompile it.
|
|
function src() {
|
|
autoload -U zrecompile
|
|
[ -f ~/.zshrc ] && zrecompile -p ~/.zshrc
|
|
[ -f ~/.zcompdump ] && zrecompile -p ~/.zcompdump
|
|
[ -f ~/.zcompdump ] && zrecompile -p ~/.zcompdump
|
|
[ -f ~/.zshrc.zwc.old ] && command rm -f ~/.zshrc.zwc.old
|
|
[ -f ~/.zcompdump.zwc.old ] && command rm -f ~/.zcompdump.zwc.old
|
|
source ~/.zshrc
|
|
}
|
|
|
|
# Do an ls after cd.
|
|
function cd() { builtin cd "$@" && ls; }
|
|
|
|
# Create new directory and enter it.
|
|
function mkd() { mkdir -p "$@" && cd "$_"; }
|
|
|
|
# Display pids of commands.
|
|
function pids() { pgrep -a "$@"; }
|
|
|
|
# Restart zsh.
|
|
function restart() { exec $SHELL $SHELL_ARGS "$@"; }
|
|
|
|
# cd to ~, clear screen, and restart zsh.
|
|
function rsrc() { cd && clear && restart; }
|
|
|
|
# Set hostname:pwd for vterm buffer title
|
|
autoload -U add-zsh-hook
|
|
add-zsh-hook -Uz chpwd() { print -Pn "\e]2;%m:%2~\a" }
|
|
|
|
# For directory tracking and prompt tracking in Emacs Vterm
|
|
function vterm_prompt_end() {
|
|
vterm_printf "51;A$(whoami)@$(hostname):$(pwd)"
|
|
}
|
|
setopt PROMPT_SUBST
|
|
PROMPT=$PROMPT'%{$(vterm_prompt_end)%}'
|
|
|
|
# To read and execute Emacs commands in Vterm
|
|
function vterm_cmd() {
|
|
local vterm_elisp
|
|
vterm_elisp=""
|
|
while [ $# -gt 0 ]; do
|
|
vterm_elisp="$vterm_elisp""$(printf '"%s" ' "$(printf "%s" "$1" | sed -e 's|\\|\\\\|g' -e 's|"|\\"|g')")"
|
|
shift
|
|
done
|
|
vterm_printf "51;E$vterm_elisp"
|
|
}
|
|
|
|
# find-file in Emacs
|
|
function find_file() {
|
|
vterm_cmd find-file "$(realpath "${@:-.}")"
|
|
}
|