diff options
Diffstat (limited to 'etc/sh/rc')
-rw-r--r-- | etc/sh/rc | 364 |
1 files changed, 364 insertions, 0 deletions
diff --git a/etc/sh/rc b/etc/sh/rc new file mode 100644 index 0000000..ae552a6 --- /dev/null +++ b/etc/sh/rc @@ -0,0 +1,364 @@ +#!/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 + +idempotent_path_add() { + case "$(eval "echo \$$1")" in + *"$2"*) + ;; + *) + eval "export $1=$2\${$1:+:}\${$1:-}" + ;; + esac +} +export A="$HOME${A:+:}${A:-}" +# idempotent_path_add B "$HOME" +export XDG_DATA_DIRS="$XDG_DATA_HOME/flatpak/exports/share:/var/lib/flatpak/exports/share${XDG_DATA_DIRS:+:}${XDG_DATA_DIRS:-}" +# idempotent_path_add XDG_DATA_DIRS "$XDG_DATA_HOME/flatpak/exports/share" + + + +# +# +# + +export HISTSIZE=-1 +export HISTFILE="$XDG_STATE_HOME/sh-history" +export SRC=~/dev +export PRIV_CONFIG="$XDG_PREFIX"/var/lib/private/tilde +export EDITOR='e' +export VISUAL="$EDITOR" +export PAGER='less -R' +export BROWSER='firefox' +export MAILDIR=~/Maildir +export BACKLIGHT_DEVICE='acpi_video0' + +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 EXINIT=' + " set number + " set autoindent + set ruler + set showmode + set showmatch +' + +HOSTNAME="$(hostname)" +export BORG_PASSCOMMAND="pass show $HOSTNAME/borg/passphrase" +export BORG_REPO="suyin:borg/$HOSTNAME" +export BORG_REMOTE_PATH='borg1' + +N_PROCS=$(($(nproc) * 2 + 1)) +GUILE_EFFECTIVE_VERSION="$(guile -c '(display (effective-version))')" +export MAKEFLAGS="-j $N_PROCS" +export GOPATH="$SRC/go" +export CFLAGS='-std=c99 -Wall -Wextra -Wpedantic -g -flto -Werror' +export CC=gcc +export AR=gcc-ar +export LEX=flex +export LDFLAGS='-flto' +export LISP='sbcl --eval' +export N_PROCS GUILE_EFFECTIVE_VERSION +export LISP_CLI_IMPL=clisp + +add_prefix() { + export GUILE_LOAD_PATH="$1/share/guile/site/$GUILE_EFFECTIVE_VERSION${GUILE_LOAD_PATH:+:}${GUILE_LOAD_PATH:-:}" + export GUILE_LOAD_COMPILED_PATH="$1/lib/guile/$GUILE_EFFECTIVE_VERSION/site-ccache${GUILE_LOAD_COMPILED_PATH:+:}${GUILE_LOAD_COMPILED_PATH:-}" + export C_INCLUDE_PATH="$1/include${C_INCLUDE_PATH:+:}${C_INCLUDE_PATH:-}" + export LIBRARY_PATH="$1/lib${LIBRARY_PATH:+:}${LIBRARY_PATH:-}" + export INFOPATH="$1/share/info${INFOPATH:+:}${INFOPATH:-}" + export MANPATH="$1/share/man${MANPATH:+:}${MANPATH:-}" + export DICPATH="$1/share/hunspell${DICPATH:+:}${DICPATH:-}" + export PATH="$1/bin${PATH:+:}${PATH:-}" +} +export PREFIX="$XDG_PREFIX/var/mkg" +add_prefix "$PREFIX" +add_prefix "$XDG_PREFIX" + +for d in "$XDG_PREFIX"/opt/bin-dirs/*; do + PATH="$d:$PATH" +done + + + +# +# Aliases +# + +unalias -a + +alias p='ping euandre.org -c 3' +alias c='tmux send-keys -R \; clear-history' +alias o='open' +alias mm='msmtp-queue -r' +alias s='vcs status' +alias d='vcs diff' +alias ds='vcs diff -- --staged' +alias tpd='cd "$(mkdtemp)"' + +alias l='ls -lahF --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 -aC' +alias make='make -e' +alias mv='mv -i' +alias vi='echo "Use \"e\" instead."; false' +alias bc='bc -l' + +alias sqlite='rlwrap sqlite3' +alias guile='guile -l "$XDG_CONFIG_HOME"/guile/init.scm' + +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`' + + + +# +# PS1 +# + +error_marker() { + STATUS=$? + if [ "$STATUS" != 0 ]; then + color -c redb " (!! $STATUS !!) " + fi +} + +shell_status_level() { + if [ -z "${SHLVL:-}" ]; then + return + fi + + if [ -n "${TMUX:-}" ]; then + LVL=$((SHLVL - 1)) + else + LVL="$SHLVL" + fi + + if [ "$LVL" = 1 ]; then + return + fi + + color -c white "$LVL" + 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() { + 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 ')' +} + +PS1='`error_marker`'$(timestamp)' '$(path)' `shell_status``vcs ps1``guix_env``in_nix_shell` +$ ' + + + +# g '^\w.*json_destroy(' +g() { + # shellcheck disable=2086 + fn=$(git grep -n -- "$1" ${2:-} | \ + cut -d: -f -2 | \ + fzf --select-1 \ + --exit-0 \ + --preview "echo {} | \ + cut -d: -f1 | \ + xargs -I% awk -v bounds=25 -v pat=\"$1\" -v n=\$(echo {} | cut -d: -f2) ' + (n - bounds < NR) && (NR < n + bounds) && (NR != n) { print } + NR==n { gsub(pat, \"\033[1;33m&\033[1;000m\"); print } + ' %") + if [ -n "$fn" ]; then + f="$(echo "$fn" | cut -d: -f1)" + n="$(echo "$fn" | cut -d: -f2)" + # shellcheck disable=2068 + # history -s g "$@" + # history -s vi "+$n" "$f" + # vi "+$n" "$f" + history -s g "$@" + history -s e "+$n" "$f" + e "+$n" "$f" + fi +} + +f() { + # profile="f-shell-function$(pwd | sed -e 's_/_-_g')" + # file="$(git ls-files | grep ${2:-.} | remembering -p "$profile" -c "fzf --select-1 --exit-0 --preview 'cat {}'")" + # shellcheck disable=2086 + file="$(git ls-files | grep ${2:-.} | fzf --select-1 --exit-0 --preview 'cat {}')" + if [ -n "$file" ]; then + # shellcheck disable=2068 + history -s f "$@" + history -s "$1" "$file" + "$1" "$file" + fi +} + + + +r() { + . ~/.profile + xset r rate 225 100 +} + +_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 + + + +# +# From here on, bash-specific things. +# + +if [ -z "$BASH_VERSION" ]; then + return +fi + +ln -fs .profile ~/.bashrc + +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 + +# IIRC, the Guix profile should do this +for f in "$HOME_ENVIRONMENT"/profile/etc/bash_completion.d/*; do + . "$f" +done + +# IIRC, the Guix package should do this +F="$HOME_ENVIRONMENT"/profile/share/autojump/autojump.bash +if [ -r "$F" ]; then + . "$F" +fi |