From 6211a84324e7471aad4c7389af5a4d1b9a871276 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Sep 2014 18:24:34 -0400 Subject: [PATCH] Improve bash config --- bash/aliases | 86 ++++++++++++++++++++++++++++++++ bash/config | 36 ++++++++++++++ bash/path | 35 +++++++++++++ bash/prompt | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++ bash_profile | 18 +++++++ bashrc | 4 +- curlrc | 24 +++++++++ inputrc | 19 +++++++ 8 files changed, 355 insertions(+), 3 deletions(-) create mode 100644 bash/aliases create mode 100644 bash/config create mode 100644 bash/path create mode 100644 bash/prompt create mode 100644 bash_profile create mode 100644 curlrc create mode 100644 inputrc diff --git a/bash/aliases b/bash/aliases new file mode 100644 index 00000000..de25ed09 --- /dev/null +++ b/bash/aliases @@ -0,0 +1,86 @@ + +alias q='exit' +alias clr='clear' +alias catn='cat -n' # cat + line numbers + +alias -- -="cd -" + +# Command fixes +alias ln="${aliases[ln]:-ln} -v" # verbose ln +alias wget='wget -c' # Resume download if possible +alias rename='noglob rename' + +# Shortcut for git +g() { + if [[ $# -gt 0 ]]; then + ${aliases[git]:-git} $@ + else + ${aliases[git]:-git} status --short + fi +} + +alias git='hub' +alias gi='git init' +alias ga='git add' +alias gap='git add --patch' +alias gc='git commit --verbose' +alias gcm='git commit --verbose -m' +alias gco='git checkout' +alias gcl='git clone' +alias gp='git push' +alias gpl='git pull' +alias gb='git branch' +alias gt='git tag' +alias gs='git status' +alias gr='git reset "HEAD^"' +alias gd='git diff' + +if is-callable 'tmux'; then + alias t='tmux new -s x || tmux attach -t x' + alias tl='tmux list-sessions' + alias ts='tmux switch' + + tmux-send() { + tmux send-keys -s "x" $1 Enter + } +fi + +# OS-specific aliases +if [[ "$OSTYPE" == darwin* ]]; then + alias codekit='open -a CodeKit' + alias b='brew' + alias v='vim' + alias e="emacsclient -n" # Emacs server must be running! +else + alias ipt='sudo iptables' +fi + +# transmission-remote +if is-callable 'transmission-remote'; then + alias bt="transmission-remote server" + alias btl="bt -l" +fi + +alias va='vagrant' +alias rk='rake' +alias rkg='rake -g' + +# Interpreters +alias rb='ruby' +alias rbe='rbenv' +alias be='bundle exec' +alias spec='rspec' + +alias py='python' +alias pye='pyenv' +[ -e /Applications/love.app ] && alias love="/Applications/love.app/Contents/MacOS/love" + +# Bash-only aliases +if [ -z "$ZSH_VERSION" ]; then + # Allow aliases to be with sudo + alias sudo='sudo ' + + alias ls='ls -G' + alias l="ls -o" + alias la="ls -AGFoh" +fi diff --git a/bash/config b/bash/config new file mode 100644 index 00000000..3c6a6bac --- /dev/null +++ b/bash/config @@ -0,0 +1,36 @@ +#!/bin/bash + +# Case-insensitive globbing (used in pathname expansion) +shopt -s nocaseglob +# Append to the Bash history file, rather than overwriting it +shopt -s histappend +# Autocorrect typos in path names when using `cd` +shopt -s cdspell +# Check the window size after each command and, if necessary, update the values +# of LINES and COLUMNS. +shopt -s checkwinsize + +# Enable bash 4 options +shopt -s autocd 2>/dev/null +shopt -s globstar 2>/dev/null + + +#### Completion ############################################# + +# Add tab completion for many Bash commands +if is-callable "brew" && [ -f "$(brew --prefix)/etc/bash_completion" ]; then + source "$(brew --prefix)/etc/bash_completion"; +elif [ -f /etc/bash_completion ]; then + source /etc/bash_completion; +fi + +# Enable tab completion for `g` by marking it as an alias for `git` +if type _git &> /dev/null && [ -f /usr/local/etc/bash_completion.d/git-completion.bash ]; then + complete -o default -o nospace -F _git g; +fi + +# Add tab completion for SSH hostnames based on ~/.ssh/config, ignoring wildcards +[ -e "$HOME/.ssh/config" ] && complete -o "default" -o "nospace" -W "$(grep "^Host" ~/.ssh/config | grep -v "[?*]" | cut -d " " -f2 | tr ' ' '\n')" scp sftp ssh; + +# Add `killall` tab completion for common apps +complete -o "nospace" -W "Contacts Calendar Dock Finder Mail Safari iTunes SystemUIServer Terminal Tweetbot" killall diff --git a/bash/path b/bash/path new file mode 100644 index 00000000..3f3e4ae4 --- /dev/null +++ b/bash/path @@ -0,0 +1,35 @@ +#!/bin/bash + +declare -a paths_prepend=( + "/usr/local/bin" + "/usr/local/sbin" + "$HOME/.dotfiles/bin" + "$HOME/.rbenv/shims" + "$HOME/.pyenv/shims" + "$HOME/.rbenv/bin" + "$HOME/.pyenv/bin" + "$(brew --prefix coreutils)/libexec/gnubin" +) + +declare -a paths_append=( + # ... +) + +# Prepend directories to PATH +for index in ${!dirs_to_prepend[*]}; do + if [ -d ${dirs_to_prepend[$index]} ]; then + # If these directories exist, then prepend them to existing PATH + PATH="${dirs_to_prepend[$index]}:$PATH" + fi +done + +# Append directories to PATH +for index in ${!dirs_to_append[*]}; do + if [ -d ${dirs_to_append[$index]} ]; then + # If these bins exist, then append them to existing PATH + PATH="$PATH:${dirs_to_append[$index]}" + fi +done + +unset paths_prepend paths_append +export PATH diff --git a/bash/prompt b/bash/prompt new file mode 100644 index 00000000..e08848a9 --- /dev/null +++ b/bash/prompt @@ -0,0 +1,136 @@ +#!/bin/bash + +# inspired from: https://raw.githubusercontent.com/necolas/dotfiles/master/shell/bash_prompt + +prompt_git() { + local s="" + local branchName="" + + # check if the current directory is in a git repository + if [ $(git rev-parse --is-inside-work-tree &>/dev/null; printf "%s" $?) == 0 ]; then + + # check if the current directory is in .git before running git checks + if [ "$(git rev-parse --is-inside-git-dir 2> /dev/null)" == "false" ]; then + + # ensure index is up to date + git update-index --really-refresh -q &>/dev/null + + # check for uncommitted changes in the index + if ! $(git diff --quiet --ignore-submodules --cached); then + s="$s+"; + fi + + # check for unstaged changes + if ! $(git diff-files --quiet --ignore-submodules --); then + s="$s!"; + fi + + # check for untracked files + if [ -n "$(git ls-files --others --exclude-standard)" ]; then + s="$s?"; + fi + + # check for stashed files + if $(git rev-parse --verify refs/stash &>/dev/null); then + s="$s$"; + fi + + fi + + # get the short symbolic ref + # if HEAD isn't a symbolic ref, get the short SHA + # otherwise, just give up + branchName="$(git symbolic-ref --quiet --short HEAD 2> /dev/null || \ + git rev-parse --short HEAD 2> /dev/null || \ + printf "(unknown)")" + + [ -n "$s" ] && s=" [$s]" + + printf "%s" "$1$branchName$s" + else + return + fi +} + +set_prompts() { + local black="" + local blue="" + local bold="" + local cyan="" + local green="" + local orange="" + local purple="" + local red="" + local reset="" + local white="" + local yellow="" + + local hostStyle="" + local userStyle="" + + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + tput sgr0 # reset colors + + bold=$(tput bold) + reset=$(tput sgr0) + + # Solarized colors + # (https://github.com/altercation/solarized/tree/master/iterm2-colors-solarized#the-values) + black=$(tput setaf 0) + blue=$(tput setaf 33) + cyan=$(tput setaf 37) + green=$(tput setaf 64) + orange=$(tput setaf 166) + purple=$(tput setaf 125) + red=$(tput setaf 124) + white=$(tput setaf 15) + yellow=$(tput setaf 136) + else + bold="" + reset="\e[0m" + + black="\e[1;30m" + blue="\e[1;34m" + cyan="\e[1;36m" + green="\e[1;32m" + orange="\e[1;33m" + purple="\e[1;35m" + red="\e[1;31m" + white="\e[1;37m" + yellow="\e[1;33m" + fi + + # build the prompt + + # logged in as root + if [[ "$USER" == "root" ]]; then + userStyle="\[$bold$red\]" + else + userStyle="\[$orange\]" + fi + + # connected via ssh + if [[ "$SSH_TTY" ]]; then + hostStyle="\[$bold$red\]" + else + hostStyle="\[$yellow\]" + fi + + # set the terminal title to the current working directory + PS1="\[\033]0;\w\007\]" + + PS1+="\n" # newline + PS1+="\[$userStyle\]\u" # username + PS1+="\[$reset$white\]@" + PS1+="\[$hostStyle\]\h" # host + PS1+="\[$reset$white\]: " + PS1+="\[$green\]\w" # working directory + PS1+="\$(prompt_git \"$white on $cyan\")" # git repository details + PS1+="\n" + PS1+="\[$reset$white\]\$ \[$reset\]" # $ (and reset color) + + export PS1 +} + +set_prompts +unset set_prompts diff --git a/bash_profile b/bash_profile new file mode 100644 index 00000000..89c2a3ad --- /dev/null +++ b/bash_profile @@ -0,0 +1,18 @@ +function is-callable { + which "$1" > /dev/null +} + +# set 256 color profile where possible +if [[ $COLORTERM == gnome-* && $TERM == xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then + export TERM=gnome-256color +elif infocmp xterm-256color >/dev/null 2>&1; then + export TERM=xterm-256color +fi + + +#### Other Settings ######################################### + +source ~/.bash/path +source ~/.bash/aliases +source ~/.bash/config +source ~/.bash/prompt diff --git a/bashrc b/bashrc index 5eb14fb5..12570026 100644 --- a/bashrc +++ b/bashrc @@ -1,3 +1 @@ -# Source component rcfiles -# source ~/.zsh/functions -# source ~/.zsh/aliases +[ -n "$PS1" ] && source ~/.bash_profile; diff --git a/curlrc b/curlrc new file mode 100644 index 00000000..35bbd3af --- /dev/null +++ b/curlrc @@ -0,0 +1,24 @@ +# cURL default configuration file +# http://curl.haxx.se/docs/manpage.html + +# Limit the time (in seconds) the connection to the server is allowed to take +connect-timeout = 30 + +# Follow HTTP redirects +location + +# Limit the time (in seconds) the whole operation is allowed to take +# (prevents cURL from hanging due to slow networks or links going down) +max-time = 300 + +# When following a redirect, automatically set the previous URL as referer +referer = ";auto" + +# Show error messages +show-error + +# Do not show the progress meter +silent + +# Send a fake UA string for the HTTP servers that sniff it +user-agent = "Mozilla/5.0 Gecko" diff --git a/inputrc b/inputrc new file mode 100644 index 00000000..0cbbd65e --- /dev/null +++ b/inputrc @@ -0,0 +1,19 @@ +#!/bin/bash + +# inputrc + +# Use case-insensitive TAB autocompletion +set completion-ignore-case on + +# Auto list tab completions (use instead of TAB-cycling) +set show-all-if-ambiguous on + +# Make TAB cycle through possible completions +# "\t": menu-complete +# Make SHIFT-TAB reverse cycle through possible completions +# "\e[Z": "\e-1\C-i" + +# Use the string that has already been typed as the prefix for searching +# through commands (i.e. more intelligent Up/Down-arrow behavior) +"\e[B": history-search-forward +"\e[A": history-search-backward