]> gitweb @ CieloNegro.org - sugar.git/blob - dot-files/_zshrc
Auto commit by The Sugar System.
[sugar.git] / dot-files / _zshrc
1 #!/bin/zsh
2 bindkey -e
3
4 stty -ixon ixany
5 #stty erase '^H'
6
7 # The following lines were added by compinstall
8 zstyle :compinstall filename "$HOME/.zshrc"
9
10 autoload -U compinit
11 compinit
12 # End of lines added by compinstall
13
14 zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z} r:|[/]=* r:|=*'
15 zstyle ':completion:*' use-cache true
16
17 if [[ -d "$HOME/.zfunc" ]]; then
18     fpath=($HOME/.zfunc $fpath)
19     autoload -U ~/.zfunc/*(:t)
20     compinit
21     function r() {
22         local f
23         f=(~/.zfunc/*(.))
24         unfunction $f:t 2> /dev/null
25         autoload -U $f:t
26     }
27 fi
28
29 if [[ -f "$HOME/.ssh/known_hosts" ]]; then
30     _cache_hosts=(`perl -ne  'if (/^([a-zA-Z0-9.-]+)/) { print "$1\n";}' ~/.ssh/known_hosts`)
31 fi
32
33 autoload -U colors
34 colors
35
36 setopt no_beep
37 setopt auto_cd
38 setopt auto_list
39 setopt auto_menu
40 setopt auto_name_dirs
41 setopt auto_param_keys
42 setopt auto_param_slash
43 setopt auto_remove_slash
44 setopt c_bases
45 setopt chase_links
46 setopt complete_aliases
47 setopt correct
48 setopt equals
49 setopt glob_complete
50 setopt prompt_bang
51 setopt prompt_percent
52 setopt prompt_subst
53 setopt pushd_ignore_dups
54 setopt pushd_to_home
55 setopt sh_file_expansion
56 setopt always_last_prompt
57 setopt extended_glob
58 setopt hist_ignore_all_dups
59 setopt hist_ignore_space
60 setopt inc_append_history
61 setopt share_history
62
63 function _we_are_in_gnu_screen () {
64     [[ -n "$WINDOW" ]]
65 }
66
67 function _we_are_in_ssh_session () {
68     [[ -n "$SSH_CONNECTION" ]]
69 }
70
71 function _we_are_in_emacs () {
72     [[ -n "$INSIDE_EMACS" ]]
73 }
74
75 _prompt_base='%B[%n@%m] %{%(?.$fg[green].$fg[red])%}%#%{$reset_color%}%b '
76 if ( _we_are_in_gnu_screen ); then
77     # GNU Screen has a capability to set its window title by "ESC k
78     # {string} ESC \". We want to reset the title to `_' to show we
79     # aren't running any command now.
80     PROMPT=$'%{\ek_\e\\%}'$_prompt_base
81 else
82     PROMPT=$_prompt_base
83 fi
84
85 autoload -U add-zsh-hook
86
87 function _gnu_screen_preexec() {
88     if { _we_are_in_gnu_screen } then
89         # Set the window title of GNU Screen.
90         local cmd=${1[(wr)^(*=*|sudo|nice|env|time|ssh|-*|[0-9]*)]}
91         printf "\ek$cmd\e\\"
92     fi
93 }
94 add-zsh-hook preexec _gnu_screen_preexec
95
96 function _dirinfo_precmd() {
97     local dirinfo="$(print_directory_info $(pwd))"
98
99     case $dirinfo in
100         "")
101             RPROMPT='%U%~%u';;
102         *)
103             RPROMPT="%U%~%u %U($dirinfo)%u";;
104     esac
105 }
106 add-zsh-hook precmd _dirinfo_precmd
107
108 function print_directory_info() {
109     local absdir=$1
110
111     if [[ -r $absdir/.git ]] then
112         # Git
113         git branch --no-color 2>/dev/null \
114             | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
115
116     elif [[ -r $absdir/.hg/branch ]] then
117         # Hg
118         local hgbranch=`cat $absdir/.hg/branch`
119         if [[ -e $absdir/.hg/unpushed ]] then
120             echo "*${hgbranch}*"
121         else
122             echo "$hgbranch"
123         fi
124
125     elif [[ -d $absdir/_darcs ]] then
126         # Darcs
127         basename $absdir
128
129     elif [[ -r $absdir/CVS/Repository ]] then
130         # CVS
131         cat $absdir/CVS/Repository \
132             | sed -e 's!\([^/]*\).*!\1!'
133
134     else
135         # Unknown.
136         if [[ $absdir = "/" ]] then
137             # This is the root directory so exit from the recursion.
138             echo
139         else
140             # Recurse to the parent dir.
141             print_directory_info $(dirname $absdir)
142         fi
143     fi
144 }
145
146 function nfgrep() {
147     fgrep --with-filename --line-number --context=1 --colour=always "$@" | $PAGER
148 }
149
150 function ppgrep() {
151     local -a percol_opts
152
153     if [[ $# -gt 0 ]]; then
154         percol_opts=("--query" "$1")
155     fi
156
157     ps aux | percol "${percol_opts[@]}" | awk '{ print $2 }'
158 }
159
160 function ppkill() {
161     local -a ppgrep_opts
162
163     if [[ $1 =~ "^[^-]" ]]; then
164         ppgrep_opts=("$1")
165         shift
166     fi
167
168     ppgrep "${ppgrep_opts[@]}" | xargs kill "$@"
169 }
170
171 function find_tac_command() {
172     if which gtac >&/dev/null; then
173         echo "gtac"
174     elif which tac >&/dev/null; then
175         echo "tac"
176     else
177         echo "tail -r"
178     fi
179 }
180
181 function percol_select_history() {
182     local -a tac_cmd
183     tac_cmd=($(find_tac_command))
184
185     local selected
186     selected=$("${tac_cmd[@]}" "$HISTFILE" | \
187         sed 's/^: [0-9]*:[0-9]*;//' | \
188         awk 'seen[$0] {next} {seen[$0]++; print}' | \
189         percol --match-method regex --query "$LBUFFER")
190
191     if [[ $? -eq 0 ]]; then
192         BUFFER="$selected"
193         CURSOR="$#BUFFER" # move cursor to the end of line
194         zle redisplay
195         #zle accept-line  # uncomment this to execute the selected one immediately.
196     else
197         zle redisplay
198     fi
199 }
200 if which percol >&/dev/null; then
201     zle -N percol_select_history
202     bindkey '^R' percol_select_history
203 fi
204
205 HISTFILE="$HOME/.zhistory"
206 HISTSIZE=6000000
207 SAVEHIST=6000000
208
209 # Select directories with z(1)
210 if [[ -r "$HOME/sandbox/_misc/z/z.sh" ]]; then
211     source "$HOME/sandbox/_misc/z/z.sh"
212
213     function percol_select_directory() {
214         local -a tac_cmd
215         tac_cmd=($(find_tac_command))
216
217         local selected
218         selected=$(_z -r 2>&1 | \
219             "${tac_cmd[@]}" | \
220             percol --query "$LBUFFER" | \
221             sed -r 's/[^[:space:]]+[[:space:]]+//')
222
223         if [[ $? -eq 0 ]]; then
224             cd "${selected}"
225             selected="" # Without this, zsh treats this variable as a
226                         # candidate for a "named directory".
227         fi
228
229         zle reset-prompt
230         return 0
231     }
232
233     if which percol >&/dev/null; then
234         zle -N percol_select_directory
235         bindkey '\C-xd' percol_select_directory
236     fi
237 fi
238
239 function lv() {
240     local -a lv_cmd
241
242     if whence -p lv >/dev/null; then
243         lv_cmd=("lv")
244     elif which less >&/dev/null; then
245         lv_cmd=("less")
246     elif which more >&/dev/null; then
247         lv_cmd=("more")
248     else
249         echo >&2 "$0: no pager commands are found"
250         return 1
251     fi
252
253     command "${lv_cmd[@]}" "$@"
254 }
255
256 alias -g L="| $PAGER"
257 alias -g G="| grep"
258 alias -g H="| head"
259 alias -g T="| tail"
260 alias -g X="| hexdump -C"
261
262 alias ..='cd ..'
263 alias cd..='cd ..'
264 alias p='pushd'
265 alias o='popd'
266 alias d='dirs'
267 alias df='df -h'
268 alias du='du -k'
269 alias ed='ed -p "ed> "'
270 alias man="LANG=C man"
271 alias mwget="wget --user-agent='Mozilla/1.4b'"
272 alias nc='nc -vv'
273 alias pkgsrc="pushd /usr/pkgsrc"
274 alias pstow="pushd /usr/local/stow"
275 alias w3m="w3m -O UTF-8"
276 alias w3mb="w3m -O UTF-8 -B"
277
278 alias aria-emacs="ssh -f -X admin@aria.cielonegro.org emacsclient -c"
279 alias pho-dev-boinc="ssh -f -X pho@pho.dev.office.ymir.co.jp env LANG=C /home/pho/var/BOINC/run_manager"
280
281 if [[ $(hostname) = "aria.cielonegro.org" ]]; then
282     alias unstuff='open -a StuffIt\ Expander.app'
283     alias pa='open -a NiseRingo.app'
284     alias heboris='open /Applications/HeborisUEMac/exe/Heboris\ OpenGL.app'
285     alias hengband='open ~/Applications/hengband*/Hengband*'
286
287 elif [[ $(hostname) = "yukari.cielonegro.org" ]]; then
288     function safari () {
289         local -a args
290         for arg in $@; do
291             args=(${args[@]} $(printf %q "$arg"))
292         done
293         ssh kurumi open -a Safari ${args[@]}
294     }
295     function mfirefox () {
296         local -a args
297         for arg in $@; do
298             args=(${args[@]} $(printf %q "$arg"))
299         done
300         ssh kurumi open -a Firefox ${args[@]}
301     }
302     function mdock () {
303         ssh kurumi open -a Dock
304     }
305 fi
306
307 if [[ $(uname) = "Darwin" ]]; then
308     alias safari="open -a Safari"
309
310     alias ldd="otool -L"
311
312     alias ls='ls -Fw'
313     alias la='ls -aw'
314     alias l='ls -lhw'
315     alias lls='ls -lahw'
316
317     #alias top='/usr/bin/top -X -o cpu'
318     alias top='/usr/bin/top -o cpu'
319 else
320     alias ls='ls -F'
321     alias la='ls -a'
322     alias l='ls -lh'
323     alias lls='ls -lah'
324 fi
325
326 function osname () {
327     case $(uname) in
328         "Darwin" | "FreeBSD" | "NetBSD")
329             uname -v;;
330         "Linux")
331             if [[ -f "/etc/redhat-release" ]]; then
332                 cat "/etc/redhat-release"
333             elif [[ -f "/etc/SuSE-release" ]]; then
334                 cat "/etc/SuSE-release"
335             else
336                 echo -n "$0: I know this is "$(uname -o)" but " >&2
337                 echo    "have no idea about its distribution."  >&2
338                 return 1
339             fi;;
340         *)
341             echo "$0: Failed to detect the OS name." >&2
342             return 1
343     esac
344 }
345
346 function _start_gpg_agent () {
347     if ! which gpg-agent >&/dev/null; then
348         # gpg-agent is not present.
349         return
350     fi
351
352     if gpg-connect-agent /bye >&/dev/null; then
353         # gpg-agent is already running.
354         if [[ -f "${HOME}/.gpg-agent-info" ]]; then
355             . "${HOME}/.gpg-agent-info"
356             export GPG_AGENT_INFO
357         fi
358     else
359         # gpg-agent is not running yet.
360         eval $(gpg-agent --daemon --write-env-file "${HOME}/.gpg-agent-info")
361     fi
362
363     GPG_TTY=$(tty)
364     export GPG_TTY
365 }
366
367 if _we_are_in_gnu_screen; then
368     # When we are in a GNU Screen session...
369
370     if _we_are_in_ssh_session; then
371         # Propagate remote session's bells to the local one.
372         screen -X vbell off
373     fi
374 else
375     if _we_are_in_emacs; then
376         # Without this, Emacs' term mode has trouble with backspaces.
377         export TERM=vt100
378     fi
379
380     # Run "fortune" if we aren't in a GNU Screen session.
381     if which fortune >/dev/null 2>&1; then
382         fortune
383     fi
384 fi
385
386 if which ssh-agent-manager >/dev/null 2>&1; then
387     eval `ssh-agent-manager -s`
388 fi
389
390 _start_gpg_agent