# If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac init () { # check the window size after each command and, if necessary, # update the values of LINES and COLUMNS. shopt -s checkwinsize # If set, the pattern "**" used in a pathname expansion context will # match all files and zero or more directories and subdirectories. shopt -s globstar # enable programmable completion features (you don't need to enable # this, if it's already enabled in /etc/bash.bashrc and /etc/profile # sources /etc/bash.bashrc). 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 # === Configure bash history === # From https://stackoverflow.com/a/19533853/2759427 # Undocumented feature which sets the size to "unlimited". # http://stackoverflow.com/questions/9457233/unlimited-bash-history export HISTFILESIZE= export HISTSIZE= export HISTTIMEFORMAT="[%F %T] " # Change the file location because certain bash sessions truncate .bash_history file upon close. # http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login # (but DONT export, otherwise child shells might truncate and do stuff we dont want with it) HISTFILE=~/.bash_eternal_history # Force prompt to write history after every command. # http://superuser.com/questions/20900/bash-history-loss PROMPT_COMMAND="history -a; $PROMPT_COMMAND" HISTCONTROL=ignoredups # append to the history file, don't overwrite it shopt -s histappend # === Set prompt and terminal title === # Prompt which is basically user@host:$PWD ending in a literal $ # \u is username # \h is hostname up to the first '.' # \w is $PWD PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' # If this is an xterm set the title to user@host:dir case "$TERM" in xterm*|rxvt*|alacritty) PS1="\[\e]0;\u@\h: \w\a\]$PS1" ;; *) ;; esac # Meta (dotfiles related) cobconf="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" export cobconf alias cobconf="cd ${cobconf}" # Git aliases alias gitkcon="git log --all --graph --date=short --pretty=format:'%C(yellow)%h %C(green)%ad %C(cyan)%an%C(auto)%d%C(reset) %C(reset)%s'" alias xclip="xclip -selection clipboard" alias dos2unix="dos2unix --keepdate" alias lsblk="lsblk -o name,mountpoint,model,size,type,ro,rm,maj:min" # Show model and serial by default alias dmesgless="dmesg --color=always | less -R" alias l="ls -lah" # MapCast alias mc="node --max-old-space-size=8192 ${HOME}/Seafile/projects/mapcast/monorepo/pkg/core-app-multitool/entry.ts" alias dispose="node ${HOME}/Seafile/projects/shred-and-record/main.ts" # enable color support of ls and also add handy aliases if [ -x /usr/bin/dircolors ]; then test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" alias ls='ls --color=auto' #alias dir='dir --color=auto' #alias vdir='vdir --color=auto' alias grep='grep --color=auto' alias fgrep='fgrep --color=auto' alias egrep='egrep --color=auto' fi # Add $HOME/bin to $PATH if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi # For nix if [ -d "$HOME/.nix-profile/bin" ] ; then PATH="$HOME/.nix-profile/bin:$PATH" fi # Old stuff on main machine where I'm not ready to use nix yet so I need to support # old shit if [ "$(hostname)" = "bepis" ]; then source "${cobconf}/bepis-old-fix.sh" fi # Setup DOTFILES_LOG_SHELL_TO_DOCKER (when enabled), which logs the history fo the shell to # docker's stdout (PID 1 fd 1) on every PROMPT_COMMAND. if [ -t 0 ] && [ -n "$DOTFILES_LOG_SHELL_TO_DOCKER" ] && [ -z "$DOTFILES_HAS_SETUP_LOG_SHELL_TO_DOCKER" ]; then export DOTFILES_HAS_SETUP_LOG_SHELL_TO_DOCKER=1 _log_cmd_first=1 # Log the command via history to docker logs (PID 1's stdout) log_cmd() { local rc=$? # Capture IMMEDIATELY so we don't lose it if [ -n "$_log_cmd_first" ]; then unset _log_cmd_first echo "[$(date -Is)] [pid $$] entering new shell" > /proc/1/fd/1 return fi local cmd cmd=$(history -w /dev/stdout | tail -n1) echo "[$(date -Is)] [exit with $rc] [pid $$] [cwd $PWD] $cmd" > /proc/1/fd/1 } PROMPT_COMMAND="log_cmd${PROMPT_COMMAND:+; $PROMPT_COMMAND}" # Trap the exit to fire a separate shell exiting command trap 'echo "[$(date -Is)] [pid $$] exiting shell" > /proc/1/fd/1' EXIT fi # Secrets to not save to github if [[ -f "${cobconf}/secrets.sh" ]]; then source ${cobconf}/secrets.sh fi # Tools findcode() { # Finds string in all code files path or contents # egrep -I is don't match binary data fd . ~/Seafile/projects \ --type f \ --exclude '*{.min.js,.js.map,.css.map,.min.css,-lock.json,.fbx,.dll,.exe,.mp4,.png,.jpg,.jpeg,.kra,.pdn,.zip,.7z,.meta,.gif,.tif,.tiff,.ogg,.svg}' \ --exclude '{FORKED,reveal.js-dependencies}' \ | xargs -d '\n' egrep --color --line-number -I "$1" # Then just look at filenames (-H including hidden) fd -H "$1" ~/Seafile/projects \ --exclude '{FORKED,reveal.js-dependencies}' # Old iteration - find + xargs egrep # Prune sections will prune those subtrees from search but always evaluate to false # find ~/Seafile/projects \ # -type d \( \ # -name node_modules -o -name .git -o -name .pytest_cache -o -name dist -o \ # -name __pycache__ -o -name FORKED -o -name venv -o -name Library -o -name _nuxt -o \ # -name reveal.js-dependencies -o -name .nuxt -o -path dotfiles/deps \ # \) -prune -false -o \ # -type f -a -not \( \ # -name '*.min.js' -o -name '*.js.map' -o -name '*-lock.json' -o -name '*.fbx' -o \ # -name '*.dll' -o -name '*.exe' -o -name '*.mp4' -o -name '*.png' -o -name '*.jpg' -o \ # -name '*.jpeg' -o -name '*.kra' -o -name '*.pdn' -o -name '*.zip' -o -name '*.7z' -o \ # -name '*.meta' -o -name '*.gif' -o -name '*.tif' -o -name '*.ogg' \ # \) | xargs -d '\n' egrep -n "$1" # Old iteration - grep # grep --exclude-dir={node_modules,.git,dist,FORKED,venv,Library,_nuxt} --exclude={*.min.js,*.js.map,*-lock.json,*.fbx} -RnI ~/Seafile/projects -e "$1" } findnotes() { grep --include={*.md,*.csv,*.pdf} -RnI ~/Seafile/notes -e "$1" } cdp() { # Opens a project in the current terminal if [[ -d "${HOME}/Seafile/projects/${1}" ]]; then local PRJ_PATH="${HOME}/Seafile/projects/${1}" elif [[ -d "~/Seafile/projects/COMMISIONED/${1}" ]]; then local PRJ_PATH="${HOME}/Seafile/projects/COMMISIONED/${1}" elif [[ -d "~/Seafile/projects/FORKED/${1}" ]]; then echo "Project was a fork" local PRJ_PATH="${HOME}/Seafile/projects/FORKED/${1}" else echo "No project '${1}' found in ~/Seafile/projects folders" return fi # Got a project path, but does it have a repo/ or repository/ if [[ -d "${PRJ_PATH}/repo" ]]; then local PRJ_PATH="${PRJ_PATH}/repo" elif [[ -d "${PRJ_PATH}/repository" ]]; then local PRJ_PATH="${PRJ_PATH}/repository" fi # Finally, cd and try to subl the project file if there is one cd ${PRJ_PATH} # local PRJ_FILE=$(find *.sublime-project) # if [[ ! -z "${PRJ_FILE}" ]]; then # subl ${PRJ_FILE} # else # subl . # fi } # Tiny replacement for *fetch sysinfo() { echo "Host: $(hostname)" echo "Distro: $(. /etc/os-release && echo "$PRETTY_NAME")" echo "OS: $(uname -sr)" echo "Uptime: $(uptime -p)" echo "CPU: $(awk -F: '/model name/ {print $2; exit}' /proc/cpuinfo | sed 's/^ //')" echo "Cores: $(nproc)" echo "RAM: $(free -h | awk '/^Mem:/ {print $3 " / " $2}')" echo "Disk: $(df -h / | awk 'NR==2 {print $3 " / " $2}')" } } # end init() init unset init