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: Sam Mär 17 20:12:26 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.
12 # Global Order: zshenv, zprofile, zshrc, zlogin
13 ################################################################################
16 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
17 if [[ -n $ZSH_PROFILE_RC ]] ; then
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 }
29 [[ $ZSH_VERSION == 4.* ]] && return 0
33 [[ $ZSH_VERSION == 4.<2->* ]] && return 0
40 [ -f /etc/grml_version ] && return 0
45 [ -f /etc/grml_cd ] && return 0
51 [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
54 isgrmlsmall() { return 1 }
57 # are we running within an utf environment?
59 case "$LANG $CHARSET $LANGUAGE" in
66 # check for user, if not running as root set $SUDO to sudo
67 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
69 # change directory to home on first invocation of zsh
70 # important for rungetty -> autologin
71 # Thanks go to Bart Schaefer!
72 isgrml && checkhome() {
73 if [[ -z "$ALREADY_DID_CD_HOME" ]]; then
74 export ALREADY_DID_CD_HOME=$HOME
80 # {{{ set some variables
81 export EDITOR=${EDITOR:-vim}
82 export MAIL=${MAIL:-/var/mail/$USER}
83 # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
84 export SHELL='/bin/zsh'
85 [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
86 [[ -x /usr/bin/dircolors ]] && eval `dircolors -b`
88 # Search path for the cd comman
91 # Support our own site-functions
92 [ -d /etc/zsh/site-functions ] && FPATH=/etc/zsh/site-functions:$FPATH
94 # automatically remove duplicates from these arrays
95 typeset -U path cdpath fpath manpath
99 if [[ "$TERM" != emacs ]]; then
100 [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
101 [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
102 [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
103 [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
104 [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
105 [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
106 [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
107 [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
108 [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
109 [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
110 [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
111 [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
113 [[ "$terminfo[kcuu1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
114 [[ "$terminfo[kcud1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
115 [[ "$terminfo[kcuf1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
116 [[ "$terminfo[kcub1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
117 [[ "$terminfo[khome]" == "
\eO"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
118 [[ "$terminfo[kend]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
119 [[ "$terminfo[khome]" == "
\eO"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
120 [[ "$terminfo[kend]" == "
\eO"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
123 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
124 # use emacs style per default:
129 #if [[ "$TERM" == screen ]]; then
130 bindkey '\e[1~' beginning-of-line # home
131 bindkey '\e[4~' end-of-line # end
132 bindkey "^[[A" up-line-or-search # cursor up
133 bindkey "^[[B" down-line-or-search # <ESC>-
134 bindkey '^x' history-beginning-search-backward # alternative ways of searching the shell history
135 # bindkey -s '^L' "|less\n" # ctrl-L pipes to less
136 # bindkey -s '^B' " &\n" # ctrl-B runs it in the background
137 # if terminal type is set to 'rxvt':
138 bindkey '\e[7~' beginning-of-line # home
139 bindkey '\e[8~' end-of-line # end
142 # insert unicode character
143 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an §
144 # See for example http://unicode.org/charts/ for unicode characters code
145 autoload insert-unicode-char
146 zle -N insert-unicode-char
147 bindkey '^Xi' insert-unicode-char
149 # just type 'cd ...' to get 'cd ../..'
150 # rationalise-dot() {
151 # if [[ $LBUFFER = *.. ]]; then
157 # zle -N rationalise-dot
158 # bindkey . rationalise-dot
160 # bindkey '\eq' push-line-or-edit
163 # power completion - abbreviation expansion {{{
164 # power completion / abbreviation expansion / buffer expansion
165 # see http://zshwiki.org/home/examples/zleiab for details
166 # less risky than the global aliases but powerful as well
167 # just type the abbreviation key and afterwards ',.' to expand it
170 setopt interactivecomments
178 'G' '|& grep --color=auto'
180 'Hl' ' --help |& less -r'
185 'R' '| tr A-z N-za-m'
190 'hide' "echo -en '\033]50;nil2\007'"
191 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
192 'small' 'echo -en "\033]50;6x10\007"'
193 'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
194 'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
195 'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
196 'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
197 'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
198 'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
202 'co' "./configure && make && sudo make install"
203 'CH' "./configure --help"
204 'conkeror' 'firefox -chrome chrome://conkeror/content'
206 'lad' $'ls -d .*(/)\n# only show dot-directories'
207 'lsa' $'ls -a .*(.)\n# only show dot-files'
208 'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
209 'lsl' $'ls -l *(@[1,10])\n# only symlinks'
210 'lsx' $'ls -l *(*[1,10])\n# only executables'
211 'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
212 'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
213 'lsd' $'ls -d *(/)\n# only show directories'
214 'lse' $'ls -d *(/^F)\n# only show empty directories'
215 'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
216 'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
217 'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
219 '600' 'chmod u+rw-x,g-rwx,o-rwx'
221 '700' 'chmod u+rwx,g-rwx,o-rwx'
222 'r--' 'chmod u+r-wx,g-rwx,o-rwx'
223 '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
224 '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
226 'cmplayer' 'mplayer -vo -fs -zoom fbdev'
227 'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
228 'fblinks' 'links2 -driver fb'
229 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
230 'fori' 'for i ({..}) { }'
233 'se' 'setopt interactivecomments'
234 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
235 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
236 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3'
238 'D' 'export DISPLAY=:0.0'
239 'mp' 'mplayer -vo xv -fs -zoom'
244 matched_chars='[.-|_a-zA-Z0-9]#'
245 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
246 LBUFFER+=${abk[$MATCH]:-$MATCH}
250 bindkey ",." globalias
254 autoload -U zmv # who needs mmv or rename?
255 autoload history-search-end
257 # we don't want to quote/espace URLs on our own...
258 if autoload -U url-quote-magic ; then
259 zle -N self-insert url-quote-magic
261 print 'Notice: no url-quote-magic available :('
264 alias run-help >&/dev/null && unalias run-help
265 autoload run-help # use via 'esc-h'
268 if autoload -U compinit && compinit 2>/dev/null ; then
269 compinit 2>/dev/null || print 'Notice: no compinit available :('
271 print 'Notice: no compinit available :('
276 is4 && autoload -U zed # use ZLE editor to edit a file or function
278 is4 && for mod in complist deltochar mathfunc ; do
279 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
282 # autoload zsh modules when they are referenced
283 is4 && for opt mod in a stat \
287 zmodload -${opt} zsh/${mod} ${mod}
290 is4 && autoload -U insert-files && \
291 zle -N insert-files && \
292 bindkey "^Xf" insert-files # C-x-f
294 bindkey ' ' magic-space # also do history expansion on space
295 bindkey '\ei' menu-complete # menu completion via esc-i
297 # press esc-e for editing command line in $EDITOR or $VISUAL
298 is4 && autoload -U edit-command-line && \
299 zle -N edit-command-line && \
300 bindkey '\ee' edit-command-line
302 # menu selection: pick item but stay in the menu (press esc-return)
303 is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
305 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
306 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
307 bindkey '\C-ed' _bkdate
310 # press esc-m for inserting last typed word again (thanks to caphuso!)
311 insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
312 zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
314 # set command prediction from history, see 'man 1 zshcontrib'
315 # is4 && autoload -U predict-on && \
316 # zle -N predict-on && \
317 # zle -N predict-off && \
318 # bindkey "^X^Z" predict-on && \
319 # bindkey "^Z" predict-off
321 # put job into foreground via ctrl-z:
322 bindkey -s '^z' "fg\n"
324 # press ctrl-q to quote line:
326 # zle beginning-of-line
328 # # RBUFFER="'$RBUFFER'"
329 # RBUFFER=${(q)RBUFFER}
332 # zle -N mquote && bindkey '^q' mquote
334 # run command line as user root via sudo:
335 _sudo-command-line() {
336 [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
338 zle -N sudo-command-line _sudo-command-line
339 bindkey "^Os" sudo-command-line
342 # {{{ set some important options
343 (( EUID != 0 )) && umask 002 || umask 022
346 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
347 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
348 setopt extended_history # save each command's beginning timestamp and the duration to the history file
349 is4 && setopt histignorealldups # If a new command line being added to the history
350 # list duplicates an older one, the older command is removed from the list
351 setopt histignorespace # remove command lines from the history list when
352 # the first character on the line is a space
353 # setopt histallowclobber # add `|' to output redirections in the history
354 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
355 setopt auto_cd # if a command is issued that can't be executed as a normal command,
356 # and the command is the name of a directory, perform the cd command to that directory
357 setopt extended_glob # in order to use #, ~ and ^ for filename generation
358 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
359 # -> searches for word not in compressed files
360 # don't forget to quote '^', '~' and '#'!
361 setopt notify # report the status of backgrounds jobs immediately
362 setopt hash_list_all # Whenever a command completion is attempted, make sure \
363 # the entire command path is hashed first.
364 setopt completeinword # not just at the end
365 # setopt nocheckjobs # don't warn me about bg processes when exiting
366 setopt nohup # and don't kill them, either
367 # setopt printexitvalue # alert me if something failed
368 # setopt dvorak # with spelling correction, assume dvorak kb
369 setopt auto_pushd # make cd push the old directory onto the directory stack.
370 setopt nonomatch # try to avoid the 'zsh: no matches found...'
371 setopt nobeep # avoid "beep"ing
373 MAILCHECK=30 # mailchecks
374 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 secondes
375 watch=(notme root) # watch for everyone but me and root
377 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
378 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
380 # WORDCHARS='*?_[]~=&;!#$%^(){}'
381 # WORDCHARS='${WORDCHARS:s@/@}'
383 # only slash should be considered as a word separator:
384 slash-backward-kill-word() {
385 local WORDCHARS="${WORDCHARS:s@/@}"
387 zle backward-kill-word
389 zle -N slash-backward-kill-word
390 bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
394 export ZSHDIR=$HOME/.zsh
395 HISTFILE=$HOME/.zsh_history
396 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
397 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
400 # dirstack handling {{{
402 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
403 dirstack=( ${(uf)"$(< ~/.zdirs)"} )
404 # "cd -" won't work after login by just setting $OLDPWD, so
405 cd $dirstack[0] && cd $OLDPWD
408 builtin dirs -pl >! ~/.zdirs
412 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
413 if [ -n "$BATTERY" ] ; then
414 if [ -x $(which acpi) ] ; then
415 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
416 [ -z "$PERCENT" ] && PERCENT='acpi not present'
417 if [ "${PERCENT%%%}" -lt 20 ] ; then
418 PERCENT="warning: ${PERCENT}%"
425 if autoload promptinit && promptinit 2>/dev/null ; then
426 promptinit # people should be able to use their favourite prompt
428 print 'Notice: no promptinit available :('
431 # precmd() => a function which is executed just before each prompt
432 # use 'NOPRECMD=1' to disable the precmd + preexec commands
434 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
436 is4 && [[ -z $NOPRECMD ]] && precmd () {
437 [[ -n $NOPRECMD ]] && return 0
438 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
439 if [[ -z ${DONTSETRPROMPT} ]] ; then
440 if [ -n "$BATTERY" ] ; then
441 # RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
442 RPROMPT="${PERCENT}${SCREENTITLE}"
444 # RPROMPT="%(?..:()% ${SCREENTITLE}"
445 RPROMPT="${SCREENTITLE}"
448 # adjust title of xterm
449 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
450 case $TERM in (xterm*|rxvt)
451 print -Pn "\e]0;%n@%m: %~\a"
456 # chpwd () => a function which is executed whenever the directory is changed
458 # preexec() => a function running before every command
459 is4 && [[ -z $NOPRECMD ]] && preexec () {
460 [[ -n $NOPRECMD ]] && return 0
461 # set hostname if not running on host with name 'grml'
462 local HOSTNAME=$(hostname)
463 if [[ "$HOSTNAME" != grml ]] ; then
466 # get the name of the program currently running and hostname of local machine
467 # set screen window title if running in a screen
468 if [[ "$TERM" == screen* ]]; then
469 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
470 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
471 echo -ne "\ek$CMD\e\\"
473 # set the screen title to "zsh" when sitting at the command prompt:
474 if [[ "$TERM" == screen* ]]; then
475 SCREENTITLE=$'%{\ekzsh\e\\%}'
479 # adjust title of xterm
480 case $TERM in (xterm*|rxvt)
481 print -Pn "\e]0;%n@%m: $1\a"
487 if autoload colors && colors 2>/dev/null ; then
488 BLUE="%{${fg[blue]}%}"
489 RED="%{${fg_bold[red]}%}"
490 GREEN="%{${fg[green]}%}"
491 CYAN="%{${fg[cyan]}%}"
492 WHITE="%{${fg[white]}%}"
493 NO_COLOUR="%{${reset_color}%}"
500 NO_COLOUR="%{
\e[0m%}"
503 EXITCODE="%(?..%?%1v )"
504 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
505 PS3='?# ' # selection prompt used within a select loop.
506 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
508 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
509 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
510 debian_chroot=$(cat /etc/debian_chroot)
513 # don't use colors on dumb terminals (like emacs):
514 if [[ "$TERM" == dumb ]] ; then
515 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
517 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
518 # set variable identifying the chroot you work in (used in the prompt below)
519 if [[ -n "$GRMLPROMPT" ]]; then
520 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
521 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
523 if (( EUID != 0 )); then
524 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
526 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
531 # if we are inside a grml-chroot set a specific prompt theme
532 if [ -n "$GRML_CHROOT" ] ; then
533 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
537 # {{{ 'hash' some often used directories
538 hash -d deb=/var/cache/apt/archives
539 hash -d doc=/usr/share/doc
540 hash -d linux=/lib/modules/$(command uname -r)/build/
542 hash -d slog=/var/log/syslog
544 hash -d templ=/usr/share/doc/grml-templates
545 hash -d tt=/usr/share/doc/texttools-doc
550 if [ $UID = 0 ] ; then
551 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
552 elif [ -r $HOME/.screenrc ] ; then
553 alias screen="/usr/bin/screen -c $HOME/.screenrc"
555 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
558 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
559 alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
560 alias la='ls -la --color=auto'
561 alias ll='ls -l --color=auto'
562 alias lh='ls -hAl --color=auto'
563 alias l='ls -lF --color=auto'
572 alias mdstat='cat /proc/mdstat'
573 alias ...='cd ../../'
575 alias cp='nocorrect cp' # no spelling correction on cp
576 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
577 alias mv='nocorrect mv' # no spelling correction on mv
578 alias rm='nocorrect rm' # no spelling correction on rm
583 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
584 alias term2iso="echo 'Setting terminal to iso mode' ; echo -e '
\e%@'"
585 alias term2utf="echo 'Setting terminal to utf-8 mode'; echo -e '
\e%G'"
587 alias utf2iso='if isutfenv ; then
588 for ENV in `env | grep UTF` ; do
589 eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')"
592 alias iso2utf='if isutfenv ; then
593 for ENV in `env | grep '\.iso'` ; do
594 eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')"
598 # set up software synthesizer via speakup
600 aumix -w 90 -v 90 -p 90 -m 90
601 if ! [ -r /dev/softsynth ] ; then
602 flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
608 nice -n -20 speechd-up
609 flite -o play -t "Finished setting up software synthesizer"
613 # I like clean prompt, so provide simple way to get that
614 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
616 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
617 if [ -x /usr/sbin/truecrypt ] ; then
619 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
621 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
625 zsh-help(){print "$bg[white]$fg[black]
626 zsh-help - hints for use of zsh on grml
627 =======================================$reset_color
629 Main configuration of zsh happens in /etc/zsh/zshrc (global)
630 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
631 The files are part of the package grml-etc-core, if you want to
632 use them on a non-grml-system just get the tar.gz from
633 http://deb.grml.org/ or get the files from the mercurial
636 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
637 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
639 If you want to stay in sync with zsh configuration of grml
640 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
641 your own stuff in \$HOME/.zshrc.local. System wide configuration
642 without touching configuration files of grml can take place
643 in /etc/zsh/zshrc.local.
645 If you want to use the configuration of user grml also when
646 running as user root just run 'zshskel' which will source
647 the file /etc/skel/.zshrc.
649 For information regarding zsh start at http://grml.org/zsh/
651 Take a look at grml's zsh refcard:
652 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
654 Check out the main zsh refcard:
655 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
657 And of course visit the zsh-lovers:
660 You can adjust some options through environment variables when
661 invoking zsh without having to edit configuration files.
662 Basically meant for bash users who are not used to the power of
665 \"NOCOR=1 zsh\" => deactivate automatic correction
666 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
667 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
668 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
670 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
671 Enjoy your grml system with the zsh!$reset_color"
675 if [ -r /etc/debian_version ] ; then
676 alias acs='apt-cache search'
677 alias acsh='apt-cache show'
678 alias acp='apt-cache policy'
679 alias adg="$SUDO apt-get dist-upgrade"
680 alias agi="$SUDO apt-get install"
681 alias ati="$SUDO aptitude install"
682 alias ag="$SUDO apt-get upgrade"
683 alias au="$SUDO apt-get update"
684 alias up="$SUDO aptitude update ; $SUDO aptitude upgrade"
685 alias dbp='dpkg-buildpackage'
686 alias ge='grep-excuses'
690 if [ -z "$1" ] ; then
692 $SUDO apt-get -u upgrade
694 ssh $1 $SUDO apt-get update
695 # ask before the upgrade
697 ssh $1 $SUDO apt-get --no-act upgrade
698 echo -n 'Process the upgrade?'
700 if [[ $dummy == "y" ]] ; then
701 ssh $1 $SUDO apt-get -u upgrade --yes
706 isgrmlcd && alias su="sudo su" # change to user root
707 alias tlog="tail -f /var/log/syslog" # take a look at the syslog
708 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
711 # sort installed Debian-packages by size
712 if [ -x /usr/bin/grep-status ] ; then
713 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
714 -n "install ok installed" | paste -sd " \n" | sort -rn'
717 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
718 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
719 if [ -x $(which wodim) ] ; then
720 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
721 See #377109 in the BTS of Debian for more details.
723 Please use the wodim binary instead' ; return 1"
727 # I hate lacking backward compability, so provide an alternative therefore
728 if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
729 function apache2-ssl-certificate(){
731 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
732 print 'You might want to take a look at Debian the package ssl-cert as well.'
733 print 'To generate a certificate for use with apache2 follow the instructions:'
737 export RANDFILE=/dev/random
738 mkdir /etc/apache2/ssl/
739 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
740 chmod 600 /etc/apache2/ssl/apache.pem
742 Run "grml-tips ssl-certificate" if you need further instructions.
748 # {{{ Use hard limits, except for a smaller stack and no core dumps
751 isgrmlcd && limit core 0 # important for a live-cd-system
755 # {{{ completion stuff
757 # Where to look for autoloaded function definitions
758 if [ -d /etc/zsh/completion.d ] ; then
759 local comp=/etc/zsh/completion.d
760 for func in $comp/*(N-.:t); . ${comp}/${func}
763 # called later (via is4 && grmlcomp)
764 # notice: use 'zstyle' for getting current settings
765 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
768 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
769 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
770 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
771 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
772 zstyle ':completion:*:correct:*' original true #
773 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
774 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
775 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
776 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
777 zstyle ':completion:*:history-words' list false #
778 zstyle ':completion:*:history-words' menu yes # activate menu
779 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
780 zstyle ':completion:*:history-words' stop yes #
781 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
782 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
783 zstyle ':completion:*' group-name ''
784 if [[ -z "$NOMENU" ]] ; then
785 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
787 setopt no_auto_menu # don't use any menus at all
789 zstyle ':completion:*:messages' format '%d' #
790 zstyle ':completion:*:options' auto-description '%d' #
791 zstyle ':completion:*:options' description 'yes' # describe options in full
792 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
793 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
794 zstyle ':completion:*' verbose true # provide verbose completion information
795 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
796 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
797 zstyle ':completion:correct:' prompt 'correct to: %e' #
798 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
800 # complete manual by their section
801 zstyle ':completion:*:manuals' separate-sections true
802 zstyle ':completion:*:manuals.*' insert-sections true
803 zstyle ':completion:*:man:*' menu yes select
806 # run rehash on completion so new installed program are found automatically:
808 (( CURRENT == 1 )) && rehash
809 return 1 # Because we didn't really complete anything
811 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
812 if [[ -n "$NOCOR" ]] ; then
813 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete
814 setopt nocorrect # do not try to correct the spelling if possible
816 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate
817 setopt correct # try to correct the spelling if possible
818 zstyle -e ':completion:*' completer '
819 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
820 _last_try="$HISTNO$BUFFER$CURSOR"
821 reply=(_complete _match _prefix)
823 if [[ $words[1] = (rm|mv) ]]; then
826 reply=(_oldlist _expand _force_rehash _complete _correct _approximate)
830 # zstyle ':completion:*' completer _complete _correct _approximate
831 # zstyle ':completion:*' expand prefix suffix
833 # automatic rehash? Credits go to Frank Terbeck
834 # function my_accept () {
836 # [[ -z ${BUFFER} ]] && zle accept-line && return
837 # buf=( ${(z)BUFFER} )
838 # [[ -z ${commands[${buf[1]}]} ]] && rehash
842 # bindkey "^M" my_accept
844 # command for process lists, the local web server details and host completion
845 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
848 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
849 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
851 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
853 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
854 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
866 zstyle ':completion:*:hosts' hosts $hosts
867 # zstyle '*' hosts $hosts
869 # specify your logins:
871 # {grml,grml1}@foo.invalid
872 # grml-devel@bar.invalid
875 # {fred,root}@foo.invalid
878 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
879 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
881 # specify specific port/service settings:
882 # telnet_users_hosts_ports=(
885 # @mail-server:{smtp,pop3}
889 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
891 # use generic completion system for programs not yet defined:
892 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
894 # see upgrade function in this file
895 compdef _hosts upgrade
901 # people should use 'grml-x'!
903 if [ -e /etc/X11/xorg.conf ] ; then
904 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
906 echo "Please use the script \"grml-x\" for starting the X Window System
907 because there does not exist /etc/X11/xorg.conf yet.
908 If you want to use startx anyway please call \"/usr/bin/startx\"."
914 if [ -e /etc/X11/xorg.conf ] ; then
915 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
917 echo "Please use the script \"grml-x\" for starting the X Window System.
918 because there does not exist /etc/X11/xorg.conf yet.
919 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
924 if [ -x /usr/sbin/915resolution ] ; then
925 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
928 alias grml-version='cat /etc/grml_version'
930 if [ -x /usr/sbin/rebuildfstab ] ; then
931 alias grml-rebuildfstab='rebuildfstab -v -r -config'
936 # {{{ now run the functions
938 is4 && isgrml && grmlstuff
943 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
946 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
947 # You use it as follows:
948 # $ NTREF=/reference/file
950 # This lists all the files in the current directory newer than the reference file.
951 # You can also specify the reference file inline; note quotes:
952 # $ ls -l *(e:'nt ~/.zshenv':)
957 [[ $REPLY -nt $NTREF ]]
961 # shell functions {{{
962 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
963 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
965 if [[ "$#*" -eq 0 ]]; then
966 [ -r ~/.zshrc ] && . ~/.zshrc
975 compdef _functions reload freload
978 if type -p qma &>/dev/null ; then
979 manzsh() { qma zshall "$1" }
982 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
983 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
984 # manzsh() { man zshall | $MYLESS -p $1 ; }
987 # use "dchange <package-name>" to view Debian's changelog of the package:
989 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
990 most /usr/share/doc/${1}/changelog.Debian.gz
992 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
993 most /usr/share/doc/${1}/changelog.gz
995 echo "No changelog for package $1 found, sorry."
1000 _dchange() { _files -W /usr/share/doc -/ }
1001 compdef _dchange dchange
1003 # use "uchange <package-name>" to view upstream's changelog of the package:
1005 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1006 most /usr/share/doc/${1}/changelog.gz
1008 echo "No changelog for package $1 found, sorry."
1012 _uchange() { _files -W /usr/share/doc -/ }
1013 compdef _uchange uchange
1017 ZSH_PROFILE_RC=1 $SHELL "$@"
1020 # edit alias via zle:
1022 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1024 compdef _aliases edalias
1026 # edit function via zle:
1028 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1030 compdef _functions edfunc
1032 # use it e.g. via 'Restart apache2'
1033 if [ -d /etc/init.d ] ; then
1034 for i in Start Restart Stop Force-Reload Reload ; do
1035 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1037 # now the completion for this:
1038 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
1041 # provide useful information on globbing
1048 p named pipes (FIFOs)
1049 * executable plain files (0100)
1050 % device files (character or block special)
1051 %b block special files
1052 %c character special files
1053 r owner-readable files (0400)
1054 w owner-writable files (0200)
1055 x owner-executable files (0100)
1056 A group-readable files (0040)
1057 I group-writable files (0020)
1058 E group-executable files (0010)
1059 R world-readable files (0004)
1060 W world-writable files (0002)
1061 X world-executable files (0001)
1062 s setuid files (04000)
1063 S setgid files (02000)
1064 t files with the sticky bit (01000)
1066 print *(m-1) # Files modified up to a day ago
1067 print *(a1) # Files accessed a day ago
1068 print *(@) # Just symlinks
1069 print *(Lk+50) # Files bigger than 50 kilobytes
1070 print *(Lk-50) # Files smaller than 50 kilobytes
1071 print **/*.c # All *.c files recursively starting in \$PWD
1072 print **/*.c~file.c # Same as above, but excluding 'file.c'
1073 print (foo|bar).* # Files starting with 'foo' or 'bar'
1074 print *~*.* # All Files that do not contain a dot
1075 chmod 644 *(.^x) # make all plain non-executable files publically readable
1076 print -l *(.c|.h) # Lists *.c and *.h
1077 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1078 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1080 alias help-zshglob=H-Glob
1082 type -p qma &>/dev/null && alias ?='qma zshall'
1084 # grep for running process, like: 'any vim'
1086 if [ -z "$1" ] ; then
1087 echo "any - grep for process(es) by keyword" >&2
1088 echo "Usage: any <keyword>" >&2 ; return 1
1091 local LENGTH=$(expr length $STRING)
1092 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1093 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1094 ps xauwww| grep "[$FIRSCHAR]$REST"
1098 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1099 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1100 [ -r /proc/1/maps ] && deswap() {
1101 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1102 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1103 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1106 # print hex value of a number
1108 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1111 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1112 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1114 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1115 perl -e "print eval($CALC),\"\n\";"
1117 functions peval &>/dev/null && alias calc=peval
1119 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1121 # NO_SWITCH="yes" command bash "$@"
1124 # exec $SHELL $SHELL_ARGS "$@"
1129 # log out? set timeout in seconds {{{
1131 # do not log out in some specific terminals:
1132 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1137 # {{{ make sure our environment is clean regarding colors
1138 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1141 # source another config file if present {{{
1142 if [ -r /etc/zsh/zshrc.local ]; then
1143 source /etc/zsh/zshrc.local
1147 # "persistent history" {{{
1148 # just write important commands you always need to ~/.important_commands
1149 if [ -r ~/.important_commands ] ; then
1150 fc -R ~/.important_commands
1154 ## END OF FILE #################################################################
1155 # vim:foldmethod=marker expandtab