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
261 # print 'Notice: no url-quote-magic available :('
263 alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
265 alias run-help >&/dev/null && unalias run-help
266 autoload run-help # use via 'esc-h'
269 if autoload -U compinit && compinit 2>/dev/null ; then
270 compinit 2>/dev/null || print 'Notice: no compinit available :('
272 print 'Notice: no compinit available :('
277 is4 && autoload -U zed # use ZLE editor to edit a file or function
279 is4 && for mod in complist deltochar mathfunc ; do
280 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
283 # autoload zsh modules when they are referenced
284 is4 && for opt mod in a stat \
288 zmodload -${opt} zsh/${mod} ${mod}
291 is4 && autoload -U insert-files && \
292 zle -N insert-files && \
293 bindkey "^Xf" insert-files # C-x-f
295 bindkey ' ' magic-space # also do history expansion on space
296 bindkey '\ei' menu-complete # menu completion via esc-i
298 # press esc-e for editing command line in $EDITOR or $VISUAL
299 is4 && autoload -U edit-command-line && \
300 zle -N edit-command-line && \
301 bindkey '\ee' edit-command-line
303 # menu selection: pick item but stay in the menu (press esc-return)
304 is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
306 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
307 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
308 bindkey '\C-ed' _bkdate
311 # press esc-m for inserting last typed word again (thanks to caphuso!)
312 insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
313 zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
315 # set command prediction from history, see 'man 1 zshcontrib'
316 # is4 && autoload -U predict-on && \
317 # zle -N predict-on && \
318 # zle -N predict-off && \
319 # bindkey "^X^Z" predict-on && \
320 # bindkey "^Z" predict-off
322 # put job into foreground via ctrl-z:
323 bindkey -s '^z' "fg\n"
325 # press ctrl-q to quote line:
327 # zle beginning-of-line
329 # # RBUFFER="'$RBUFFER'"
330 # RBUFFER=${(q)RBUFFER}
333 # zle -N mquote && bindkey '^q' mquote
335 # run command line as user root via sudo:
336 _sudo-command-line() {
337 [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
339 zle -N sudo-command-line _sudo-command-line
340 bindkey "^Os" sudo-command-line
343 # {{{ set some important options
344 (( EUID != 0 )) && umask 002 || umask 022
347 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
348 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
349 setopt extended_history # save each command's beginning timestamp and the duration to the history file
350 is4 && setopt histignorealldups # If a new command line being added to the history
351 # list duplicates an older one, the older command is removed from the list
352 setopt histignorespace # remove command lines from the history list when
353 # the first character on the line is a space
354 # setopt histallowclobber # add `|' to output redirections in the history
355 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
356 setopt auto_cd # if a command is issued that can't be executed as a normal command,
357 # and the command is the name of a directory, perform the cd command to that directory
358 setopt extended_glob # in order to use #, ~ and ^ for filename generation
359 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
360 # -> searches for word not in compressed files
361 # don't forget to quote '^', '~' and '#'!
362 setopt notify # report the status of backgrounds jobs immediately
363 setopt hash_list_all # Whenever a command completion is attempted, make sure \
364 # the entire command path is hashed first.
365 setopt completeinword # not just at the end
366 # setopt nocheckjobs # don't warn me about bg processes when exiting
367 setopt nohup # and don't kill them, either
368 # setopt printexitvalue # alert me if something failed
369 # setopt dvorak # with spelling correction, assume dvorak kb
370 setopt auto_pushd # make cd push the old directory onto the directory stack.
371 setopt nonomatch # try to avoid the 'zsh: no matches found...'
372 setopt nobeep # avoid "beep"ing
374 MAILCHECK=30 # mailchecks
375 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 secondes
376 watch=(notme root) # watch for everyone but me and root
378 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
379 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
381 # WORDCHARS='*?_[]~=&;!#$%^(){}'
382 # WORDCHARS='${WORDCHARS:s@/@}'
384 # only slash should be considered as a word separator:
385 slash-backward-kill-word() {
386 local WORDCHARS="${WORDCHARS:s@/@}"
388 zle backward-kill-word
390 zle -N slash-backward-kill-word
391 bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
395 export ZSHDIR=$HOME/.zsh
396 HISTFILE=$HOME/.zsh_history
397 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
398 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
401 # dirstack handling {{{
403 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
404 dirstack=( ${(uf)"$(< ~/.zdirs)"} )
405 # "cd -" won't work after login by just setting $OLDPWD, so
406 cd $dirstack[0] && cd $OLDPWD
409 builtin dirs -pl >! ~/.zdirs
413 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
414 if [ -n "$BATTERY" ] ; then
415 if [ -x $(which acpi) ] ; then
416 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
417 [ -z "$PERCENT" ] && PERCENT='acpi not present'
418 if [ "${PERCENT%%%}" -lt 20 ] ; then
419 PERCENT="warning: ${PERCENT}%"
426 if autoload promptinit && promptinit 2>/dev/null ; then
427 promptinit # people should be able to use their favourite prompt
429 print 'Notice: no promptinit available :('
432 # precmd() => a function which is executed just before each prompt
433 # use 'NOPRECMD=1' to disable the precmd + preexec commands
435 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
437 is4 && [[ -z $NOPRECMD ]] && precmd () {
438 [[ -n $NOPRECMD ]] && return 0
439 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
440 if [[ -z ${DONTSETRPROMPT} ]] ; then
441 if [ -n "$BATTERY" ] ; then
442 # RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
443 RPROMPT="${PERCENT}${SCREENTITLE}"
445 # RPROMPT="%(?..:()% ${SCREENTITLE}"
446 RPROMPT="${SCREENTITLE}"
449 # adjust title of xterm
450 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
451 case $TERM in (xterm*|rxvt)
452 print -Pn "\e]0;%n@%m: %~\a"
457 # chpwd () => a function which is executed whenever the directory is changed
459 # preexec() => a function running before every command
460 is4 && [[ -z $NOPRECMD ]] && preexec () {
461 [[ -n $NOPRECMD ]] && return 0
462 # set hostname if not running on host with name 'grml'
463 local HOSTNAME=$(hostname)
464 if [[ "$HOSTNAME" != grml ]] ; then
467 # get the name of the program currently running and hostname of local machine
468 # set screen window title if running in a screen
469 if [[ "$TERM" == screen* ]]; then
470 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
471 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
472 echo -ne "\ek$CMD\e\\"
474 # set the screen title to "zsh" when sitting at the command prompt:
475 if [[ "$TERM" == screen* ]]; then
476 SCREENTITLE=$'%{\ekzsh\e\\%}'
480 # adjust title of xterm
481 case $TERM in (xterm*|rxvt)
482 print -Pn "\e]0;%n@%m: $1\a"
488 if autoload colors && colors 2>/dev/null ; then
489 BLUE="%{${fg[blue]}%}"
490 RED="%{${fg_bold[red]}%}"
491 GREEN="%{${fg[green]}%}"
492 CYAN="%{${fg[cyan]}%}"
493 WHITE="%{${fg[white]}%}"
494 NO_COLOUR="%{${reset_color}%}"
501 NO_COLOUR="%{
\e[0m%}"
504 EXITCODE="%(?..%?%1v )"
505 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
506 PS3='?# ' # selection prompt used within a select loop.
507 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
509 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
510 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
511 debian_chroot=$(cat /etc/debian_chroot)
514 # don't use colors on dumb terminals (like emacs):
515 if [[ "$TERM" == dumb ]] ; then
516 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
518 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
519 # set variable identifying the chroot you work in (used in the prompt below)
520 if [[ -n "$GRMLPROMPT" ]]; then
521 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
522 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
524 if (( EUID != 0 )); then
525 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
527 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
532 # if we are inside a grml-chroot set a specific prompt theme
533 if [ -n "$GRML_CHROOT" ] ; then
534 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
538 # {{{ 'hash' some often used directories
539 hash -d deb=/var/cache/apt/archives
540 hash -d doc=/usr/share/doc
541 hash -d linux=/lib/modules/$(command uname -r)/build/
543 hash -d slog=/var/log/syslog
545 hash -d templ=/usr/share/doc/grml-templates
546 hash -d tt=/usr/share/doc/texttools-doc
551 if [ $UID = 0 ] ; then
552 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
553 elif [ -r $HOME/.screenrc ] ; then
554 alias screen="/usr/bin/screen -c $HOME/.screenrc"
556 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
559 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
560 alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
561 alias la='ls -la --color=auto'
562 alias ll='ls -l --color=auto'
563 alias lh='ls -hAl --color=auto'
564 alias l='ls -lF --color=auto'
573 alias mdstat='cat /proc/mdstat'
574 alias ...='cd ../../'
576 alias cp='nocorrect cp' # no spelling correction on cp
577 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
578 alias mv='nocorrect mv' # no spelling correction on mv
579 alias rm='nocorrect rm' # no spelling correction on rm
584 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
585 alias term2iso="echo 'Setting terminal to iso mode' ; echo -e '
\e%@'"
586 alias term2utf="echo 'Setting terminal to utf-8 mode'; echo -e '
\e%G'"
588 alias utf2iso='if isutfenv ; then
589 for ENV in `env | grep UTF` ; do
590 eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')"
593 alias iso2utf='if isutfenv ; then
594 for ENV in `env | grep '\.iso'` ; do
595 eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')"
599 # set up software synthesizer via speakup
601 aumix -w 90 -v 90 -p 90 -m 90
602 if ! [ -r /dev/softsynth ] ; then
603 flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
609 nice -n -20 speechd-up
610 flite -o play -t "Finished setting up software synthesizer"
614 # I like clean prompt, so provide simple way to get that
615 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
617 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
618 if [ -x /usr/sbin/truecrypt ] ; then
620 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
622 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
626 zsh-help(){print "$bg[white]$fg[black]
627 zsh-help - hints for use of zsh on grml
628 =======================================$reset_color
630 Main configuration of zsh happens in /etc/zsh/zshrc (global)
631 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
632 The files are part of the package grml-etc-core, if you want to
633 use them on a non-grml-system just get the tar.gz from
634 http://deb.grml.org/ or get the files from the mercurial
637 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
638 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
640 If you want to stay in sync with zsh configuration of grml
641 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
642 your own stuff in \$HOME/.zshrc.local. System wide configuration
643 without touching configuration files of grml can take place
644 in /etc/zsh/zshrc.local.
646 If you want to use the configuration of user grml also when
647 running as user root just run 'zshskel' which will source
648 the file /etc/skel/.zshrc.
650 For information regarding zsh start at http://grml.org/zsh/
652 Take a look at grml's zsh refcard:
653 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
655 Check out the main zsh refcard:
656 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
658 And of course visit the zsh-lovers:
661 You can adjust some options through environment variables when
662 invoking zsh without having to edit configuration files.
663 Basically meant for bash users who are not used to the power of
666 \"NOCOR=1 zsh\" => deactivate automatic correction
667 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
668 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
669 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
671 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
672 Enjoy your grml system with the zsh!$reset_color"
676 if [ -r /etc/debian_version ] ; then
677 alias acs='apt-cache search'
678 alias acsh='apt-cache show'
679 alias acp='apt-cache policy'
680 alias adg="$SUDO apt-get dist-upgrade"
681 alias agi="$SUDO apt-get install"
682 alias ati="$SUDO aptitude install"
683 alias ag="$SUDO apt-get upgrade"
684 alias au="$SUDO apt-get update"
685 alias up="$SUDO aptitude update ; $SUDO aptitude upgrade"
686 alias dbp='dpkg-buildpackage'
687 alias ge='grep-excuses'
691 if [ -z "$1" ] ; then
693 $SUDO apt-get -u upgrade
695 ssh $1 $SUDO apt-get update
696 # ask before the upgrade
698 ssh $1 $SUDO apt-get --no-act upgrade
699 echo -n 'Process the upgrade?'
701 if [[ $dummy == "y" ]] ; then
702 ssh $1 $SUDO apt-get -u upgrade --yes
707 isgrmlcd && alias su="sudo su" # change to user root
708 alias tlog="tail -f /var/log/syslog" # take a look at the syslog
709 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
712 # sort installed Debian-packages by size
713 if [ -x /usr/bin/grep-status ] ; then
714 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
715 -n "install ok installed" | paste -sd " \n" | sort -rn'
718 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
719 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
720 if [ -x $(which wodim) ] ; then
721 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
722 See #377109 in the BTS of Debian for more details.
724 Please use the wodim binary instead' ; return 1"
728 # get_tw_cli has been renamed into get_3ware
729 if [ -x /usr/bin/get_3ware ] ; then
731 echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
736 # I hate lacking backward compability, so provide an alternative therefore
737 if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
738 function apache2-ssl-certificate(){
740 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
741 print 'You might want to take a look at Debian the package ssl-cert as well.'
742 print 'To generate a certificate for use with apache2 follow the instructions:'
746 export RANDFILE=/dev/random
747 mkdir /etc/apache2/ssl/
748 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
749 chmod 600 /etc/apache2/ssl/apache.pem
751 Run "grml-tips ssl-certificate" if you need further instructions.
757 # {{{ Use hard limits, except for a smaller stack and no core dumps
760 isgrmlcd && limit core 0 # important for a live-cd-system
764 # {{{ completion stuff
766 # Where to look for autoloaded function definitions
767 if [ -d /etc/zsh/completion.d ] ; then
768 local comp=/etc/zsh/completion.d
769 for func in $comp/*(N-.:t); . ${comp}/${func}
772 # called later (via is4 && grmlcomp)
773 # notice: use 'zstyle' for getting current settings
774 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
777 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
778 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
779 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
780 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
781 zstyle ':completion:*:correct:*' original true #
782 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
783 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
784 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
785 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
786 zstyle ':completion:*:history-words' list false #
787 zstyle ':completion:*:history-words' menu yes # activate menu
788 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
789 zstyle ':completion:*:history-words' stop yes #
790 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
791 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
792 zstyle ':completion:*' group-name ''
793 if [[ -z "$NOMENU" ]] ; then
794 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
796 setopt no_auto_menu # don't use any menus at all
798 zstyle ':completion:*:messages' format '%d' #
799 zstyle ':completion:*:options' auto-description '%d' #
800 zstyle ':completion:*:options' description 'yes' # describe options in full
801 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
802 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
803 zstyle ':completion:*' verbose true # provide verbose completion information
804 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
805 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
806 zstyle ':completion:correct:' prompt 'correct to: %e' #
807 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
809 # complete manual by their section
810 zstyle ':completion:*:manuals' separate-sections true
811 zstyle ':completion:*:manuals.*' insert-sections true
812 zstyle ':completion:*:man:*' menu yes select
815 # run rehash on completion so new installed program are found automatically:
817 (( CURRENT == 1 )) && rehash
818 return 1 # Because we didn't really complete anything
820 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
821 if [[ -n "$NOCOR" ]] ; then
822 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files
823 setopt nocorrect # do not try to correct the spelling if possible
825 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files
826 setopt correct # try to correct the spelling if possible
827 zstyle -e ':completion:*' completer '
828 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
829 _last_try="$HISTNO$BUFFER$CURSOR"
830 reply=(_complete _match _prefix _files)
832 if [[ $words[1] = (rm|mv) ]]; then
833 reply=(_complete _files)
835 reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files)
839 # zstyle ':completion:*' completer _complete _correct _approximate
840 # zstyle ':completion:*' expand prefix suffix
842 # automatic rehash? Credits go to Frank Terbeck
843 # function my_accept () {
845 # [[ -z ${BUFFER} ]] && zle accept-line && return
846 # buf=( ${(z)BUFFER} )
847 # [[ -z ${commands[${buf[1]}]} ]] && rehash
851 # bindkey "^M" my_accept
853 # command for process lists, the local web server details and host completion
854 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
857 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
858 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
860 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
862 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
863 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
875 zstyle ':completion:*:hosts' hosts $hosts
876 # zstyle '*' hosts $hosts
878 # specify your logins:
880 # {grml,grml1}@foo.invalid
881 # grml-devel@bar.invalid
884 # {fred,root}@foo.invalid
887 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
888 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
890 # specify specific port/service settings:
891 # telnet_users_hosts_ports=(
894 # @mail-server:{smtp,pop3}
898 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
900 # use generic completion system for programs not yet defined:
901 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
903 # see upgrade function in this file
904 compdef _hosts upgrade
910 # people should use 'grml-x'!
912 if [ -e /etc/X11/xorg.conf ] ; then
913 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
915 echo "Please use the script \"grml-x\" for starting the X Window System
916 because there does not exist /etc/X11/xorg.conf yet.
917 If you want to use startx anyway please call \"/usr/bin/startx\"."
923 if [ -e /etc/X11/xorg.conf ] ; then
924 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
926 echo "Please use the script \"grml-x\" for starting the X Window System.
927 because there does not exist /etc/X11/xorg.conf yet.
928 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
933 if [ -x /usr/sbin/915resolution ] ; then
934 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
937 alias grml-version='cat /etc/grml_version'
939 if [ -x /usr/sbin/rebuildfstab ] ; then
940 alias grml-rebuildfstab='rebuildfstab -v -r -config'
945 # {{{ now run the functions
947 is4 && isgrml && grmlstuff
952 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
955 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
956 # You use it as follows:
957 # $ NTREF=/reference/file
959 # This lists all the files in the current directory newer than the reference file.
960 # You can also specify the reference file inline; note quotes:
961 # $ ls -l *(e:'nt ~/.zshenv':)
966 [[ $REPLY -nt $NTREF ]]
970 # shell functions {{{
971 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
972 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
974 if [[ "$#*" -eq 0 ]]; then
975 [ -r ~/.zshrc ] && . ~/.zshrc
984 compdef _functions reload freload
986 # list symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
988 [ -z "$1" ] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
991 while [ -h "$file" ] ; do
993 file=$(readlink "$file")
999 if type -p qma &>/dev/null ; then
1000 manzsh() { qma zshall "$1" }
1003 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1004 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
1005 # manzsh() { man zshall | $MYLESS -p $1 ; }
1008 if [ -x /usr/bin/most ] ; then
1009 # use "dchange <package-name>" to view Debian's changelog of the package:
1011 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
1012 most /usr/share/doc/${1}/changelog.Debian.gz
1014 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1015 most /usr/share/doc/${1}/changelog.gz
1017 echo "No changelog for package $1 found, sorry."
1022 _dchange() { _files -W /usr/share/doc -/ }
1023 compdef _dchange dchange
1025 # use "uchange <package-name>" to view upstream's changelog of the package:
1027 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1028 most /usr/share/doc/${1}/changelog.gz
1030 echo "No changelog for package $1 found, sorry."
1034 _uchange() { _files -W /usr/share/doc -/ }
1035 compdef _uchange uchange
1040 ZSH_PROFILE_RC=1 $SHELL "$@"
1043 # edit alias via zle:
1045 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1047 compdef _aliases edalias
1049 # edit function via zle:
1051 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1053 compdef _functions edfunc
1055 # use it e.g. via 'Restart apache2'
1056 if [ -d /etc/init.d ] ; then
1057 for i in Start Restart Stop Force-Reload Reload ; do
1058 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1060 # now the completion for this:
1061 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
1064 # provide useful information on globbing
1071 p named pipes (FIFOs)
1072 * executable plain files (0100)
1073 % device files (character or block special)
1074 %b block special files
1075 %c character special files
1076 r owner-readable files (0400)
1077 w owner-writable files (0200)
1078 x owner-executable files (0100)
1079 A group-readable files (0040)
1080 I group-writable files (0020)
1081 E group-executable files (0010)
1082 R world-readable files (0004)
1083 W world-writable files (0002)
1084 X world-executable files (0001)
1085 s setuid files (04000)
1086 S setgid files (02000)
1087 t files with the sticky bit (01000)
1089 print *(m-1) # Files modified up to a day ago
1090 print *(a1) # Files accessed a day ago
1091 print *(@) # Just symlinks
1092 print *(Lk+50) # Files bigger than 50 kilobytes
1093 print *(Lk-50) # Files smaller than 50 kilobytes
1094 print **/*.c # All *.c files recursively starting in \$PWD
1095 print **/*.c~file.c # Same as above, but excluding 'file.c'
1096 print (foo|bar).* # Files starting with 'foo' or 'bar'
1097 print *~*.* # All Files that do not contain a dot
1098 chmod 644 *(.^x) # make all plain non-executable files publically readable
1099 print -l *(.c|.h) # Lists *.c and *.h
1100 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1101 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1103 alias help-zshglob=H-Glob
1105 type -p qma &>/dev/null && alias ?='qma zshall'
1107 # grep for running process, like: 'any vim'
1109 if [ -z "$1" ] ; then
1110 echo "any - grep for process(es) by keyword" >&2
1111 echo "Usage: any <keyword>" >&2 ; return 1
1114 local LENGTH=$(expr length $STRING)
1115 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1116 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1117 ps xauwww| grep "[$FIRSCHAR]$REST"
1121 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1122 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1123 [ -r /proc/1/maps ] && deswap() {
1124 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1125 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1126 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1129 # print hex value of a number
1131 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1134 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1135 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1137 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1138 perl -e "print eval($CALC),\"\n\";"
1140 functions peval &>/dev/null && alias calc=peval
1142 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1144 # NO_SWITCH="yes" command bash "$@"
1147 # exec $SHELL $SHELL_ARGS "$@"
1152 # log out? set timeout in seconds {{{
1154 # do not log out in some specific terminals:
1155 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1160 # {{{ make sure our environment is clean regarding colors
1161 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1164 # source another config file if present {{{
1165 if [ -r /etc/zsh/zshrc.local ]; then
1166 source /etc/zsh/zshrc.local
1170 # "persistent history" {{{
1171 # just write important commands you always need to ~/.important_commands
1172 if [ -r ~/.important_commands ] ; then
1173 fc -R ~/.important_commands
1177 ## END OF FILE #################################################################
1178 # vim:foldmethod=marker expandtab