first commit

This commit is contained in:
Tomasz Kapias 2023-03-18 18:49:08 +07:00
commit 12e96c1088
Signed by: tkapias
SSH key fingerprint: SHA256:bsmasrX7y0xxAHa/x1x8zAgHInO4nPpKMk5JIQ0Vsbw
14 changed files with 6367 additions and 0 deletions

7
.bash_logout Normal file
View file

@ -0,0 +1,7 @@
# ~/.bash_logout: executed by bash(1) when login shell exits.
# when leaving the console clear the screen to increase privacy
if [ "$SHLVL" = 1 ]; then
[ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

3
.bash_profile Normal file
View file

@ -0,0 +1,3 @@
#!/usr/bin/env bash
. "$HOME/.profile"

16
.bashrc Normal file
View file

@ -0,0 +1,16 @@
#!/usr/bin/env bash
# ~/.bashrc: executed by bash(1) for non-login shells.
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return ;;
esac
chmod 700 ~/.bashrc.d
chmod 600 ~/.bashrc ~/.bashrc.d/*
for file in ~/.bashrc.d/*.bashrc;
do
source "${file}"
done

View file

@ -0,0 +1,68 @@
#!/usr/bin/env bash
# executed by bash(1) for non-login shells.
# ==============================
# SHELL OPTIONS
# ==============================
# shell command line style : emacs, vi, noediting
set -o emacs
# set -o vi
# set noediting
# exit will lists the status interactive jobs and postpone if one is running
shopt -s checkjobs
# includes filenames beginning with a . (dot) in pathname expansion
shopt -s dotglob
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
# enable programmable completion features
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
# activate a DEBUG trap to catch term window resize
#declare -x rows cols
#update_size(){
# winsizeStatus=$(shopt | grep checkwinsize | awk '{print $2}')
# if [[ "$winsizeStatus" == "off" ]]; then
# rows=$(tput lines)
# cols=$(tput cols)
# echo -en "\e[2;5;90mDEBUG\e[25;90m TERM winsize updated to ${rows}x${cols} >\e[0m"
# else
# echo -en "\e[2;5;90mDEBUG\e[25;90m TERM winsize updated to ${LINES}x${COLUMNS} >\e[0m"
# fi
#}
#trap update_size WINCH
# ==============================
# HISTORY
# ==============================
# attempts to save all lines of a multiple-line command in the same history entry
shopt -s cmdhist
# appended rather than overwrite
shopt -s histappend
# with cmdhist, saved with embedded newlines rather than semicolon separators
shopt -s lithist
HISTCONTROL=ignoreboth
HISTSIZE=10000
HISTFILESIZE=20000
HISTTIMEFORMAT="%y/%m/%d %T "
HISTIGNORE="history:ls:l:pwd:exit:"
if [[ ${BASH_VERSION:0:1} -gt 5 || ${BASH_VERSION:0:1} -ge 5 && ${BASH_VERSION:2:1} -ge 1 ]]; then
PROMPT_COMMAND=("history -a" "history -c" "history -r")
else
PROMPT_COMMAND="history -a; history -c; history -r"
fi

160
.bashrc.d/01-env.bashrc Normal file
View file

@ -0,0 +1,160 @@
#!/usr/bin/env bash
# executed by bash(1) for non-login shells.
# ==============================
# ENV
# ==============================
# ==============================
# System
# ==============================
# Expanding PATH with system's bins
if [[ -d "/usr/sbin" ]] ; then
export PATH="/usr/sbin:$PATH"
fi
if [[ -d "/usr/local/sbin" ]] ; then
export PATH="/usr/local/sbin:$PATH"
fi
# Expanding PATH with users bin
if [[ -d "$HOME/.local/bin" ]] ; then
export PATH="$HOME/.local/bin:$PATH"
fi
# Check if XDG environment variables are set or set them to default
if [[ -z "$XDG_DATA_HOME" ]]; then
export XDG_DATA_HOME=$HOME/.local/share
fi
if [[ -z "$XDG_CONFIG_HOME" ]]; then
export XDG_CONFIG_HOME=$HOME/.config
fi
if [[ -z "$XDG_STATE_HOME" ]]; then
export XDG_STATE_HOME=$HOME/.local/state
fi
if [[ -z "$XDG_CACHE_HOME" ]]; then
export XDG_CACHE_HOME=$HOME/.cache
fi
# Check presence of locale Download folder or create a default one
if [[ "$(xdg-user-dir DOWNLOAD)" == "$(xdg-user-dir)" ]]; then
mkdir -p "$HOME/Downloads"
export XDG_DOWNLOAD_DIR="$HOME/Downloads"
else
XDG_DOWNLOAD_DIR="$(xdg-user-dir DOWNLOAD)"
export XDG_DOWNLOAD_DIR
fi
# ==============================
# Shell
# ==============================
# add a preview for commands and a toggle bind for FZF's history
if command -v fzf 1> /dev/null; then
export FZF_CTRL_R_OPTS="--preview 'echo {}' --preview-window down:4:wrap --bind 'ctrl-p:toggle-preview'"
fi
# vim a global text editor
if command -v vim 1> /dev/null; then
export EDITOR=vim
fi
# ==============================
# Languages
# ==============================
# Cargo env config
if [[ -d "$HOME/.cargo/bin" ]]; then
export PATH="$HOME/.cargo/bin:$PATH"
fi
# Nim env config
if [[ -d "$HOME/.nimble/bin" ]]; then
export PATH="$HOME/.nimble/bin:$PATH"
fi
# Go env config
if [[ -d "$HOME/go/bin" ]]; then
export PATH="$HOME/go/bin:$PATH"
fi
# Deno env config
if [[ -f "$HOME/.deno/bin/deno" ]]; then
export DENO_INSTALL="$HOME/.deno"
export PATH="$DENO_INSTALL/bin:$PATH"
fi
# Expanding PYTHONPATH for PDM
if command -v pdm 1> /dev/null; then
# update with output from here when upgrading Python : eval "$(pdm --pep582)"
if [[ -n "$PYTHONPATH" ]] && [[ -d "/usr/lib/python3/dist-packages/pdm/pep582" ]]; then
export PYTHONPATH='/usr/lib/python3/dist-packages/pdm/pep582':$PYTHONPATH
elif [[ -d "/usr/lib/python3/dist-packages/pdm/pep582" ]]; then
export PYTHONPATH='/usr/lib/python3/dist-packages/pdm/pep582'
fi
fi
# PIPX env config
if command -v pipx 1> /dev/null; then
eval "$(register-python-argcomplete pipx)"
fi
# refuser l'adhésion à la télémétrie .NET
if command -v dontnet 1> /dev/null; then
export DOTNET_CLI_TELEMETRY_OPTOUT=1
fi
# ==============================
# Applications
# ==============================
# Enable key bindings for fzf
if command -v fzf 1> /dev/null && [[ -f "/usr/share/doc/fzf/examples/key-bindings.bash" ]]; then
source /usr/share/doc/fzf/examples/key-bindings.bash
fi
# Let gpg-agent know from which terminal its has been called.
if command -v gpg 1> /dev/null; then
export GPG_TTY=$(tty)
fi
# set SSH Agent socket for KeepassXC
if [[ -z "$SSH_CONNECTION" ]] && command -v keepassxc 1> /dev/null; then
SSH_AUTH_SOCK=$(find /tmp/ -path "/tmp/ssh-*/agent.*" -printf "%TY-%Tm-%Td_%TH:%TM:%TS %p\n" 2>/dev/null | sort -n | tail -1 | awk '{print $2}')
export SSH_AUTH_SOCK
fi
# preprocessor for less used in neomutt
if command -v lesspipe.sh 1> /dev/null; then
export LESSOPEN="|LESSQUIET=1 /usr/local/bin/lesspipe.sh %s"
export MAGIC="/usr/share/file/magic:$HOME/.local/share/file/magic"
fi
# additional cfgs for hl
if command -v hl 1> /dev/null; then
export HL_CONF=$HOME/.config/hl/config.d:/etc/hl/config.d
fi
# used by functions mark/unmark/marks/jump
if [[ -d "$HOME/.marks" ]]; then
export MARKPATH="$HOME/.marks"
else
mkdir "$HOME/.marks"
export MARKPATH="$HOME/.marks"
fi
# ==============================
# DISPLAY
# ==============================
#some fancy, colorful manpages
export LESS_TERMCAP_so=$(printf '\e[01;33m') # enter standout mode yellow
export LESS_TERMCAP_se=$(printf '\e[0m') # leave standout mode
export LESS_TERMCAP_us=$(printf '\e[04;36m') # enter underline mode cyan
export LESS_TERMCAP_ue=$(printf '\e[0m') # leave underline mode
export LESS_TERMCAP_mb=$(printf '\e[05;31m') # enter blinking mode red
export LESS_TERMCAP_md=$(printf '\e[01;35m') # enter double-bright mode bold, magenta
export LESS_TERMCAP_me=$(printf '\e[0m') # turn off all appearance modes (mb, md, so, us)
# colored GCC warnings and errors
export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

View file

@ -0,0 +1,17 @@
#!/usr/bin/env bash
# executed by bash(1) for non-login shells.
# ==============================
# SECRETS
# ==============================
# for the boop function
NTFYSERVER="ntfy.server.tld"
export NTFYBOOPSURL="https://${NTFYSERVER}/boops"
if command -v keyring 1> /dev/null && [[ -n "$DBUS_SESSION_BUS_ADDRESS" ]]; then
NTFYBOOPSTOKEN="$(keyring -b keyring.backends.SecretService.Keyring get ${NTFYSERVER} boop-token)"
export NTFYBOOPSTOKEN
fi
# locale city for scripts like meteo alias
export MYCITY="Some City"

215
.bashrc.d/10-aliases.bashrc Normal file
View file

@ -0,0 +1,215 @@
#!/usr/bin/env bash
# executed by bash(1) for non-login shells.
# ==============================
# ALIASES
# ==============================
# ==============================
# Overlays
# ==============================
if command -v dircolors 1> /dev/null; then
alias dir='dir --color=auto'
alias vdir='vdir --color=auto'
# had to add -a because grep interprete a part of syslog as a binary
alias grep='grep --color=auto -a'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
alias ls='ls --color=auto'
else
alias grep='grep -a'
fi
# most common usage of df/du
if command -v hl 1> /dev/null; then
alias df='df -Tha --total | hlauto --df'
else
alias df='df -Tha --total'
fi
alias du='du -ach'
# better ncdu
if command -v ncdu 1> /dev/null; then
alias ncdu='ncdu -e --exclude-kernfs --color dark'
fi
# nano with backups
if command -v nano 1> /dev/null; then
mkdir -p ~/.cache/nano/backups
alias nano='nano -BGSceilqy% --atblanks -T 4 -C ~/.cache/nano/backups'
# clean nano backups
alias nano-clean='rm -rf ~/.cache/nano/backups/*'
fi
# force vim usage
if command -v vim 1> /dev/null; then
alias vi='vim'
fi
# ==============================
# New/Updated Utils
# ==============================
# login to root with sudo but keeping your ssh-agent and tmux env
alias sudoi='sudo -i --preserve-env=TMUX,WINDOWID,SSH_AGENT_PID,TERM_PROGRAM'
# short cd ..
alias cd..='cd ..'
alias ..='cd ..'
# last location
alias back='cd "$OLDPWD"'
# new upgraded ls, check fzf versions in functions
if command -v exa 1> /dev/null; then
alias l='exa -abghHl --git --icons --color always --group-directories-first --time-style=long-iso'
fi
# most common usage of ps
alias psf='ps faux'
# grep in psf
alias psg='ps faux | grep -v grep | grep -i -e VSZ -e'
# grep in history
alias hgrep='history | grep -i'
# print the 15 last lines from history
alias recent='fc -l'
# mkdir verbose and recursive
alias mkd='mkdir -pv'
# better man
alias manu='man --encoding UTF-8 --no-hyphenation --pager "less --ignore-case --LONG-PROMPT --mouse --quit-at-eof --quit-if-one-screen --RAW-CONTROL-CHARS --squeeze-blank-lines --status-column --tilde --use-color"'
# less with follow like tail -f
alias less-follow='less --auto-buffers --follow-name +F --ignore-case --LONG-PROMPT --mouse --quit-at-eof --RAW-CONTROL-CHARS --squeeze-blank-lines --status-column --tilde --use-color'
# find alternative
if command -v fdfind 1> /dev/null; then
alias fd='fdfind'
alias fdh='fdfind -H'
fi
# shape the bandwidth allowd for a command with trickle: standalone, D:100KB/s, U10KB/s
if command -v trickle 1> /dev/null; then
alias slow='trickle -s -d 100 -u 10 -t 1'
fi
if command -v xclip 1> /dev/null; then
# shortcuts to copy/paste text contents
alias xclip-in-txt='xclip -in -rmlastnl -selection clipboard'
alias xclip-txt-out='xclip -out -rmlastnl -selection clipboard'
# shortcuts to copy/paste other contents
alias xclip-in-png='xclip -in -selection clipboard -t image/png'
alias xclip-in-jpeg='xclip -in -selection clipboard -t image/jpeg'
alias xclip-in-gif='xclip -in -selection clipboard -t image/gif'
alias xclip-in-webp='xclip -in -selection clipboard -t image/webp'
alias xclip-in-svg='xclip -in -selection clipboard -t image/svg'
alias xclip-in-ico='xclip -in -selection clipboard -t image/ico'
alias xclip-in-tiff='xclip -in -selection clipboard -t image/tiff'
alias xclip-out-png='xclip -out -selection clipboard -t image/png'
alias xclip-out-jpeg='xclip -out -selection clipboard -t image/jpeg'
alias xclip-out-gif='xclip -out -selection clipboard -t image/gif'
alias xclip-out-webp='xclip -out -selection clipboard -t image/webp'
alias xclip-out-svg='xclip -out -selection clipboard -t image/svg'
alias xclip-out-ico='xclip -out -selection clipboard -t image/ico'
alias xclip-out-tiff='xclip -out -selection clipboard -t image/tiff'
fi
# ps alternative on rust
if command -v procs 1> /dev/null; then
alias procs='procs --insert VmRss --insert VmSwap --insert Threads --insert Priority --insert ElapsedTime --insert State --sortd VmSwap'
fi
# ==============================
# New commands or external programs
# ==============================
# custom motd dashboard
if [[ -f "/etc/update-motd.d/00-motdfetch" ]]; then
alias motd='/etc/update-motd.d/00-motdfetch'
fi
# SSH and ET with MOTD
alias sshmotd='ssh -o SetEnv=SSH_MOTD=1'
if command -v et 1> /dev/null; then
alias etmotd='et --ssh-option SetEnv=SSH_MOTD=1'
fi
# open a new tmux session named ssh_tmux or attach to it
if command -v tmux 1> /dev/null; then
alias tmuxs='tmux new-session -A -s ssh_tmux && exit'
fi
# vifm: tui file explorer
if command -v vifmrun 1> /dev/null && command -v vifm 1> /dev/null; then
alias vifm='vifmrun'
alias vf='vifmrun'
fi
# dragon for drag&drop function
if command -v dragon 1> /dev/null; then
alias drag='dragon --and-exit --on-top'
alias drop='dragon --and-exit --on-top --target'
fi
# glow: tui/cli markdown pager explorer
if command -v glow 1> /dev/null; then
alias glw='glow -l -p -w 80 -s dark'
fi
if command -v tidy-viewer 1> /dev/null; then
alias tv='tidy-viewer'
fi
# HLEDGER
if command -v hledger 1> /dev/null; then
export LEDGER_FILE=$HOME/.finance/$(date +"%Y").journal
fi
# get local meteo for 3 days
alias meteo='echo -e "┌─────────┐\n│ wttr.in │ ${MYCITY}:\n└─────────┘\n" && curl "wttr.in/$(echo ${MYCITY} | tr " -" "+")?mM2FQ&lang=${LANGUAGE/*:}"'
# mimic3: tts interactive command, just paste text inside
if command -v mimic3 1> /dev/null; then
alias mimic3-fr='mimic3 --voice fr_FR/tom_low --play-program paplay --interactive'
alias mimic3-en='mimic3 --voice en_US/ljspeech_low --play-program paplay --interactive'
alias mimic3-pl='mimic3 --voice pl_PL/m-ailabs_low --play-program paplay --interactive'
fi
# Neomutt, notmuch, mbsync
if command -v neomutt 1> /dev/null; then
alias ntt='neomutt -f "📫Boite à lettres"'
if command -v notmuch 1> /dev/null && command -v mbsync 1> /dev/null; then
# Sync all Mailboxes, Notmuch and Afew, then launch Neomutt
alias ntt-sync='notmuch new && mbsync mutt && notmuch new && neomutt -f "📫Boite à lettres"'
# Sync some Mailboxes, Notmuch and Afew, then launch Neomutt
alias ntt-sync-base='notmuch new && mbsync mutt-fast && notmuch new && neomutt -f "📫Boite à lettres"'
# Reindex Notmuch and Afew for main, then launch Neomutt
alias ntt-index='notmuch new && neomutt -f "📫Boite à lettres"'
fi
if command -v msmtp-queue 1> /dev/null; then
# Flush send mail queue with msmtpq, then launch Neomutt
alias ntt-flush='msmtp-queue -r && neomutt -f "📫Boite à lettres"'
fi
fi
# Display webcam output with MPV
if command -v mpv 1> /dev/null && [[ -c "/dev/video0" ]]; then
alias mpv-webcam='mpv av://v4l2:/dev/video0 --profile=low-latency --untimed'
if [[ -c "/dev/video2" ]]; then
alias mpv-fakecam='mpv av://v4l2:/dev/video2 --profile=low-latency --untimed'
fi
fi
# easy downloads with yt-dlp
if command -v yt-dlp 1> /dev/null && command -v ffmpeg 1> /dev/null; then
alias yt-audio-low='yt-dlp --no-update --socket-timeout 50 --force-ipv4 --limit-rate 1M --downloader wget --paths ${XDG_DOWNLOAD_DIR} --quiet --progress --prefer-free-formats --check-formats --format worstaudio'
alias yt-video-medium='yt-dlp --no-update --socket-timeout 50 --force-ipv4 --limit-rate 1M --downloader wget --paths ${XDG_DOWNLOAD_DIR} --quiet --progress --prefer-free-formats --check-formats --format "bestvideo[height<=?360][vbr>100][vbr<500]+worstaudio"'
fi
# to reconnect by tcp:5555 to the adb device currently tethering
if command -v adb 1> /dev/null; then
alias adb-reconnect='adb disconnect; adb connect $(ip route | egrep "^default" | awk "{print \$3}"):5555'
fi

View file

@ -0,0 +1,715 @@
#!/usr/bin/env bash
# executed by bash(1) for non-login shells.
# ==============================
# FUNCTIONS
# ==============================
# ==============================
# System
# ==============================
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# pass declared functions to sudo, /!\ aliases in the function will not work
sudof() {
Help() {
cat <<- HEREDOC
Pass declared functions as command to sudo bash.
Syntax: sudof [-h] <functionName> [<options/arguments>]
options:
-h Print this Help.
HEREDOC
}
while getopts ":h" option; do
case $option in
h) Help; return 0 ;;
\?) echo -e "Unknown option: -$OPTARG \n" >&2; Help; return 1;;
: ) echo -e "Missing argument for -$OPTARG \n" >&2; Help; return 1;;
* ) echo -e "Unimplemented option: -$option \n" >&2; Help; return 1;;
esac
done
local TMPFUNC=$(declare -f "$1")
local TMPCMD=${@:1}
sudo bash -c "$TMPFUNC; $TMPCMD"
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Pretty print dependencies from a package with dpkg
dpkg-debdep() {
dpkg --info "$1" | \
awk 'BEGIN{print "Depends:"} \
/Depends: / { gsub("Depends: ", ""); \
n=split($0,deps,","); \
for(i=1;i<=n;i++) print deps[i] \
}'
}
# ==============================
# Terminal
# ==============================
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# set of functions for marks/jump, MARKPATH created/exported in 01.env.bashrc
mark() { ln -s "$(pwd)" "$MARKPATH/$1"; }
unmark() { rm -i "$MARKPATH/$1"; }
marks() { ls -l "$MARKPATH" | sed 's/ / /g' | cut -d' ' -f9- | sed 's/ -/\t-/g' && echo; }
jump() { cd -P "$MARKPATH/$1" 2>/dev/null || echo "No such mark: $1"; }
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# pipe to hl only if you are in a tty and the output is not piped or redirected
if command -v hl 1> /dev/null; then
hlauto() {
if [ -t 1 ]; then
hl "$1"
else
cat -
fi
}
fi
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# full page of \n for the clear alias
pgdown() {
printf '\n%.0s' $(eval echo {1..$(( $(tput lines) - 1 ))})
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# clear teminal and TMUX history and get to the bottom line
c() {
echo -en "\ec"; pgdown
if [[ -n $TMUX_PANE ]]; then
tmux clear-history -t "$TMUX_PANE"
fi
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# shortcut for tmux to open a new default session with a name or attach if it exist
# an alias tmuxs exist too for ssh sessions
if command -v tmux 1> /dev/null; then
tmuxa() {
systemd-run -q --scope --user tmux new-session -A -s default "$@"
exit
}
fi
# ==============================
# Utils
# ==============================
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# mkdir with sub-dirs and change of pwd
md() { mkdir -pv "$1" && cd "$1"; }
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# list almost all services units (except user disabled) with state color
lservices() {
Help() {
cat <<- HEREDOC
List all Systemd services units.
Simplified and colorful.
Syntax: lservices [-h] [-x] [<username>]
Output: ServiceName UID STATE DESCRIPTION
options:
-h Print this Help.
-x Copy the list to Clipboard with xclip.
-p Disable the pager feature.
<username> [root] display --system services,
[other] display --user services,
[empty] default to current user.
HEREDOC
}
local OPTIND=0
while getopts ":hxp" option; do
case $option in
h) Help; return 0 ;;
x) local _XCLIP=1;;
p) local _NOPAGER=1;;
\?) echo -e "Unknown option: -$OPTARG \n" >&2; Help; return 1;;
: ) echo -e "Missing argument for -$OPTARG \n" >&2; Help; return 1;;
* ) echo -e "Unimplemented option: -$option \n" >&2; Help; return 1;;
esac
done
shift $((OPTIND-1))
if [[ -z $1 ]]; then
local _UID=$(id -u)
else
local _UID=$(id -u $1)
fi
if [[ "$_UID" == "0" ]]; then
local _OUT=$(sudo systemctl list-units --system -q --plain --full --no-pager -t service)
elif [[ "$_UID" == "$(id -u)" ]]; then
local _OUT=$(systemctl list-units --user -q --plain --full --no-pager -t service)
else
local _OUT=$(sudo machinectl -q shell --uid="$_UID" .host /usr/bin/systemctl list-units --user -q --plain --full --no-pager -t service)
fi
if [[ $_XCLIP == 1 ]]; then
echo -e "${_OUT}" | xclip -selection clipboard
fi
local _OUT=$(echo "$_OUT" | awk -v uid=$_UID ' \
BEGIN {
red = "\033[1;31m"
green = "\033[1;32m"
yellow = "\033[1;33m"
blue = "\033[1;36m"
reset = "\033[0m"
map["running"] = green
map["exited"] = yellow
map["failed"] = red
}
match($0,/^(.*)\.service(\s*)loaded\s[a-z]+\s([a-z]+)(\s.*)$/,a) {
status = a[3]
if ( status in map )
$0 = blue a[1] a[2] reset " " uid " " map[status] status reset a[4]
else
$0 = blue a[1] a[2] reset " " uid " " a[3] a[4]
}
{ print } '
)
if [[ $_NOPAGER == 1 ]]; then
echo -e "${_OUT}"
else
echo -e "${_OUT}" | less --ignore-case --LONG-PROMPT --mouse --RAW-CONTROL-CHARS --tilde --use-color --quit-if-one-screen
fi
if [[ $_XCLIP == 1 ]]; then
echo "List copied in the system clipboard!"
fi
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# bat/cat-like with no comments
if command -v bat 1> /dev/null; then
batl() {
bat -pp --color always "$@" \
| sed -E -e '1b;/^(\x1B\[[0-9;]+m\s*\x1B\[[0-9;]+m\x1B\[[0-9;]+m)?(\s+)?(\x1B\[[0-9;]+m)?(#|\")/d' \
| bat --decorations never --pager "less --ignore-case --status-column --line-numbers --quiet --tilde --use-color --quit-if-one-screen --RAW-CONTROL-CHARS"
}
fi
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# custom alternative to ls that pipe to fzf-tmux or fzf
lf() {
Help() {
cat <<- HEREDOC
A custom alternative to ls that pipe to fzf-tmux or fzf
Accept only the first path submitted (Default=.)
Syntax: lf [-h] [-a] [-e] [-o] [-t -l level] [<path>]
options:
-h Print this Help.
-a Display hidden files
-e Sort by extension
-o Sort by oldest
-t Tree mode
-l num Tree level, default=2
HEREDOC
}
local _type="list"
local _filter="visible"
local _by="name"
local _lvl=""
local _fzf_opt="--preview-window down:5:wrap"
local OPTIND=0
while getopts ":haeotl:" option; do
case $option in
h) Help; return 0 ;;
a) local _all="-a"
local _filter="all";;
e) local _sort="--sort=extension"
local _by="ext" ;;
o) local _sort="--sort=oldest"
local _by="oldest" ;;
t) local _tree="-T"
local _type="tree"
local _fzf_opt="--keep-right --preview-window down:2:wrap"
local _lvl=", with 2 level," ;;
l) local _level="-L ${OPTARG}"
local _lvl=", with ${OPTARG} level," ;;
\?) echo -e "Unknown option: -$OPTARG \n" >&2; Help; return 1;;
: ) echo -e "Missing argument for -$OPTARG \n" >&2; Help; return 1;;
* ) echo -e "Unimplemented option: -$option \n" >&2; Help; return 1;;
esac
done
shift $((OPTIND-1))
if [[ -f "/usr/bin/tmux" || -f "/usr/local/bin/tmux" ]]; then
local _fzfCmd="fzf-tmux -p 95%,75%"
else
local _fzfCmd="fzf"
fi
if [ -z "$1" ]; then
local _location="$(realpath -sq "$PWD" 2>&1)"
elif [ -z "$2" ]; then
local _location="$(realpath -sq "$1" 2>&1)"
else
echo "Error: Invalid number of paths"
Help
return 0
fi
local _localizer="awk -v loc=\"$_location/\" '{print \"\\\"\" loc \$0 \"\\\"\"}'"
local _oneliner="sed -E -e 's/\s->\s.+//g' \
| awk '{\$1=\$2=\$3=\$4=\$5=\$6=\$7=\"\"; \$0=\$0; \$1=\$1; print \$0}' \
| sed -E -e 's/^[^[:digit:][:alpha:]_.]*\s//g' \
| awk -v loc=\"$_location/\" '{print \"\\\"\" loc \$0 \"\\\"\"}' \
| xargs -d \"\n\""
if [[ "$_type" == "tree" ]]; then
local _localizer="awk '{print \"\\\"\" \$0 \"\\\"\"}'"
local _oneliner="cat"
fi
exa -bghHl $_all $_sort $_tree $_level --icons --git --color always --group-directories-first --time-style=long-iso "$_location" 2>&1 \
| ${_fzfCmd} -p 95%,75% --multi --reverse --ansi --tabstop 2 --header-lines 1 \
--prompt "A $_type$_lvl of $_filter elements sorted by $_by in \"$_location\" > " \
$_fzf_opt --bind ctrl-a:select-all,ctrl-d:deselect-all,ctrl-t:toggle-all,ctrl-p:toggle-preview \
--preview "for line in {+}; do echo \"\$line\"; done \
| sed -E -e 's/\s->\s.+//g' \
| awk '{\$1=\$2=\$3=\$4=\$5=\$6=\$7=\"\"; \$0=\$0; \$1=\$1; print \$0}' \
| sed -E -e 's/^[^[:digit:][:alpha:]_.]*\s//g' \
| $_localizer \
| xargs -d \"\n\"" \
| eval "$_oneliner"
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# find file/symlinks or directories with fd and fzf, use a regex pattern and an optionnal location
fdf() {
local array=( fd exa fzf bat )
for cmd in "${array[@]}"; do
if [[ -z $(command -v $cmd) ]]; then
echo 'function requirements: $cmd could not be found: sudo apt install fd-find exa fzf bat'
return 0
fi
done
Help() {
cat <<- HEREDOC
Filesystem search shortcuts with fd, fzf bat and exa
Syntax: fdf [-h] [-d] [-p] [-e] "<regex_query>" [<location>]
options:
-h Print this Help.
-d search directories only (defaut to files & symlinks)
-p preview in fzf (bat for files and exa tree for dirs)
-e output results with exa
HEREDOC
}
local _fdfindType="-tf -tl"
if [[ -f "/usr/bin/tmux" || -f "/usr/local/bin/tmux" ]]; then
local _fzfCmd="fzf-tmux"
else
local _fzfCmd="fzf"
fi
local _previewCdm="bat --style=numbers --color=always --line-range :150 {}"
local _xargs="cat"
local OPTIND=0
while getopts ":hdpe" option; do
case $option in
h) Help; return 0 ;;
d) local _fdfindType="-td"
local _exaType="-d"
local _fzfHeaderType="dir"
local _previewCdm="exa -bhlaTL 2 --icons --color always --group-directories-first --no-permissions --time-style=iso {}" ;;
p) local _fzfCmd="fzf"
local _preview=$_previewCdm ;;
e) local _xargs="xargs -r exa -abghHl --icons --color always --group-directories-first --time-style=long-iso" ;;
\?) echo -e "Unknown option: -$OPTARG \n" >&2; Help; return 1;;
: ) echo -e "Missing argument for -$OPTARG \n" >&2; Help; return 1;;
* ) echo -e "Unimplemented option: -$option \n" >&2; Help; return 1;;
esac
done
shift $((OPTIND-1))
if [ -z "$1" ]; then
echo "Error: fdf needs a <regex_query>"
Help
return 0
fi
if [ -z "$2" ]; then
local _searchPath="$(realpath -sq "$PWD" 2>&1)"
else
local _searchPath="$(realpath -sq "$2" 2>&1)"
fi
fdfind -0aH $_fdfindType ^$1\$ "$_searchPath" | xargs -r -0 exa $_exaType --colour=always \
| $_fzfCmd -m --reverse --ansi --keep-right --bind ctrl-a:select-all,ctrl-d:deselect-all,ctrl-t:toggle-all --header "^$1\$ $_fzfHeaderType in \"$_searchPath\"" --preview "$_preview" | eval "$_xargs"
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# better listing for all tcp/udp sockets
ssfull() {
if [[ -f "/usr/bin/tmux" || -f "/usr/local/bin/tmux" ]]; then
local _fzfCmd="fzf-tmux"
else
local _fzfCmd="fzf"
fi
ss -Haptun --cgroup 2>&1 \
| awk '{gsub(/cgroup:/,"- - cgroup:",$7);if($7 =="")print $0" - - -";else print $0;}' \
| awk '{
gsub(/,fd=.+,pid=/,",",$7);gsub(/users:|\(|\)|,fd=[0-9]+/,"",$7);gsub(/,pid=/," ",$7);
gsub(/.+\/|cgroup:/,"",$8);
gsub(/.+\/|cgroup:/,"",$9);
if(match($5, /^.+%[^\]]+:.+$/))localip = gensub(/^(.*[0-9\]*])%.+:[0-9*]{1,5}$/,"\\1","g",$5);else localip = gensub(/^(.*):[0-9*]{1,5}$/,"\\1","g",$5);
if(match($5, /^.+%[^\]]+:.+$/))localindex = gensub(/^.+%([^\]]+):.+$/,"\\1","g",$5);else localindex = "-";
localport = gensub(/^.*:([^:]*)$/,"\\1","g",$5);
if(match($6, /^.+%[^\]]+:.+$/))peerip = gensub(/^(.*[0-9\]*])%.+:[0-9*]{1,5}$/,"\\1","g",$6);else peerip = gensub(/^(.*):[0-9*]{1,5}$/,"\\1","g",$6);
if(match($6, /^.+%[^\]]+:.+$/))peerindex = gensub(/^.+%([^\]]+):.+$/,"\\1","g",$6);else peerindex = "-";
peerport = gensub(/^.*:([^:]*)$/,"\\1","g",$6);
stategroup = "";
if(match($2, /^ESTAB$/))stategroup = "1-ESTABL";
if(match($2, /^SYN-SENT$/))stategroup = "1-ESTABL";
if(match($2, /^SYN-RECV$/))stategroup = "1-ESTABL";
if(match($2, /^FIN-WAIT-1$/))stategroup = "2-CLOSIN";
if(match($2, /^FIN-WAIT-2$/))stategroup = "2-CLOSIN";
if(match($2, /^CLOSE-WAIT$/))stategroup = "2-CLOSIN";
if(match($2, /^LAST-ACK$/))stategroup = "2-CLOSIN";
if(match($2, /^CLOSING$/))stategroup = "2-CLOSIN";
if(match($2, /^TIME-WAIT$/))stategroup = "3-WAITIN";
if(match($2, /^LISTEN$/))stategroup = "0-LISTEN";
if(match($2, /^UNCONN$/))stategroup = "0-LISTEN";
if(stategroup =="")stategroup = "-";
if($1 =="tcp" || $1 == "udp")print stategroup,$1,localip,localindex,localport,peerip,peerindex,peerport,$7,$8,$9;
}' \
| sort -k1,1 -k3,3 -k4,4 -k6,6n \
| awk 'BEGIN{print "StateGroup Protocol LocalAddr LocalIndex LocalPort PeerAddr PeerIndex PeerPort Process PID Cgroup"}1' \
| column -t \
| $_fzfCmd --multi --reverse --ansi --keep-right --tabstop 2 --header-lines 1 --prompt "List of all tcp/udp sockets > " --bind ctrl-a:select-all,ctrl-d:deselect-all,ctrl-t:toggle-all
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# better listing for listening tcp/udp sockets
sslisten() {
if [[ -f "/usr/bin/tmux" || -f "/usr/local/bin/tmux" ]]; then
local _fzfCmd="fzf-tmux"
else
local _fzfCmd="fzf"
fi
ss -Hlptun --cgroup 2>&1 \
| awk '{gsub(/cgroup:/,"- - cgroup:",$7);if($7 =="")print $0" - - -";else print $0;}' \
| awk '{
gsub(/,fd=.+,pid=/,",",$7);gsub(/users:|\(|\)|,fd=[0-9]+/,"",$7);gsub(/,pid=/," ",$7);
gsub(/.+\/|cgroup:/,"",$8);
gsub(/.+\/|cgroup:/,"",$9);
if(match($5, /^.+%[^\]]+:.+$/))localip = gensub(/^(.*[0-9\]*])%.+:[0-9*]{1,5}$/,"\\1","g",$5);else localip = gensub(/^(.*):[0-9*]{1,5}$/,"\\1","g",$5);
if(match($5, /^.+%[^\]]+:.+$/))localindex = gensub(/^.+%([^\]]+):.+$/,"\\1","g",$5);else localindex = "-";
localport = gensub(/^.*:([^:]*)$/,"\\1","g",$5);
if(match($6, /^.+%[^\]]+:.+$/))peerip = gensub(/^(.*[0-9\]*])%.+:[0-9*]{1,5}$/,"\\1","g",$6);else peerip = gensub(/^(.*):[0-9*]{1,5}$/,"\\1","g",$6);
if(match($6, /^.+%[^\]]+:.+$/))peerindex = gensub(/^.+%([^\]]+):.+$/,"\\1","g",$6);else peerindex = "-";
peerport = gensub(/^.*:([^:]*)$/,"\\1","g",$6);
stategroup = "";
if(match($2, /^LISTEN$/))stategroup = "LISTENING";
if(match($2, /^UNCONN$/))stategroup = "LISTENING";
if(stategroup =="")stategroup = "-";
if($1 =="tcp" || $1 == "udp")print stategroup,$1,localip,localindex,localport,peerip,peerindex,peerport,$7,$8,$9;
}' \
| sort -k1,1 -k3,3 -k4,4 -k6,6n \
| awk 'BEGIN{print "StateGroup Protocol LocalAddr LocalIndex LocalPort PeerAddr PeerIndex PeerPort Process PID Cgroup"}1' \
| column -t \
| $_fzfCmd --multi --reverse --ansi --keep-right --tabstop 2 --header-lines 1 --prompt "List of LISTENING tcp/udp sockets > " --bind ctrl-a:select-all,ctrl-d:deselect-all,ctrl-t:toggle-all
}
# ==============================
# New commands or external programs
# ==============================
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# set shell working directory after leaving Vifm
if command -v vifmrun 1> /dev/null; then
vfcd() {
local dst="$(command vifmrun --choose-dir - "$@")"
if [ -z "$dst" ]; then
echo 'Directory picking cancelled/failed'
return 1
fi
cd "$dst"
}
fi
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# simple archive extraction of all kinds, get dep with "sudo apt install tar bzip2 unrar gzip unzip 7zip xz-utils innoextract cabextract"
extract() {
Help() {
cat <<- HEREDOC
Archive extraction simplified.
Syntax: extract [-h] <path/file_name>.<zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz>
extract <path/file_name_1.ext> [path/file_name_2.ext] [path/file_name_3.ext]
options:
-h Print this Help.
HEREDOC
}
while getopts ":h" option; do
case $option in
h) Help; return 0 ;;
\?) echo -e "Unknown option: -$OPTARG \n" >&2; Help; return 1;;
: ) echo -e "Missing argument for -$OPTARG \n" >&2; Help; return 1;;
* ) echo -e "Unimplemented option: -$option \n" >&2; Help; return 1;;
esac
done
array=( tar unlzma bunzip2 unrar gunzip unzip uncompress 7z unxz innoextract cabextract )
for cmd in "${array[@]}"; do
if [[ -z $(command -v "$cmd") ]]; then
echo "Requirements: at least $cmd could not be found:"
echo "sudo apt install tar bzip2 unrar gzip unzip 7zip xz-utils innoextract cabextract"
return 0
fi
done
for n in "$@"
do
if [[ -f "$n" ]] ; then
case "${n%,}" in
*.tar.bz2|*.tar.gz|*.tar.xz|*.tbz2|*.tgz|*.txz|*.tar)
tar xvf "$n" ;;
*.lzma) unlzma ./"$n" ;;
*.bz2) bunzip2 ./"$n" ;;
*.rar) unrar x -ad ./"$n" ;;
*.gz) gunzip ./"$n" ;;
*.zip) unzip ./"$n" ;;
*.z) uncompress ./"$n" ;;
*.7z|*.arj|*.cab|*.chm|*.deb|*.dmg|*.iso|*.lzh|*.msi|*.rpm|*.udf|*.wim|*.xar)
7z x ./"$n" ;;
*.xz) unxz ./"$n" ;;
*gog*.exe|*gog*.sh)
innoextract -es -c1 -p1 ./"$n" ;;
*.exe) cabextract ./"$n" ;;
*) echo "extract: '$n' - unknown archive method"; return 1;;
esac
else
echo "'$n' - file does not exist"
return 1
fi
done
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Command execution notifier
boop() {
Help() {
cat <<- HEREDOC
Command execution notifier.
- In front of a command: notification + sound + NTFY (env: NTFYBOOPSURL, NTFYBOOPSTOKEN)
(It send the command name and 1st arg, exec time and exit code)
- At the end of a chain: notification + sound
Syntax: Pre command: boop [-h] [sudo] <some command> | boop <some command>; boop <some command>
Post command: <some command>; boop
options:
-h Print this Help.
HEREDOC
}
while getopts ":h" option; do
case $option in
h) Help; return 0 ;;
\?) echo -e "Unknown option: -$OPTARG \n" >&2; Help; return 1;;
: ) echo -e "Missing argument for -$OPTARG \n" >&2; Help; return 1;;
* ) echo -e "Unimplemented option: -$option \n" >&2; Help; return 1;;
esac
done
local STATUS="$?"
local ARRAY1=( /usr/bin/time play dunstify )
local ARRAY2=( /usr/bin/time curl )
for cmd in "${ARRAY2[@]}"; do
if [[ -z $(command -v "$cmd") ]]; then
echo "boop function requirements: command $cmd could not be found"
return 1
fi
done
if [[ -z "$1" ]]; then
for cmd in "${ARRAY1[@]}"; do
if [[ -z $(command -v "$cmd") ]]; then
echo "boop function requirements: command $cmd could not be found"
return "$STATUS"
fi
done
if [[ "$STATUS" == '0' ]]; then
dunstify -a NTFY -u normal -i dialog-information "Commande terminée avec SUCCÉE ✅ !"
play -q -n synth pl G2 pl B2 pl D3 pl B3 pl D4 pl D4 delay 0 .05 .1 .15 .2 .25 remix - fade 0 2 .1 norm -1
else
dunstify -a NTFY -u critical -i dialog-error "Commande terminée avec une ERREUR ⚠️ !" "Exit code : $STATUS"
play -q -n synth 3 sin 960 synth 3 sin fmod 1920 fade l 0 3 2.8 trim 0 1 repeat 2 norm -1
fi
return "$STATUS"
else
local FILE=$(mktemp --suffix ".time")
boop2ntfy() {
local TIME=$(awk 'NR==1{print $1}' "$FILE")
local STATUS=$(awk 'NR==1{print $2}' "$FILE")
if [[ -z $(awk 'NR==1{print $4}' "$FILE") ]]; then
local CMDBEGIN=$(awk 'NR==1{print $3}' "$FILE")
else
local CMDBEGIN="$(awk 'NR==1{print $3}' "$FILE") $(awk 'NR==1{print $4}' "$FILE")"
fi
local HOSTNAME=$(hostname)
local URL="$NTFYBOOPSURL"
local TOKEN="$NTFYBOOPSTOKEN"
if [[ "$STATUS" == '0' ]]; then
if command -v dunstify 1> /dev/null; then
dunstify -a NTFY -u normal -i dialog-information "Commande terminée avec SUCCÉE ✅ !" "Durée : $TIME - Commande : $CMDBEGIN"
fi
if command -v play 1> /dev/null; then
play -q -n synth pl G2 pl B2 pl D3 pl B3 pl D4 pl D4 delay 0 .05 .1 .15 .2 .25 remix - fade 0 2 .1 norm -1
fi
curl --max-time 25 -s -S -H "Authorization: Bearer ${TOKEN}" -H "X-Title: Hôte : $HOSTNAME" -H tag:tada -d "La commande \"$CMDBEGIN\" s'est terminée avec Succès ! (Durée : $TIME)" "$URL" &> /dev/null
else
if command -v dunstify 1> /dev/null; then
dunstify -a NTFY -u critical -i dialog-error "Commande terminée avec une ERREUR ⚠️ !" "Durée : $TIME - Exit code : $STATUS - Commande : $CMDBEGIN"
fi
if command -v play 1> /dev/null; then
play -q -n synth 3 sin 960 synth 3 sin fmod 1920 fade l 0 3 2.8 trim 0 1 repeat 2 norm -1
fi
curl --max-time 25 -s -S -H "Authorization: Bearer ${TOKEN}" -H "X-Title: Hôte : $HOSTNAME" -H "X-Priority: 4" -H tag:warning -d "La commande \"$CMDBEGIN\" s'est interrompue avec le code d'Erreur $STATUS ! (Durée : $TIME)" "$URL" &> /dev/null
fi
}
/usr/bin/time -q -f "%E %x %C" -o "$FILE" "$@"; boop2ntfy
local EXIT=$(awk 'NR==1{print $2}' "$FILE")
rm -f "$FILE"
return "$EXIT"
fi
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# download a file from Google Drive with continuation : gdrive-dl ID FILENAME
gdrivedl() {
Help() {
cat <<- HEREDOC
Download a file from Google Drive with continuation.
Syntax: gdrive-dl [-h] <sharing ID from gdrive uri> <output file name>
options:
-h Print this Help.
HEREDOC
}
while getopts ":h" option; do
case $option in
h) Help; return 0 ;;
\?) echo -e "Unknown option: -$OPTARG \n" >&2; Help; return 1;;
: ) echo -e "Missing argument for -$OPTARG \n" >&2; Help; return 1;;
* ) echo -e "Unimplemented option: -$option \n" >&2; Help; return 1;;
esac
done
local _ID=$1
local _FILENAME=$2
wget --prefer-family=IPv4 --force-directories --no-check-certificate --no-hsts --continue --load-cookies "/tmp/gdrive-cookies-${_ID}.txt" \
"https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/gdrive-cookies-${_ID}.txt \
--keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=${_ID}' -O- | \
sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=${_ID}" -O "${XDG_DOWNLOAD_DIR}/$_FILENAME" \
&& rm -rf "/tmp/gdrive-cookies-${_ID}.txt"
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# mans - print brief help about a single option or command
mans() {
Help() {
cat <<- HEREDOC 1>&2
Mans print brief help about a single option or command
Usage: mans <command> [<option|section>]
Example:
mans bash getopts Documentation for bash getopts
mans ssh -v Documentation for ssh -v flag
mans select SYNOPSIS for select(2)
mans 'open(2)' SYNOPSIS for open(2)
HEREDOC
}
if test $# -lt 1; then
Help
return 0
fi
manpage="$1"
# show the SYNOPSIS section if no section or option was given
option="${2:-SYNOPSIS}"
# handle manpage(number)
case $manpage in *\(*\))
page=${manpage%\(*\)}
section=${manpage#"$page"}
section=${section#\(}
section=${section%\)}
manpage="$page"
;;
esac
man ${section:+-s $section} "$manpage" | perl -n -e \
'BEGIN {
$option = "'"$option"'";
$inside_option = 0;
}
if (!$inside_option) {
if (/^(\s*)\Q$option\E\b/p) {
# start of this option
$option_indentation = $1;
$inside_option = 1;
$saw_blank_line = 0;
print;
}
} else {
if (/^$/) {
$saw_blank_line = 1;
print;
} elsif (/^\Q$option_indentation\E\S/ and $saw_blank_line) {
# item at same indentation => start of next option
$inside_option = 0;
} elsif (/^\S/) {
# new heading => start of next section
$inside_option = 0;
} else {
print;
}
}' | { if command -v hl 1> /dev/null; then hlauto --man; else cat -; fi }
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# br - This function starts broot and executes the command
if command -v br 1> /dev/null; then
br() {
local cmd cmd_file code
cmd_file=$(mktemp)
if broot --outcmd "$cmd_file" "$@"; then
cmd=$(<"$cmd_file")
command rm -f "$cmd_file"
eval "$cmd"
else
code=$?
command rm -f "$cmd_file"
return "$code"
fi
}
fi

View file

@ -0,0 +1,68 @@
#!/usr/bin/env bash
# executed by bash(1) for non-login shells.
# ==============================
# BINDINGS
# ==============================
# ==============================
# FZF-EMOJI-WIDGET
# ==============================
# custom emojis selector with fzf, inspired by fzf shell bindings
# Require bash > v4; I did not copy other shells solutions from fzf shell bindings
# => pip --user install emoji-fzf
# => sudo apt install fzf
if [[ -f "$HOME/.local/bin/emoji-fzf" ]]; then
fzf-emoji-widget() {
Help() {
echo "FZF widget to insert or replace some emojis."
echo "Use it with bash>4 and 'bind -x'"
echo "Default: insert emojis in place."
echo
echo "Syntax: [-h] [-i]"
echo "options:"
echo "-h Print this Help."
echo "-i Replace the word before cursor, using it as a query"
echo
# READLINE(command line string) and READLINE_POINT(cursor position)
# are generated by bind.
}
local OPTIND=0
while getopts ":hi" option; do
case $option in
h) Help
return 0 ;;
i) local _REPLACE=1
local _QUERYLINE=${READLINE_LINE:0:READLINE_POINT}
local _QUERYLINE_POINT=${#_QUERYLINE}
local _QUERY="${_QUERYLINE/* /}"
local _QUERYLINE_START=$(( _QUERYLINE_POINT - "${#_QUERY}" )) ;;
\?) echo "Error: Invalid option: -$OPTARG"
Help
return 0 ;;
esac
done
shift $((OPTIND-1))
local selected=$(emoji-fzf preview --prepend | fzf-tmux -p 85% --multi --reverse --no-hscroll --header "Select multiple emojis with Tab and validate with Enter." --query "$_QUERY" | cut -d " " -f 2 | emoji-fzf get | xargs -d "\n")
if [[ $_REPLACE == 1 ]]; then
READLINE_LINE="${READLINE_LINE:0:$_QUERYLINE_START}$selected${READLINE_LINE:READLINE_POINT}"
READLINE_POINT=$(( _QUERYLINE_START + "${#selected}" ))
else
READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$selected${READLINE_LINE:READLINE_POINT}"
READLINE_POINT=$(( READLINE_POINT + "${#selected}" ))
fi
}
# ALT-e - Paste emojis from a list into the command line
bind -m emacs-standard -x '"\ee": fzf-emoji-widget'
bind -m vi-command -x '"\ee": fzf-emoji-widget'
bind -m vi-insert -x '"\ee": fzf-emoji-widget'
# ALT-i - Replace the word before cursor with emojis from a list
bind -m emacs-standard -x '"\ei": fzf-emoji-widget -i'
bind -m vi-command -x '"\ei": fzf-emoji-widget -i'
bind -m vi-insert -x '"\ei": fzf-emoji-widget -i'
fi

View file

@ -0,0 +1,243 @@
#!/usr/bin/env bash
# executed by bash(1) for non-login shells.
####################################
# LIQUID PROMPT CONFIGURATION FILE #
####################################
# This example config file does not contain all possible config options, nor
# does it have detailed option descriptions. See the documentation for that:
# https://liquidprompt.readthedocs.io/en/stable/config.html
#############
# BEHAVIOUR #
#############
# Display the battery level in more urgent color when the level is below this threshold.
# Recommended value is 75
LP_BATTERY_THRESHOLD=75
# Display the load average over the past minute when above this threshold.
# This value is scaled per CPU, so on a quad-core machine, the load average
# would need to be 2.40 or greater to be displayed.
# Recommended value is 0.60
LP_LOAD_THRESHOLD=0.80
# Display the temperature when the temperate is above this threshold (in
# degrees Celsius).
# Recommended value is 60
LP_TEMP_THRESHOLD=60
# Use the shorten path feature if the path is too long to fit in the prompt
# line.
# Recommended value is 1
LP_ENABLE_SHORTEN_PATH=1
# The maximum percentage of the screen width used to display the path before
# removing the center portion of the path and replacing with '...'.
# Recommended value is 35
LP_PATH_LENGTH=35
# The number of directories (including '/') to keep at the beginning of a
# shortened path.
# Recommended value is 2
LP_PATH_KEEP=3
# Determine if the hostname should always be displayed, even if not connecting
# through network.
# Defaults to 0 (do not display hostname when locally connected)
# set to 1 if you want to always see the hostname
# set to -1 if you want to never see the hostname
LP_HOSTNAME_ALWAYS=0
# When to display the user name:
# 1: always display the user name
# 0: hide the logged user (always display different users)
# -1: never display the user name
# Default value is 1
LP_USER_ALWAYS=1
# Display the actual values of load/batteries along with their
# corresponding marks. Set to 0 to only print the colored marks.
# Defaults to 1 (display percentages)
LP_PERCENTS_ALWAYS=1
# Display a user-defined set of environment variables.
# May show if the variables are unset, set, or their actual content
# (see below to configure which variables to watch).
LP_ENABLE_ENV_VARS=1
# The set of environment variables that the user wants to watch.
# Items should be a string with three space-separated elements
# of the form `"<name> <set>[ <unset>]"`
# The string used when the variable is set may contain the `%s` mark,
# which is replaced by the actual content of the variable.
LP_ENV_VARS=(
# # Display "V" if VERBOSE is set, nothing if it's unset.
# "VERBOSE V"
# # Display the name of the desktop session, if set, T if unset.
# "DESKTOP_SESSION %s T"
# # Display "ed:" followed the name of the default editor, nothing if unset.
# "EDITOR ed:%s"
)
# Use the permissions feature and display a red ':' before the prompt to show
# when you don't have write permission to the current directory.
# Recommended value is 1
LP_ENABLE_PERM=1
# Enable the proxy detection feature.
# Recommended value is 1
LP_ENABLE_PROXY=0
# Enable the jobs feature.
# Recommended value is 1
LP_ENABLE_JOBS=1
# Enable the detached sessions feature.
# Default value is 1
LP_ENABLE_DETACHED_SESSIONS=0
# Enable the load feature.
# Recommended value is 1
LP_ENABLE_LOAD=1
# Enable the battery feature.
# Recommended value is 1
LP_ENABLE_BATT=0
# Enable the 'sudo credentials' feature.
# Be warned that this may pollute the syslog if you don't have sudo
# credentials, and the sysadmin might hate you.
LP_ENABLE_SUDO=0
# Enable the directory stack support.
LP_ENABLE_DIRSTACK=0
# Enable the VCS features with the root account.
# Recommended value is 0
LP_ENABLE_VCS_ROOT=0
# Enable the Git special features.
# Recommended value is 1
LP_ENABLE_GIT=0
# Enable the Subversion special features.
# Recommended value is 1
LP_ENABLE_SVN=0
# Enable the Mercurial special features.
# Recommended value is 1
LP_ENABLE_HG=0
# Enable the Fossil special features.
# Recommended value is 1
LP_ENABLE_FOSSIL=0
# Enable the Bazaar special features.
# Recommended value is 1
LP_ENABLE_BZR=0
# Show time of when the current prompt was displayed.
LP_ENABLE_TIME=1
# Show runtime of the previous command if over LP_RUNTIME_THRESHOLD
# Recommended value is 0
LP_ENABLE_RUNTIME=1
# Minimal runtime (in seconds) before the runtime will be displayed
# Recommended value is 2
LP_RUNTIME_THRESHOLD=3
# Ring the terminal bell if the runtime of the previous command exceeded
# LP_RUNTIME_BELL_THRESHOLD
# Recommended value is 0
LP_ENABLE_RUNTIME_BELL=0
# Minimal runtime (in seconds) before the terminal bell will be rung.
# Recommended value is 10
LP_RUNTIME_BELL_THRESHOLD=10
# Display the virtualenv that is currently activated, if any
# Recommended value is 1
LP_ENABLE_VIRTUALENV=1
# Display the ruby virtual env that is currently activated, if any
# Recommended value is 1
LP_ENABLE_RUBY_VENV=1
# If using RVM, personalize the rvm-prompt.
# see http://rvm.io/workflow/prompt for details.
# Warning, this variable must be a shell array.
LP_RUBY_RVM_PROMPT_OPTIONS=(i v g s)
# Display the terraform workspace that is currently activated, if any
# Recommended value is 0
LP_ENABLE_TERRAFORM=0
# Display the enabled software collections, if any
# Recommended value is 1
LP_ENABLE_SCLS=0
# Show current Kubernetes kubectl context
LP_ENABLE_KUBECONTEXT=0
# Delimiter to shorten kubectl context by removing a suffix.
# E.g. when your context names are dev-cluster and test-cluster, set to "-"
# in order to output "dev" and "test" in prompt.
LP_DELIMITER_KUBECONTEXT_SUFFIX=
# Delimiter to shorten kubectl context by removing a prefix.
# E.g. when your context names are like
# arn:aws:eks:$REGION:$ACCOUNT_ID:cluster/$CLUSTER_NAME, set to "/"
# in order to output "$CLUSTER_NAME" in prompt.
LP_DELIMITER_KUBECONTEXT_PREFIX=
# Display the current active AWS_PROFILE, if any
# Recommended value is 1
LP_ENABLE_AWS_PROFILE=0
# Show highest system temperature
LP_ENABLE_TEMP=1
# When showing the time, use an analog clock instead of numeric values.
# Recommended value is 0
LP_TIME_ANALOG=0
# Use the prompt as the title of the terminal window
# Recommended value is 0
LP_ENABLE_TITLE=0
# Enable Title for screen, byobu, and tmux
LP_ENABLE_SCREEN_TITLE=0
# Use different colors for the different hosts you SSH to
LP_ENABLE_SSH_COLORS=0
# Show the error code of the last command if it was not 0
LP_ENABLE_ERROR=1
# Show the (guessed) error meaning after the error code.
LP_ENABLE_ERROR_MEANING=0
# Extends the list of guessed error meanings (may produce wrong meanings).
LP_ENABLE_ERROR_MEANING_EXTENDED=0
# Specify an array of absolute paths in which all vcs will be disabled.
# Ex: ("/root" "/home/me/large-remove-svn-repo")
LP_DISABLED_VCS_PATHS=()
# Use a local liquidpromptrc if it exists.
# Can be helpful if you sync your primary config across machines, or if
# there's a system-wide config at /etc/liquidpromptrc from which you'd
# like to make only minor deviations.
#LOCAL_RCFILE=$HOME/.liquidpromptrc.local
#[ -f "$LOCAL_RCFILE" ] && source "$LOCAL_RCFILE"
# Show the value of $SHLVL, which is the number of nested shells. For example,
# if one runs bash inside their shell, it will open a new shell inside their current shell,
# and this will display “2”.
LP_ENABLE_SHLVL=0
# vim: set et sts=4 sw=4 tw=120 ft=sh:

View file

@ -0,0 +1,148 @@
#!/usr/bin/env bash
# executed by bash(1) for non-login shells.
####################################
# LIQUID PROMPT DEFAULT THEME FILE #
####################################
# Special characters
# Be sure to use characters that exists in the font you use. You can use several
# characters at once.
# Below is an example of how to fallback to ASCII if the term is not Unicode-capable.
# Defaults to UTF-8 characters.
if [[ "$(locale -k LC_CTYPE | sed -n 's/^charmap="\(.*\)"/\1/p')" == *"UTF-8"* ]]; then
# If charset is UTF-8.
LP_MARK_BATTERY="⌁" # in front of the battery charge
LP_MARK_ADAPTER="⏚" # displayed when plugged
LP_MARK_LOAD="⌂" # in front of the load
LP_MARK_TEMP="θ" # in front of the temp
LP_MARK_PROXY="↥" # indicate a proxy in use
LP_MARK_HG="☿" # prompt mark in hg repositories
LP_MARK_SVN="‡" # prompt mark in svn repositories
LP_MARK_GIT="±" # prompt mark in git repositories
LP_MARK_FOSSIL="⌘" # prompt mark in fossil repositories
LP_MARK_DISABLED="⌀" # prompt mark in directory with disabled VCS info
LP_MARK_UNTRACKED="*" # if git has untracked files
LP_MARK_STASH="+" # if git has stashs
LP_MARK_SHORTEN_PATH=" … " # prompt mark in shortened paths
LP_MARK_PERM=": " # separator between host and path
LP_MARK_KUBECONTEXT="⎈" # Kubernetes context
LP_MARK_SHLVL="└" # number of nested shells
else
# If charset is anything else, fallback to ASCII chars
LP_MARK_BATTERY="b"
LP_MARK_ADAPTER="p"
LP_MARK_LOAD="c"
LP_MARK_TEMP="T"
LP_MARK_PROXY="^"
LP_MARK_HG="m"
LP_MARK_SVN="="
LP_MARK_GIT="+"
LP_MARK_FOSSIL="f"
LP_MARK_DISABLED="!"
LP_MARK_UNTRACKED="*"
LP_MARK_STASH="+"
LP_MARK_SHORTEN_PATH=" ... "
LP_MARK_PERM=": "
LP_MARK_KUBECONTEXT="k8s:"
fi
LP_MARK_BRACKET_OPEN="[" # open bracket
LP_MARK_BRACKET_CLOSE="]" # close bracket
#LP_MARK_PREFIX=$'\n' # newline prompt mark prefix
LP_MARK_PREFIX=" " # prompt mark prefix
LP_PS1_PREFIX=""
LP_PS1_POSTFIX=""
# Colors
# Available colors are:
# BOLD, BLACK, BOLD_GRAY, WHITE, BOLD_WHITE,
# RED, BOLD_RED, WARN_RED, CRIT_RED, DANGER_RED,
# GREEN, BOLD_GREEN, YELLOW, BOLD_YELLOW, BLUE,
# BOLD_BLUE, PURPLE, PINK, CYAN, BOLD_CYAN
# Set to a null string "" if you do not want color.
# Current working directory
LP_COLOR_PATH="$BOLD" # as normal user
LP_COLOR_PATH_ROOT="$BOLD_YELLOW" # as root
# Color of the proxy mark
LP_COLOR_PROXY="$BOLD_BLUE"
# Jobs count
LP_COLOR_JOB_D="$YELLOW" # Detached (aka screen sessions)
LP_COLOR_JOB_R="$BOLD_YELLOW" # Running (xterm &)
LP_COLOR_JOB_Z="$BOLD_YELLOW" # Sleeping (Ctrl-Z)
# Last error code
LP_COLOR_ERR="$PURPLE"
# Prompt mark
LP_COLOR_MARK="$BOLD" # as user
LP_COLOR_MARK_ROOT="$BOLD_RED" # as root
LP_COLOR_MARK_SUDO="$BOLD_RED" # when sudo credentials are cached
# Current user
LP_COLOR_USER_LOGGED="" # user who logged in
LP_COLOR_USER_ALT="$BOLD" # user but not the one who logged in
LP_COLOR_USER_ROOT="$BOLD_YELLOW" # root
# Hostname
LP_COLOR_HOST="" # local host
LP_COLOR_SSH="$BLUE" # connected via SSH
LP_COLOR_SU="$BOLD_YELLOW" # connected remotely but in new environment through su/sudo
LP_COLOR_TELNET="$WARN_RED" # connected via telnet
LP_COLOR_X11_ON="$GREEN" # connected with X11 support
LP_COLOR_X11_OFF="$YELLOW" # connected without X11 support
# Separation mark (aka permission in the working dir)
LP_COLOR_WRITE="$GREEN" # have write permission
LP_COLOR_NOWRITE="$RED" # do not have write permission
# VCS
LP_COLOR_UP="$GREEN" # repository is up to date / a push have been made
LP_COLOR_COMMITS="$YELLOW" # some commits have not been pushed
LP_COLOR_COMMITS_BEHIND="$BOLD_RED" # some commits have not been pushed
LP_COLOR_CHANGES="$RED" # there is some changes to commit
LP_COLOR_DIFF="$PURPLE" # number of lines impacted by current changes
# Battery
LP_COLOR_CHARGING_ABOVE="$GREEN" # charging and above threshold
LP_COLOR_CHARGING_UNDER="$YELLOW" # charging but under threshold
LP_COLOR_DISCHARGING_ABOVE="$YELLOW" # discharging but above threshold
LP_COLOR_DISCHARGING_UNDER="$RED" # discharging and under threshold
# Time
LP_COLOR_TIME="$BLUE"
# Brackets inside screen/tmux
LP_COLOR_IN_MULTIPLEXER="$BOLD_BLUE"
# Virtual environment
LP_COLOR_VIRTUALENV="$CYAN"
# Kubernetes
LP_COLOR_KUBECONTEXT="$CYAN"
# Terraform
LP_COLOR_TERRAFORM="$PINK"
# Runtime
LP_COLOR_RUNTIME="$YELLOW"
# Color map (for battery and load levels, and temperature)
# Range from 0 (nothing special) to 9 (alert)
LP_COLORMAP=(
""
"$GREEN"
"$BOLD_GREEN"
"$YELLOW"
"$BOLD_YELLOW"
"$RED"
"$BOLD_RED"
"$WARN_RED"
"$CRIT_RED"
"$DANGER_RED"
)
# vim: set et sts=4 sw=4 tw=120 ft=sh:

4627
.bashrc.d/22-prompt.bashrc Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,20 @@
#!/usr/bin/env bash
# ~/.bashrc: executed by bash(1) for non-login shells.
# ==============================
# AUTOSTART
# ==============================
# run tmux if TMUX variable is null
if [[ "${TERM-}" != tmux* ]] && [[ -z "${TMUX}" ]] && [[ -z "${SSH_CONNECTION}" ]]; then
tmuxa
elif [[ -z "${TMUX}" ]] && [[ -n "${SSH_CONNECTION}" ]]; then
tmuxs
fi
# run MOTD at login only in an ssh session
if [[ -n "${TMUX}" ]] && [[ -n "${SSH_CONNECTION}" ]] && [[ "${SSH_MOTD-}" == 1 ]] && [[ -f "/etc/update-motd.d/00-motdfetch" ]]; then
motd
else
# use function pgdown to get the prompt to terminal window bottom
pgdown
fi

60
.profile Normal file
View file

@ -0,0 +1,60 @@
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# if running with bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
else
# Expanding PATH with users bin
if [ -d "$HOME/.local/bin" ] ; then
export PATH="$HOME/.local/bin:$PATH"
fi
# Check if XDG environment variables are set or set them to default
if [ -z "$XDG_DATA_HOME" ]; then
export XDG_DATA_HOME=$HOME/.local/share
fi
if [ -z "$XDG_CONFIG_HOME" ]; then
export XDG_CONFIG_HOME=$HOME/.config
fi
if [ -z "$XDG_STATE_HOME" ]; then
export XDG_STATE_HOME=$HOME/.local/state
fi
if [ -z "$XDG_CACHE_HOME" ]; then
export XDG_CACHE_HOME=$HOME/.cache
fi
# ==============================
# Languages
# ==============================
# Cargo env config
if [ -d "$HOME/.cargo/bin" ]; then
export PATH="$HOME/.cargo/bin:$PATH"
fi
# Nim env config
if [ -d "$HOME/.nimble/bin" ]; then
export PATH="$HOME/.nimble/bin:$PATH"
fi
# Go env config
if [ -d "$HOME/go/bin" ]; then
export PATH="$HOME/go/bin:$PATH"
fi
# Deno env config
if [ -f "$HOME/.deno/bin/deno" ]; then
export DENO_INSTALL="$HOME/.deno"
export PATH="$DENO_INSTALL/bin:$PATH"
fi
# opt-out for .NET telemetry
if command -v dontnet 1> /dev/null; then
export DOTNET_CLI_TELEMETRY_OPTOUT=1
fi
fi