# # $HOME/.bashrc # # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # for examples # Copied from .profile to do minor initialization for non-interactive non-login-shells umask 077 PATH="$HOME"/bin:"$HOME"/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # Make `ssh host date` to display in 24-hour format LANG=C # If not running interactively, don't do anything case $- in *i*) ;; *) return ;; esac # Stop if non-interactive shell [ -z "$PS1" ] && return . "$HOME"/.shellrc if [ "$HISTFILE" = "$HOME/.bash_history" ]; then # This is the default value set by interactive bash # when the global value was unset. Unset it here too. unset HISTFILE fi # 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 # append to the history file, don't overwrite it shopt -s histappend [ "`type -t ls`" = alias ] && unalias ls [ "`type -t ll`" = alias ] && unalias ll back() { cd - "$@"; } functions() { typeset -f "$@"; } j() { jobs; } if [ -z "$BASH_COMPLETION_COMPAT_DIR" ]; then if [ -d /usr/share/bash-completion -a -r /usr/share/bash-completion/bash_completion ]; then _BASH_COMPLETIONS_DIR=/usr/share/bash-completion/completions . /usr/share/bash-completion/bash_completion elif [ -r /etc/bash_completion ]; then _BASH_COMPLETIONS_DIR=/etc/bash_completion.d . /etc/bash_completion elif [ -d /etc/bash_completion.d ]; then _BASH_COMPLETIONS_DIR=/etc/bash_completion.d for _compf in /etc/bash_completion.d/*; do . $_compf done elif [ -d /usr/local/etc/bash_completion.d ]; then _BASH_COMPLETIONS_DIR=/usr/local/etc/bash_completion.d for _compf in /usr/local/etc/bash_completion.d/*; do . $_compf done else echo "Unknown OS type, cannot source bash_completion" >&2 fi fi has_completion() { [ -n "$_BASH_COMPLETIONS_DIR" -a -d "$_BASH_COMPLETIONS_DIR" -a -r "$_BASH_COMPLETIONS_DIR/$1" ] || complete -p $1 >/dev/null 2>&1 } for cmd in builtin cgmem_nice command dbus-launch exec \ killall man nice nohup pidof pidOf KillAll pgrep pkill psg pswg \ run-hosts su sudo time whence whereis which xargs; do ! has_completion $cmd && complete -o default -A command $cmd done for cmd in dig host mtr nslookup nc netcat nmap p ping ping6 \ ssh2 s2 socat telnet t tt \ tcptraceroute tcptraceroute6 tracert tracert6 traceroute traceroute6 \ whois wd wget wget-download wget-m wget-wrapper ww; do ! has_completion $cmd && complete -A hostname $cmd done for cmd in distribute ftp lftp r rsync \ s scp ssh smbclient tcpdump tshark wireshark; do ! has_completion $cmd && complete -o default -A hostname $cmd done for cmd in bg fg jobs; do ! has_completion $cmd && complete -A job $cmd done complete -A job j wait for cmd in unset; do ! has_completion $cmd && complete -A function -A variable $cmd done if [ -d "$HOME"/.bash_completion.d ]; then for _compf in "$HOME"/.bash_completion.d/*; do . $_compf done fi delegate_completion() { local prog programs prog=$1 ! has_completion $prog && return shift programs="$@" eval "_${prog}_completion_loader() { _completion_loader $prog if [ x"$DELEGATE_NOSPACE" = x1 ]; then complete -o nospace -F _$prog $programs else complete -F _$prog $programs fi unset _${prog}_completion_loader return 124 }" complete -F _${prog}_completion_loader $programs } delegate_completion make m delegate_completion ping p delegate_completion python python2.7 python3.4 python3.5 python3.6 python3.7 python3.8 python3.9 python3.10 python3.11 DELEGATE_NOSPACE=1 delegate_completion rsync r rsync_cgmn rsync_cgmn_recode rsync_cgmn_recode2 delegate_completion ssh s delegate_completion wget wget-m wget-wrapper ww unset _BASH_COMPLETIONS_DIR has_completion delegate_completion if [ -d "$HOME/lib/config" ]; then complete -W "`cd \"$HOME/lib/config\" && echo *`" include fi complete -W "`echo $BROWSER | sed 's/:/ /g'`" start-browser if [ "`type -t short_curdir`" != function -a \ -r "$HOME"/admin/prog/bash_prompt ]; then . "$HOME"/admin/prog/bash_prompt fi if type -p pip >/dev/null 2>&1 || type -p pip3 >/dev/null 2>&1; then _pip_completion_loader() { eval "`pip completion --bash`" complete -F _pip_completion pip pip2 pip2.7 pip3 pip3.4 pip3.5 pip3.6 pip3.7 pip3.8 pip3.9 pip3.10 pip3.11 unset _pip_completion_loader return 124 } complete -F _pip_completion_loader pip pip2 pip2.7 pip3 pip3.4 pip3.5 pip3.6 pip3.7 pip3.8 pip3.9 pip3.10 pip3.11 fi #if which pyenv >/dev/null 2>&1; then # eval "`pyenv init -`" # eval "`pyenv virtualenv-init -`" #fi . virtualenvwrapper_lazy.sh 2>/dev/null if [ -n "$VIRTUAL_ENV" ] && ! type deactivate >/dev/null 2>&1; then . "$VIRTUAL_ENV/bin/activate" fi # Clean up python virtual environment on exit # See https://virtualenvwrapper.readthedocs.io/en/latest/tips.html#clean-up-environments-on-exit trap '[ "$VIRTUAL_ENV" ] && deactivate' EXIT if test -x /usr/bin/git >/dev/null 2>&1; then # chdir to a directory cdgitpath() { if [ $# -ne 1 ]; then echo "Usage: cdgitpath path_key" >&2 return 1 fi path_key="$1" if [ -z "$path_key" ]; then echo "Usage: cdgitpath path_key" >&2 return 1 fi path_url="`git config --get --path $path_key`" if echo "$path_url" | grep -q '^file:/'; then path_url="`echo \"$path_url\" | sed 's@^file:/\+@/@'`" fi cd "$path_url" } # chdir to a remote's directory (if the remote is on the local FS) cdremote() { if [ $# -gt 1 ]; then echo "Usage: cdremote [remote_name]" >&2 return 1 fi if [ -z "$1" ]; then branch="`git rev-parse --abbrev-ref HEAD`" remote="`git config --get branch.$branch.remote`" else remote="$1" fi if [ -n "$remote" ] && git config --get remote.$remote.url | grep -q '^\(file:/\|/\|\.\./\)'; then # (file:/ or / or ../ at the beginning) cdgitpath remote.$remote.url return fi if [ -n "$1" ]; then echo "Cannot find directory for remote $1" >&2 echo "Usage: cdremote [remote_name]" >&2 return 1 fi _list_remotes '^\(file:/\|/\|\.\./\)' # (file:/ or / or ../ at the beginning) if [ ${#GIT_REMOTES[*]} -eq 1 ]; then remote=${GIT_REMOTES[0]} unset GIT_REMOTES cdgitpath remote.$remote.url else unset GIT_REMOTES echo "Cannot find directory for any remote" >&2 echo "Usage: cdremote [remote_name]" >&2 return 1 fi } # completion for aliases in global .gitconfig # fixup rbi rbia rbiap rbip - do refs name completion _git_fixup() { __gitcomp_nl "$(__git_refs)" ; } _git_rbi() { __gitcomp_nl "$(__git_refs)" ; } _git_rbia() { __gitcomp_nl "$(__git_refs)" ; } _git_rbiap() { __gitcomp_nl "$(__git_refs)" ; } _git_rbip() { __gitcomp_nl "$(__git_refs)" ; } # # push-to-all-remotes - do branch name completion _git_push_to_all_remotes() { __gitcomp_nl "$(__git_heads)" ; } _cdgitpath_complete() { local cur="${COMP_WORDS[COMP_CWORD]}" COMPREPLY=(`compgen -W "$(__git_config_get_set_variables)" -- "$cur"`) } _git_open() { _cdgitpath_complete } complete -F _cdgitpath_complete cdgitpath git-open # list remotes with URLs matching a regexp _list_remotes() { if [ $# -ne 1 ]; then echo "Usage: _list_remotes remote_regexp" >&2 return 1 fi declare -ag GIT_REMOTES=() local remote for remote in `git remote`; do if git config --get remote.$remote.url | grep -q "$1"; then GIT_REMOTES+=($remote) fi done } # completion for cdremote and git-open-remote - list remotes with a pattern _list_remotes_completion() { local cur="${COMP_WORDS[COMP_CWORD]}" _list_remotes "$1" COMPREPLY=(`compgen -W "${GIT_REMOTES[*]}" -- "$cur"`) unset GIT_REMOTES } # completion for cdremote - list remotes with directories as URLs _cdremote_complete() { _list_remotes_completion '^\(file:/\|/\|\.\./\)' # (file:/ or / or ../ at the beginning) if [ ${#COMPREPLY[*]} -eq 0 ]; then _list_remotes_completion . fi } complete -F _cdremote_complete cdremote # completion for git-open-remote - list remotes with http(s) URLs _git_open_remote() { _list_remotes_completion '^http\(s\)\?://' if [ ${#COMPREPLY[*]} -eq 0 ]; then _list_remotes_completion . fi } complete -F _git_open_remote git-open-remote fi if [ "$SHLVL" -eq 1 -a "`type -t X`" = function ] && which startx >/dev/null 2>&1; then # From https://stackoverflow.com/a/18839557 copy_function() { test -n "$(declare -f "$1")" || return eval "${_/$1/$2}" } rename_function() { copy_function "$@" || return unset -f "$1" } rename_function X _non_bash_X X() { history -a; _non_bash_X; history -r; } fi