dotfiles/bashrc
Fernando Schauenburg 807d172521 [bash] fix inconsistent PATH and MANPATH
These two major problems existed:

 * PATH got multiple instances of the same entries for nested shells.
 * MANPATH got set, but ignoring the results of the system's `manpath`
   command. This caused some man pages to be missing, because the
   presence of MANPATH variable prevents man from looking up man pages
   at the paths returned from `manpath`.

Both issues are now fixed :)

BONUS: we abstract the last absolute locations we had in terms of where
Homebrew is installed. For Linux, Cygwin, or Mac without Homebrew we
assume all our custom tools will be installed under /usr/local. It is
easy enough to change that in case we have a different directory in a
specific system.
2018-04-15 20:01:43 +02:00

206 lines
8 KiB
Bash

# Environment variables
export EDITOR="vim"
export HISTSIZE="65536"
export HISTFILESIZE="$HISTSIZE"
export HISTCONTROL=ignoredups:ignorespace
export LANG="en_US.UTF-8"
export LANGUAGE="en_US"
export LC_CTYPE="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
export LESS="-i -j.49 -M -R -z-2"
export PAGER=less
export DOTFILES="$HOME/.dotfiles"
# Find out where Homebrew performs installations. If Homebrew is not installed
# (e.g. running on Linux), assume /usr/local for our installations.
if command -v brew &>/dev/null; then
BREW_PREFIX=$(brew --prefix)
else
BREW_PREFIX=/usr/local
fi
# Prevent path_helper from messing with the PATH when starting tmux.
# See: https://superuser.com/a/583502
if [ -f /etc/profile ]; then
export PATH=""
source /etc/profile
fi
# Add custom bin dirs to PATH if they exist and are not already in PATH.
for p in $BREW_PREFIX/opt/coreutils/libexec/gnubin $DOTFILES/bin $HOME/bin; do
if [ -d "$p" ] && [[ ":$PATH:" != *":$p:"* ]]; then
PATH="$p:$PATH"
fi
done
# If MANPATH is not yet defined, initialize it with the contents of `manpath`.
if [ -z ${MANPATH+x} ]; then
export MANPATH=$(manpath)
fi
# Prepend custom man directories to MANPATH if they exist, so that we get
# correct man page entries when multiple versions of a command are available.
for p in $BREW_PREFIX/share/man $BREW_PREFIX/opt/coreutils/libexec/gnuman; do
if [ -d "$p" ] && [[ ":$MANPATH:" != *":$p:"* ]]; then
MANPATH="$p:$MANPATH"
fi
done
# Useful aliases
if ls --group-directories-first >/dev/null 2>&1
then
ls_dir_group="--group-directories-first" # GNU version
else
ls_dir_group="" # BSD version, doesn't support directory grouping
fi
alias g="git"
alias ls="ls -hF --color=auto ${ls_dir_group}"
alias la="ls -a"
alias ll="ls -l"
alias lla="ls -la"
alias grep="grep --color=auto";
alias egrep="egrep --color=auto";
alias fgrep="fgrep --color=auto";
alias v="vim"
alias vi="vim"
alias path='echo $PATH | tr -s ":" "\n"'
alias mpath='echo $MANPATH | tr -s ":" "\n"'
# Shell options
for option in cdspell checkwinsize globstar histappend nocaseglob
do
shopt -s "$option" 2> /dev/null
done
# Add git command completion
source "$DOTFILES/resources/git-completion.bash"
# combined mkdir and cd
mkcd() { mkdir -p -- "$1" && cd -P -- "$1"; }
# Change a color in the terminal's palette
change_palette() (
IFS="" # $* should be joined without spaces
if [ -n "$TMUX" ]; then
# http://permalink.gmane.org/gmane.comp.terminal-emulators.tmux.user/1324
echo -ne "\033Ptmux;\033\033]$*\007\033\\"
elif [ "${TERM%%-*}" = "screen" ]; then
echo -ne "\033P\033]$*\007\033\\"
else
echo -ne "\033]$*\033\\"
fi
)
# Solarize the shell by adjusting:
# - the terminal's color palette
# - the ANSI color palette
# - prompt string
# - `ls` command output colors
do_solarize_shell() {
[ -z "$BACKGROUND" ] && export BACKGROUND="dark"
if [ "$TERM_PROGRAM" = "Apple_Terminal" ]; then
echo "tell application \"Terminal\" to set current settings of selected tab of front window to settings set \"solarized-$BACKGROUND\"" | osascript
else
# Solarized colors from http://ethanschoonover.com/solarized
base03=002b36 base02=073642 base01=586e75 base00=657b83
base0=839496 base1=93a1a1 base2=eee8d5 base3=fdf6e3
red=dc322f orange=cb4b16 yellow=b58900 green=859900
cyan=2aa198 blue=268bd2 violet=6c71c4 magenta=d33682
# Customize the terminal's color palette & determine selector for
# changing the ANSI color palette below
cursor_color=$red
if [ "$BACKGROUND" = "dark" ]; then
bg_color=$base03
fg_color=$base1
else
bg_color=$base2
fg_color=$base02
fi
if [ -n "$ITERM_SESSION_ID" ]; then
change_palette Pg $fg_color # Foreground
change_palette Pi $fg_color # Bold
change_palette Ph $bg_color # Background
change_palette Pj $base01 # Selection
change_palette Pk $base2 # Selected text
change_palette Pl $cursor_color # Cursor
change_palette Pm $cursor_color # Cursor text
selector="P%s" a=a b=b c=c d=d e=e f=f
else
change_palette "10;#" $fg_color # Foreground
change_palette "11;#" $bg_color # Background
change_palette "12;#" $cursor_color # Cursor
selector="4;%d;#" a=10 b=11 c=12 d=13 e=14 f=15
fi
# Change the ANSI color palette
# iTerm2: Pnrrggbb (http://iterm2.com/documentation-escape-codes.html)
# other terminals: 4;n;#rrggbb
# Pn or 4;n;# n rrggbb ANSI name
change_palette $(printf $selector 0) $base02 # 0;30 black
change_palette $(printf $selector 1) $red # 0;31 red
change_palette $(printf $selector 2) $green # 0;32 green
change_palette $(printf $selector 3) $yellow # 0;33 yellow
change_palette $(printf $selector 4) $blue # 0;34 blue
change_palette $(printf $selector 5) $magenta # 0;35 magenta
change_palette $(printf $selector 6) $cyan # 0;36 cyan
change_palette $(printf $selector 7) $base2 # 0;37 white
change_palette $(printf $selector 8) $base03 # 1;30 bold black
change_palette $(printf $selector 9) $orange # 1;31 bold red
change_palette $(printf $selector $a) $base01 # 1;32 bold green
change_palette $(printf $selector $b) $base00 # 1;33 bold yellow
change_palette $(printf $selector $c) $base0 # 1;34 bold blue
change_palette $(printf $selector $d) $violet # 1;35 bold magenta
change_palette $(printf $selector $e) $base1 # 1;36 bold cyan
change_palette $(printf $selector $f) $base3 # 1;37 bold white
fi
# Customize the prompt
if [ $(id -u) -eq 0 ]; then
__c="1;31" # orange user name for root
elif [ -n "$SSH_CLIENT" ]; then
__c="0;33" # yellow user name when connected via SSH
else
__c="0;36" # default user name color is cyan
fi
export PS1="[\[\033[${__c}m\]\u@\h \[\033[0;34m\]\w\[\033[0m\]]\n\$ "
export PS2=". "
# Customize colors for `ls` command
ls_colors="$HOME/.dircolors/solarized-$BACKGROUND"
if type dircolors &> /dev/null && [ -f $ls_colors ]; then
eval "$(dircolors $ls_colors)"
fi
}
# Quickly change between light and dark background
light() { export BACKGROUND="light" && do_solarize_shell; }
dark() { export BACKGROUND="dark" && do_solarize_shell; }
# Print the solarized palette (for testing)
solarized() {
printf "\033[%sm%-7s %-s %2d\033[0m " "1;30" Base03 "1;30" 8
printf "\033[%sm%-7s %-s %2d\033[0m\n" "0;31" Red "0;31" 1
printf "\033[%sm%-7s %-s %2d\033[0m " "0;30" Base02 "0;30" 0
printf "\033[%sm%-7s %-s %2d\033[0m\n" "1;31" Orange "1;31" 9
printf "\033[%sm%-7s %-s %2d\033[0m " "1;32" Base01 "1;32" 10
printf "\033[%sm%-7s %-s %2d\033[0m\n" "0;33" Yellow "0;33" 3
printf "\033[%sm%-7s %-s %2d\033[0m " "1;33" Base00 "1;33" 11
printf "\033[%sm%-7s %-s %2d\033[0m\n" "0;32" Green "0;32" 2
printf "\033[%sm%-7s %-s %2d\033[0m " "1;34" Base0 "1;34" 12
printf "\033[%sm%-7s %-s %2d\033[0m\n" "0;36" Cyan "0;36" 6
printf "\033[%sm%-7s %-s %2d\033[0m " "1;36" Base1 "1;36" 14
printf "\033[%sm%-7s %-s %2d\033[0m\n" "0;34" Blue "0;34" 4
printf "\033[%sm%-7s %-s %2d\033[0m " "0;37" Base2 "0;37" 7
printf "\033[%sm%-7s %-s %2d\033[0m\n" "1;35" Violet "1;35" 13
printf "\033[%sm%-7s %-s %2d\033[0m " "1;37" Base3 "1;37" 15
printf "\033[%sm%-7s %-s %2d\033[0m\n" "0;35" Magenta "0;35" 5
}
# Solarize the shell only if running interactively (makes FTP clients happy)
[[ "$-" == *i* ]] && do_solarize_shell
# ~/.bashrc.local can be used for local settings (not in repository)
[ -f ~/.bashrc.local ] && . ~/.bashrc.local