aa1fddfff1a81cf2c9b301ed4e863d27d06b3e1d
[grml-etc-core.git] / etc / zsh / zshrc
1 # Filename:      zshrc
2 # Purpose:       config file for zsh (z shell)
3 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
4 # Bug-Reports:   see http://grml.org/bugs/
5 # License:       This file is licensed under the GPL v2.
6 # Latest change: Fre Jän 05 19:35:27 CET 2007 [mika]
7 ################################################################################
8 # This file is sourced only for interactive shells. It
9 # should contain commands to set up aliases, functions,
10 # options, key bindings, etc.
11 #
12 # Global Order: zshenv, zprofile, zshrc, zlogin
13 ################################################################################
14
15 # zsh profiling {{{
16 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
17   if [[ -n $ZSH_PROFILE_RC ]] ; then
18      zmodload zsh/zprof
19   fi
20 # }}}
21
22 # {{{ check for version/system
23 # check for versions (compatibility reasons)
24   if autoload is-at-least && is-at-least 2>/dev/null ; then
25      is4() { is-at-least 4 }
26      is42() { is-at-least 4.2 }
27   else
28     is4(){
29       [[ $ZSH_VERSION == 4.* ]] && return 0
30       return 1
31     }
32     is42(){
33       [[ $ZSH_VERSION == 4.<2->* ]] && return 0
34       return 1
35     }
36   fi
37
38 # grml specific stuff
39   isgrml(){
40     [ -f /etc/grml_version ] && return 0
41     return 1
42   }
43
44   isgrmlcd(){
45     [ -f /etc/grml_cd ] && return 0
46     return 1
47   }
48
49   if isgrml ; then
50     isgrmlsmall() {
51     [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
52   }
53   else
54     isgrmlsmall() { return 1 }
55   fi
56
57   # are we running within an utf environment?
58   isutfenv() {
59     case "$LANG $CHARSET $LANGUAGE" in
60       *utf*) return 0 ;;
61       *)     return 1 ;;
62     esac
63   }
64
65 # check for user, if not running as root set $SUDO to sudo
66  (( EUID != 0 )) && SUDO='sudo' || SUDO=''
67
68 # change directory to home on first invocation of zsh
69 # important for rungetty -> autologin
70 # Thanks go to Bart Schaefer!
71   isgrml && checkhome() {
72   if [[ -z "$ALREADY_DID_CD_HOME" ]]; then
73      export ALREADY_DID_CD_HOME=$HOME
74      cd
75   fi
76   }
77 # }}}
78
79 # {{{ set some variables
80   export EDITOR=${EDITOR:-vim}
81   export MAIL=${MAIL:-/var/mail/$USER}
82   [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
83   [[ -x /usr/bin/dircolors ]] && eval `dircolors -b`
84
85 # Search path for the cd comman
86 #  cdpath=(.. ~)
87
88 # Support our own site-functions
89   [ -d /etc/zsh/site-functions ] && FPATH=/etc/zsh/site-functions:$FPATH
90
91 # automatically remove duplicates from these arrays
92   typeset -U path cdpath fpath manpath
93 # }}}
94
95 # {{{ keybindings
96  if [[ "$TERM" != emacs ]]; then
97   [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
98   [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
99   [[ -z "$terminfo[kend]"  ]] || bindkey -M emacs "$terminfo[kend]"  end-of-line
100   [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
101   [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
102   [[ -z "$terminfo[kend]"  ]] || bindkey -M vicmd "$terminfo[kend]"  vi-end-of-line
103   [[ -z "$terminfo[cuu1]"  ]] || bindkey -M viins "$terminfo[cuu1]"  vi-up-line-or-history
104   [[ -z "$terminfo[cuf1]"  ]] || bindkey -M viins "$terminfo[cuf1]"  vi-forward-char
105   [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
106   [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
107   [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
108   [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
109   # ncurses stuff:
110   [[ "$terminfo[kcuu1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
111   [[ "$terminfo[kcud1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
112   [[ "$terminfo[kcuf1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
113   [[ "$terminfo[kcub1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
114   [[ "$terminfo[khome]" == "\eO"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
115   [[ "$terminfo[kend]"  == "\eO"* ]] && bindkey -M viins "${terminfo[kend]/O/[}"  end-of-line
116   [[ "$terminfo[khome]" == "\eO"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
117   [[ "$terminfo[kend]"  == "\eO"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line
118 fi
119
120 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
121 # use emacs style per default:
122   bindkey -e
123 # use vi style:
124 # bindkey -v
125
126 #if [[ "$TERM" == screen ]]; then
127   bindkey '\e[1~' beginning-of-line       # home
128   bindkey '\e[4~' end-of-line             # end
129   bindkey "^[[A"  up-line-or-search       # cursor up
130   bindkey "^[[B"  down-line-or-search     # <ESC>-
131   bindkey '^x'    history-beginning-search-backward # alternative ways of searching the shell history
132 # bindkey -s '^L' "|less\n"             # ctrl-L pipes to less
133 # bindkey -s '^B' " &\n"                # ctrl-B runs it in the background
134 # if terminal type is set to 'rxvt':
135   bindkey '\e[7~' beginning-of-line       # home
136   bindkey '\e[8~' end-of-line             # end
137 #fi
138
139 #  bindkey '\eq' push-line-or-edit
140 # }}}
141
142 # power completion - abbreviation expansion {{{
143 # power completion / abbreviation expansion / buffer expansion
144 # see http://zshwiki.org/home/examples/zleiab for details
145 # less risky than the global aliases but powerful as well
146 # just type the abbreviation key and afterwards ',.' to expand it
147   declare -A abk
148   setopt extendedglob
149   setopt interactivecomments
150   abk=(
151    # key  # value
152    'C'    '| wc -l'
153    '...' '../..'
154    '....' '../../..'
155    'BG' '& exit'
156    'C' '|wc -l'
157    'G' '|& grep --color=auto'
158    'H' '|head'
159    'Hl' ' --help |& less -r'
160    'L' '|less'
161    'LL' '|& less -r'
162    'M' '|most'
163    'N' '&>/dev/null'
164    'R' '| tr A-z N-za-m'
165    'SL' '| sort | less'
166    'S' '| sort -u'
167    'T' '|tail'
168    'V' '|& vim -'
169    'hide' "echo -en '\033]50;nil2\007'"
170    'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
171    'small' 'echo -en "\033]50;6x10\007"'
172    'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
173    'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
174    'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
175    'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
176    'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
177    'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
178    'da' 'du -sch'
179    'j' 'jobs -l'
180    'u' 'translate -i'
181    'co' "./configure && make && sudo make install"
182    'CH' "./configure --help"
183    'conkeror' 'firefox -chrome chrome://conkeror/content'
184    'dir' 'ls -lSrah'
185    'lad' $'ls -d .*(/)\n# only show dot-directories'
186    'lsa' $'ls -a .*(.)\n# only show dot-files'
187    'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
188    'lsl' $'ls -l *(@[1,10])\n# only symlinks'
189    'lsx' $'ls -l *(*[1,10])\n# only executables'
190    'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
191    'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
192    'lsd' $'ls -d *(/)\n# only show directories'
193    'lse' $'ls -d *(/^F)\n# only show empty directories'
194    'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
195    'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
196    'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
197    'rw-' 'chmod 600'
198    '600' 'chmod u+rw-x,g-rwx,o-rwx'
199    'rwx' 'chmod u+rwx'
200    '700' 'chmod u+rwx,g-rwx,o-rwx'
201    'r--' 'chmod u+r-wx,g-rwx,o-rwx'
202    '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
203    '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
204    'md' 'mkdir -p '
205    'cmplayer' 'mplayer -vo -fs -zoom fbdev'
206    'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
207    'fblinks' 'links2 -driver fb'
208    'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
209    'fori' 'for i ({..}) { }'
210    'cx' 'chmod +x'
211    'e'  'print -l'
212    'se' 'setopt interactivecomments'
213    'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
214    'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
215    'fb3' '=mplayer -vo fbdev -fs  -zoom 1>/dev/null -xy 3'
216    'ci' 'centericq'
217    'D'  'export DISPLAY=:0.0'
218    'mp' 'mplayer -vo xv -fs -zoom'
219   )
220
221   globalias () {
222         local MATCH
223         matched_chars='[.-|_a-zA-Z0-9]#'
224         LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
225         LBUFFER+=${abk[$MATCH]:-$MATCH}
226   }
227
228   zle -N globalias
229   bindkey ",." globalias
230 # }}}
231
232 # {{{ autoloading
233   autoload -U zmv    # who needs mmv or rename?
234   autoload history-search-end
235
236   # we don't want to quote/espace URLs on our own...
237   # avoid 'url-quote-magic: function definition file not found' on some older boxes
238   if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Zle/url-quote-magic" ] && \
239      autoload -U url-quote-magic && zle -N self-insert url-quote-magic ; then
240      zle -N self-insert url-quote-magic
241   else
242      print 'Notice: no url-quote-magic available :('
243   fi
244
245   alias run-help >&/dev/null && unalias run-help
246   autoload run-help # use via 'esc-h'
247
248 # completion system
249   if autoload -U compinit && compinit 2>/dev/null ; then
250      compinit 2>/dev/null || print 'Notice: no compinit available :('
251    else
252      print 'Notice: no compinit available :('
253      function zstyle { }
254      function compdef { }
255   fi
256
257   is4 && autoload -U zed                  # use ZLE editor to edit a file or function
258
259   is4 && for mod in complist deltochar mathfunc ; do
260              zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
261          done
262
263 # autoload zsh modules when they are referenced
264   is4 && for opt mod in a  stat    \
265                         a  zpty    \
266                         ap zprof   \
267                         ap mapfile ; do
268              zmodload -${opt} zsh/${mod} ${mod}
269          done ; unset opt mod
270
271   is4 && autoload -U insert-files && \
272   zle -N insert-files && \
273   bindkey "^Xf" insert-files # C-x-f
274
275   bindkey ' '   magic-space    # also do history expansion on space
276   bindkey '\ei' menu-complete  # menu completion via esc-i
277
278 # press esc-e for editing command line in $EDITOR or $VISUAL
279   is4 && autoload -U edit-command-line && \
280   zle -N edit-command-line && \
281   bindkey '\ee' edit-command-line
282
283 # menu selection: pick item but stay in the menu (press esc-return)
284   is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
285
286 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
287   _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
288   bindkey '\C-ed' _bkdate
289   zle -N _bkdate
290
291 # press esc-m for inserting last typed word again (thanks to caphuso!)
292   insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
293   zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
294
295 # set command prediction from history, see 'man 1 zshcontrib'
296 #  is4 && autoload -U predict-on && \
297 #  zle -N predict-on         && \
298 #  zle -N predict-off        && \
299 #  bindkey "^X^Z" predict-on && \
300 #  bindkey "^Z" predict-off
301
302 # put job into foreground via ctrl-z:
303   bindkey -s '^z' "fg\n"
304
305 # press ctrl-q to quote line:
306 #  mquote () {
307 #        zle beginning-of-line
308 #        zle forward-word
309 #        # RBUFFER="'$RBUFFER'"
310 #        RBUFFER=${(q)RBUFFER}
311 #        zle end-of-line
312 #  }
313 #  zle -N mquote && bindkey '^q' mquote
314
315 # run command line as user root via sudo:
316   _sudo-command-line() {
317     [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
318   }
319   zle -N sudo-command-line _sudo-command-line
320   bindkey "^Os" sudo-command-line
321 # }}}
322
323 # {{{ set some important options
324   # umask 022
325   umask 002
326
327 # history:
328   setopt append_history       # append history list to the history file (important for multiple parallel zsh sessions!)
329   is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
330   setopt extended_history     # save each command's beginning timestamp and the duration to the history file
331   is4 && setopt histignorealldups # If  a  new  command  line being added to the history
332                               # list duplicates an older one, the older command is removed from the list
333   setopt histignorespace      # remove command lines from the history list when
334                               # the first character on the line is a space
335 #  setopt histallowclobber    # add `|' to output redirections in the history
336 #  setopt NO_clobber          # warning if file exists ('cat /dev/null > ~/.zshrc')
337   setopt auto_cd              # if a command is issued that can't be executed as a normal command,
338                               # and the command is the name of a directory, perform the cd command to that directory
339   setopt extended_glob        # in order to use #, ~ and ^ for filename generation
340                               # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
341                               # -> searches for word not in compressed files
342                               # don't forget to quote '^', '~' and '#'!
343   setopt notify               # report the status of backgrounds jobs immediately
344   setopt hash_list_all        # Whenever a command completion is attempted, make sure \
345                               # the entire command path is hashed first.
346   setopt completeinword       # not just at the end
347 # setopt nocheckjobs          # don't warn me about bg processes when exiting
348   setopt nohup                # and don't kill them, either
349 # setopt printexitvalue       # alert me if something failed
350 # setopt dvorak               # with spelling correction, assume dvorak kb
351   setopt auto_pushd           # make cd push the old directory onto the directory stack.
352   setopt nonomatch            # try to avoid the 'zsh: no matches found...'
353   setopt nobeep               # avoid "beep"ing
354
355   MAILCHECK=30       # mailchecks
356   REPORTTIME=5       # report about cpu-/system-/user-time of command if running longer than 5 secondes
357   watch=(notme root) # watch for everyone but me and root
358
359 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
360 #  WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
361 #  WORDCHARS=.
362 #  WORDCHARS='*?_[]~=&;!#$%^(){}'
363 #  WORDCHARS='${WORDCHARS:s@/@}'
364
365 # only slash should be considered as a word separator:
366   slash-backward-kill-word() {
367     local WORDCHARS="${WORDCHARS:s@/@}"
368     # zle backward-word
369     zle backward-kill-word
370   }
371   zle -N slash-backward-kill-word
372   bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
373 # }}}
374
375 # {{{ history
376   export ZSHDIR=$HOME/.zsh
377   HISTFILE=$HOME/.zsh_history
378   isgrmlcd && HISTSIZE=500  || HISTSIZE=5000
379   isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
380 # }}}
381
382 # dirstack handling {{{
383   DIRSTACKSIZE=20
384   if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
385      dirstack=( ${(uf)"$(< ~/.zdirs)"} )
386      # "cd -" won't work after login by just setting $OLDPWD, so
387      cd $dirstack[0] && cd $OLDPWD
388   fi
389   chpwd() {
390     builtin dirs -pl >! ~/.zdirs
391   }
392 # }}}
393
394 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
395   if [ -n "$BATTERY" ] ; then
396      if [ -x =acpi ] ; then
397         PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
398         [ -z "$PERCENT" ] && PERCENT='acpi not present'
399         if [ "${PERCENT%%%}" -lt 20 ] ; then
400            PERCENT="warning: ${PERCENT}%"
401         fi
402      fi
403   fi
404 # }}}
405
406 # {{{ set prompt
407   if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Prompts/promptinit" ] && autoload promptinit && promptinit 2>/dev/null ; then
408      promptinit # people should be able to use their favourite prompt
409   else
410      print 'Notice: no promptinit available :('
411   fi
412
413 # precmd() => a function which is executed just before each prompt
414 # use 'NOPRECMD=1' to disable the precmd + preexec commands
415
416   # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
417
418   is4 && [[ -z $NOPRECMD ]] && precmd () {
419       [[ -n $NOPRECMD ]] && return 0
420       # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
421       if [[ -z ${DONTSETRPROMPT} ]] ; then
422         if [ -n "$BATTERY" ] ; then
423           # RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
424           RPROMPT="${PERCENT}${SCREENTITLE}"
425         else
426           # RPROMPT="%(?..:()% ${SCREENTITLE}"
427           RPROMPT="${SCREENTITLE}"
428         fi
429       fi
430       # adjust title of xterm
431       # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
432       case $TERM in (xterm*|rxvt)
433         print -Pn "\e]0;%n@%m: %~\a"
434         ;;
435       esac
436   }
437
438 # chpwd () => a function which is executed whenever the directory is changed
439
440 # preexec() => a function running before every command
441   is4 && [[ -z $NOPRECMD ]] && preexec () {
442       [[ -n $NOPRECMD ]] && return 0
443   # set hostname if not running on host with name 'grml'
444       local HOSTNAME=$(hostname)
445       if [[ "$HOSTNAME" != grml ]] ; then
446          NAME="@$HOSTNAME"
447       fi
448   # get the name of the program currently running and hostname of local machine
449   # set screen window title if running in a screen
450       if [[ "$TERM" == screen* ]]; then
451           # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]}       # dont't use hostname
452           local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
453           echo -ne "\ek$CMD\e\\"
454       fi
455   # set the screen title to "zsh" when sitting at the command prompt:
456       if [[ "$TERM" == screen* ]]; then
457            SCREENTITLE=$'%{\ekzsh\e\\%}'
458       else
459            SCREENTITLE=''
460       fi
461   # adjust title of xterm
462       case $TERM in (xterm*|rxvt)
463         print -Pn "\e]0;%n@%m: $1\a"
464         ;;
465       esac
466   }
467
468 # set colors
469   if autoload colors && colors 2>/dev/null ; then
470      BLUE="%{${fg[blue]}%}"
471      RED="%{${fg_bold[red]}%}"
472      GREEN="%{${fg[green]}%}"
473      CYAN="%{${fg[cyan]}%}"
474      WHITE="%{${fg[white]}%}"
475      NO_COLOUR="%{${reset_color}%}"
476   else
477      BLUE="%{\e[1;34m%}"
478      RED="%{\e[1;31m%}"
479      GREEN="%{\e[1;32m%}"
480      CYAN="%{\e[1;36m%}"
481      WHITE="%{\e[1;37m%}"
482      NO_COLOUR="%{\e[0m%}"
483   fi
484
485   EXITCODE="%(?..%?%1v )"
486   PS2='`%_> '       # secondary prompt, printed when the shell needs more information to complete a command.
487   PS3='?# '         # selection prompt used within a select loop.
488   PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
489
490   # set variable debian_chroot if running in a chroot with /etc/debian_chroot
491   if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
492     debian_chroot=$(cat /etc/debian_chroot)
493   fi
494
495   # don't use colors on dumb terminals (like emacs):
496   if [[ "$TERM" == dumb ]] ; then
497     PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
498   else
499     # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
500     # set variable identifying the chroot you work in (used in the prompt below)
501     if [[ -n "$GRMLPROMPT" ]]; then
502       PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
503 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
504     else
505       if (( EUID != 0 )); then
506         PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
507       else
508         PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
509       fi
510     fi
511   fi
512
513   # if we are inside a grml-chroot set a specific prompt theme
514   if [ -n "$GRML_CHROOT" ] ; then
515      PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
516   fi
517 # }}}
518
519 # {{{ 'hash' some often used directories
520   hash -d deb=/var/cache/apt/archives
521   hash -d doc=/usr/share/doc
522   hash -d linux=/lib/modules/$(command uname -r)/build/
523   hash -d log=/var/log
524   hash -d slog=/var/log/syslog
525   hash -d src=/usr/src
526   hash -d templ=/usr/share/doc/grml-templates
527   hash -d tt=/usr/share/doc/texttools-doc
528   hash -d www=/var/www
529 # }}}
530
531 # {{{ some aliases
532   if [ $UID = 0 ] ; then
533      [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
534   elif [ -r $HOME/.screenrc ] ; then
535      alias screen="/usr/bin/screen -c $HOME/.screenrc"
536   else
537      [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
538   fi
539
540   if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
541      alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
542      alias la='ls -la --color=auto'
543      alias ll='ls -l --color=auto'
544      alias lh='ls -hAl --color=auto'
545      alias l='ls -lF --color=auto'
546   else
547      alias ls='ls -b -CF'
548      alias la='ls -la'
549      alias ll='ls -l'
550      alias lh='ls -hAl'
551      alias l='ls -lF'
552   fi
553
554   alias cp='nocorrect cp'         # no spelling correction on cp
555   alias mkdir='nocorrect mkdir'   # no spelling correction on mkdir
556   alias mv='nocorrect mv'         # no spelling correction on mv
557   alias rm='nocorrect rm'         # no spelling correction on rm
558
559   alias rd='rmdir'
560   alias md='mkdir'
561
562   alias swspeak="setopt singlelinezle ; unsetopt prompt_cr ; export PS1='%m%# ' ; speechd-up" # set up software synth.
563
564   # I like clean prompt, so provide simple way to get that
565   alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
566
567 # truecrypt; use e.g. via 'truec /dev/ice' /mnt/ice' or 'truec -i'
568   if [ -x /usr/sbin/truecrypt ] ; then
569      if isutfenv ; then
570         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
571      else
572         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
573      fi
574   fi
575
576   zsh-help(){print "$bg[white]$fg[black]
577 zsh-help - hints for use of zsh on grml
578 =======================================$reset_color
579
580 Main configuration of zsh happens in /etc/zsh/zshrc (global)
581 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
582 The files are part of the package grml-etc-core, if you want to
583 use them on a non-grml-system just get the tar.gz from
584 http://deb.grml.org/ or get the files from the mercurial
585 repository:
586
587   http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
588   http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
589
590 If you want to stay in sync with zsh configuration of grml
591 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
592 your own stuff in \$HOME/.zshrc.local. System wide configuration
593 without touching configuration files of grml can take place
594 in /etc/zsh/zshrc.local.
595
596 If you want to use the configuration of user grml also when
597 running as user root just run 'zshskel' which will source
598 the file /etc/skel/.zshrc.
599
600 For information regarding zsh start at http://grml.org/zsh/
601
602 Take a look at grml's zsh refcard:
603 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
604
605 Check out the main zsh refcard:
606 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
607
608 And of course visit the zsh-lovers:
609 % man zsh-lovers
610
611 You can adjust some options through environment variables when
612 invoking zsh without having to edit configuration files.
613 Basically meant for bash users who are not used to the power of
614 the zsh yet. :)
615
616   \"NOCOR=1    zsh\" => deactivate automatic correction
617   \"NOMENU=1   zsh\" => do not use menu completion (note: use strg-d for completion instead!)
618   \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
619   \"BATTERY=1  zsh\" => activate battery status (via acpi) on right side of prompt
620 $bg[white]$fg[black]
621 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
622 Enjoy your grml system with the zsh!$reset_color"
623 }
624
625 # debian stuff
626   if [ -r /etc/debian_version ] ; then
627     alias acs='apt-cache search'
628     alias acsh='apt-cache show'
629     alias acp='apt-cache policy'
630     alias adg="$SUDO apt-get dist-upgrade"
631     alias agi="$SUDO apt-get install"
632     alias ag="$SUDO apt-get upgrade"
633     alias au="$SUDO apt-get update"
634     alias dbp='dpkg-buildpackage'
635     alias ge='grep-excuses'
636
637     # debian upgrade
638     upgrade () {
639       if [ -z "$1" ] ; then
640           $SUDO apt-get update
641           $SUDO apt-get -u upgrade
642       else
643           ssh $1 $SUDO apt-get update
644           # ask before the upgrade
645           local dummy
646           ssh $1 $SUDO apt-get --no-act upgrade
647           echo -n 'Process the upgrade?'
648           read -q dummy
649           if [[ $dummy == "y" ]] ; then
650               ssh $1 $SUDO apt-get -u upgrade --yes
651           fi
652       fi
653     }
654
655     isgrmlcd && alias su="sudo su"          # change to user root
656     alias tlog="tail -f /var/log/syslog"    # take a look at the syslog
657     alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
658   fi
659
660 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
661   if [ -L /usr/bin/cdrecord -o ! -x =cdrecord ] ; then
662      if [ -x =wodim ] ; then
663         alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
664 See #377109 in the BTS of Debian for more details.
665
666 Please use the wodim binary instead' ; return 1"
667      fi
668   fi
669
670 # I hate lacking backward compability, so provide an alternative therefore
671   if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
672    function apache2-ssl-certificate(){
673
674      print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
675      print 'You might want to take a look at Debian the package ssl-cert as well.'
676      print 'To generate a certificate for use with apache2 follow the instructions:'
677
678      echo '
679
680 export RANDFILE=/dev/random
681 mkdir /etc/apache2/ssl/
682 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
683 chmod 600 /etc/apache2/ssl/apache.pem
684
685 Run "grml-tips ssl-certificate" if you need further instructions.
686 '
687    }
688   fi
689 # }}}
690
691 # {{{ Use hard limits, except for a smaller stack and no core dumps
692   unlimit
693   limit stack 8192
694   isgrmlcd && limit core 0 # important for a live-cd-system
695   limit -s
696 # }}}
697
698 # {{{ completion stuff
699
700 # Where to look for autoloaded function definitions
701   if [ -d /etc/zsh/completion.d ] ; then
702     local comp=/etc/zsh/completion.d
703     for func in $comp/*(N-.:t); . ${comp}/${func}
704   fi
705
706 # called later (via is4 && grmlcomp)
707 # notice: use 'zstyle' for getting current settings
708 #         press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
709 grmlcomp() {
710 ## completion system
711   zstyle ':completion:*:approximate:'    max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
712   zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
713   zstyle ':completion:*:correct:*'       insert-unambiguous true             # start menu completion only if it could find no unambiguous initial string
714   zstyle ':completion:*:corrections'     format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
715   zstyle ':completion:*:correct:*'       original true                       #
716   zstyle ':completion:*:default'         list-colors ${(s.:.)LS_COLORS}      # activate color-completion(!)
717   zstyle ':completion:*:descriptions'    format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}'  # format on completion
718   zstyle ':completion:*:*:cd:*:directory-stack' menu yes select              # complete 'cd -<tab>' with menu
719   zstyle ':completion:*:expand:*'        tag-order all-expansions            # insert all expansions for expand completer
720   zstyle ':completion:*:history-words'   list false                          #
721   zstyle ':completion:*:history-words'   menu yes                            # activate menu
722   zstyle ':completion:*:history-words'   remove-all-dups yes                 # ignore duplicate entries
723   zstyle ':completion:*:history-words'   stop yes                            #
724   zstyle ':completion:*'                 matcher-list 'm:{a-z}={A-Z}'        # match uppercase from lowercase
725   zstyle ':completion:*:matches'         group 'yes'                         # separate matches into groups
726   zstyle ':completion:*'                 group-name ''
727   if [[ -z "$NOMENU" ]] ; then
728     zstyle ':completion:*'               menu select=5                       # if there are more than 5 options allow selecting from a menu
729   else
730     setopt no_auto_menu # don't use any menus at all
731   fi
732   zstyle ':completion:*:messages'        format '%d'                         #
733   zstyle ':completion:*:options'         auto-description '%d'               #
734   zstyle ':completion:*:options'         description 'yes'                   # describe options in full
735   zstyle ':completion:*:processes'       command 'ps -au$USER'               # on processes completion complete all user processes
736   zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters        # offer indexes before parameters in subscripts
737   zstyle ':completion:*'                 verbose true                        # provide verbose completion information
738   zstyle ':completion:*:warnings'        format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
739   zstyle ':completion:*:*:zcompile:*'    ignored-patterns '(*~|*.zwc)'       # define files to ignore for zcompile
740   zstyle ':completion:correct:'          prompt 'correct to: %e'             #
741   zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*'    # Ignore completion functions for commands you don't have:
742
743 # complete manual by their section
744   zstyle ':completion:*:manuals'    separate-sections true
745   zstyle ':completion:*:manuals.*'  insert-sections   true
746   zstyle ':completion:*:man:*'      menu yes select
747
748 ## correction
749 # run rehash on completion so new installed program are found automatically:
750   _force_rehash() {
751       (( CURRENT == 1 )) && rehash
752          return 1 # Because we didn't really complete anything
753     }
754 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
755   if [[ -n "$NOCOR" ]] ; then
756     zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete
757     setopt nocorrect # do not try to correct the spelling if possible
758   else
759 #    zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate
760     setopt correct  # try to correct the spelling if possible
761     zstyle -e ':completion:*' completer '
762         if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
763           _last_try="$HISTNO$BUFFER$CURSOR"
764           reply=(_complete _match _prefix)
765         else
766           if [[ $words[1] = (rm|mv) ]]; then
767             reply=(_complete)
768           else
769             reply=(_oldlist _expand _force_rehash _complete _correct _approximate)
770           fi
771         fi'
772   fi
773 # zstyle ':completion:*' completer _complete _correct _approximate
774 # zstyle ':completion:*' expand prefix suffix
775
776 # automatic rehash? Credits go to Frank Terbeck
777 # function my_accept () {
778 #   local buf
779 #   [[ -z ${BUFFER} ]] && zle accept-line && return
780 #   buf=( ${(z)BUFFER}  )
781 #   [[ -z ${commands[${buf[1]}]} ]] && rehash
782 #   zle accept-line
783 # }
784 # zle -N my_accept
785 # bindkey "^M" my_accept
786
787 # command for process lists, the local web server details and host completion
788   zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
789
790 # caching
791   [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
792                           zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
793
794 # host completion
795   if is42 ; then
796     [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
797     [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
798   else
799     _ssh_hosts=()
800     _etc_hosts=()
801   fi
802   hosts=(
803       `hostname`
804       "$_ssh_hosts[@]"
805       "$_etc_hosts[@]"
806       grml.org
807       localhost
808   )
809   zstyle ':completion:*:hosts' hosts $hosts
810 #  zstyle '*' hosts $hosts
811
812 # specify your logins:
813 # my_accounts=(
814 #  {grml,grml1}@foo.invalid
815 #  grml-devel@bar.invalid
816 # )
817 # other_accounts=(
818 #  {fred,root}@foo.invalid
819 #  vera@bar.invalid
820 # )
821 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
822 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
823
824 # specify specific port/service settings:
825 #  telnet_users_hosts_ports=(
826 #    user1@host1:
827 #    user2@host2:
828 #    @mail-server:{smtp,pop3}
829 #    @news-server:nntp
830 #    @proxy-server:8000
831 #  )
832 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
833
834 # use generic completion system for programs not yet defined:
835   compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
836
837 # see upgrade function in this file
838   compdef _hosts upgrade
839 }
840 # }}}
841
842 # {{{ grmlstuff
843 grmlstuff() {
844 # people should use 'grml-x'!
845   function startx() {
846     if [ -e /etc/X11/xorg.conf ] ; then
847        [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
848     else
849       echo "Please use the script \"grml-x\" for starting the X Window System
850 because there does not exist /etc/X11/xorg.conf yet.
851 If you want to use startx anyway please call \"/usr/bin/startx\"."
852       return -1
853     fi
854   }
855
856   function xinit() {
857     if [ -e /etc/X11/xorg.conf ] ; then
858        [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
859     else
860       echo "Please use the script \"grml-x\" for starting the X Window System.
861 because there does not exist /etc/X11/xorg.conf yet.
862 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
863       return -1
864     fi
865   }
866
867   if [ -x /usr/sbin/915resolution ] ; then
868      alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
869   fi
870
871   alias grml-version='cat /etc/grml_version'
872
873   if [ -x /usr/sbin/rebuildfstab ] ; then
874      alias grml-rebuildfstab='rebuildfstab -v -r -config'
875   fi
876 }
877 # }}}
878
879 # {{{ now run the functions
880   isgrml && checkhome
881   is4    && isgrml    && grmlstuff
882   is4    && grmlcomp
883 # }}}
884
885 # {{{ keephack
886   [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
887 # }}}
888
889 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
890 # You use it as follows:
891 # $ NTREF=/reference/file
892 # $ ls -l *(e:nt:)
893 # This lists all the files in the current directory newer than the reference file.
894 # You can also specify the reference file inline; note quotes:
895 # $ ls -l *(e:'nt ~/.zshenv':)
896   is4 && nt() {
897     if [[ -n $1 ]]; then
898       local NTREF=${~1}
899     fi
900     [[ $REPLY -nt $NTREF ]]
901   }
902 # }}}
903
904 # shell functions {{{
905   setenv()  { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" }  # csh compatibility
906   freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
907   reload () {
908    if [[ "$#*" -eq 0 ]]; then
909       [ -r ~/.zshrc ] && . ~/.zshrc
910    else
911       local fn
912       for fn in "$@"; do
913           unfunction $fn
914           autoload -U $fn
915       done
916    fi
917   }
918   compdef _functions reload freload
919
920   # fast manual access
921   if type -p qma &>/dev/null ; then
922      manzsh()  { qma zshall "$1" }
923   else
924      manzsh()  { /usr/bin/man zshall |  vim -c "se ft=man| se hlsearch" +/"$1" - ; }
925      # manzsh()  { /usr/bin/man zshall |  most +/"$1" ; }
926      # manzsh()  { man zshall | $MYLESS -p $1 ; }
927   fi
928
929 # use "dchange <package-name>" to view Debian's changelog of the package:
930   dchange() {
931     if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
932        most /usr/share/doc/${1}/changelog.Debian.gz
933     else
934        if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
935           most /usr/share/doc/${1}/changelog.gz
936        else
937           echo "No changelog for package $1 found, sorry."
938           return 1
939        fi
940     fi
941   }
942   _dchange() { _files -W /usr/share/doc -/ }
943   compdef _dchange dchange
944
945 # use "uchange <package-name>" to view upstream's changelog of the package:
946   uchange() {
947     if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
948        most /usr/share/doc/${1}/changelog.gz
949     else
950        echo "No changelog for package $1 found, sorry."
951        return 1
952     fi
953   }
954   _uchange() { _files -W /usr/share/doc -/ }
955   compdef _uchange uchange
956
957 # zsh profiling
958   profile () {
959       ZSH_PROFILE_RC=1 $SHELL "$@"
960   }
961
962 # edit alias via zle:
963   edalias() {
964     [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
965   }
966   compdef _aliases edalias
967
968 # edit function via zle:
969   edfunc() {
970     [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
971   }
972   compdef _functions edfunc
973
974 # use it e.g. via 'Restart apache2'
975  if [ -d /etc/init.d ] ; then
976   for i in Start Restart Stop Force-Reload Reload ; do
977     eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
978   done
979   # now the completion for this:
980   compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
981  fi
982
983 # provide useful information on globbing
984   H-Glob() {
985   echo -e "
986       /      directories
987       .      plain files
988       @      symbolic links
989       =      sockets
990       p      named pipes (FIFOs)
991       *      executable plain files (0100)
992       %      device files (character or block special)
993       %b     block special files
994       %c     character special files
995       r      owner-readable files (0400)
996       w      owner-writable files (0200)
997       x      owner-executable files (0100)
998       A      group-readable files (0040)
999       I      group-writable files (0020)
1000       E      group-executable files (0010)
1001       R      world-readable files (0004)
1002       W      world-writable files (0002)
1003       X      world-executable files (0001)
1004       s      setuid files (04000)
1005       S      setgid files (02000)
1006       t      files with the sticky bit (01000)
1007
1008    print *(m-1)          # Files modified up to a day ago
1009    print *(a1)           # Files accessed a day ago
1010    print *(@)            # Just symlinks
1011    print *(Lk+50)        # Files bigger than 50 kilobytes
1012    print *(Lk-50)        # Files smaller than 50 kilobytes
1013    print **/*.c          # All *.c files recursively starting in \$PWD
1014    print **/*.c~file.c   # Same as above, but excluding 'file.c'
1015    print (foo|bar).*     # Files starting with 'foo' or 'bar'
1016    print *~*.*           # All Files that do not contain a dot
1017    chmod 644 *(.^x)      # make all plain non-executable files publically readable
1018    print -l *(.c|.h)     # Lists *.c and *.h
1019    print **/*(g:users:)  # Recursively match all files that are owned by group 'users'
1020    echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1021   }
1022   alias help-zshglob=H-Glob
1023
1024   type -p qma &>/dev/null && alias ?='qma zshall'
1025
1026   # grep for running process, like: 'any vim'
1027   any() {
1028   if [ -z "$1" ] ; then
1029      echo "any - grep for process(es) by keyword" >&2
1030      echo "Usage: any <keyword>" >&2 ; return 1
1031   else
1032      local STRING=$1
1033      local LENGTH=$(expr length $STRING)
1034      local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1035      local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1036      ps xauwww| grep "[$FIRSCHAR]$REST"
1037   fi
1038   }
1039
1040   # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1041   # bash() {
1042   #  NO_SWITCH="yes" command bash "$@"
1043   # }
1044   # restart () {
1045   #  exec $SHELL $SHELL_ARGS "$@"
1046   # }
1047
1048 # }}}
1049
1050 # log out? set timeout in seconds {{{
1051 # TMOUT=1800
1052 # do not log out in some specific terminals:
1053 #  if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1054 #    unset TMOUT
1055 #  fi
1056 # }}}
1057
1058 # {{{ make sure our environment is clean regarding colors
1059   for color in BLUE RED GREEN CYAN WHITE ; unset $color
1060 # }}}
1061
1062 # source another config file if present {{{
1063   if [ -r /etc/zsh/zshrc.local ]; then
1064    source /etc/zsh/zshrc.local
1065   fi
1066 # }}}
1067
1068 # "persistent history" {{{
1069 # just write important commands you always need to ~/.important_commands
1070   if [ -r ~/.important_commands ] ; then
1071      fc -R ~/.important_commands
1072   fi
1073 # }}}
1074
1075 ## END OF FILE #################################################################
1076 # vim:foldmethod=marker expandtab