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 22 18:37: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 # 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
627 flite -o play -t "Finished setting up software synthesizer"
631 # I like clean prompt, so provide simple way to get that
632 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
634 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
635 if [ -x /usr/sbin/truecrypt ] ; then
637 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
639 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
643 zsh-help(){print "$bg[white]$fg[black]
644 zsh-help - hints for use of zsh on grml
645 =======================================$reset_color
647 Main configuration of zsh happens in /etc/zsh/zshrc (global)
648 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
649 The files are part of the package grml-etc-core, if you want to
650 use them on a non-grml-system just get the tar.gz from
651 http://deb.grml.org/ or get the files from the mercurial
654 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
655 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
657 If you want to stay in sync with zsh configuration of grml
658 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
659 your own stuff in \$HOME/.zshrc.local. System wide configuration
660 without touching configuration files of grml can take place
661 in /etc/zsh/zshrc.local.
663 If you want to use the configuration of user grml also when
664 running as user root just run 'zshskel' which will source
665 the file /etc/skel/.zshrc.
667 For information regarding zsh start at http://grml.org/zsh/
669 Take a look at grml's zsh refcard:
670 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
672 Check out the main zsh refcard:
673 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
675 And of course visit the zsh-lovers:
678 You can adjust some options through environment variables when
679 invoking zsh without having to edit configuration files.
680 Basically meant for bash users who are not used to the power of
683 \"NOCOR=1 zsh\" => deactivate automatic correction
684 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
685 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
686 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
688 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
689 Enjoy your grml system with the zsh!$reset_color"
693 if [ -r /etc/debian_version ] ; then
694 alias acs='apt-cache search'
695 alias acsh='apt-cache show'
696 alias acp='apt-cache policy'
697 alias adg="$SUDO apt-get dist-upgrade"
698 alias agi="$SUDO apt-get install"
699 alias ati="$SUDO aptitude install"
700 alias ag="$SUDO apt-get upgrade"
701 alias au="$SUDO apt-get update"
702 alias up="$SUDO aptitude update ; $SUDO aptitude upgrade"
703 alias dbp='dpkg-buildpackage'
704 alias ge='grep-excuses'
708 if [ -z "$1" ] ; then
710 $SUDO apt-get -u upgrade
712 ssh $1 $SUDO apt-get update
713 # ask before the upgrade
715 ssh $1 $SUDO apt-get --no-act upgrade
716 echo -n 'Process the upgrade?'
718 if [[ $dummy == "y" ]] ; then
719 ssh $1 $SUDO apt-get -u upgrade --yes
724 isgrmlcd && alias su="sudo su" # change to user root
725 alias tlog="tail -f /var/log/syslog" # take a look at the syslog
726 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
729 # sort installed Debian-packages by size
730 if [ -x /usr/bin/grep-status ] ; then
731 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
732 -n "install ok installed" | paste -sd " \n" | sort -rn'
735 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
736 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
737 if [ -x $(which wodim) ] ; then
738 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
739 See #377109 in the BTS of Debian for more details.
741 Please use the wodim binary instead' ; return 1"
745 # get_tw_cli has been renamed into get_3ware
746 if [ -x /usr/bin/get_3ware ] ; then
748 echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
753 # I hate lacking backward compability, so provide an alternative therefore
754 if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
755 function apache2-ssl-certificate(){
757 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
758 print 'You might want to take a look at Debian the package ssl-cert as well.'
759 print 'To generate a certificate for use with apache2 follow the instructions:'
763 export RANDFILE=/dev/random
764 mkdir /etc/apache2/ssl/
765 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
766 chmod 600 /etc/apache2/ssl/apache.pem
768 Run "grml-tips ssl-certificate" if you need further instructions.
774 # {{{ Use hard limits, except for a smaller stack and no core dumps
777 isgrmlcd && limit core 0 # important for a live-cd-system
781 # {{{ completion stuff
783 # called later (via is4 && grmlcomp)
784 # notice: use 'zstyle' for getting current settings
785 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
788 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
789 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
790 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
791 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
792 zstyle ':completion:*:correct:*' original true #
793 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
794 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
795 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
796 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
797 zstyle ':completion:*:history-words' list false #
798 zstyle ':completion:*:history-words' menu yes # activate menu
799 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
800 zstyle ':completion:*:history-words' stop yes #
801 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
802 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
803 zstyle ':completion:*' group-name ''
804 if [[ -z "$NOMENU" ]] ; then
805 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
807 setopt no_auto_menu # don't use any menus at all
809 zstyle ':completion:*:messages' format '%d' #
810 zstyle ':completion:*:options' auto-description '%d' #
811 zstyle ':completion:*:options' description 'yes' # describe options in full
812 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
813 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
814 zstyle ':completion:*' verbose true # provide verbose completion information
815 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
816 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
817 zstyle ':completion:correct:' prompt 'correct to: %e' #
818 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
820 # complete manual by their section
821 zstyle ':completion:*:manuals' separate-sections true
822 zstyle ':completion:*:manuals.*' insert-sections true
823 zstyle ':completion:*:man:*' menu yes select
826 # run rehash on completion so new installed program are found automatically:
828 (( CURRENT == 1 )) && rehash
829 return 1 # Because we didn't really complete anything
831 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
832 if [[ -n "$NOCOR" ]] ; then
833 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files
834 setopt nocorrect # do not try to correct the spelling if possible
836 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files
837 setopt correct # try to correct the spelling if possible
838 zstyle -e ':completion:*' completer '
839 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
840 _last_try="$HISTNO$BUFFER$CURSOR"
841 reply=(_complete _match _prefix _files)
843 if [[ $words[1] = (rm|mv) ]]; then
844 reply=(_complete _files)
846 reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files)
850 # zstyle ':completion:*' completer _complete _correct _approximate
851 # zstyle ':completion:*' expand prefix suffix
853 # automatic rehash? Credits go to Frank Terbeck
854 # function my_accept () {
856 # [[ -z ${BUFFER} ]] && zle accept-line && return
857 # buf=( ${(z)BUFFER} )
858 # [[ -z ${commands[${buf[1]}]} ]] && rehash
862 # bindkey "^M" my_accept
864 # command for process lists, the local web server details and host completion
865 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
868 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
869 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
871 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
873 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
874 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
886 zstyle ':completion:*:hosts' hosts $hosts
887 # zstyle '*' hosts $hosts
889 # specify your logins:
891 # {grml,grml1}@foo.invalid
892 # grml-devel@bar.invalid
895 # {fred,root}@foo.invalid
898 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
899 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
901 # specify specific port/service settings:
902 # telnet_users_hosts_ports=(
905 # @mail-server:{smtp,pop3}
909 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
911 # use generic completion system for programs not yet defined:
912 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
914 # see upgrade function in this file
915 compdef _hosts upgrade
921 # people should use 'grml-x'!
923 if [ -e /etc/X11/xorg.conf ] ; then
924 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
926 echo "Please use the script \"grml-x\" for starting the X Window System
927 because there does not exist /etc/X11/xorg.conf yet.
928 If you want to use startx anyway please call \"/usr/bin/startx\"."
934 if [ -e /etc/X11/xorg.conf ] ; then
935 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
937 echo "Please use the script \"grml-x\" for starting the X Window System.
938 because there does not exist /etc/X11/xorg.conf yet.
939 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
944 if [ -x /usr/sbin/915resolution ] ; then
945 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
948 alias grml-version='cat /etc/grml_version'
950 if [ -x /usr/sbin/rebuildfstab ] ; then
951 alias grml-rebuildfstab='rebuildfstab -v -r -config'
956 # {{{ now run the functions
958 is4 && isgrml && grmlstuff
963 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
966 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
967 # You use it as follows:
968 # $ NTREF=/reference/file
970 # This lists all the files in the current directory newer than the reference file.
971 # You can also specify the reference file inline; note quotes:
972 # $ ls -l *(e:'nt ~/.zshenv':)
977 [[ $REPLY -nt $NTREF ]]
981 # shell functions {{{
982 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
983 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
985 if [[ "$#*" -eq 0 ]]; then
986 [ -r ~/.zshrc ] && . ~/.zshrc
995 compdef _functions reload freload
997 # list symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
999 [ -z "$1" ] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
1002 while [ -h "$file" ] ; do
1004 file=$(readlink "$file")
1009 # fast manual access
1010 if type -p qma &>/dev/null ; then
1011 manzsh() { qma zshall "$1" }
1014 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1015 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
1016 # manzsh() { man zshall | $MYLESS -p $1 ; }
1019 if [ -x /usr/bin/most ] ; then
1020 # use "dchange <package-name>" to view Debian's changelog of the package:
1022 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
1023 most /usr/share/doc/${1}/changelog.Debian.gz
1025 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1026 most /usr/share/doc/${1}/changelog.gz
1028 echo "No changelog for package $1 found, sorry."
1033 _dchange() { _files -W /usr/share/doc -/ }
1034 compdef _dchange dchange
1036 # use "uchange <package-name>" to view upstream's changelog of the package:
1038 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1039 most /usr/share/doc/${1}/changelog.gz
1041 echo "No changelog for package $1 found, sorry."
1045 _uchange() { _files -W /usr/share/doc -/ }
1046 compdef _uchange uchange
1051 ZSH_PROFILE_RC=1 $SHELL "$@"
1054 # edit alias via zle:
1056 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1058 compdef _aliases edalias
1060 # edit function via zle:
1062 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1064 compdef _functions edfunc
1066 # use it e.g. via 'Restart apache2'
1067 if [ -d /etc/init.d ] ; then
1068 for i in Start Restart Stop Force-Reload Reload ; do
1069 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1071 # now the completion for this:
1072 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
1075 # provide useful information on globbing
1082 p named pipes (FIFOs)
1083 * executable plain files (0100)
1084 % device files (character or block special)
1085 %b block special files
1086 %c character special files
1087 r owner-readable files (0400)
1088 w owner-writable files (0200)
1089 x owner-executable files (0100)
1090 A group-readable files (0040)
1091 I group-writable files (0020)
1092 E group-executable files (0010)
1093 R world-readable files (0004)
1094 W world-writable files (0002)
1095 X world-executable files (0001)
1096 s setuid files (04000)
1097 S setgid files (02000)
1098 t files with the sticky bit (01000)
1100 print *(m-1) # Files modified up to a day ago
1101 print *(a1) # Files accessed a day ago
1102 print *(@) # Just symlinks
1103 print *(Lk+50) # Files bigger than 50 kilobytes
1104 print *(Lk-50) # Files smaller than 50 kilobytes
1105 print **/*.c # All *.c files recursively starting in \$PWD
1106 print **/*.c~file.c # Same as above, but excluding 'file.c'
1107 print (foo|bar).* # Files starting with 'foo' or 'bar'
1108 print *~*.* # All Files that do not contain a dot
1109 chmod 644 *(.^x) # make all plain non-executable files publically readable
1110 print -l *(.c|.h) # Lists *.c and *.h
1111 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1112 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1114 alias help-zshglob=H-Glob
1116 type -p qma &>/dev/null && alias ?='qma zshall'
1118 # grep for running process, like: 'any vim'
1120 if [ -z "$1" ] ; then
1121 echo "any - grep for process(es) by keyword" >&2
1122 echo "Usage: any <keyword>" >&2 ; return 1
1125 local LENGTH=$(expr length $STRING)
1126 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1127 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1128 ps xauwww| grep "[$FIRSCHAR]$REST"
1132 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1133 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1134 [ -r /proc/1/maps ] && deswap() {
1135 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1136 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1137 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1140 # print hex value of a number
1142 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1145 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1146 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1148 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1149 perl -e "print eval($CALC),\"\n\";"
1151 functions peval &>/dev/null && alias calc=peval
1153 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1155 # NO_SWITCH="yes" command bash "$@"
1158 # exec $SHELL $SHELL_ARGS "$@"
1163 # log out? set timeout in seconds {{{
1165 # do not log out in some specific terminals:
1166 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1171 # {{{ make sure our environment is clean regarding colors
1172 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1175 # source another config file if present {{{
1176 if [ -r /etc/zsh/zshrc.local ]; then
1177 source /etc/zsh/zshrc.local
1181 # "persistent history" {{{
1182 # just write important commands you always need to ~/.important_commands
1183 if [ -r ~/.important_commands ] ; then
1184 fc -R ~/.important_commands
1188 ## END OF FILE #################################################################
1189 # vim:foldmethod=marker expandtab