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 29 13:16:44 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 if [[ -n $RPROMPT ]] ; then
453 [[ $TERM == screen* ]] && echo -n $'\ekzsh\e\\'
456 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
457 if [[ -z $DONTSETRPROMPT ]] ; then
458 if [[ -n $BATTERY ]] ; then
459 RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
460 # RPROMPT="${PERCENT}${SCREENTITLE}"
462 RPROMPT="%(?..:()% ${SCREENTITLE}"
463 # RPROMPT="${SCREENTITLE}"
466 # adjust title of xterm
467 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
468 case $TERM in (xterm*|rxvt)
469 print -Pn "\e]0;%n@%m: %~\a"
474 # chpwd () => a function which is executed whenever the directory is changed
476 # preexec() => a function running before every command
477 is4 && [[ -z $NOPRECMD ]] && preexec () {
478 [[ -n $NOPRECMD ]] && return 0
479 # set hostname if not running on host with name 'grml'
480 local HOSTNAME=$(hostname)
481 if [[ "$HOSTNAME" != grml ]] ; then
484 # get the name of the program currently running and hostname of local machine
485 # set screen window title if running in a screen
486 if [[ "$TERM" == screen* ]]; then
487 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
488 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
489 echo -ne "\ek$CMD\e\\"
491 # set the screen title to "zsh" when sitting at the command prompt:
492 if [[ "$TERM" == screen* ]]; then
493 SCREENTITLE=$'%{\ekzsh\e\\%}'
497 # adjust title of xterm
498 case $TERM in (xterm*|rxvt)
499 print -Pn "\e]0;%n@%m: $1\a"
505 if autoload colors && colors 2>/dev/null ; then
506 BLUE="%{${fg[blue]}%}"
507 RED="%{${fg_bold[red]}%}"
508 GREEN="%{${fg[green]}%}"
509 CYAN="%{${fg[cyan]}%}"
510 WHITE="%{${fg[white]}%}"
511 NO_COLOUR="%{${reset_color}%}"
518 NO_COLOUR="%{
\e[0m%}"
521 EXITCODE="%(?..%?%1v )"
522 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
523 PS3='?# ' # selection prompt used within a select loop.
524 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
526 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
527 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
528 debian_chroot=$(cat /etc/debian_chroot)
531 # don't use colors on dumb terminals (like emacs):
532 if [[ "$TERM" == dumb ]] ; then
533 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
535 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
536 # set variable identifying the chroot you work in (used in the prompt below)
537 if [[ -n $GRMLPROMPT ]]; then
538 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
539 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
541 if (( EUID != 0 )); then
542 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
544 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
549 # if we are inside a grml-chroot set a specific prompt theme
550 if [ -n "$GRML_CHROOT" ] ; then
551 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
555 # {{{ 'hash' some often used directories
556 hash -d deb=/var/cache/apt/archives
557 hash -d doc=/usr/share/doc
558 hash -d linux=/lib/modules/$(command uname -r)/build/
560 hash -d slog=/var/log/syslog
562 hash -d templ=/usr/share/doc/grml-templates
563 hash -d tt=/usr/share/doc/texttools-doc
568 if [ $UID = 0 ] ; then
569 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
570 elif [ -r $HOME/.screenrc ] ; then
571 alias screen="/usr/bin/screen -c $HOME/.screenrc"
573 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
576 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
577 alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
578 alias la='ls -la --color=auto'
579 alias ll='ls -l --color=auto'
580 alias lh='ls -hAl --color=auto'
581 alias l='ls -lF --color=auto'
590 alias mdstat='cat /proc/mdstat'
591 alias ...='cd ../../'
593 alias cp='nocorrect cp' # no spelling correction on cp
594 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
595 alias mv='nocorrect mv' # no spelling correction on mv
596 alias rm='nocorrect rm' # no spelling correction on rm
601 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
602 alias term2iso="echo 'Setting terminal to iso mode' ; echo -e '
\e%@'"
603 alias term2utf="echo 'Setting terminal to utf-8 mode'; echo -e '
\e%G'"
605 alias utf2iso='if isutfenv ; then
606 for ENV in `env | grep UTF` ; do
607 eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')"
610 alias iso2utf='if isutfenv ; then
611 for ENV in `env | grep '\.iso'` ; do
612 eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')"
616 # set up software synthesizer via speakup
618 aumix -w 90 -v 90 -p 90 -m 90
619 if ! [ -r /dev/softsynth ] ; then
620 flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
626 nice -n -20 speechd-up
628 flite -o play -t "Finished setting up software synthesizer"
632 # I like clean prompt, so provide simple way to get that
633 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
635 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
636 if [ -x /usr/sbin/truecrypt ] ; then
638 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
640 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
644 zsh-help(){print "$bg[white]$fg[black]
645 zsh-help - hints for use of zsh on grml
646 =======================================$reset_color
648 Main configuration of zsh happens in /etc/zsh/zshrc (global)
649 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
650 The files are part of the package grml-etc-core, if you want to
651 use them on a non-grml-system just get the tar.gz from
652 http://deb.grml.org/ or get the files from the mercurial
655 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
656 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
658 If you want to stay in sync with zsh configuration of grml
659 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
660 your own stuff in \$HOME/.zshrc.local. System wide configuration
661 without touching configuration files of grml can take place
662 in /etc/zsh/zshrc.local.
664 If you want to use the configuration of user grml also when
665 running as user root just run 'zshskel' which will source
666 the file /etc/skel/.zshrc.
668 For information regarding zsh start at http://grml.org/zsh/
670 Take a look at grml's zsh refcard:
671 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
673 Check out the main zsh refcard:
674 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
676 And of course visit the zsh-lovers:
679 You can adjust some options through environment variables when
680 invoking zsh without having to edit configuration files.
681 Basically meant for bash users who are not used to the power of
684 \"NOCOR=1 zsh\" => deactivate automatic correction
685 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
686 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
687 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
689 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
690 Enjoy your grml system with the zsh!$reset_color"
694 if [ -r /etc/debian_version ] ; then
695 alias acs='apt-cache search'
696 alias acsh='apt-cache show'
697 alias acp='apt-cache policy'
698 alias adg="$SUDO apt-get dist-upgrade"
699 alias agi="$SUDO apt-get install"
700 alias ati="$SUDO aptitude install"
701 alias ag="$SUDO apt-get upgrade"
702 alias au="$SUDO apt-get update"
703 alias up="$SUDO aptitude update ; $SUDO aptitude upgrade"
704 alias dbp='dpkg-buildpackage'
705 alias ge='grep-excuses'
709 if [ -z "$1" ] ; then
711 $SUDO apt-get -u upgrade
713 ssh $1 $SUDO apt-get update
714 # ask before the upgrade
716 ssh $1 $SUDO apt-get --no-act upgrade
717 echo -n 'Process the upgrade?'
719 if [[ $dummy == "y" ]] ; then
720 ssh $1 $SUDO apt-get -u upgrade --yes
725 isgrmlcd && alias su="sudo su" # change to user root
726 alias tlog="tail -f /var/log/syslog" # take a look at the syslog
727 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
730 # sort installed Debian-packages by size
731 if [ -x /usr/bin/grep-status ] ; then
732 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
733 -n "install ok installed" | paste -sd " \n" | sort -rn'
736 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
737 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
738 if [ -x $(which wodim) ] ; then
739 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
740 See #377109 in the BTS of Debian for more details.
742 Please use the wodim binary instead' ; return 1"
746 # get_tw_cli has been renamed into get_3ware
747 if [ -x /usr/bin/get_3ware ] ; then
749 echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
754 # I hate lacking backward compability, so provide an alternative therefore
755 if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
756 function apache2-ssl-certificate(){
758 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
759 print 'You might want to take a look at Debian the package ssl-cert as well.'
760 print 'To generate a certificate for use with apache2 follow the instructions:'
764 export RANDFILE=/dev/random
765 mkdir /etc/apache2/ssl/
766 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
767 chmod 600 /etc/apache2/ssl/apache.pem
769 Run "grml-tips ssl-certificate" if you need further instructions.
775 # {{{ Use hard limits, except for a smaller stack and no core dumps
778 isgrmlcd && limit core 0 # important for a live-cd-system
782 # {{{ completion stuff
784 # called later (via is4 && grmlcomp)
785 # notice: use 'zstyle' for getting current settings
786 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
789 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
790 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
791 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
792 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
793 zstyle ':completion:*:correct:*' original true #
794 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
795 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
796 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
797 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
798 zstyle ':completion:*:history-words' list false #
799 zstyle ':completion:*:history-words' menu yes # activate menu
800 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
801 zstyle ':completion:*:history-words' stop yes #
802 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
803 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
804 zstyle ':completion:*' group-name ''
805 if [[ -z "$NOMENU" ]] ; then
806 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
808 setopt no_auto_menu # don't use any menus at all
810 zstyle ':completion:*:messages' format '%d' #
811 zstyle ':completion:*:options' auto-description '%d' #
812 zstyle ':completion:*:options' description 'yes' # describe options in full
813 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
814 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
815 zstyle ':completion:*' verbose true # provide verbose completion information
816 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
817 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
818 zstyle ':completion:correct:' prompt 'correct to: %e' #
819 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
821 # complete manual by their section
822 zstyle ':completion:*:manuals' separate-sections true
823 zstyle ':completion:*:manuals.*' insert-sections true
824 zstyle ':completion:*:man:*' menu yes select
827 # run rehash on completion so new installed program are found automatically:
829 (( CURRENT == 1 )) && rehash
830 return 1 # Because we didn't really complete anything
832 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
833 if [[ -n "$NOCOR" ]] ; then
834 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files
835 setopt nocorrect # do not try to correct the spelling if possible
837 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files
838 setopt correct # try to correct the spelling if possible
839 zstyle -e ':completion:*' completer '
840 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
841 _last_try="$HISTNO$BUFFER$CURSOR"
842 reply=(_complete _match _prefix _files)
844 if [[ $words[1] = (rm|mv) ]]; then
845 reply=(_complete _files)
847 reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files)
851 # zstyle ':completion:*' completer _complete _correct _approximate
852 # zstyle ':completion:*' expand prefix suffix
854 # automatic rehash? Credits go to Frank Terbeck
855 # function my_accept () {
857 # [[ -z ${BUFFER} ]] && zle accept-line && return
858 # buf=( ${(z)BUFFER} )
859 # [[ -z ${commands[${buf[1]}]} ]] && rehash
863 # bindkey "^M" my_accept
865 # command for process lists, the local web server details and host completion
866 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
869 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
870 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
872 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
874 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
875 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
887 zstyle ':completion:*:hosts' hosts $hosts
888 # zstyle '*' hosts $hosts
890 # specify your logins:
892 # {grml,grml1}@foo.invalid
893 # grml-devel@bar.invalid
896 # {fred,root}@foo.invalid
899 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
900 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
902 # specify specific port/service settings:
903 # telnet_users_hosts_ports=(
906 # @mail-server:{smtp,pop3}
910 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
912 # use generic completion system for programs not yet defined:
913 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
915 # see upgrade function in this file
916 compdef _hosts upgrade
922 # people should use 'grml-x'!
924 if [ -e /etc/X11/xorg.conf ] ; then
925 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
927 echo "Please use the script \"grml-x\" for starting the X Window System
928 because there does not exist /etc/X11/xorg.conf yet.
929 If you want to use startx anyway please call \"/usr/bin/startx\"."
935 if [ -e /etc/X11/xorg.conf ] ; then
936 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
938 echo "Please use the script \"grml-x\" for starting the X Window System.
939 because there does not exist /etc/X11/xorg.conf yet.
940 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
945 if [ -x /usr/sbin/915resolution ] ; then
946 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
949 alias grml-version='cat /etc/grml_version'
951 if [ -x /usr/sbin/rebuildfstab ] ; then
952 alias grml-rebuildfstab='rebuildfstab -v -r -config'
957 # {{{ now run the functions
959 is4 && isgrml && grmlstuff
964 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
967 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
968 # You use it as follows:
969 # $ NTREF=/reference/file
971 # This lists all the files in the current directory newer than the reference file.
972 # You can also specify the reference file inline; note quotes:
973 # $ ls -l *(e:'nt ~/.zshenv':)
978 [[ $REPLY -nt $NTREF ]]
982 # shell functions {{{
983 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
984 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
986 if [[ "$#*" -eq 0 ]]; then
987 [ -r ~/.zshrc ] && . ~/.zshrc
996 compdef _functions reload freload
998 # list symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
1000 [ -z "$1" ] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
1003 while [ -h "$file" ] ; do
1005 file=$(readlink "$file")
1010 # fast manual access
1011 if type -p qma &>/dev/null ; then
1012 manzsh() { qma zshall "$1" }
1015 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1016 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
1017 # manzsh() { man zshall | $MYLESS -p $1 ; }
1020 if [ -x /usr/bin/most ] ; then
1021 # use "dchange <package-name>" to view Debian's changelog of the package:
1023 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
1024 most /usr/share/doc/${1}/changelog.Debian.gz
1026 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1027 most /usr/share/doc/${1}/changelog.gz
1029 echo "No changelog for package $1 found, sorry."
1034 _dchange() { _files -W /usr/share/doc -/ }
1035 compdef _dchange dchange
1037 # use "uchange <package-name>" to view upstream's changelog of the package:
1039 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1040 most /usr/share/doc/${1}/changelog.gz
1042 echo "No changelog for package $1 found, sorry."
1046 _uchange() { _files -W /usr/share/doc -/ }
1047 compdef _uchange uchange
1052 ZSH_PROFILE_RC=1 $SHELL "$@"
1055 # edit alias via zle:
1057 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1059 compdef _aliases edalias
1061 # edit function via zle:
1063 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1065 compdef _functions edfunc
1067 # use it e.g. via 'Restart apache2'
1068 if [ -d /etc/init.d ] ; then
1069 for i in Start Restart Stop Force-Reload Reload ; do
1070 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1072 # now the completion for this:
1073 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
1076 # provide useful information on globbing
1083 p named pipes (FIFOs)
1084 * executable plain files (0100)
1085 % device files (character or block special)
1086 %b block special files
1087 %c character special files
1088 r owner-readable files (0400)
1089 w owner-writable files (0200)
1090 x owner-executable files (0100)
1091 A group-readable files (0040)
1092 I group-writable files (0020)
1093 E group-executable files (0010)
1094 R world-readable files (0004)
1095 W world-writable files (0002)
1096 X world-executable files (0001)
1097 s setuid files (04000)
1098 S setgid files (02000)
1099 t files with the sticky bit (01000)
1101 print *(m-1) # Files modified up to a day ago
1102 print *(a1) # Files accessed a day ago
1103 print *(@) # Just symlinks
1104 print *(Lk+50) # Files bigger than 50 kilobytes
1105 print *(Lk-50) # Files smaller than 50 kilobytes
1106 print **/*.c # All *.c files recursively starting in \$PWD
1107 print **/*.c~file.c # Same as above, but excluding 'file.c'
1108 print (foo|bar).* # Files starting with 'foo' or 'bar'
1109 print *~*.* # All Files that do not contain a dot
1110 chmod 644 *(.^x) # make all plain non-executable files publically readable
1111 print -l *(.c|.h) # Lists *.c and *.h
1112 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1113 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1115 alias help-zshglob=H-Glob
1117 type -p qma &>/dev/null && alias ?='qma zshall'
1119 # grep for running process, like: 'any vim'
1121 if [ -z "$1" ] ; then
1122 echo "any - grep for process(es) by keyword" >&2
1123 echo "Usage: any <keyword>" >&2 ; return 1
1126 local LENGTH=$(expr length $STRING)
1127 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1128 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1129 ps xauwww| grep "[$FIRSCHAR]$REST"
1133 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1134 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1135 [ -r /proc/1/maps ] && deswap() {
1136 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1137 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1138 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1141 # print hex value of a number
1143 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1146 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1147 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1149 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1150 perl -e "print eval($CALC),\"\n\";"
1152 functions peval &>/dev/null && alias calc=peval
1154 # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
1155 # certain circumstances, so work around it, no matter which environment we have
1157 if [ -z "$DISPLAY" ] ; then
1158 consolechars -f /usr/share/consolefonts/default8x16.psf.gz
1165 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1167 # NO_SWITCH="yes" command bash "$@"
1170 # exec $SHELL $SHELL_ARGS "$@"
1175 # log out? set timeout in seconds {{{
1177 # do not log out in some specific terminals:
1178 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1183 # {{{ make sure our environment is clean regarding colors
1184 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1187 # source another config file if present {{{
1188 if [ -r /etc/zsh/zshrc.local ]; then
1189 source /etc/zsh/zshrc.local
1193 # "persistent history" {{{
1194 # just write important commands you always need to ~/.important_commands
1195 if [ -r ~/.important_commands ] ; then
1196 fc -R ~/.important_commands
1200 ## END OF FILE #################################################################
1201 # vim:foldmethod=marker expandtab