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 # completion functions go to /etc/zsh/completion.d
92 # function files may be put into /etc/zsh/functions.d, from where they
93 # will be automatically autoloaded.
94 [[ -d /etc/zsh/completion.d ]] && fpath+=( /etc/zsh/completion.d )
95 if [[ -d /etc/zsh/functions.d ]] ; then
96 fpath+=( /etc/zsh/functions.d )
97 for func in /etc/zsh/functions.d/[^_]*[^~] ; do
102 # automatically remove duplicates from these arrays
103 typeset -U path cdpath fpath manpath
107 if [[ "$TERM" != emacs ]]; then
108 [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
109 [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
110 [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
111 [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
112 [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
113 [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
114 [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
115 [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
116 [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
117 [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
118 [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
119 [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
121 [[ "$terminfo[kcuu1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
122 [[ "$terminfo[kcud1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
123 [[ "$terminfo[kcuf1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
124 [[ "$terminfo[kcub1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
125 [[ "$terminfo[khome]" == "
\eO"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
126 [[ "$terminfo[kend]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
127 [[ "$terminfo[khome]" == "
\eO"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
128 [[ "$terminfo[kend]" == "
\eO"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
131 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
132 # use emacs style per default:
137 #if [[ "$TERM" == screen ]]; then
138 bindkey '\e[1~' beginning-of-line # home
139 bindkey '\e[4~' end-of-line # end
140 bindkey "^[[A" up-line-or-search # cursor up
141 bindkey "^[[B" down-line-or-search # <ESC>-
142 bindkey '^x' history-beginning-search-backward # alternative ways of searching the shell history
143 # bindkey -s '^L' "|less\n" # ctrl-L pipes to less
144 # bindkey -s '^B' " &\n" # ctrl-B runs it in the background
145 # if terminal type is set to 'rxvt':
146 bindkey '\e[7~' beginning-of-line # home
147 bindkey '\e[8~' end-of-line # end
150 # insert unicode character
151 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an ยง
152 # See for example http://unicode.org/charts/ for unicode characters code
153 autoload insert-unicode-char
154 zle -N insert-unicode-char
155 bindkey '^Xi' insert-unicode-char
157 # just type 'cd ...' to get 'cd ../..'
158 # rationalise-dot() {
159 # if [[ $LBUFFER = *.. ]]; then
165 # zle -N rationalise-dot
166 # bindkey . rationalise-dot
168 # bindkey '\eq' push-line-or-edit
171 # power completion - abbreviation expansion {{{
172 # power completion / abbreviation expansion / buffer expansion
173 # see http://zshwiki.org/home/examples/zleiab for details
174 # less risky than the global aliases but powerful as well
175 # just type the abbreviation key and afterwards ',.' to expand it
178 setopt interactivecomments
186 'G' '|& grep --color=auto'
188 'Hl' ' --help |& less -r'
193 'R' '| tr A-z N-za-m'
198 'hide' "echo -en '\033]50;nil2\007'"
199 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
200 'small' 'echo -en "\033]50;6x10\007"'
201 'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
202 'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
203 'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
204 'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
205 'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
206 'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
210 'co' "./configure && make && sudo make install"
211 'CH' "./configure --help"
212 'conkeror' 'firefox -chrome chrome://conkeror/content'
214 'lad' $'ls -d .*(/)\n# only show dot-directories'
215 'lsa' $'ls -a .*(.)\n# only show dot-files'
216 'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
217 'lsl' $'ls -l *(@[1,10])\n# only symlinks'
218 'lsx' $'ls -l *(*[1,10])\n# only executables'
219 'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
220 'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
221 'lsd' $'ls -d *(/)\n# only show directories'
222 'lse' $'ls -d *(/^F)\n# only show empty directories'
223 'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
224 'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
225 'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
227 '600' 'chmod u+rw-x,g-rwx,o-rwx'
229 '700' 'chmod u+rwx,g-rwx,o-rwx'
230 'r--' 'chmod u+r-wx,g-rwx,o-rwx'
231 '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
232 '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
234 'cmplayer' 'mplayer -vo -fs -zoom fbdev'
235 'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
236 'fblinks' 'links2 -driver fb'
237 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
238 'fori' 'for i ({..}) { }'
241 'se' 'setopt interactivecomments'
242 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
243 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
244 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3'
246 'D' 'export DISPLAY=:0.0'
247 'mp' 'mplayer -vo xv -fs -zoom'
252 matched_chars='[.-|_a-zA-Z0-9]#'
253 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
254 LBUFFER+=${abk[$MATCH]:-$MATCH}
258 bindkey ",." globalias
262 autoload -U zmv # who needs mmv or rename?
263 autoload history-search-end
265 # we don't want to quote/espace URLs on our own...
266 # if autoload -U url-quote-magic ; then
267 # zle -N self-insert url-quote-magic
268 # zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
270 # print 'Notice: no url-quote-magic available :('
272 alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
274 alias run-help >&/dev/null && unalias run-help
275 autoload run-help # use via 'esc-h'
278 if autoload -U compinit && compinit 2>/dev/null ; then
279 compinit 2>/dev/null || print 'Notice: no compinit available :('
281 print 'Notice: no compinit available :('
286 is4 && autoload -U zed # use ZLE editor to edit a file or function
288 is4 && for mod in complist deltochar mathfunc ; do
289 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
292 # autoload zsh modules when they are referenced
293 is4 && for opt mod in a stat \
297 zmodload -${opt} zsh/${mod} ${mod}
300 is4 && autoload -U insert-files && \
301 zle -N insert-files && \
302 bindkey "^Xf" insert-files # C-x-f
304 bindkey ' ' magic-space # also do history expansion on space
305 bindkey '\ei' menu-complete # menu completion via esc-i
307 # press esc-e for editing command line in $EDITOR or $VISUAL
308 is4 && autoload -U edit-command-line && \
309 zle -N edit-command-line && \
310 bindkey '\ee' edit-command-line
312 # menu selection: pick item but stay in the menu (press esc-return)
313 is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
315 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
316 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
317 bindkey '\C-ed' _bkdate
320 # press esc-m for inserting last typed word again (thanks to caphuso!)
321 insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
322 zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
324 # set command prediction from history, see 'man 1 zshcontrib'
325 # is4 && autoload -U predict-on && \
326 # zle -N predict-on && \
327 # zle -N predict-off && \
328 # bindkey "^X^Z" predict-on && \
329 # bindkey "^Z" predict-off
331 # put job into foreground via ctrl-z:
332 bindkey -s '^z' "fg\n"
334 # press ctrl-q to quote line:
336 # zle beginning-of-line
338 # # RBUFFER="'$RBUFFER'"
339 # RBUFFER=${(q)RBUFFER}
342 # zle -N mquote && bindkey '^q' mquote
344 # run command line as user root via sudo:
345 _sudo-command-line() {
346 [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
348 zle -N sudo-command-line _sudo-command-line
349 bindkey "^Os" sudo-command-line
352 # {{{ set some important options
353 (( EUID != 0 )) && umask 002 || umask 022
356 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
357 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
358 setopt extended_history # save each command's beginning timestamp and the duration to the history file
359 is4 && setopt histignorealldups # If a new command line being added to the history
360 # list duplicates an older one, the older command is removed from the list
361 setopt histignorespace # remove command lines from the history list when
362 # the first character on the line is a space
363 # setopt histallowclobber # add `|' to output redirections in the history
364 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
365 setopt auto_cd # if a command is issued that can't be executed as a normal command,
366 # and the command is the name of a directory, perform the cd command to that directory
367 setopt extended_glob # in order to use #, ~ and ^ for filename generation
368 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
369 # -> searches for word not in compressed files
370 # don't forget to quote '^', '~' and '#'!
371 setopt notify # report the status of backgrounds jobs immediately
372 setopt hash_list_all # Whenever a command completion is attempted, make sure \
373 # the entire command path is hashed first.
374 setopt completeinword # not just at the end
375 # setopt nocheckjobs # don't warn me about bg processes when exiting
376 setopt nohup # and don't kill them, either
377 # setopt printexitvalue # alert me if something failed
378 # setopt dvorak # with spelling correction, assume dvorak kb
379 setopt auto_pushd # make cd push the old directory onto the directory stack.
380 setopt nonomatch # try to avoid the 'zsh: no matches found...'
381 setopt nobeep # avoid "beep"ing
383 MAILCHECK=30 # mailchecks
384 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 secondes
385 watch=(notme root) # watch for everyone but me and root
387 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
388 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
390 # WORDCHARS='*?_[]~=&;!#$%^(){}'
391 # WORDCHARS='${WORDCHARS:s@/@}'
393 # only slash should be considered as a word separator:
394 slash-backward-kill-word() {
395 local WORDCHARS="${WORDCHARS:s@/@}"
397 zle backward-kill-word
399 zle -N slash-backward-kill-word
400 bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
404 export ZSHDIR=$HOME/.zsh
405 HISTFILE=$HOME/.zsh_history
406 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
407 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
410 # dirstack handling {{{
412 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
413 dirstack=( ${(uf)"$(< ~/.zdirs)"} )
414 # "cd -" won't work after login by just setting $OLDPWD, so
415 cd $dirstack[0] && cd $OLDPWD
418 builtin dirs -pl >! ~/.zdirs
422 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
423 if [ -n "$BATTERY" ] ; then
424 if [ -x $(which acpi) ] ; then
425 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
426 [ -z "$PERCENT" ] && PERCENT='acpi not present'
427 if [ "${PERCENT%%%}" -lt 20 ] ; then
428 PERCENT="warning: ${PERCENT}%"
435 if autoload promptinit && promptinit 2>/dev/null ; then
436 promptinit # people should be able to use their favourite prompt
438 print 'Notice: no promptinit available :('
441 # precmd() => a function which is executed just before each prompt
442 # use 'NOPRECMD=1' to disable the precmd + preexec commands
444 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
446 is4 && [[ -z $NOPRECMD ]] && precmd () {
447 [[ -n $NOPRECMD ]] && return 0
448 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
449 if [[ -z ${DONTSETRPROMPT} ]] ; then
450 if [ -n "$BATTERY" ] ; then
451 # RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
452 RPROMPT="${PERCENT}${SCREENTITLE}"
454 # RPROMPT="%(?..:()% ${SCREENTITLE}"
455 RPROMPT="${SCREENTITLE}"
458 # adjust title of xterm
459 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
460 case $TERM in (xterm*|rxvt)
461 print -Pn "\e]0;%n@%m: %~\a"
466 # chpwd () => a function which is executed whenever the directory is changed
468 # preexec() => a function running before every command
469 is4 && [[ -z $NOPRECMD ]] && preexec () {
470 [[ -n $NOPRECMD ]] && return 0
471 # set hostname if not running on host with name 'grml'
472 local HOSTNAME=$(hostname)
473 if [[ "$HOSTNAME" != grml ]] ; then
476 # get the name of the program currently running and hostname of local machine
477 # set screen window title if running in a screen
478 if [[ "$TERM" == screen* ]]; then
479 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
480 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
481 echo -ne "\ek$CMD\e\\"
483 # set the screen title to "zsh" when sitting at the command prompt:
484 if [[ "$TERM" == screen* ]]; then
485 SCREENTITLE=$'%{\ekzsh\e\\%}'
489 # adjust title of xterm
490 case $TERM in (xterm*|rxvt)
491 print -Pn "\e]0;%n@%m: $1\a"
497 if autoload colors && colors 2>/dev/null ; then
498 BLUE="%{${fg[blue]}%}"
499 RED="%{${fg_bold[red]}%}"
500 GREEN="%{${fg[green]}%}"
501 CYAN="%{${fg[cyan]}%}"
502 WHITE="%{${fg[white]}%}"
503 NO_COLOUR="%{${reset_color}%}"
510 NO_COLOUR="%{
\e[0m%}"
513 EXITCODE="%(?..%?%1v )"
514 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
515 PS3='?# ' # selection prompt used within a select loop.
516 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
518 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
519 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
520 debian_chroot=$(cat /etc/debian_chroot)
523 # don't use colors on dumb terminals (like emacs):
524 if [[ "$TERM" == dumb ]] ; then
525 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
527 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
528 # set variable identifying the chroot you work in (used in the prompt below)
529 if [[ -n "$GRMLPROMPT" ]]; then
530 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
531 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
533 if (( EUID != 0 )); then
534 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
536 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
541 # if we are inside a grml-chroot set a specific prompt theme
542 if [ -n "$GRML_CHROOT" ] ; then
543 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
547 # {{{ 'hash' some often used directories
548 hash -d deb=/var/cache/apt/archives
549 hash -d doc=/usr/share/doc
550 hash -d linux=/lib/modules/$(command uname -r)/build/
552 hash -d slog=/var/log/syslog
554 hash -d templ=/usr/share/doc/grml-templates
555 hash -d tt=/usr/share/doc/texttools-doc
560 if [ $UID = 0 ] ; then
561 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
562 elif [ -r $HOME/.screenrc ] ; then
563 alias screen="/usr/bin/screen -c $HOME/.screenrc"
565 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
568 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
569 alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
570 alias la='ls -la --color=auto'
571 alias ll='ls -l --color=auto'
572 alias lh='ls -hAl --color=auto'
573 alias l='ls -lF --color=auto'
582 alias mdstat='cat /proc/mdstat'
583 alias ...='cd ../../'
585 alias cp='nocorrect cp' # no spelling correction on cp
586 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
587 alias mv='nocorrect mv' # no spelling correction on mv
588 alias rm='nocorrect rm' # no spelling correction on rm
593 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
594 alias term2iso="echo 'Setting terminal to iso mode' ; echo -e '
\e%@'"
595 alias term2utf="echo 'Setting terminal to utf-8 mode'; echo -e '
\e%G'"
597 alias utf2iso='if isutfenv ; then
598 for ENV in `env | grep UTF` ; do
599 eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')"
602 alias iso2utf='if isutfenv ; then
603 for ENV in `env | grep '\.iso'` ; do
604 eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')"
608 # set up software synthesizer via speakup
610 aumix -w 90 -v 90 -p 90 -m 90
611 if ! [ -r /dev/softsynth ] ; then
612 flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
618 nice -n -20 speechd-up
619 flite -o play -t "Finished setting up software synthesizer"
623 # I like clean prompt, so provide simple way to get that
624 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
626 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
627 if [ -x /usr/sbin/truecrypt ] ; then
629 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
631 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
635 zsh-help(){print "$bg[white]$fg[black]
636 zsh-help - hints for use of zsh on grml
637 =======================================$reset_color
639 Main configuration of zsh happens in /etc/zsh/zshrc (global)
640 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
641 The files are part of the package grml-etc-core, if you want to
642 use them on a non-grml-system just get the tar.gz from
643 http://deb.grml.org/ or get the files from the mercurial
646 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
647 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
649 If you want to stay in sync with zsh configuration of grml
650 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
651 your own stuff in \$HOME/.zshrc.local. System wide configuration
652 without touching configuration files of grml can take place
653 in /etc/zsh/zshrc.local.
655 If you want to use the configuration of user grml also when
656 running as user root just run 'zshskel' which will source
657 the file /etc/skel/.zshrc.
659 For information regarding zsh start at http://grml.org/zsh/
661 Take a look at grml's zsh refcard:
662 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
664 Check out the main zsh refcard:
665 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
667 And of course visit the zsh-lovers:
670 You can adjust some options through environment variables when
671 invoking zsh without having to edit configuration files.
672 Basically meant for bash users who are not used to the power of
675 \"NOCOR=1 zsh\" => deactivate automatic correction
676 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
677 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
678 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
680 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
681 Enjoy your grml system with the zsh!$reset_color"
685 if [ -r /etc/debian_version ] ; then
686 alias acs='apt-cache search'
687 alias acsh='apt-cache show'
688 alias acp='apt-cache policy'
689 alias adg="$SUDO apt-get dist-upgrade"
690 alias agi="$SUDO apt-get install"
691 alias ati="$SUDO aptitude install"
692 alias ag="$SUDO apt-get upgrade"
693 alias au="$SUDO apt-get update"
694 alias up="$SUDO aptitude update ; $SUDO aptitude upgrade"
695 alias dbp='dpkg-buildpackage'
696 alias ge='grep-excuses'
700 if [ -z "$1" ] ; then
702 $SUDO apt-get -u upgrade
704 ssh $1 $SUDO apt-get update
705 # ask before the upgrade
707 ssh $1 $SUDO apt-get --no-act upgrade
708 echo -n 'Process the upgrade?'
710 if [[ $dummy == "y" ]] ; then
711 ssh $1 $SUDO apt-get -u upgrade --yes
716 isgrmlcd && alias su="sudo su" # change to user root
717 alias tlog="tail -f /var/log/syslog" # take a look at the syslog
718 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
721 # sort installed Debian-packages by size
722 if [ -x /usr/bin/grep-status ] ; then
723 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
724 -n "install ok installed" | paste -sd " \n" | sort -rn'
727 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
728 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
729 if [ -x $(which wodim) ] ; then
730 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
731 See #377109 in the BTS of Debian for more details.
733 Please use the wodim binary instead' ; return 1"
737 # get_tw_cli has been renamed into get_3ware
738 if [ -x /usr/bin/get_3ware ] ; then
740 echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
745 # I hate lacking backward compability, so provide an alternative therefore
746 if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
747 function apache2-ssl-certificate(){
749 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
750 print 'You might want to take a look at Debian the package ssl-cert as well.'
751 print 'To generate a certificate for use with apache2 follow the instructions:'
755 export RANDFILE=/dev/random
756 mkdir /etc/apache2/ssl/
757 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
758 chmod 600 /etc/apache2/ssl/apache.pem
760 Run "grml-tips ssl-certificate" if you need further instructions.
766 # {{{ Use hard limits, except for a smaller stack and no core dumps
769 isgrmlcd && limit core 0 # important for a live-cd-system
773 # {{{ completion stuff
775 # called later (via is4 && grmlcomp)
776 # notice: use 'zstyle' for getting current settings
777 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
780 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
781 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
782 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
783 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
784 zstyle ':completion:*:correct:*' original true #
785 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
786 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
787 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
788 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
789 zstyle ':completion:*:history-words' list false #
790 zstyle ':completion:*:history-words' menu yes # activate menu
791 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
792 zstyle ':completion:*:history-words' stop yes #
793 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
794 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
795 zstyle ':completion:*' group-name ''
796 if [[ -z "$NOMENU" ]] ; then
797 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
799 setopt no_auto_menu # don't use any menus at all
801 zstyle ':completion:*:messages' format '%d' #
802 zstyle ':completion:*:options' auto-description '%d' #
803 zstyle ':completion:*:options' description 'yes' # describe options in full
804 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
805 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
806 zstyle ':completion:*' verbose true # provide verbose completion information
807 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
808 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
809 zstyle ':completion:correct:' prompt 'correct to: %e' #
810 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
812 # complete manual by their section
813 zstyle ':completion:*:manuals' separate-sections true
814 zstyle ':completion:*:manuals.*' insert-sections true
815 zstyle ':completion:*:man:*' menu yes select
818 # run rehash on completion so new installed program are found automatically:
820 (( CURRENT == 1 )) && rehash
821 return 1 # Because we didn't really complete anything
823 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
824 if [[ -n "$NOCOR" ]] ; then
825 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files
826 setopt nocorrect # do not try to correct the spelling if possible
828 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files
829 setopt correct # try to correct the spelling if possible
830 zstyle -e ':completion:*' completer '
831 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
832 _last_try="$HISTNO$BUFFER$CURSOR"
833 reply=(_complete _match _prefix _files)
835 if [[ $words[1] = (rm|mv) ]]; then
836 reply=(_complete _files)
838 reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files)
842 # zstyle ':completion:*' completer _complete _correct _approximate
843 # zstyle ':completion:*' expand prefix suffix
845 # automatic rehash? Credits go to Frank Terbeck
846 # function my_accept () {
848 # [[ -z ${BUFFER} ]] && zle accept-line && return
849 # buf=( ${(z)BUFFER} )
850 # [[ -z ${commands[${buf[1]}]} ]] && rehash
854 # bindkey "^M" my_accept
856 # command for process lists, the local web server details and host completion
857 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
860 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
861 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
863 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
865 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
866 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
878 zstyle ':completion:*:hosts' hosts $hosts
879 # zstyle '*' hosts $hosts
881 # specify your logins:
883 # {grml,grml1}@foo.invalid
884 # grml-devel@bar.invalid
887 # {fred,root}@foo.invalid
890 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
891 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
893 # specify specific port/service settings:
894 # telnet_users_hosts_ports=(
897 # @mail-server:{smtp,pop3}
901 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
903 # use generic completion system for programs not yet defined:
904 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
906 # see upgrade function in this file
907 compdef _hosts upgrade
913 # people should use 'grml-x'!
915 if [ -e /etc/X11/xorg.conf ] ; then
916 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
918 echo "Please use the script \"grml-x\" for starting the X Window System
919 because there does not exist /etc/X11/xorg.conf yet.
920 If you want to use startx anyway please call \"/usr/bin/startx\"."
926 if [ -e /etc/X11/xorg.conf ] ; then
927 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
929 echo "Please use the script \"grml-x\" for starting the X Window System.
930 because there does not exist /etc/X11/xorg.conf yet.
931 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
936 if [ -x /usr/sbin/915resolution ] ; then
937 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
940 alias grml-version='cat /etc/grml_version'
942 if [ -x /usr/sbin/rebuildfstab ] ; then
943 alias grml-rebuildfstab='rebuildfstab -v -r -config'
948 # {{{ now run the functions
950 is4 && isgrml && grmlstuff
955 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
958 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
959 # You use it as follows:
960 # $ NTREF=/reference/file
962 # This lists all the files in the current directory newer than the reference file.
963 # You can also specify the reference file inline; note quotes:
964 # $ ls -l *(e:'nt ~/.zshenv':)
969 [[ $REPLY -nt $NTREF ]]
973 # shell functions {{{
974 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
975 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
977 if [[ "$#*" -eq 0 ]]; then
978 [ -r ~/.zshrc ] && . ~/.zshrc
987 compdef _functions reload freload
989 # list symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
991 [ -z "$1" ] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
994 while [ -h "$file" ] ; do
996 file=$(readlink "$file")
1001 # fast manual access
1002 if type -p qma &>/dev/null ; then
1003 manzsh() { qma zshall "$1" }
1006 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1007 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
1008 # manzsh() { man zshall | $MYLESS -p $1 ; }
1011 if [ -x /usr/bin/most ] ; then
1012 # use "dchange <package-name>" to view Debian's changelog of the package:
1014 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
1015 most /usr/share/doc/${1}/changelog.Debian.gz
1017 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1018 most /usr/share/doc/${1}/changelog.gz
1020 echo "No changelog for package $1 found, sorry."
1025 _dchange() { _files -W /usr/share/doc -/ }
1026 compdef _dchange dchange
1028 # use "uchange <package-name>" to view upstream's changelog of the package:
1030 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1031 most /usr/share/doc/${1}/changelog.gz
1033 echo "No changelog for package $1 found, sorry."
1037 _uchange() { _files -W /usr/share/doc -/ }
1038 compdef _uchange uchange
1043 ZSH_PROFILE_RC=1 $SHELL "$@"
1046 # edit alias via zle:
1048 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1050 compdef _aliases edalias
1052 # edit function via zle:
1054 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1056 compdef _functions edfunc
1058 # use it e.g. via 'Restart apache2'
1059 if [ -d /etc/init.d ] ; then
1060 for i in Start Restart Stop Force-Reload Reload ; do
1061 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1063 # now the completion for this:
1064 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
1067 # provide useful information on globbing
1074 p named pipes (FIFOs)
1075 * executable plain files (0100)
1076 % device files (character or block special)
1077 %b block special files
1078 %c character special files
1079 r owner-readable files (0400)
1080 w owner-writable files (0200)
1081 x owner-executable files (0100)
1082 A group-readable files (0040)
1083 I group-writable files (0020)
1084 E group-executable files (0010)
1085 R world-readable files (0004)
1086 W world-writable files (0002)
1087 X world-executable files (0001)
1088 s setuid files (04000)
1089 S setgid files (02000)
1090 t files with the sticky bit (01000)
1092 print *(m-1) # Files modified up to a day ago
1093 print *(a1) # Files accessed a day ago
1094 print *(@) # Just symlinks
1095 print *(Lk+50) # Files bigger than 50 kilobytes
1096 print *(Lk-50) # Files smaller than 50 kilobytes
1097 print **/*.c # All *.c files recursively starting in \$PWD
1098 print **/*.c~file.c # Same as above, but excluding 'file.c'
1099 print (foo|bar).* # Files starting with 'foo' or 'bar'
1100 print *~*.* # All Files that do not contain a dot
1101 chmod 644 *(.^x) # make all plain non-executable files publically readable
1102 print -l *(.c|.h) # Lists *.c and *.h
1103 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1104 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1106 alias help-zshglob=H-Glob
1108 type -p qma &>/dev/null && alias ?='qma zshall'
1110 # grep for running process, like: 'any vim'
1112 if [ -z "$1" ] ; then
1113 echo "any - grep for process(es) by keyword" >&2
1114 echo "Usage: any <keyword>" >&2 ; return 1
1117 local LENGTH=$(expr length $STRING)
1118 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1119 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1120 ps xauwww| grep "[$FIRSCHAR]$REST"
1124 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1125 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1126 [ -r /proc/1/maps ] && deswap() {
1127 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1128 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1129 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1132 # print hex value of a number
1134 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1137 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1138 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1140 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1141 perl -e "print eval($CALC),\"\n\";"
1143 functions peval &>/dev/null && alias calc=peval
1145 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1147 # NO_SWITCH="yes" command bash "$@"
1150 # exec $SHELL $SHELL_ARGS "$@"
1155 # log out? set timeout in seconds {{{
1157 # do not log out in some specific terminals:
1158 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1163 # {{{ make sure our environment is clean regarding colors
1164 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1167 # source another config file if present {{{
1168 if [ -r /etc/zsh/zshrc.local ]; then
1169 source /etc/zsh/zshrc.local
1173 # "persistent history" {{{
1174 # just write important commands you always need to ~/.important_commands
1175 if [ -r ~/.important_commands ] ; then
1176 fc -R ~/.important_commands
1180 ## END OF FILE #################################################################
1181 # vim:foldmethod=marker expandtab