aboutsummaryrefslogtreecommitdiff
path: root/zsh/zshrc
blob: 22fe481891b2067cc82dba49fdf08adc54e26108 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# Use emacs keybindings for shell.
bindkey -e

# Use vi as my text editor.
export EDITOR=vi

# Keep plenty of history.
HISTFILE=~/.zsh_history
HISTSIZE=1000000
SAVEHIST=1000000

# Don't worry too much about sending me long lists.
LISTMAX=500

# Append history lines directly.
setopt appendhistory

# Push a directory onto the stack whenever changed.
setopt autopushd 

# Allow completing options for aliases.
setopt completealiases

# Use special globbing features.
setopt extendedglob

# Save a lot more information to the history file.
setopt extendedhistory

# Ignore duplicate history.
setopt histignorealldups

# Ignore duplicate directories on the stack.
setopt pushdignoredups

# Always retrieve history from file, not memory.
setopt sharehistory

# Put completions above my prompt, not below it.
unsetopt alwayslastprompt

# Don't beep at me.
unsetopt beep

# Don't use flow control.
unsetopt flowcontrol

# Don't put filetype suffices in lists.
unsetopt listtypes

# Use zsh's built-in autocompletion.
autoload -Uz zutil
autoload -Uz compinit
autoload -Uz complist
compinit

# Make completion expand and correct helpfully.
zstyle ':completion:*' completer _expand _complete _correct _approximate

# SSH agent setup, if available.
[[ -e ~/.ssh/agent ]] && . ~/.ssh/agent

# Sensible prompts, we'll work out colours shortly.
PS1="[%n@%m:%~]%(!.#.$)"
PS2="..."

# Start stacking up options for ls and grep.
LS_OPTS=
GREP_OPTS=

# If we're using an xterm, force 256 colors.
if [[ $TERM == xterm* ]]; then
   TERM=xterm-256color
fi

# If we have a color terminal, do colory things.
if [[ $TERM == *color ]]; then

    # Change prompt color depending on whether I'm root or not.
    PS1="%{%(!.%F{red}.%F{green})%B%}${PS1}%{%b%f%}"

    # Get colouring for ls and grep if available.
    hash dircolors &>/dev/null && eval "$(dircolors -b)"
    if ls --help | grep -- --color &>/dev/null; then
        LS_OPTS="${LS_OPTS} --color=auto"
    fi
    if grep --help | grep -- --color &>/dev/null; then
       GREP_OPTS="${GREP_OPTS} --color=auto"
    fi

    # Use same colors for completion.
    zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
    zstyle ':completion:*' list-colors ''
fi

# Set up more options for grep; exclude version control files.
if grep --help | grep -- --exclude &>/dev/null; then
    for PATTERN in .git .gitignore .gitmodules; do
        GREP_OPTS="${GREP_OPTS} --exclude=${PATTERN}"
    done
fi
if grep --help | grep -- --exclude-dir &>/dev/null; then
    for PATTERN in .cvs .git .hg .svn; do
        GREP_OPTS="${GREP_OPTS} --exclude-dir=${PATTERN}"
    done
fi

# Alias ls and grep with the options we've collected.
alias ls="ls ${LS_OPTS}"
alias grep="grep ${GREP_OPTS}"

# Protect innocent MySQL databases from my stupidity.
alias mysql='mysql --safe-updates'

# I always do this, and I hate slow train.
alias sl='ls'

# Set window titles in various terminals. Doesn't work yet.
case $TERM in
    screen*)
        precmd () {print -Pn "\ek%m\e\\"}
        ;;
    xterm*)
        precmd () {print -Pn "\e]0;%m\a"}
        ;;
esac

# Add space suffix to the prompt now that we're done hacking it up.
PS1="${PS1} "