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 'insecscp' 'scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
239 'fori' 'for i ({..}) { }'
242 'se' 'setopt interactivecomments'
243 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
244 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
245 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3'
247 'D' 'export DISPLAY=:0.0'
248 'mp' 'mplayer -vo xv -fs -zoom'
253 matched_chars='[.-|_a-zA-Z0-9]#'
254 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
255 LBUFFER+=${abk[$MATCH]:-$MATCH}
259 bindkey ",." globalias
263 autoload -U zmv # who needs mmv or rename?
264 autoload history-search-end
266 # we don't want to quote/espace URLs on our own...
267 # if autoload -U url-quote-magic ; then
268 # zle -N self-insert url-quote-magic
269 # zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
271 # print 'Notice: no url-quote-magic available :('
273 alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
275 alias run-help >&/dev/null && unalias run-help
276 autoload run-help # use via 'esc-h'
279 if autoload -U compinit && compinit 2>/dev/null ; then
280 compinit 2>/dev/null || print 'Notice: no compinit available :('
282 print 'Notice: no compinit available :('
287 is4 && autoload -U zed # use ZLE editor to edit a file or function
289 is4 && for mod in complist deltochar mathfunc ; do
290 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
293 # autoload zsh modules when they are referenced
294 is4 && for opt mod in a stat \
298 zmodload -${opt} zsh/${mod} ${mod}
301 is4 && autoload -U insert-files && \
302 zle -N insert-files && \
303 bindkey "^Xf" insert-files # C-x-f
305 bindkey ' ' magic-space # also do history expansion on space
306 bindkey '\ei' menu-complete # menu completion via esc-i
308 # press esc-e for editing command line in $EDITOR or $VISUAL
309 is4 && autoload -U edit-command-line && \
310 zle -N edit-command-line && \
311 bindkey '\ee' edit-command-line
313 # menu selection: pick item but stay in the menu (press esc-return)
314 is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
316 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
317 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
318 bindkey '\C-ed' _bkdate
321 # press esc-m for inserting last typed word again (thanks to caphuso!)
322 insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
323 zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
325 # set command prediction from history, see 'man 1 zshcontrib'
326 # is4 && autoload -U predict-on && \
327 # zle -N predict-on && \
328 # zle -N predict-off && \
329 # bindkey "^X^Z" predict-on && \
330 # bindkey "^Z" predict-off
332 # put job into foreground via ctrl-z:
333 bindkey -s '^z' "fg\n"
335 # press ctrl-q to quote line:
337 # zle beginning-of-line
339 # # RBUFFER="'$RBUFFER'"
340 # RBUFFER=${(q)RBUFFER}
343 # zle -N mquote && bindkey '^q' mquote
345 # run command line as user root via sudo:
346 _sudo-command-line() {
347 [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
349 zle -N sudo-command-line _sudo-command-line
350 bindkey "^Os" sudo-command-line
353 # {{{ set some important options
354 (( EUID != 0 )) && umask 002 || umask 022
357 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
358 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
359 setopt extended_history # save each command's beginning timestamp and the duration to the history file
360 is4 && setopt histignorealldups # If a new command line being added to the history
361 # list duplicates an older one, the older command is removed from the list
362 setopt histignorespace # remove command lines from the history list when
363 # the first character on the line is a space
364 # setopt histallowclobber # add `|' to output redirections in the history
365 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
366 setopt auto_cd # if a command is issued that can't be executed as a normal command,
367 # and the command is the name of a directory, perform the cd command to that directory
368 setopt extended_glob # in order to use #, ~ and ^ for filename generation
369 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
370 # -> searches for word not in compressed files
371 # don't forget to quote '^', '~' and '#'!
372 setopt notify # report the status of backgrounds jobs immediately
373 setopt hash_list_all # Whenever a command completion is attempted, make sure \
374 # the entire command path is hashed first.
375 setopt completeinword # not just at the end
376 # setopt nocheckjobs # don't warn me about bg processes when exiting
377 setopt nohup # and don't kill them, either
378 # setopt printexitvalue # alert me if something failed
379 # setopt dvorak # with spelling correction, assume dvorak kb
380 setopt auto_pushd # make cd push the old directory onto the directory stack.
381 setopt nonomatch # try to avoid the 'zsh: no matches found...'
382 setopt nobeep # avoid "beep"ing
384 MAILCHECK=30 # mailchecks
385 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 secondes
386 watch=(notme root) # watch for everyone but me and root
388 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
389 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
391 # WORDCHARS='*?_[]~=&;!#$%^(){}'
392 # WORDCHARS='${WORDCHARS:s@/@}'
394 # only slash should be considered as a word separator:
395 slash-backward-kill-word() {
396 local WORDCHARS="${WORDCHARS:s@/@}"
398 zle backward-kill-word
400 zle -N slash-backward-kill-word
401 bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
405 export ZSHDIR=$HOME/.zsh
406 HISTFILE=$HOME/.zsh_history
407 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
408 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
411 # dirstack handling {{{
413 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
414 dirstack=( ${(uf)"$(< ~/.zdirs)"} )
415 # "cd -" won't work after login by just setting $OLDPWD, so
416 cd $dirstack[0] && cd $OLDPWD
419 builtin dirs -pl >! ~/.zdirs
423 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
424 if [ -n "$BATTERY" ] ; then
425 if [ -x $(which acpi) ] ; then
426 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
427 [ -z "$PERCENT" ] && PERCENT='acpi not present'
428 if [ "${PERCENT%%%}" -lt 20 ] ; then
429 PERCENT="warning: ${PERCENT}%"
436 if autoload promptinit && promptinit 2>/dev/null ; then
437 promptinit # people should be able to use their favourite prompt
439 print 'Notice: no promptinit available :('
442 # precmd() => a function which is executed just before each prompt
443 # use 'NOPRECMD=1' to disable the precmd + preexec commands
445 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
447 # make sure to use right prompt only when not running a command
448 is4 && setopt transient_rprompt
450 is4 && [[ -z $NOPRECMD ]] && precmd () {
451 [[ -n $NOPRECMD ]] && return 0
452 # allow manual overwriting of RPROMPT
453 if [[ -n $RPROMPT ]] ; then
454 [[ $TERM == screen* ]] && echo -n $'\ekzsh\e\\'
457 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
458 if [[ -z $DONTSETRPROMPT ]] ; then
459 if [[ -n $BATTERY ]] ; then
460 RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
461 # RPROMPT="${PERCENT}${SCREENTITLE}"
463 RPROMPT="%(?..:()% ${SCREENTITLE}"
464 # RPROMPT="${SCREENTITLE}"
467 # adjust title of xterm
468 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
469 case $TERM in (xterm*|rxvt)
470 print -Pn "\e]0;%n@%m: %~\a"
475 # chpwd () => a function which is executed whenever the directory is changed
477 # preexec() => a function running before every command
478 is4 && [[ -z $NOPRECMD ]] && preexec () {
479 [[ -n $NOPRECMD ]] && return 0
480 # set hostname if not running on host with name 'grml'
481 local HOSTNAME=$(hostname)
482 if [[ "$HOSTNAME" != grml ]] ; then
485 # get the name of the program currently running and hostname of local machine
486 # set screen window title if running in a screen
487 if [[ "$TERM" == screen* ]]; then
488 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
489 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
490 echo -ne "\ek$CMD\e\\"
492 # set the screen title to "zsh" when sitting at the command prompt:
493 if [[ "$TERM" == screen* ]]; then
494 SCREENTITLE=$'%{\ekzsh\e\\%}'
498 # adjust title of xterm
499 case $TERM in (xterm*|rxvt)
500 print -Pn "\e]0;%n@%m: $1\a"
506 if autoload colors && colors 2>/dev/null ; then
507 BLUE="%{${fg[blue]}%}"
508 RED="%{${fg_bold[red]}%}"
509 GREEN="%{${fg[green]}%}"
510 CYAN="%{${fg[cyan]}%}"
511 WHITE="%{${fg[white]}%}"
512 NO_COLOUR="%{${reset_color}%}"
519 NO_COLOUR="%{
\e[0m%}"
522 EXITCODE="%(?..%?%1v )"
523 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
524 PS3='?# ' # selection prompt used within a select loop.
525 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
527 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
528 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
529 debian_chroot=$(cat /etc/debian_chroot)
532 # don't use colors on dumb terminals (like emacs):
533 if [[ "$TERM" == dumb ]] ; then
534 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
536 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
537 # set variable identifying the chroot you work in (used in the prompt below)
538 if [[ -n $GRMLPROMPT ]]; then
539 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
540 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
542 if (( EUID != 0 )); then
543 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
545 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
550 # if we are inside a grml-chroot set a specific prompt theme
551 if [ -n "$GRML_CHROOT" ] ; then
552 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
556 # {{{ 'hash' some often used directories
557 hash -d deb=/var/cache/apt/archives
558 hash -d doc=/usr/share/doc
559 hash -d linux=/lib/modules/$(command uname -r)/build/
561 hash -d slog=/var/log/syslog
563 hash -d templ=/usr/share/doc/grml-templates
564 hash -d tt=/usr/share/doc/texttools-doc
569 if [ $UID = 0 ] ; then
570 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
571 elif [ -r $HOME/.screenrc ] ; then
572 alias screen="/usr/bin/screen -c $HOME/.screenrc"
574 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
577 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
578 alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
579 alias la='ls -la --color=auto'
580 alias ll='ls -l --color=auto'
581 alias lh='ls -hAl --color=auto'
582 alias l='ls -lF --color=auto'
591 alias mdstat='cat /proc/mdstat'
592 alias ...='cd ../../'
594 alias cp='nocorrect cp' # no spelling correction on cp
595 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
596 alias mv='nocorrect mv' # no spelling correction on mv
597 alias rm='nocorrect rm' # no spelling correction on rm
602 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
603 alias term2iso="echo 'Setting terminal to iso mode' ; echo -e '
\e%@'"
604 alias term2utf="echo 'Setting terminal to utf-8 mode'; echo -e '
\e%G'"
606 alias utf2iso='if isutfenv ; then
607 for ENV in `env | grep UTF` ; do
608 eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')"
611 alias iso2utf='if isutfenv ; then
612 for ENV in `env | grep '\.iso'` ; do
613 eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')"
617 # set up software synthesizer via speakup
619 aumix -w 90 -v 90 -p 90 -m 90
620 if ! [ -r /dev/softsynth ] ; then
621 flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
627 nice -n -20 speechd-up
629 flite -o play -t "Finished setting up software synthesizer"
633 # I like clean prompt, so provide simple way to get that
634 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
636 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
637 if [ -x /usr/sbin/truecrypt ] ; then
639 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
641 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
645 zsh-help(){print "$bg[white]$fg[black]
646 zsh-help - hints for use of zsh on grml
647 =======================================$reset_color
649 Main configuration of zsh happens in /etc/zsh/zshrc (global)
650 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
651 The files are part of the package grml-etc-core, if you want to
652 use them on a non-grml-system just get the tar.gz from
653 http://deb.grml.org/ or get the files from the mercurial
656 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
657 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
659 If you want to stay in sync with zsh configuration of grml
660 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
661 your own stuff in \$HOME/.zshrc.local. System wide configuration
662 without touching configuration files of grml can take place
663 in /etc/zsh/zshrc.local.
665 If you want to use the configuration of user grml also when
666 running as user root just run 'zshskel' which will source
667 the file /etc/skel/.zshrc.
669 For information regarding zsh start at http://grml.org/zsh/
671 Take a look at grml's zsh refcard:
672 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
674 Check out the main zsh refcard:
675 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
677 And of course visit the zsh-lovers:
680 You can adjust some options through environment variables when
681 invoking zsh without having to edit configuration files.
682 Basically meant for bash users who are not used to the power of
685 \"NOCOR=1 zsh\" => deactivate automatic correction
686 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
687 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
688 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
690 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
691 Enjoy your grml system with the zsh!$reset_color"
695 if [ -r /etc/debian_version ] ; then
696 alias acs='apt-cache search'
697 alias acsh='apt-cache show'
698 alias acp='apt-cache policy'
699 alias adg="$SUDO apt-get dist-upgrade"
700 alias agi="$SUDO apt-get install"
701 alias ati="$SUDO aptitude install"
702 alias ag="$SUDO apt-get upgrade"
703 alias au="$SUDO apt-get update"
704 alias up="$SUDO aptitude update ; $SUDO aptitude upgrade"
705 alias dbp='dpkg-buildpackage'
706 alias ge='grep-excuses'
710 if [ -z "$1" ] ; then
712 $SUDO apt-get -u upgrade
714 ssh $1 $SUDO apt-get update
715 # ask before the upgrade
717 ssh $1 $SUDO apt-get --no-act upgrade
718 echo -n 'Process the upgrade?'
720 if [[ $dummy == "y" ]] ; then
721 ssh $1 $SUDO apt-get -u upgrade --yes
726 isgrmlcd && alias su="sudo su" # change to user root
727 alias tlog="tail -f /var/log/syslog" # take a look at the syslog
728 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
731 # sort installed Debian-packages by size
732 if [ -x /usr/bin/grep-status ] ; then
733 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
734 -n "install ok installed" | paste -sd " \n" | sort -rn'
737 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
738 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
739 if [ -x $(which wodim) ] ; then
740 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
741 See #377109 in the BTS of Debian for more details.
743 Please use the wodim binary instead' ; return 1"
747 # get_tw_cli has been renamed into get_3ware
748 if [ -x /usr/bin/get_3ware ] ; then
750 echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
755 # I hate lacking backward compability, so provide an alternative therefore
756 if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
757 function apache2-ssl-certificate(){
759 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
760 print 'You might want to take a look at Debian the package ssl-cert as well.'
761 print 'To generate a certificate for use with apache2 follow the instructions:'
765 export RANDFILE=/dev/random
766 mkdir /etc/apache2/ssl/
767 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
768 chmod 600 /etc/apache2/ssl/apache.pem
770 Run "grml-tips ssl-certificate" if you need further instructions.
776 # {{{ Use hard limits, except for a smaller stack and no core dumps
779 isgrmlcd && limit core 0 # important for a live-cd-system
783 # {{{ completion stuff
785 # called later (via is4 && grmlcomp)
786 # notice: use 'zstyle' for getting current settings
787 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
790 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
791 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
792 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
793 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
794 zstyle ':completion:*:correct:*' original true #
795 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
796 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
797 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
798 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
799 zstyle ':completion:*:history-words' list false #
800 zstyle ':completion:*:history-words' menu yes # activate menu
801 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
802 zstyle ':completion:*:history-words' stop yes #
803 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
804 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
805 zstyle ':completion:*' group-name ''
806 if [[ -z "$NOMENU" ]] ; then
807 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
809 setopt no_auto_menu # don't use any menus at all
811 zstyle ':completion:*:messages' format '%d' #
812 zstyle ':completion:*:options' auto-description '%d' #
813 zstyle ':completion:*:options' description 'yes' # describe options in full
814 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
815 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
816 zstyle ':completion:*' verbose true # provide verbose completion information
817 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
818 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
819 zstyle ':completion:correct:' prompt 'correct to: %e' #
820 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
822 # complete manual by their section
823 zstyle ':completion:*:manuals' separate-sections true
824 zstyle ':completion:*:manuals.*' insert-sections true
825 zstyle ':completion:*:man:*' menu yes select
828 # run rehash on completion so new installed program are found automatically:
830 (( CURRENT == 1 )) && rehash
831 return 1 # Because we didn't really complete anything
833 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
834 if [[ -n "$NOCOR" ]] ; then
835 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files
836 setopt nocorrect # do not try to correct the spelling if possible
838 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files
839 setopt correct # try to correct the spelling if possible
840 zstyle -e ':completion:*' completer '
841 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
842 _last_try="$HISTNO$BUFFER$CURSOR"
843 reply=(_complete _match _prefix _files)
845 if [[ $words[1] = (rm|mv) ]]; then
846 reply=(_complete _files)
848 reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files)
852 # zstyle ':completion:*' completer _complete _correct _approximate
853 # zstyle ':completion:*' expand prefix suffix
855 # automatic rehash? Credits go to Frank Terbeck
856 # function my_accept () {
858 # [[ -z ${BUFFER} ]] && zle accept-line && return
859 # buf=( ${(z)BUFFER} )
860 # [[ -z ${commands[${buf[1]}]} ]] && rehash
864 # bindkey "^M" my_accept
866 # command for process lists, the local web server details and host completion
867 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
870 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
871 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
873 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
875 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
876 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
888 zstyle ':completion:*:hosts' hosts $hosts
889 # zstyle '*' hosts $hosts
891 # specify your logins:
893 # {grml,grml1}@foo.invalid
894 # grml-devel@bar.invalid
897 # {fred,root}@foo.invalid
900 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
901 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
903 # specify specific port/service settings:
904 # telnet_users_hosts_ports=(
907 # @mail-server:{smtp,pop3}
911 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
913 # use generic completion system for programs not yet defined:
914 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
916 # see upgrade function in this file
917 compdef _hosts upgrade
923 # people should use 'grml-x'!
925 if [ -e /etc/X11/xorg.conf ] ; then
926 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
928 echo "Please use the script \"grml-x\" for starting the X Window System
929 because there does not exist /etc/X11/xorg.conf yet.
930 If you want to use startx anyway please call \"/usr/bin/startx\"."
936 if [ -e /etc/X11/xorg.conf ] ; then
937 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
939 echo "Please use the script \"grml-x\" for starting the X Window System.
940 because there does not exist /etc/X11/xorg.conf yet.
941 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
946 if [ -x /usr/sbin/915resolution ] ; then
947 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
950 alias grml-version='cat /etc/grml_version'
952 if [ -x /usr/sbin/rebuildfstab ] ; then
953 alias grml-rebuildfstab='rebuildfstab -v -r -config'
958 # {{{ now run the functions
960 is4 && isgrml && grmlstuff
965 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
968 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
969 # You use it as follows:
970 # $ NTREF=/reference/file
972 # This lists all the files in the current directory newer than the reference file.
973 # You can also specify the reference file inline; note quotes:
974 # $ ls -l *(e:'nt ~/.zshenv':)
979 [[ $REPLY -nt $NTREF ]]
983 # shell functions {{{
984 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
985 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
987 if [[ "$#*" -eq 0 ]]; then
988 [ -r ~/.zshrc ] && . ~/.zshrc
997 compdef _functions reload freload
999 # list symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
1001 [ -z "$1" ] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
1004 while [ -h "$file" ] ; do
1006 file=$(readlink "$file")
1011 # fast manual access
1012 if type -p qma &>/dev/null ; then
1013 manzsh() { qma zshall "$1" }
1016 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1017 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
1018 # manzsh() { man zshall | $MYLESS -p $1 ; }
1021 if [ -x /usr/bin/most ] ; then
1022 # use "dchange <package-name>" to view Debian's changelog of the package:
1024 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
1025 most /usr/share/doc/${1}/changelog.Debian.gz
1027 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1028 most /usr/share/doc/${1}/changelog.gz
1030 echo "No changelog for package $1 found, sorry."
1035 _dchange() { _files -W /usr/share/doc -/ }
1036 compdef _dchange dchange
1038 # use "uchange <package-name>" to view upstream's changelog of the package:
1040 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1041 most /usr/share/doc/${1}/changelog.gz
1043 echo "No changelog for package $1 found, sorry."
1047 _uchange() { _files -W /usr/share/doc -/ }
1048 compdef _uchange uchange
1053 ZSH_PROFILE_RC=1 $SHELL "$@"
1056 # edit alias via zle:
1058 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1060 compdef _aliases edalias
1062 # edit function via zle:
1064 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1066 compdef _functions edfunc
1068 # use it e.g. via 'Restart apache2'
1069 if [ -d /etc/init.d ] ; then
1070 for i in Start Restart Stop Force-Reload Reload ; do
1071 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1073 # now the completion for this:
1074 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
1077 # provide useful information on globbing
1084 p named pipes (FIFOs)
1085 * executable plain files (0100)
1086 % device files (character or block special)
1087 %b block special files
1088 %c character special files
1089 r owner-readable files (0400)
1090 w owner-writable files (0200)
1091 x owner-executable files (0100)
1092 A group-readable files (0040)
1093 I group-writable files (0020)
1094 E group-executable files (0010)
1095 R world-readable files (0004)
1096 W world-writable files (0002)
1097 X world-executable files (0001)
1098 s setuid files (04000)
1099 S setgid files (02000)
1100 t files with the sticky bit (01000)
1102 print *(m-1) # Files modified up to a day ago
1103 print *(a1) # Files accessed a day ago
1104 print *(@) # Just symlinks
1105 print *(Lk+50) # Files bigger than 50 kilobytes
1106 print *(Lk-50) # Files smaller than 50 kilobytes
1107 print **/*.c # All *.c files recursively starting in \$PWD
1108 print **/*.c~file.c # Same as above, but excluding 'file.c'
1109 print (foo|bar).* # Files starting with 'foo' or 'bar'
1110 print *~*.* # All Files that do not contain a dot
1111 chmod 644 *(.^x) # make all plain non-executable files publically readable
1112 print -l *(.c|.h) # Lists *.c and *.h
1113 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1114 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1116 alias help-zshglob=H-Glob
1118 type -p qma &>/dev/null && alias ?='qma zshall'
1120 # grep for running process, like: 'any vim'
1122 if [ -z "$1" ] ; then
1123 echo "any - grep for process(es) by keyword" >&2
1124 echo "Usage: any <keyword>" >&2 ; return 1
1127 local LENGTH=$(expr length $STRING)
1128 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1129 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1130 ps xauwww| grep "[$FIRSCHAR]$REST"
1134 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1135 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1136 [ -r /proc/1/maps ] && deswap() {
1137 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1138 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1139 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1142 # print hex value of a number
1144 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1147 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1148 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1150 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1151 perl -e "print eval($CALC),\"\n\";"
1153 functions peval &>/dev/null && alias calc=peval
1155 # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
1156 # certain circumstances, so work around it, no matter which environment we have
1158 if [ -z "$DISPLAY" ] ; then
1159 consolechars -f /usr/share/consolefonts/default8x16.psf.gz
1166 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1168 # NO_SWITCH="yes" command bash "$@"
1171 # exec $SHELL $SHELL_ARGS "$@"
1176 # log out? set timeout in seconds {{{
1178 # do not log out in some specific terminals:
1179 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1184 # {{{ make sure our environment is clean regarding colors
1185 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1188 # source another config file if present {{{
1189 if [ -r /etc/zsh/zshrc.local ]; then
1190 source /etc/zsh/zshrc.local
1194 # "persistent history" {{{
1195 # just write important commands you always need to ~/.important_commands
1196 if [ -r ~/.important_commands ] ; then
1197 fc -R ~/.important_commands
1201 ## END OF FILE #################################################################
1202 # vim:foldmethod=marker expandtab