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: Son Apr 15 22:36:24 CEST 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
260 # zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
262 # print 'Notice: no url-quote-magic available :('
264 alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
266 alias run-help >&/dev/null && unalias run-help
267 autoload run-help # use via 'esc-h'
270 if autoload -U compinit && compinit 2>/dev/null ; then
271 compinit 2>/dev/null || print 'Notice: no compinit available :('
273 print 'Notice: no compinit available :('
278 is4 && autoload -U zed # use ZLE editor to edit a file or function
280 is4 && for mod in complist deltochar mathfunc ; do
281 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
284 # autoload zsh modules when they are referenced
285 is4 && for opt mod in a stat \
289 zmodload -${opt} zsh/${mod} ${mod}
292 is4 && autoload -U insert-files && \
293 zle -N insert-files && \
294 bindkey "^Xf" insert-files # C-x-f
296 bindkey ' ' magic-space # also do history expansion on space
297 bindkey '\ei' menu-complete # menu completion via esc-i
299 # press esc-e for editing command line in $EDITOR or $VISUAL
300 is4 && autoload -U edit-command-line && \
301 zle -N edit-command-line && \
302 bindkey '\ee' edit-command-line
304 # menu selection: pick item but stay in the menu (press esc-return)
305 is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
307 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
308 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
309 bindkey '\C-ed' _bkdate
312 # press esc-m for inserting last typed word again (thanks to caphuso!)
313 insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
314 zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
316 # set command prediction from history, see 'man 1 zshcontrib'
317 # is4 && autoload -U predict-on && \
318 # zle -N predict-on && \
319 # zle -N predict-off && \
320 # bindkey "^X^Z" predict-on && \
321 # bindkey "^Z" predict-off
323 # put job into foreground via ctrl-z:
324 bindkey -s '^z' "fg\n"
326 # press ctrl-q to quote line:
328 # zle beginning-of-line
330 # # RBUFFER="'$RBUFFER'"
331 # RBUFFER=${(q)RBUFFER}
334 # zle -N mquote && bindkey '^q' mquote
336 # run command line as user root via sudo:
337 _sudo-command-line() {
338 [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
340 zle -N sudo-command-line _sudo-command-line
341 bindkey "^Os" sudo-command-line
344 # {{{ set some important options
345 (( EUID != 0 )) && umask 002 || umask 022
348 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
349 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
350 setopt extended_history # save each command's beginning timestamp and the duration to the history file
351 is4 && setopt histignorealldups # If a new command line being added to the history
352 # list duplicates an older one, the older command is removed from the list
353 setopt histignorespace # remove command lines from the history list when
354 # the first character on the line is a space
355 # setopt histallowclobber # add `|' to output redirections in the history
356 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
357 setopt auto_cd # if a command is issued that can't be executed as a normal command,
358 # and the command is the name of a directory, perform the cd command to that directory
359 setopt extended_glob # in order to use #, ~ and ^ for filename generation
360 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
361 # -> searches for word not in compressed files
362 # don't forget to quote '^', '~' and '#'!
363 setopt notify # report the status of backgrounds jobs immediately
364 setopt hash_list_all # Whenever a command completion is attempted, make sure \
365 # the entire command path is hashed first.
366 setopt completeinword # not just at the end
367 # setopt nocheckjobs # don't warn me about bg processes when exiting
368 setopt nohup # and don't kill them, either
369 # setopt printexitvalue # alert me if something failed
370 # setopt dvorak # with spelling correction, assume dvorak kb
371 setopt auto_pushd # make cd push the old directory onto the directory stack.
372 setopt nonomatch # try to avoid the 'zsh: no matches found...'
373 setopt nobeep # avoid "beep"ing
375 MAILCHECK=30 # mailchecks
376 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 secondes
377 watch=(notme root) # watch for everyone but me and root
379 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
380 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
382 # WORDCHARS='*?_[]~=&;!#$%^(){}'
383 # WORDCHARS='${WORDCHARS:s@/@}'
385 # only slash should be considered as a word separator:
386 slash-backward-kill-word() {
387 local WORDCHARS="${WORDCHARS:s@/@}"
389 zle backward-kill-word
391 zle -N slash-backward-kill-word
392 bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
396 export ZSHDIR=$HOME/.zsh
397 HISTFILE=$HOME/.zsh_history
398 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
399 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
402 # dirstack handling {{{
404 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
405 dirstack=( ${(uf)"$(< ~/.zdirs)"} )
406 # "cd -" won't work after login by just setting $OLDPWD, so
407 cd $dirstack[0] && cd $OLDPWD
410 builtin dirs -pl >! ~/.zdirs
414 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
415 if [ -n "$BATTERY" ] ; then
416 if [ -x $(which acpi) ] ; then
417 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
418 [ -z "$PERCENT" ] && PERCENT='acpi not present'
419 if [ "${PERCENT%%%}" -lt 20 ] ; then
420 PERCENT="warning: ${PERCENT}%"
427 if autoload promptinit && promptinit 2>/dev/null ; then
428 promptinit # people should be able to use their favourite prompt
430 print 'Notice: no promptinit available :('
433 # precmd() => a function which is executed just before each prompt
434 # use 'NOPRECMD=1' to disable the precmd + preexec commands
436 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
438 is4 && [[ -z $NOPRECMD ]] && precmd () {
439 [[ -n $NOPRECMD ]] && return 0
440 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
441 if [[ -z ${DONTSETRPROMPT} ]] ; then
442 if [ -n "$BATTERY" ] ; then
443 # RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
444 RPROMPT="${PERCENT}${SCREENTITLE}"
446 # RPROMPT="%(?..:()% ${SCREENTITLE}"
447 RPROMPT="${SCREENTITLE}"
450 # adjust title of xterm
451 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
452 case $TERM in (xterm*|rxvt)
453 print -Pn "\e]0;%n@%m: %~\a"
458 # chpwd () => a function which is executed whenever the directory is changed
460 # preexec() => a function running before every command
461 is4 && [[ -z $NOPRECMD ]] && preexec () {
462 [[ -n $NOPRECMD ]] && return 0
463 # set hostname if not running on host with name 'grml'
464 local HOSTNAME=$(hostname)
465 if [[ "$HOSTNAME" != grml ]] ; then
468 # get the name of the program currently running and hostname of local machine
469 # set screen window title if running in a screen
470 if [[ "$TERM" == screen* ]]; then
471 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
472 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
473 echo -ne "\ek$CMD\e\\"
475 # set the screen title to "zsh" when sitting at the command prompt:
476 if [[ "$TERM" == screen* ]]; then
477 SCREENTITLE=$'%{\ekzsh\e\\%}'
481 # adjust title of xterm
482 case $TERM in (xterm*|rxvt)
483 print -Pn "\e]0;%n@%m: $1\a"
489 if autoload colors && colors 2>/dev/null ; then
490 BLUE="%{${fg[blue]}%}"
491 RED="%{${fg_bold[red]}%}"
492 GREEN="%{${fg[green]}%}"
493 CYAN="%{${fg[cyan]}%}"
494 WHITE="%{${fg[white]}%}"
495 NO_COLOUR="%{${reset_color}%}"
502 NO_COLOUR="%{
\e[0m%}"
505 EXITCODE="%(?..%?%1v )"
506 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
507 PS3='?# ' # selection prompt used within a select loop.
508 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
510 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
511 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
512 debian_chroot=$(cat /etc/debian_chroot)
515 # don't use colors on dumb terminals (like emacs):
516 if [[ "$TERM" == dumb ]] ; then
517 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
519 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
520 # set variable identifying the chroot you work in (used in the prompt below)
521 if [[ -n "$GRMLPROMPT" ]]; then
522 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
523 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
525 if (( EUID != 0 )); then
526 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
528 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
533 # if we are inside a grml-chroot set a specific prompt theme
534 if [ -n "$GRML_CHROOT" ] ; then
535 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
539 # {{{ 'hash' some often used directories
540 hash -d deb=/var/cache/apt/archives
541 hash -d doc=/usr/share/doc
542 hash -d linux=/lib/modules/$(command uname -r)/build/
544 hash -d slog=/var/log/syslog
546 hash -d templ=/usr/share/doc/grml-templates
547 hash -d tt=/usr/share/doc/texttools-doc
552 if [ $UID = 0 ] ; then
553 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
554 elif [ -r $HOME/.screenrc ] ; then
555 alias screen="/usr/bin/screen -c $HOME/.screenrc"
557 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
560 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
561 alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
562 alias la='ls -la --color=auto'
563 alias ll='ls -l --color=auto'
564 alias lh='ls -hAl --color=auto'
565 alias l='ls -lF --color=auto'
574 alias mdstat='cat /proc/mdstat'
575 alias ...='cd ../../'
577 alias cp='nocorrect cp' # no spelling correction on cp
578 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
579 alias mv='nocorrect mv' # no spelling correction on mv
580 alias rm='nocorrect rm' # no spelling correction on rm
585 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
586 alias term2iso="echo 'Setting terminal to iso mode' ; echo -e '
\e%@'"
587 alias term2utf="echo 'Setting terminal to utf-8 mode'; echo -e '
\e%G'"
589 alias utf2iso='if isutfenv ; then
590 for ENV in `env | grep UTF` ; do
591 eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')"
594 alias iso2utf='if isutfenv ; then
595 for ENV in `env | grep '\.iso'` ; do
596 eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')"
600 # set up software synthesizer via speakup
602 aumix -w 90 -v 90 -p 90 -m 90
603 if ! [ -r /dev/softsynth ] ; then
604 flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
610 nice -n -20 speechd-up
611 flite -o play -t "Finished setting up software synthesizer"
615 # I like clean prompt, so provide simple way to get that
616 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
618 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
619 if [ -x /usr/sbin/truecrypt ] ; then
621 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
623 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
627 zsh-help(){print "$bg[white]$fg[black]
628 zsh-help - hints for use of zsh on grml
629 =======================================$reset_color
631 Main configuration of zsh happens in /etc/zsh/zshrc (global)
632 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
633 The files are part of the package grml-etc-core, if you want to
634 use them on a non-grml-system just get the tar.gz from
635 http://deb.grml.org/ or get the files from the mercurial
638 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
639 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
641 If you want to stay in sync with zsh configuration of grml
642 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
643 your own stuff in \$HOME/.zshrc.local. System wide configuration
644 without touching configuration files of grml can take place
645 in /etc/zsh/zshrc.local.
647 If you want to use the configuration of user grml also when
648 running as user root just run 'zshskel' which will source
649 the file /etc/skel/.zshrc.
651 For information regarding zsh start at http://grml.org/zsh/
653 Take a look at grml's zsh refcard:
654 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
656 Check out the main zsh refcard:
657 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
659 And of course visit the zsh-lovers:
662 You can adjust some options through environment variables when
663 invoking zsh without having to edit configuration files.
664 Basically meant for bash users who are not used to the power of
667 \"NOCOR=1 zsh\" => deactivate automatic correction
668 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
669 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
670 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
672 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
673 Enjoy your grml system with the zsh!$reset_color"
677 if [ -r /etc/debian_version ] ; then
678 alias acs='apt-cache search'
679 alias acsh='apt-cache show'
680 alias acp='apt-cache policy'
681 alias adg="$SUDO apt-get dist-upgrade"
682 alias agi="$SUDO apt-get install"
683 alias ati="$SUDO aptitude install"
684 alias ag="$SUDO apt-get upgrade"
685 alias au="$SUDO apt-get update"
686 alias up="$SUDO aptitude update ; $SUDO aptitude upgrade"
687 alias dbp='dpkg-buildpackage'
688 alias ge='grep-excuses'
692 if [ -z "$1" ] ; then
694 $SUDO apt-get -u upgrade
696 ssh $1 $SUDO apt-get update
697 # ask before the upgrade
699 ssh $1 $SUDO apt-get --no-act upgrade
700 echo -n 'Process the upgrade?'
702 if [[ $dummy == "y" ]] ; then
703 ssh $1 $SUDO apt-get -u upgrade --yes
708 isgrmlcd && alias su="sudo su" # change to user root
709 alias tlog="tail -f /var/log/syslog" # take a look at the syslog
710 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
713 # sort installed Debian-packages by size
714 if [ -x /usr/bin/grep-status ] ; then
715 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
716 -n "install ok installed" | paste -sd " \n" | sort -rn'
719 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
720 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
721 if [ -x $(which wodim) ] ; then
722 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
723 See #377109 in the BTS of Debian for more details.
725 Please use the wodim binary instead' ; return 1"
729 # get_tw_cli has been renamed into get_3ware
730 if [ -x /usr/bin/get_3ware ] ; then
732 echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
737 # I hate lacking backward compability, so provide an alternative therefore
738 if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
739 function apache2-ssl-certificate(){
741 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
742 print 'You might want to take a look at Debian the package ssl-cert as well.'
743 print 'To generate a certificate for use with apache2 follow the instructions:'
747 export RANDFILE=/dev/random
748 mkdir /etc/apache2/ssl/
749 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
750 chmod 600 /etc/apache2/ssl/apache.pem
752 Run "grml-tips ssl-certificate" if you need further instructions.
758 # {{{ Use hard limits, except for a smaller stack and no core dumps
761 isgrmlcd && limit core 0 # important for a live-cd-system
765 # {{{ completion stuff
767 # Where to look for autoloaded function definitions
768 if [ -d /etc/zsh/completion.d ] ; then
769 local comp=/etc/zsh/completion.d
770 for func in $comp/*(N-.:t); . ${comp}/${func}
773 # called later (via is4 && grmlcomp)
774 # notice: use 'zstyle' for getting current settings
775 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
778 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
779 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
780 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
781 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
782 zstyle ':completion:*:correct:*' original true #
783 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
784 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
785 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
786 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
787 zstyle ':completion:*:history-words' list false #
788 zstyle ':completion:*:history-words' menu yes # activate menu
789 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
790 zstyle ':completion:*:history-words' stop yes #
791 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
792 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
793 zstyle ':completion:*' group-name ''
794 if [[ -z "$NOMENU" ]] ; then
795 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
797 setopt no_auto_menu # don't use any menus at all
799 zstyle ':completion:*:messages' format '%d' #
800 zstyle ':completion:*:options' auto-description '%d' #
801 zstyle ':completion:*:options' description 'yes' # describe options in full
802 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
803 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
804 zstyle ':completion:*' verbose true # provide verbose completion information
805 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
806 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
807 zstyle ':completion:correct:' prompt 'correct to: %e' #
808 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
810 # complete manual by their section
811 zstyle ':completion:*:manuals' separate-sections true
812 zstyle ':completion:*:manuals.*' insert-sections true
813 zstyle ':completion:*:man:*' menu yes select
816 # run rehash on completion so new installed program are found automatically:
818 (( CURRENT == 1 )) && rehash
819 return 1 # Because we didn't really complete anything
821 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
822 if [[ -n "$NOCOR" ]] ; then
823 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files
824 setopt nocorrect # do not try to correct the spelling if possible
826 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files
827 setopt correct # try to correct the spelling if possible
828 zstyle -e ':completion:*' completer '
829 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
830 _last_try="$HISTNO$BUFFER$CURSOR"
831 reply=(_complete _match _prefix _files)
833 if [[ $words[1] = (rm|mv) ]]; then
834 reply=(_complete _files)
836 reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files)
840 # zstyle ':completion:*' completer _complete _correct _approximate
841 # zstyle ':completion:*' expand prefix suffix
843 # automatic rehash? Credits go to Frank Terbeck
844 # function my_accept () {
846 # [[ -z ${BUFFER} ]] && zle accept-line && return
847 # buf=( ${(z)BUFFER} )
848 # [[ -z ${commands[${buf[1]}]} ]] && rehash
852 # bindkey "^M" my_accept
854 # command for process lists, the local web server details and host completion
855 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
858 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
859 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
861 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
863 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
864 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
876 zstyle ':completion:*:hosts' hosts $hosts
877 # zstyle '*' hosts $hosts
879 # specify your logins:
881 # {grml,grml1}@foo.invalid
882 # grml-devel@bar.invalid
885 # {fred,root}@foo.invalid
888 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
889 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
891 # specify specific port/service settings:
892 # telnet_users_hosts_ports=(
895 # @mail-server:{smtp,pop3}
899 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
901 # use generic completion system for programs not yet defined:
902 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
904 # see upgrade function in this file
905 compdef _hosts upgrade
911 # people should use 'grml-x'!
913 if [ -e /etc/X11/xorg.conf ] ; then
914 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
916 echo "Please use the script \"grml-x\" for starting the X Window System
917 because there does not exist /etc/X11/xorg.conf yet.
918 If you want to use startx anyway please call \"/usr/bin/startx\"."
924 if [ -e /etc/X11/xorg.conf ] ; then
925 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
927 echo "Please use the script \"grml-x\" for starting the X Window System.
928 because there does not exist /etc/X11/xorg.conf yet.
929 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
934 if [ -x /usr/sbin/915resolution ] ; then
935 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
938 alias grml-version='cat /etc/grml_version'
940 if [ -x /usr/sbin/rebuildfstab ] ; then
941 alias grml-rebuildfstab='rebuildfstab -v -r -config'
946 # {{{ now run the functions
948 is4 && isgrml && grmlstuff
953 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
956 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
957 # You use it as follows:
958 # $ NTREF=/reference/file
960 # This lists all the files in the current directory newer than the reference file.
961 # You can also specify the reference file inline; note quotes:
962 # $ ls -l *(e:'nt ~/.zshenv':)
967 [[ $REPLY -nt $NTREF ]]
971 # shell functions {{{
972 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
973 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
975 if [[ "$#*" -eq 0 ]]; then
976 [ -r ~/.zshrc ] && . ~/.zshrc
985 compdef _functions reload freload
987 # list symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
989 [ -z "$1" ] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
992 while [ -h "$file" ] ; do
994 file=$(readlink "$file")
1000 if type -p qma &>/dev/null ; then
1001 manzsh() { qma zshall "$1" }
1004 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1005 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
1006 # manzsh() { man zshall | $MYLESS -p $1 ; }
1009 if [ -x /usr/bin/most ] ; then
1010 # use "dchange <package-name>" to view Debian's changelog of the package:
1012 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
1013 most /usr/share/doc/${1}/changelog.Debian.gz
1015 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1016 most /usr/share/doc/${1}/changelog.gz
1018 echo "No changelog for package $1 found, sorry."
1023 _dchange() { _files -W /usr/share/doc -/ }
1024 compdef _dchange dchange
1026 # use "uchange <package-name>" to view upstream's changelog of the package:
1028 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1029 most /usr/share/doc/${1}/changelog.gz
1031 echo "No changelog for package $1 found, sorry."
1035 _uchange() { _files -W /usr/share/doc -/ }
1036 compdef _uchange uchange
1041 ZSH_PROFILE_RC=1 $SHELL "$@"
1044 # edit alias via zle:
1046 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1048 compdef _aliases edalias
1050 # edit function via zle:
1052 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1054 compdef _functions edfunc
1056 # use it e.g. via 'Restart apache2'
1057 if [ -d /etc/init.d ] ; then
1058 for i in Start Restart Stop Force-Reload Reload ; do
1059 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1061 # now the completion for this:
1062 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
1065 # provide useful information on globbing
1072 p named pipes (FIFOs)
1073 * executable plain files (0100)
1074 % device files (character or block special)
1075 %b block special files
1076 %c character special files
1077 r owner-readable files (0400)
1078 w owner-writable files (0200)
1079 x owner-executable files (0100)
1080 A group-readable files (0040)
1081 I group-writable files (0020)
1082 E group-executable files (0010)
1083 R world-readable files (0004)
1084 W world-writable files (0002)
1085 X world-executable files (0001)
1086 s setuid files (04000)
1087 S setgid files (02000)
1088 t files with the sticky bit (01000)
1090 print *(m-1) # Files modified up to a day ago
1091 print *(a1) # Files accessed a day ago
1092 print *(@) # Just symlinks
1093 print *(Lk+50) # Files bigger than 50 kilobytes
1094 print *(Lk-50) # Files smaller than 50 kilobytes
1095 print **/*.c # All *.c files recursively starting in \$PWD
1096 print **/*.c~file.c # Same as above, but excluding 'file.c'
1097 print (foo|bar).* # Files starting with 'foo' or 'bar'
1098 print *~*.* # All Files that do not contain a dot
1099 chmod 644 *(.^x) # make all plain non-executable files publically readable
1100 print -l *(.c|.h) # Lists *.c and *.h
1101 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1102 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1104 alias help-zshglob=H-Glob
1106 type -p qma &>/dev/null && alias ?='qma zshall'
1108 # grep for running process, like: 'any vim'
1110 if [ -z "$1" ] ; then
1111 echo "any - grep for process(es) by keyword" >&2
1112 echo "Usage: any <keyword>" >&2 ; return 1
1115 local LENGTH=$(expr length $STRING)
1116 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1117 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1118 ps xauwww| grep "[$FIRSCHAR]$REST"
1122 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1123 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1124 [ -r /proc/1/maps ] && deswap() {
1125 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1126 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1127 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1130 # print hex value of a number
1132 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1135 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1136 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1138 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1139 perl -e "print eval($CALC),\"\n\";"
1141 functions peval &>/dev/null && alias calc=peval
1143 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1145 # NO_SWITCH="yes" command bash "$@"
1148 # exec $SHELL $SHELL_ARGS "$@"
1153 # log out? set timeout in seconds {{{
1155 # do not log out in some specific terminals:
1156 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1161 # {{{ make sure our environment is clean regarding colors
1162 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1165 # source another config file if present {{{
1166 if [ -r /etc/zsh/zshrc.local ]; then
1167 source /etc/zsh/zshrc.local
1171 # "persistent history" {{{
1172 # just write important commands you always need to ~/.important_commands
1173 if [ -r ~/.important_commands ] ; then
1174 fc -R ~/.important_commands
1178 ## END OF FILE #################################################################
1179 # vim:foldmethod=marker expandtab