2 # Purpose: config file for zsh (z shell)
3 # Authors: grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
4 # Bug-Reports: see http://grml.org/bugs/
5 # License: This file is licensed under the GPL v2.
6 # Latest change: Sam Apr 21 23:57:20 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 # make sure to use right prompt only when not running a command
447 is4 && setopt transient_rprompt
449 is4 && [[ -z $NOPRECMD ]] && precmd () {
450 [[ -n $NOPRECMD ]] && return 0
451 # allow manual overwriting of RPROMPT
452 [[ -n $RPROMPT ]] && echo -n $'\ekzsh\e\\' && return 0
453 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
454 if [[ -z $DONTSETRPROMPT ]] ; then
455 if [[ -n $BATTERY ]] ; then
456 RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
457 # RPROMPT="${PERCENT}${SCREENTITLE}"
459 RPROMPT="%(?..:()% ${SCREENTITLE}"
460 # RPROMPT="${SCREENTITLE}"
463 # adjust title of xterm
464 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
465 case $TERM in (xterm*|rxvt)
466 print -Pn "\e]0;%n@%m: %~\a"
471 # chpwd () => a function which is executed whenever the directory is changed
473 # preexec() => a function running before every command
474 is4 && [[ -z $NOPRECMD ]] && preexec () {
475 [[ -n $NOPRECMD ]] && return 0
476 # set hostname if not running on host with name 'grml'
477 local HOSTNAME=$(hostname)
478 if [[ "$HOSTNAME" != grml ]] ; then
481 # get the name of the program currently running and hostname of local machine
482 # set screen window title if running in a screen
483 if [[ "$TERM" == screen* ]]; then
484 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
485 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
486 echo -ne "\ek$CMD\e\\"
488 # set the screen title to "zsh" when sitting at the command prompt:
489 if [[ "$TERM" == screen* ]]; then
490 SCREENTITLE=$'%{\ekzsh\e\\%}'
494 # adjust title of xterm
495 case $TERM in (xterm*|rxvt)
496 print -Pn "\e]0;%n@%m: $1\a"
502 if autoload colors && colors 2>/dev/null ; then
503 BLUE="%{${fg[blue]}%}"
504 RED="%{${fg_bold[red]}%}"
505 GREEN="%{${fg[green]}%}"
506 CYAN="%{${fg[cyan]}%}"
507 WHITE="%{${fg[white]}%}"
508 NO_COLOUR="%{${reset_color}%}"
515 NO_COLOUR="%{
\e[0m%}"
518 EXITCODE="%(?..%?%1v )"
519 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
520 PS3='?# ' # selection prompt used within a select loop.
521 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
523 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
524 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
525 debian_chroot=$(cat /etc/debian_chroot)
528 # don't use colors on dumb terminals (like emacs):
529 if [[ "$TERM" == dumb ]] ; then
530 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
532 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
533 # set variable identifying the chroot you work in (used in the prompt below)
534 if [[ -n $GRMLPROMPT ]]; then
535 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
536 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
538 if (( EUID != 0 )); then
539 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
541 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
546 # if we are inside a grml-chroot set a specific prompt theme
547 if [ -n "$GRML_CHROOT" ] ; then
548 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
552 # {{{ 'hash' some often used directories
553 hash -d deb=/var/cache/apt/archives
554 hash -d doc=/usr/share/doc
555 hash -d linux=/lib/modules/$(command uname -r)/build/
557 hash -d slog=/var/log/syslog
559 hash -d templ=/usr/share/doc/grml-templates
560 hash -d tt=/usr/share/doc/texttools-doc
565 if [ $UID = 0 ] ; then
566 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
567 elif [ -r $HOME/.screenrc ] ; then
568 alias screen="/usr/bin/screen -c $HOME/.screenrc"
570 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
573 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
574 alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
575 alias la='ls -la --color=auto'
576 alias ll='ls -l --color=auto'
577 alias lh='ls -hAl --color=auto'
578 alias l='ls -lF --color=auto'
587 alias mdstat='cat /proc/mdstat'
588 alias ...='cd ../../'
590 alias cp='nocorrect cp' # no spelling correction on cp
591 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
592 alias mv='nocorrect mv' # no spelling correction on mv
593 alias rm='nocorrect rm' # no spelling correction on rm
598 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
599 alias term2iso="echo 'Setting terminal to iso mode' ; echo -e '
\e%@'"
600 alias term2utf="echo 'Setting terminal to utf-8 mode'; echo -e '
\e%G'"
602 alias utf2iso='if isutfenv ; then
603 for ENV in `env | grep UTF` ; do
604 eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')"
607 alias iso2utf='if isutfenv ; then
608 for ENV in `env | grep '\.iso'` ; do
609 eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')"
613 # set up software synthesizer via speakup
615 aumix -w 90 -v 90 -p 90 -m 90
616 if ! [ -r /dev/softsynth ] ; then
617 flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
623 nice -n -20 speechd-up
624 flite -o play -t "Finished setting up software synthesizer"
628 # I like clean prompt, so provide simple way to get that
629 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
631 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
632 if [ -x /usr/sbin/truecrypt ] ; then
634 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
636 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
640 zsh-help(){print "$bg[white]$fg[black]
641 zsh-help - hints for use of zsh on grml
642 =======================================$reset_color
644 Main configuration of zsh happens in /etc/zsh/zshrc (global)
645 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
646 The files are part of the package grml-etc-core, if you want to
647 use them on a non-grml-system just get the tar.gz from
648 http://deb.grml.org/ or get the files from the mercurial
651 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
652 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
654 If you want to stay in sync with zsh configuration of grml
655 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
656 your own stuff in \$HOME/.zshrc.local. System wide configuration
657 without touching configuration files of grml can take place
658 in /etc/zsh/zshrc.local.
660 If you want to use the configuration of user grml also when
661 running as user root just run 'zshskel' which will source
662 the file /etc/skel/.zshrc.
664 For information regarding zsh start at http://grml.org/zsh/
666 Take a look at grml's zsh refcard:
667 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
669 Check out the main zsh refcard:
670 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
672 And of course visit the zsh-lovers:
675 You can adjust some options through environment variables when
676 invoking zsh without having to edit configuration files.
677 Basically meant for bash users who are not used to the power of
680 \"NOCOR=1 zsh\" => deactivate automatic correction
681 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
682 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
683 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
685 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
686 Enjoy your grml system with the zsh!$reset_color"
690 if [ -r /etc/debian_version ] ; then
691 alias acs='apt-cache search'
692 alias acsh='apt-cache show'
693 alias acp='apt-cache policy'
694 alias adg="$SUDO apt-get dist-upgrade"
695 alias agi="$SUDO apt-get install"
696 alias ati="$SUDO aptitude install"
697 alias ag="$SUDO apt-get upgrade"
698 alias au="$SUDO apt-get update"
699 alias up="$SUDO aptitude update ; $SUDO aptitude upgrade"
700 alias dbp='dpkg-buildpackage'
701 alias ge='grep-excuses'
705 if [ -z "$1" ] ; then
707 $SUDO apt-get -u upgrade
709 ssh $1 $SUDO apt-get update
710 # ask before the upgrade
712 ssh $1 $SUDO apt-get --no-act upgrade
713 echo -n 'Process the upgrade?'
715 if [[ $dummy == "y" ]] ; then
716 ssh $1 $SUDO apt-get -u upgrade --yes
721 isgrmlcd && alias su="sudo su" # change to user root
722 alias tlog="tail -f /var/log/syslog" # take a look at the syslog
723 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
726 # sort installed Debian-packages by size
727 if [ -x /usr/bin/grep-status ] ; then
728 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
729 -n "install ok installed" | paste -sd " \n" | sort -rn'
732 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
733 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
734 if [ -x $(which wodim) ] ; then
735 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
736 See #377109 in the BTS of Debian for more details.
738 Please use the wodim binary instead' ; return 1"
742 # get_tw_cli has been renamed into get_3ware
743 if [ -x /usr/bin/get_3ware ] ; then
745 echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
750 # I hate lacking backward compability, so provide an alternative therefore
751 if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
752 function apache2-ssl-certificate(){
754 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
755 print 'You might want to take a look at Debian the package ssl-cert as well.'
756 print 'To generate a certificate for use with apache2 follow the instructions:'
760 export RANDFILE=/dev/random
761 mkdir /etc/apache2/ssl/
762 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
763 chmod 600 /etc/apache2/ssl/apache.pem
765 Run "grml-tips ssl-certificate" if you need further instructions.
771 # {{{ Use hard limits, except for a smaller stack and no core dumps
774 isgrmlcd && limit core 0 # important for a live-cd-system
778 # {{{ completion stuff
780 # called later (via is4 && grmlcomp)
781 # notice: use 'zstyle' for getting current settings
782 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
785 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
786 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
787 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
788 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
789 zstyle ':completion:*:correct:*' original true #
790 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
791 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
792 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
793 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
794 zstyle ':completion:*:history-words' list false #
795 zstyle ':completion:*:history-words' menu yes # activate menu
796 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
797 zstyle ':completion:*:history-words' stop yes #
798 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
799 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
800 zstyle ':completion:*' group-name ''
801 if [[ -z "$NOMENU" ]] ; then
802 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
804 setopt no_auto_menu # don't use any menus at all
806 zstyle ':completion:*:messages' format '%d' #
807 zstyle ':completion:*:options' auto-description '%d' #
808 zstyle ':completion:*:options' description 'yes' # describe options in full
809 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
810 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
811 zstyle ':completion:*' verbose true # provide verbose completion information
812 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
813 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
814 zstyle ':completion:correct:' prompt 'correct to: %e' #
815 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
817 # complete manual by their section
818 zstyle ':completion:*:manuals' separate-sections true
819 zstyle ':completion:*:manuals.*' insert-sections true
820 zstyle ':completion:*:man:*' menu yes select
823 # run rehash on completion so new installed program are found automatically:
825 (( CURRENT == 1 )) && rehash
826 return 1 # Because we didn't really complete anything
828 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
829 if [[ -n "$NOCOR" ]] ; then
830 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files
831 setopt nocorrect # do not try to correct the spelling if possible
833 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files
834 setopt correct # try to correct the spelling if possible
835 zstyle -e ':completion:*' completer '
836 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
837 _last_try="$HISTNO$BUFFER$CURSOR"
838 reply=(_complete _match _prefix _files)
840 if [[ $words[1] = (rm|mv) ]]; then
841 reply=(_complete _files)
843 reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files)
847 # zstyle ':completion:*' completer _complete _correct _approximate
848 # zstyle ':completion:*' expand prefix suffix
850 # automatic rehash? Credits go to Frank Terbeck
851 # function my_accept () {
853 # [[ -z ${BUFFER} ]] && zle accept-line && return
854 # buf=( ${(z)BUFFER} )
855 # [[ -z ${commands[${buf[1]}]} ]] && rehash
859 # bindkey "^M" my_accept
861 # command for process lists, the local web server details and host completion
862 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
865 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
866 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
868 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
870 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
871 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
883 zstyle ':completion:*:hosts' hosts $hosts
884 # zstyle '*' hosts $hosts
886 # specify your logins:
888 # {grml,grml1}@foo.invalid
889 # grml-devel@bar.invalid
892 # {fred,root}@foo.invalid
895 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
896 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
898 # specify specific port/service settings:
899 # telnet_users_hosts_ports=(
902 # @mail-server:{smtp,pop3}
906 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
908 # use generic completion system for programs not yet defined:
909 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
911 # see upgrade function in this file
912 compdef _hosts upgrade
918 # people should use 'grml-x'!
920 if [ -e /etc/X11/xorg.conf ] ; then
921 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
923 echo "Please use the script \"grml-x\" for starting the X Window System
924 because there does not exist /etc/X11/xorg.conf yet.
925 If you want to use startx anyway please call \"/usr/bin/startx\"."
931 if [ -e /etc/X11/xorg.conf ] ; then
932 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
934 echo "Please use the script \"grml-x\" for starting the X Window System.
935 because there does not exist /etc/X11/xorg.conf yet.
936 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
941 if [ -x /usr/sbin/915resolution ] ; then
942 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
945 alias grml-version='cat /etc/grml_version'
947 if [ -x /usr/sbin/rebuildfstab ] ; then
948 alias grml-rebuildfstab='rebuildfstab -v -r -config'
953 # {{{ now run the functions
955 is4 && isgrml && grmlstuff
960 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
963 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
964 # You use it as follows:
965 # $ NTREF=/reference/file
967 # This lists all the files in the current directory newer than the reference file.
968 # You can also specify the reference file inline; note quotes:
969 # $ ls -l *(e:'nt ~/.zshenv':)
974 [[ $REPLY -nt $NTREF ]]
978 # shell functions {{{
979 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
980 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
982 if [[ "$#*" -eq 0 ]]; then
983 [ -r ~/.zshrc ] && . ~/.zshrc
992 compdef _functions reload freload
994 # list symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
996 [ -z "$1" ] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
999 while [ -h "$file" ] ; do
1001 file=$(readlink "$file")
1006 # fast manual access
1007 if type -p qma &>/dev/null ; then
1008 manzsh() { qma zshall "$1" }
1011 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1012 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
1013 # manzsh() { man zshall | $MYLESS -p $1 ; }
1016 if [ -x /usr/bin/most ] ; then
1017 # use "dchange <package-name>" to view Debian's changelog of the package:
1019 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
1020 most /usr/share/doc/${1}/changelog.Debian.gz
1022 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1023 most /usr/share/doc/${1}/changelog.gz
1025 echo "No changelog for package $1 found, sorry."
1030 _dchange() { _files -W /usr/share/doc -/ }
1031 compdef _dchange dchange
1033 # use "uchange <package-name>" to view upstream's changelog of the package:
1035 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1036 most /usr/share/doc/${1}/changelog.gz
1038 echo "No changelog for package $1 found, sorry."
1042 _uchange() { _files -W /usr/share/doc -/ }
1043 compdef _uchange uchange
1048 ZSH_PROFILE_RC=1 $SHELL "$@"
1051 # edit alias via zle:
1053 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1055 compdef _aliases edalias
1057 # edit function via zle:
1059 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1061 compdef _functions edfunc
1063 # use it e.g. via 'Restart apache2'
1064 if [ -d /etc/init.d ] ; then
1065 for i in Start Restart Stop Force-Reload Reload ; do
1066 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1068 # now the completion for this:
1069 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
1072 # provide useful information on globbing
1079 p named pipes (FIFOs)
1080 * executable plain files (0100)
1081 % device files (character or block special)
1082 %b block special files
1083 %c character special files
1084 r owner-readable files (0400)
1085 w owner-writable files (0200)
1086 x owner-executable files (0100)
1087 A group-readable files (0040)
1088 I group-writable files (0020)
1089 E group-executable files (0010)
1090 R world-readable files (0004)
1091 W world-writable files (0002)
1092 X world-executable files (0001)
1093 s setuid files (04000)
1094 S setgid files (02000)
1095 t files with the sticky bit (01000)
1097 print *(m-1) # Files modified up to a day ago
1098 print *(a1) # Files accessed a day ago
1099 print *(@) # Just symlinks
1100 print *(Lk+50) # Files bigger than 50 kilobytes
1101 print *(Lk-50) # Files smaller than 50 kilobytes
1102 print **/*.c # All *.c files recursively starting in \$PWD
1103 print **/*.c~file.c # Same as above, but excluding 'file.c'
1104 print (foo|bar).* # Files starting with 'foo' or 'bar'
1105 print *~*.* # All Files that do not contain a dot
1106 chmod 644 *(.^x) # make all plain non-executable files publically readable
1107 print -l *(.c|.h) # Lists *.c and *.h
1108 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1109 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1111 alias help-zshglob=H-Glob
1113 type -p qma &>/dev/null && alias ?='qma zshall'
1115 # grep for running process, like: 'any vim'
1117 if [ -z "$1" ] ; then
1118 echo "any - grep for process(es) by keyword" >&2
1119 echo "Usage: any <keyword>" >&2 ; return 1
1122 local LENGTH=$(expr length $STRING)
1123 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1124 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1125 ps xauwww| grep "[$FIRSCHAR]$REST"
1129 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1130 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1131 [ -r /proc/1/maps ] && deswap() {
1132 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1133 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1134 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1137 # print hex value of a number
1139 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1142 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1143 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1145 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1146 perl -e "print eval($CALC),\"\n\";"
1148 functions peval &>/dev/null && alias calc=peval
1150 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1152 # NO_SWITCH="yes" command bash "$@"
1155 # exec $SHELL $SHELL_ARGS "$@"
1160 # log out? set timeout in seconds {{{
1162 # do not log out in some specific terminals:
1163 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1168 # {{{ make sure our environment is clean regarding colors
1169 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1172 # source another config file if present {{{
1173 if [ -r /etc/zsh/zshrc.local ]; then
1174 source /etc/zsh/zshrc.local
1178 # "persistent history" {{{
1179 # just write important commands you always need to ~/.important_commands
1180 if [ -r ~/.important_commands ] ; then
1181 fc -R ~/.important_commands
1185 ## END OF FILE #################################################################
1186 # vim:foldmethod=marker expandtab