#!/bin/sh # shellcheck disable=1090,1091 export ENV=~/.profile export XDG_DATA_DIRS="$XDG_DATA_HOME/flatpak/exports/share:/var/lib/flatpak/exports/share${XDG_DATA_DIRS:+:}${XDG_DATA_DIRS:-}" mkdir -p \ "$XDG_CONFIG_HOME" \ "$XDG_CACHE_HOME/euandreh" \ "$XDG_DATA_HOME/euandreh" \ "$XDG_STATE_HOME/euandreh" \ "$XDG_LOG_HOME/euandreh" GUIX_PROFILE="$XDG_CONFIG_HOME"/guix/current if [ -r "$GUIX_PROFILE"/etc/profile ]; then . "$GUIX_PROFILE"/etc/profile fi path_add() { case ":$2:" in *:"$3":*) ;; *) eval "export $1=$3\${$1:+:}\${$1:-}" ;; esac } export XDG_DATA_DIRS="$XDG_DATA_HOME/flatpak/exports/share:/var/lib/flatpak/exports/share${XDG_DATA_DIRS:+:}${XDG_DATA_DIRS:-}" # # # export HISTSIZE=-1 export HISTFILE="$XDG_STATE_HOME/sh-history" export SRC=~/dev export PRIV_CONFIG="$XDG_PREFIX"/var/lib/private/tilde export PRIV_STATEDIR=/var/lib/"$USER" export EDITOR='vi' export VISUAL="$EDITOR" export PAGER='less -R' export BROWSER='firefox' export MAILDIR=~/Maildir export TZ='America/Sao_Paulo' export DICT=~/Desktop/en_US.dic HOST="$(uname -s)/$(uname -m)" TARGET="Linux/i386" export HOST TARGET export GUILE_HISTORY="$XDG_STATE_HOME/guile-history" export GNUPGHOME="$XDG_CONFIG_HOME/gnupg" export RLWRAP_HOME="$XDG_CACHE_HOME/rlwrap" export LESSHISTFILE="$XDG_STATE_HOME/lesshst" export NOTMUCH_CONFIG="$XDG_CONFIG_HOME/notmuch/default/config" export PASSWORD_STORE_DIR="$SRC/private/password-store" export MAILCAPS="$XDG_CONFIG_HOME/mailcaps/config" export PYTHONSTARTUP="$XDG_CONFIG_HOME/python/pythonrc.py" export NIX_PATH=nixpkgs="$HOME/dev/misc/nixpkgs" export EXINIT=' " set number set ruler set showmode set showmatch set extended set cedit= set filec= set iclower set searchincr set tildeop set windowname set verbose set wraplen=80 set autoindent map  :tagnext map  :tagprev map \ :w " Remover line break: " set leftright set sidescroll=32 " map  :set leftright " toggle? " echo success? " map  :set autoindent " toggle? " map  y :p:.,$!copy :q " map  p :read !xclip -o " map K wb"zye:o:!man "zp " map  f ::!env FZF_DEFAULT_COMMAND="git ls-files" fzf >> % :edit GIEdit  :bg " map & wb"zye:o:!git grep "zp " map & wb"zye::!echo % >> % :edit GI:!git grep h"zpwi^X7c fzf >>  ::edit Gf:l"zyt:hDIEdit + h"zp :bg " map gb :vsplit "zy1G:edit /tmp G:read !git blame -- # : o"zpG!wc -lI: ' HOSTNAME="$(hostname)" export BORG_PASSCOMMAND="pass show $HOSTNAME/borg" export BORG_REPO="suyin:borg/$HOSTNAME" export BORG_REMOTE_PATH='borg14' NPROC="$(nproc)" export NPROC GUILE_EFFECTIVE_VERSION="$(guile -c '(display (effective-version))')" export N="$(($(nproc) * 2 + 1))" export MAKEFLAGS="-j $N" export GOPATH="$SRC/go" export VGFLAGS=' --show-error-list=yes --show-leak-kinds=all --leak-check=full --track-origins=yes --error-exitcode=1 ' VGFLAGS="$(printf '%s\n' "$VGFLAGS" | grep . | tr -d '\t' | tr '\n' ' ')" export FUZZSEC=0.1 export CC=gcc export CCFLAGS=' -g -fPIC -std=c17 -Wall -Wextra -Wpedantic -Wconversion -Wshadow -Wundef -Wdouble-promotion -Wvla -Wmissing-prototypes ' CCFLAGS="$(printf '%s\n' "$CCFLAGS" | grep . | tr -d '\t' | tr '\n' ' ')" export LLDFLAGS='' export LDFLAGS="$LLDFLAGS -static" export CFLAGS="$CCFLAGS" export YFLAGS='-Wother' export GOCFLAGS="-I $PREFIX/lib/go -N" export GOLDFLAGS="-L $PREFIX/lib/go" export LEIN_SUPPRESS_USER_LEVEL_REPO_WARNINGS=1 export LEIN_HOME="$XDG_CONFIG_HOME"/leiningen export GUILE_EFFECTIVE_VERSION export LISP=li export LISP_CLI_IMPL=sbcl export GPODDER_HOME="$XDG_DATA_HOME"/gPodder export GPODDER_DOWNLOAD_DIR="${XDG_DOWNLOAD_DIR:-$HOME/Downloads}"/gPodder add_prefix() { path_add GUILE_LOAD_PATH "$GUILE_LOAD_PATH" "$1/share/guile/site/$GUILE_EFFECTIVE_VERSION" path_add GUILE_LOAD_COMPILED_PATH "$GUILE_LOAD_COMPILET_PATH" "$1/lib/guile/$GUILE_EFFECTIVE_VERSION/site-ccache" path_add C_INCLUDE_PATH "$C_INCLUDE_PATH" "$1/include" path_add LIBRARY_PATH "$LIBRARY_PATH" "$1/lib" path_add ADA_INCLUDE_PATH "$ADA_INCLUDE_PATH" "$1/include" path_add ADA_OBJECTS_PATH "$ADA_OBJECTS_PATH" "$1/lib/ali" path_add NODE_PATH "$NODE_PATH" "$1/lib/node" path_add INFOPATH "$INFOPATH" "$1/share/info" path_add MANPATH "$MANPATH" "$1/share/man" path_add DICPATH "$DICPATH" "$1/share/hunspell" path_add PATH "$PATH" "$1/bin" } export PREFIX="$XDG_PREFIX/var/mkg" add_prefix "$PREFIX" add_prefix "$XDG_PREFIX" add_prefix "$GOPATH" add_prefix "$HOME/.nix-profile" for d in "$XDG_PREFIX"/opt/bin-dirs/*; do path_add PATH "$PATH" "$d" done PATH="/run/setuid-programs:/run/wrappers/bin:$XDG_PREFIX/bin:$PREFIX/bin:$PATH" # # Aliases # unalias -a alias p='ping euandre.org -c 3' alias o='open' alias e='vi' alias mm='msmtp-queue -r' alias s='vcs status' alias d='vcs diff' alias ds='vcs diff -- --staged' alias tpd='cd "$(mkdtemp)"' alias cls='tmux send-keys -R \; clear-history' alias c='clean' alias l='ls -lahiF --color' alias grep='grep --color=auto' alias diff='diff --color=auto' alias watch='watch --color ' alias man='MANWIDTH=$((COLUMNS > 80 ? 80 : COLUMNS)) man' alias less='less -R' alias tree='tree -F -aC -I .git -I vendor -I STUFF -I refers' alias make='make -e --no-print-directory' alias mv='mv -i' alias bc='bc -lq' alias gdb='gdb -q --ex "set confirm off"' alias ffmpeg='ffmpeg -loglevel warning -hide_banner' alias sqlite='rlwrap sqlite3' alias li='rlwrap li' alias guile='guile -l "$XDG_CONFIG_HOME"/guile/init.scm' alias info='info --init-file "$XDG_CONFIG_HOME"/info/infokey' alias wget='wget --hsts-file="$XDG_STATE_HOME"/wget-hsts' alias tmux='tmux -f "$XDG_CONFIG_HOME"/tmux/tmux.conf' alias flush='sync && echo 3 | sudo tee /proc/sys/vm/drop_caches > /dev/null' alias kal='khal calendar today `LANG=en.UTF-8 date +%A`' alias tg='TG_API_ID="$(pass show tg/api_id)" TG_API_HASH="$(pass show tg/api_hash)" tg' # # PS1 # error_marker() { STATUS=$? if [ "$STATUS" != 0 ]; then color -c redb " (!! $STATUS !!) " fi } shell_status_level() { if [ -z "${SHLVL:-}" ]; then return fi if [ "$SHLVL" = 1 ]; then return fi color -c white "$SHLVL" if [ -n "${RANGER_LEVEL:-}" ]; then color -c white '|' color -c bluei 'r' fi } shell_status_jobs() { JOBS="$(jobs | grep -cv autojump)" if [ "$JOBS" != 0 ]; then color -c red "$JOBS" fi } shell_status() { LEVEL="$(shell_status_level)" JOBS="$(shell_status_jobs)" if [ -z "$LEVEL" ] && [ -z "$JOBS" ]; then return fi color -c white '[' printf '%s' "$LEVEL" if [ -n "$LEVEL" ] && [ -n "$JOBS" ]; then color -c white '|' fi printf '%s' "$JOBS" color -c white ']' printf ' ' } timestamp_fn() { color -c blacki '\T' } path() { color -c yellowb '\w/' } guix_env() { if [ -z "${GUIX_ENVIRONMENT:-}" ]; then return fi printf '\n' color -c blacki '~> ' color -c purple 'guix environment ' printf '(' color -c blueb "$GUIX_ENVIRONMENT" printf ')' } in_nix_shell() { if [ -z "${IN_NIX_SHELL:-}" ]; then return fi printf '\n' color -c blacki '~> ' color -c purpleb "$IN_NIX_SHELL " color -c purple 'nix-shell ' printf '(' color -c blueb "${name:-}" printf ')' } in_ssh_session() { if [ -n "${SSH_CLIENT:-}" ]; then color -c blackb '\\u' printf '@' color -c purple '\\H' fi } direnv_status() { if [ -n "${DIRENV_FILE:-}" ]; then color -c lightblue '.' fi } makeflags_status() { if [ -n "${MAKEFLAGS:-}" ]; then color -c lightblue '|' fi } VCS_PS1_TIMEOUT=0.5 vcs_status() { timeout "$VCS_PS1_TIMEOUT" vcs ps1 || if [ $? = 124 ]; then color -c red '❌' fi } PS1='`error_marker`'$(timestamp_fn)' '$(path)'`direnv_status``makeflags_status` `shell_status``vcs_status``guix_env``in_nix_shell` '$(in_ssh_session)'$ ' export PS1 g() { if [ -z "${1:-}" ]; then cat <<-'EOF' Missing PATTERN. Usage: g PATTERN [FILE] EOF return 2 fi PAT="$(mkstemp)-g-shell-function" printf '%s' "$1" > "$PAT" PREVIEW_CMD="highlight -n{2} -f{1} -e \"\$(cat '$PAT')\"" LINE="$( # shellcheck disable=2086 git grep -iIE --color=always -n -- "$(cat "$PAT")" ${2:-} | fzf \ --exit-0 \ --select-1 \ --ansi \ --delimiter=: \ --preview-window 'up,60%,+{2}+3/3' \ --preview "$PREVIEW_CMD" )" rm -f "$(dirname "$PAT")"/*-g-shell-function if [ -n "$LINE" ]; then FILE="$( printf '%s\n' "$LINE" | cut -d: -f1)" NUMBER="$(printf '%s\n' "$LINE" | cut -d: -f2)" case "$1" in "'"*"'") # Best effort handling of string escaping, since # one can't recover what was typed at this level H="\"$1\"" ;; *) H="'$1'" ;; esac if [ -z "${2:-}" ]; then history -s g "$H" else history -s g "$H" "'$2'" fi history -s "$VISUAL" +"$NUMBER" "'$FILE'" "$VISUAL" +"$NUMBER" "$FILE" fi } f() { P="f-shell-function$(pwd | sed 's|/|-|g')" F="$( vcs ls | grep -E -e "${2:-.}" | remembering -p "$P" -- \ fzf \ --select-1 \ --exit-0 \ --preview-window up \ --preview 'cat {}' )" CMD="${1:-$VISUAL}" if [ -n "$F" ]; then if [ -z "${1:-}" ]; then history -s f elif [ -z "${2:-}" ]; then history -s f "$1" else history -s f "$1" "'$2'" fi case "$F" in -*) DELIM='--' ;; *) DELIM='' ;; esac history -s "$CMD" $DELIM "'$F'" "$CMD" -- "$F" fi } idiff() { diff -U10 --color=always "$1" "$2" | less } r() { . ~/.profile } rr() { r direnv allow } _edit_without_executing() { F="$(mkstemp)" printf '%s\n' "$READLINE_LINE" > "$F" e "$F" READLINE_LINE="$(cat "$F")" READLINE_POINT="${#READLINE_LINE}" rm -f "$F" } if set -o | grep 'on' | grep -Eq '^(vi|emacs)'; then bind -x '"\C-x\C-e":_edit_without_executing' fi # # GPG and SSH agents configuration # SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket) GPG_TTY=$(tty ||:) export GPG_TTY SSH_AUTH_SOCK gpgconf --launch gpg-agent case $- in *i*) stty -ixon # Disable C-s/C-q mode ;; *) ;; esac F="$PRIV_CONFIG"/privrc.sh if [ -r "$F" ]; then # Extra rc code to be loaded, stored in private repository . "$F" fi # # Only for graphical sessions # if [ -n "${DISPLAY:-}" ]; then xset s 1800 xset r rate 225 100 # Get keycode number by running `xev(1)`, and symname by looking at the # definitions in `X11/keysymdef.h`. xmodmap \ -e 'keycode 118 = ssharp bar' \ -e 'keycode 75 = slash question' \ fi # # From here on, bash-specific things. # if [ -z "$BASH_VERSION" ]; then return fi # shellcheck disable=3045 ulimit -c unlimited export INPUTRC="$XDG_CONFIG_HOME/bash/inputrc" export HISTCONTROL=ignorespace:ignoredups eval "$(direnv hook bash)" # # From here on, interactive-only bash-specific things. # case $- in *i*) ;; *) return ;; esac HOME_ENVIRONMENT="$HOME"/.guix-home # IIRC, the Guix profile should do this alias have='true' for f in "$HOME_ENVIRONMENT"/profile/etc/bash_completion.d/*; do . "$f" done unalias have # IIRC, the Guix package should do this F="$HOME_ENVIRONMENT"/profile/share/autojump/autojump.bash if [ -r "$F" ]; then . "$F" fi unset HOME_ENVIRONMENT export TD_USE_BUILTIN_HOOKS='git'