2 # Purpose: config file for zsh (z shell)
3 # Authors: grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
4 # Bug-Reports: see http://grml.org/bugs/
5 # License: This file is licensed under the GPL v2.
6 # Latest change: Sam Jun 09 18:44:38 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 potentially old files in 'completion.d' {{{
24 xof=(/etc/zsh/completion.d/*~/etc/zsh/completion.d/_*(N))
25 if (( ${#xof} > 0 )) ; then
26 printf '\n -!- INFORMATION\n\n'
27 printf ' -!- %s file(s) not starting with an underscore (_) found in\n' ${#xof}
28 printf ' -!- /etc/zsh/completion.d/.\n\n'
29 printf ' -!- While this has been the case in old versions of grml-etc-core,\n'
30 printf ' -!- recent versions of the grml-zsh-setup have all these files rewritten\n'
31 printf ' -!- and renamed. Furthermore, the grml-zsh-setup will *only* add files\n'
32 printf ' -!- named _* to that directory.\n\n'
33 printf ' -!- If you added functions to completion.d yourself, please consider\n'
34 printf ' -!- moving them to /etc/zsh/functions.d/. Files in that directory, not\n'
35 printf ' -!- starting with an underscore are marked for automatic loading\n'
36 printf ' -!- by default (so that is quite convenient).\n\n'
37 printf ' -!- If there are files *not* starting with an underscore from an older\n'
38 printf ' -!- grml-etc-core in completion.d, you may safely remove them.\n\n'
39 printf ' -!- Delete the files for example via running:\n\n'
40 printf " rm ${xof}\n\n"
41 printf ' -!- Note, that this message will *not* go away, unless you yourself\n'
42 printf ' -!- resolve the situation manually.\n\n'
43 BROKEN_COMPLETION_DIR=1
48 # {{{ check for version/system
49 # check for versions (compatibility reasons)
50 if autoload is-at-least && is-at-least 2>/dev/null ; then
51 is4() { is-at-least 4 }
52 is42() { is-at-least 4.2 }
55 [[ $ZSH_VERSION == 4.* ]] && return 0
59 [[ $ZSH_VERSION == 4.<2->* ]] && return 0
66 [ -f /etc/grml_version ] && return 0
71 [ -f /etc/grml_cd ] && return 0
77 [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
80 isgrmlsmall() { return 1 }
83 # are we running within an utf environment?
85 case "$LANG $CHARSET $LANGUAGE" in
92 # check for user, if not running as root set $SUDO to sudo
93 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
96 # creates an alias and precedes the command with
97 # sudo if $EUID is not zero.
98 local only=0 ; local multi=0
99 while [[ ${1} == -* ]] ; do
103 (--) shift ; break ;;
105 printf 'usage: salias [-h|-o|-a] <alias-expression>\n'
106 printf ' -h shows this help text.\n'
107 printf ' -a replace '\'' ; '\'' sequences with '\'' ; sudo '\''.\n'
108 printf ' be careful using this option.\n'
109 printf ' -o only sets an alias if a preceding sudo would be needed.\n'
112 (*) printf "unkown option: '%s'\n" "${1}" ; return 1 ;;
116 if (( ${#argv} > 1 )) ; then
117 printf 'Too many arguments %s\n' "${#argv}"
120 key="${1%%\=*}" ; val="${1#*\=}"
121 if (( EUID == 0 )) && (( only == 0 )); then
122 alias -- "${key}=${val}"
123 elif (( EUID > 0 )) ; then
124 (( multi > 0 )) && val="${val// ; / ; sudo }"
125 alias -- "${key}=sudo ${val}"
130 # change directory to home on first invocation of zsh
131 # important for rungetty -> autologin
132 # Thanks go to Bart Schaefer!
133 isgrml && checkhome() {
134 if [[ -z "$ALREADY_DID_CD_HOME" ]]; then
135 export ALREADY_DID_CD_HOME=$HOME
141 # {{{ set some variables
142 export EDITOR=${EDITOR:-vim}
143 export MAIL=${MAIL:-/var/mail/$USER}
144 # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
145 export SHELL='/bin/zsh'
146 [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
147 [ -x $(which dircolors) ] && eval `dircolors -b`
149 # Search path for the cd comman
152 # completion functions go to /etc/zsh/completion.d
153 # function files may be put into /etc/zsh/functions.d, from where they
154 # will be automatically autoloaded.
155 if [ -n "$BROKEN_COMPLETION_DIR" ] ; then
156 print 'Warning: not setting completion directories because broken files have been found.'>&2
158 [[ -d /etc/zsh/completion.d ]] && fpath+=( /etc/zsh/completion.d )
159 if [[ -d /etc/zsh/functions.d ]] ; then
160 fpath+=( /etc/zsh/functions.d )
161 for func in /etc/zsh/functions.d/[^_]*[^~] ; do
162 autoload -U ${func:t}
167 # automatically remove duplicates from these arrays
168 typeset -U path cdpath fpath manpath
172 if [[ "$TERM" != emacs ]]; then
173 [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
174 [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
175 [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
176 [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
177 [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
178 [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
179 [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
180 [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
181 [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
182 [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
183 [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
184 [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
186 [[ "$terminfo[kcuu1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
187 [[ "$terminfo[kcud1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
188 [[ "$terminfo[kcuf1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
189 [[ "$terminfo[kcub1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
190 [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
191 [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
192 [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
193 [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
196 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
197 # use emacs style per default:
202 #if [[ "$TERM" == screen ]]; then
203 bindkey '\e[1~' beginning-of-line # home
204 bindkey '\e[4~' end-of-line # end
205 bindkey '\e[A' up-line-or-search # cursor up
206 bindkey '\e[B' down-line-or-search # <ESC>-
207 bindkey '^x' history-beginning-search-backward # alternative ways of searching the shell history
208 # bindkey -s '^L' "|less\n" # ctrl-L pipes to less
209 # bindkey -s '^B' " &\n" # ctrl-B runs it in the background
210 # if terminal type is set to 'rxvt':
211 bindkey '\e[7~' beginning-of-line # home
212 bindkey '\e[8~' end-of-line # end
215 # insert unicode character
216 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an ยง
217 # See for example http://unicode.org/charts/ for unicode characters code
218 autoload insert-unicode-char
219 zle -N insert-unicode-char
220 bindkey '^Xi' insert-unicode-char
222 # just type 'cd ...' to get 'cd ../..'
223 # rationalise-dot() {
224 # if [[ $LBUFFER = *.. ]]; then
230 # zle -N rationalise-dot
231 # bindkey . rationalise-dot
233 # bindkey '\eq' push-line-or-edit
236 # power completion - abbreviation expansion {{{
237 # power completion / abbreviation expansion / buffer expansion
238 # see http://zshwiki.org/home/examples/zleiab for details
239 # less risky than the global aliases but powerful as well
240 # just type the abbreviation key and afterwards ',.' to expand it
243 setopt interactivecomments
251 'G' '|& grep --color=auto'
253 'Hl' ' --help |& less -r'
258 'R' '| tr A-z N-za-m'
263 'hide' "echo -en '\033]50;nil2\007'"
264 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
265 'small' 'echo -en "\033]50;6x10\007"'
266 'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
267 'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
268 'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
269 'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
270 'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
271 'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
275 'co' "./configure && make && sudo make install"
276 'CH' "./configure --help"
277 'conkeror' 'firefox -chrome chrome://conkeror/content'
279 'lad' $'ls -d .*(/)\n# only show dot-directories'
280 'lsa' $'ls -a .*(.)\n# only show dot-files'
281 'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
282 'lsl' $'ls -l *(@[1,10])\n# only symlinks'
283 'lsx' $'ls -l *(*[1,10])\n# only executables'
284 'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
285 'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
286 'lsd' $'ls -d *(/)\n# only show directories'
287 'lse' $'ls -d *(/^F)\n# only show empty directories'
288 'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
289 'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
290 'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
292 '600' 'chmod u+rw-x,g-rwx,o-rwx'
294 '700' 'chmod u+rwx,g-rwx,o-rwx'
295 'r--' 'chmod u+r-wx,g-rwx,o-rwx'
296 '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
297 '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
299 'cmplayer' 'mplayer -vo -fs -zoom fbdev'
300 'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
301 'fblinks' 'links2 -driver fb'
302 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
303 'insecscp' 'scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
304 'fori' 'for i ({..}) { }'
307 'se' 'setopt interactivecomments'
308 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
309 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
310 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3'
312 'D' 'export DISPLAY=:0.0'
313 'mp' 'mplayer -vo xv -fs -zoom'
318 matched_chars='[.-|_a-zA-Z0-9]#'
319 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
320 LBUFFER+=${abk[$MATCH]:-$MATCH}
324 bindkey ",." globalias
328 autoload -U zmv # who needs mmv or rename?
329 autoload history-search-end
331 # we don't want to quote/espace URLs on our own...
332 # if autoload -U url-quote-magic ; then
333 # zle -N self-insert url-quote-magic
334 # zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
336 # print 'Notice: no url-quote-magic available :('
338 alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
340 alias run-help >&/dev/null && unalias run-help
341 autoload run-help # use via 'esc-h'
344 if autoload -U compinit && compinit 2>/dev/null ; then
345 compinit 2>/dev/null || print 'Notice: no compinit available :('
347 print 'Notice: no compinit available :('
352 is4 && autoload -U zed # use ZLE editor to edit a file or function
354 is4 && for mod in complist deltochar mathfunc ; do
355 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
358 # autoload zsh modules when they are referenced
359 is4 && for opt mod in a stat \
363 zmodload -${opt} zsh/${mod} ${mod}
366 is4 && autoload -U insert-files && \
367 zle -N insert-files && \
368 bindkey "^Xf" insert-files # C-x-f
370 bindkey ' ' magic-space # also do history expansion on space
371 bindkey '\ei' menu-complete # menu completion via esc-i
373 # press esc-e for editing command line in $EDITOR or $VISUAL
374 is4 && autoload -U edit-command-line && \
375 zle -N edit-command-line && \
376 bindkey '\ee' edit-command-line
378 # menu selection: pick item but stay in the menu (press esc-return)
379 is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
381 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
382 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
383 bindkey '\C-ed' _bkdate
386 # press esc-m for inserting last typed word again (thanks to caphuso!)
387 insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
388 zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
390 # set command prediction from history, see 'man 1 zshcontrib'
391 # is4 && autoload -U predict-on && \
392 # zle -N predict-on && \
393 # zle -N predict-off && \
394 # bindkey "^X^Z" predict-on && \
395 # bindkey "^Z" predict-off
397 # put job into foreground via ctrl-z:
398 bindkey -s '^z' "fg\n"
400 # press ctrl-q to quote line:
402 # zle beginning-of-line
404 # # RBUFFER="'$RBUFFER'"
405 # RBUFFER=${(q)RBUFFER}
408 # zle -N mquote && bindkey '^q' mquote
410 # run command line as user root via sudo:
411 _sudo-command-line() {
412 [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
414 zle -N sudo-command-line _sudo-command-line
415 bindkey "^Os" sudo-command-line
418 # {{{ set some important options
419 (( EUID != 0 )) && umask 002 || umask 022
422 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
423 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
424 setopt extended_history # save each command's beginning timestamp and the duration to the history file
425 is4 && setopt histignorealldups # If a new command line being added to the history
426 # list duplicates an older one, the older command is removed from the list
427 setopt histignorespace # remove command lines from the history list when
428 # the first character on the line is a space
429 # setopt histallowclobber # add `|' to output redirections in the history
430 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
431 setopt auto_cd # if a command is issued that can't be executed as a normal command,
432 # and the command is the name of a directory, perform the cd command to that directory
433 setopt extended_glob # in order to use #, ~ and ^ for filename generation
434 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
435 # -> searches for word not in compressed files
436 # don't forget to quote '^', '~' and '#'!
437 setopt notify # report the status of backgrounds jobs immediately
438 setopt hash_list_all # Whenever a command completion is attempted, make sure \
439 # the entire command path is hashed first.
440 setopt completeinword # not just at the end
441 # setopt nocheckjobs # don't warn me about bg processes when exiting
442 setopt nohup # and don't kill them, either
443 # setopt printexitvalue # alert me if something failed
444 # setopt dvorak # with spelling correction, assume dvorak kb
445 setopt auto_pushd # make cd push the old directory onto the directory stack.
446 setopt nonomatch # try to avoid the 'zsh: no matches found...'
447 setopt nobeep # avoid "beep"ing
449 MAILCHECK=30 # mailchecks
450 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 secondes
451 watch=(notme root) # watch for everyone but me and root
453 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
454 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
456 # WORDCHARS='*?_[]~=&;!#$%^(){}'
457 # WORDCHARS='${WORDCHARS:s@/@}'
459 # only slash should be considered as a word separator:
460 slash-backward-kill-word() {
461 local WORDCHARS="${WORDCHARS:s@/@}"
463 zle backward-kill-word
465 zle -N slash-backward-kill-word
466 bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
470 export ZSHDIR=$HOME/.zsh
471 HISTFILE=$HOME/.zsh_history
472 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
473 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
476 # dirstack handling {{{
478 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
479 dirstack=( ${(uf)"$(< ~/.zdirs)"} )
480 # "cd -" won't work after login by just setting $OLDPWD, so
481 [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD
484 builtin dirs -pl >! ~/.zdirs
488 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
489 if [ -n "$BATTERY" ] ; then
490 if [ -x $(which acpi) ] ; then
491 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
492 [ -z "$PERCENT" ] && PERCENT='acpi not present'
493 if [ "${PERCENT%%%}" -lt 20 ] ; then
494 PERCENT="warning: ${PERCENT}%"
501 if autoload promptinit && promptinit 2>/dev/null ; then
502 promptinit # people should be able to use their favourite prompt
504 print 'Notice: no promptinit available :('
507 # precmd() => a function which is executed just before each prompt
508 # use 'NOPRECMD=1' to disable the precmd + preexec commands
510 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
512 # make sure to use right prompt only when not running a command
513 is4 && setopt transient_rprompt
515 is4 && [[ -z $NOPRECMD ]] && precmd () {
516 [[ -n $NOPRECMD ]] && return 0
517 # allow manual overwriting of RPROMPT
518 if [[ -n $RPROMPT ]] ; then
519 [[ $TERM == screen* ]] && echo -n $'\ekzsh\e\\'
522 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
523 if [[ -z $DONTSETRPROMPT ]] ; then
524 if [[ -n $BATTERY ]] ; then
525 RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
526 # RPROMPT="${PERCENT}${SCREENTITLE}"
528 RPROMPT="%(?..:()% ${SCREENTITLE}"
529 # RPROMPT="${SCREENTITLE}"
532 # adjust title of xterm
533 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
534 case $TERM in (xterm*|rxvt)
535 print -Pn "\e]0;%n@%m: %~\a"
540 # chpwd () => a function which is executed whenever the directory is changed
542 # preexec() => a function running before every command
543 is4 && [[ -z $NOPRECMD ]] && preexec () {
544 [[ -n $NOPRECMD ]] && return 0
545 # set hostname if not running on host with name 'grml'
546 local HOSTNAME=$(hostname)
547 if [[ "$HOSTNAME" != grml ]] ; then
550 # get the name of the program currently running and hostname of local machine
551 # set screen window title if running in a screen
552 if [[ "$TERM" == screen* ]]; then
553 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
554 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
555 echo -ne "\ek$CMD\e\\"
557 # set the screen title to "zsh" when sitting at the command prompt:
558 if [[ "$TERM" == screen* ]]; then
559 SCREENTITLE=$'%{\ekzsh\e\\%}'
563 # adjust title of xterm
564 case $TERM in (xterm*|rxvt)
565 print -Pn "\e]0;%n@%m: $1\a"
571 if autoload colors && colors 2>/dev/null ; then
572 BLUE="%{${fg[blue]}%}"
573 RED="%{${fg_bold[red]}%}"
574 GREEN="%{${fg[green]}%}"
575 CYAN="%{${fg[cyan]}%}"
576 WHITE="%{${fg[white]}%}"
577 NO_COLOUR="%{${reset_color}%}"
581 GREEN=$'%{\e[1;32m%}'
583 WHITE=$'%{\e[1;37m%}'
584 NO_COLOUR=$'%{\e[0m%}'
587 EXITCODE="%(?..%?%1v )"
588 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
589 PS3='?# ' # selection prompt used within a select loop.
590 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
592 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
593 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
594 debian_chroot=$(cat /etc/debian_chroot)
597 # don't use colors on dumb terminals (like emacs):
598 if [[ "$TERM" == dumb ]] ; then
599 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
601 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
602 # set variable identifying the chroot you work in (used in the prompt below)
603 if [[ -n $GRMLPROMPT ]]; then
604 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
605 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
607 if (( EUID != 0 )); then
608 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
610 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
615 # if we are inside a grml-chroot set a specific prompt theme
616 if [ -n "$GRML_CHROOT" ] ; then
617 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
621 # {{{ 'hash' some often used directories
622 hash -d deb=/var/cache/apt/archives
623 hash -d doc=/usr/share/doc
624 hash -d linux=/lib/modules/$(command uname -r)/build/
626 hash -d slog=/var/log/syslog
628 hash -d templ=/usr/share/doc/grml-templates
629 hash -d tt=/usr/share/doc/texttools-doc
634 if [ $UID = 0 ] ; then
635 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
636 elif [ -r $HOME/.screenrc ] ; then
637 alias screen="/usr/bin/screen -c $HOME/.screenrc"
639 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
642 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
643 alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
644 alias la='ls -la --color=auto'
645 alias ll='ls -l --color=auto'
646 alias lh='ls -hAl --color=auto'
647 alias l='ls -lF --color=auto'
656 alias mdstat='cat /proc/mdstat'
657 alias ...='cd ../../'
659 alias cp='nocorrect cp' # no spelling correction on cp
660 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
661 alias mv='nocorrect mv' # no spelling correction on mv
662 alias rm='nocorrect rm' # no spelling correction on rm
667 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
668 alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
669 alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
671 alias utf2iso='if isutfenv ; then
672 for ENV in `env | grep UTF` ; do
673 eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')"
676 alias iso2utf='if isutfenv ; then
677 for ENV in `env | grep '\.iso'` ; do
678 eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')"
682 # set up software synthesizer via speakup
684 aumix -w 90 -v 90 -p 90 -m 90
685 if ! [ -r /dev/softsynth ] ; then
686 flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
692 nice -n -20 speechd-up
694 flite -o play -t "Finished setting up software synthesizer"
698 # I like clean prompt, so provide simple way to get that
699 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
701 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
702 if [ -x $(which truecrypt) ] ; then
704 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
706 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
710 zsh-help(){print "$bg[white]$fg[black]
711 zsh-help - hints for use of zsh on grml
712 =======================================$reset_color
714 Main configuration of zsh happens in /etc/zsh/zshrc (global)
715 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
716 The files are part of the package grml-etc-core, if you want to
717 use them on a non-grml-system just get the tar.gz from
718 http://deb.grml.org/ or get the files from the mercurial
721 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
722 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
724 If you want to stay in sync with zsh configuration of grml
725 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
726 your own stuff in \$HOME/.zshrc.local. System wide configuration
727 without touching configuration files of grml can take place
728 in /etc/zsh/zshrc.local.
730 If you want to use the configuration of user grml also when
731 running as user root just run 'zshskel' which will source
732 the file /etc/skel/.zshrc.
734 For information regarding zsh start at http://grml.org/zsh/
736 Take a look at grml's zsh refcard:
737 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
739 Check out the main zsh refcard:
740 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
742 And of course visit the zsh-lovers:
745 You can adjust some options through environment variables when
746 invoking zsh without having to edit configuration files.
747 Basically meant for bash users who are not used to the power of
750 \"NOCOR=1 zsh\" => deactivate automatic correction
751 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
752 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
753 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
755 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
756 Enjoy your grml system with the zsh!$reset_color"
760 if [ -r /etc/debian_version ] ; then
761 alias acs='apt-cache search'
762 alias acsh='apt-cache show'
763 alias acp='apt-cache policy'
764 salias adg="apt-get dist-upgrade"
765 salias agi="apt-get install"
766 salias ati="aptitude install"
767 salias ag="apt-get upgrade"
768 salias au="apt-get update"
769 salias -a up="aptitude update ; aptitude upgrade"
770 alias dbp='dpkg-buildpackage'
771 alias ge='grep-excuses'
775 if [ -z "$1" ] ; then
777 $SUDO apt-get -u upgrade
779 ssh $1 $SUDO apt-get update
780 # ask before the upgrade
782 ssh $1 $SUDO apt-get --no-act upgrade
783 echo -n 'Process the upgrade?'
785 if [[ $dummy == "y" ]] ; then
786 ssh $1 $SUDO apt-get -u upgrade --yes
791 isgrmlcd && alias su="sudo -s" # get a root shell
792 alias llog="$PAGER /var/log/syslog" # take a look at the syslog
793 alias tlog="tail -f /var/log/syslog" # follow the syslog
794 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
797 # sort installed Debian-packages by size
798 if [ -x $(which grep-status) ] ; then
799 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
800 -n "install ok installed" | paste -sd " \n" | sort -rn'
803 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
804 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
805 if [ -x $(which wodim) ] ; then
806 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
807 See #377109 in the BTS of Debian for more details.
809 Please use the wodim binary instead' ; return 1"
813 # get_tw_cli has been renamed into get_3ware
814 if [ -x $(which get_3ware) ] ; then
816 echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
821 # I hate lacking backward compability, so provide an alternative therefore
822 if ! [ -x $(which apache2-ssl-certificate) ] ; then
823 apache2-ssl-certificate(){
825 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
826 print 'You might want to take a look at Debian the package ssl-cert as well.'
827 print 'To generate a certificate for use with apache2 follow the instructions:'
831 export RANDFILE=/dev/random
832 mkdir /etc/apache2/ssl/
833 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
834 chmod 600 /etc/apache2/ssl/apache.pem
836 Run "grml-tips ssl-certificate" if you need further instructions.
842 # {{{ Use hard limits, except for a smaller stack and no core dumps
845 isgrmlcd && limit core 0 # important for a live-cd-system
849 # {{{ completion stuff
851 # called later (via is4 && grmlcomp)
852 # notice: use 'zstyle' for getting current settings
853 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
856 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
857 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
858 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
859 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
860 zstyle ':completion:*:correct:*' original true #
861 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
862 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
863 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
864 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
865 zstyle ':completion:*:history-words' list false #
866 zstyle ':completion:*:history-words' menu yes # activate menu
867 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
868 zstyle ':completion:*:history-words' stop yes #
869 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
870 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
871 zstyle ':completion:*' group-name ''
872 if [[ -z "$NOMENU" ]] ; then
873 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
875 setopt no_auto_menu # don't use any menus at all
877 zstyle ':completion:*:messages' format '%d' #
878 zstyle ':completion:*:options' auto-description '%d' #
879 zstyle ':completion:*:options' description 'yes' # describe options in full
880 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
881 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
882 zstyle ':completion:*' verbose true # provide verbose completion information
883 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
884 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
885 zstyle ':completion:correct:' prompt 'correct to: %e' #
886 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
888 # complete manual by their section
889 zstyle ':completion:*:manuals' separate-sections true
890 zstyle ':completion:*:manuals.*' insert-sections true
891 zstyle ':completion:*:man:*' menu yes select
894 # run rehash on completion so new installed program are found automatically:
896 (( CURRENT == 1 )) && rehash
897 return 1 # Because we didn't really complete anything
899 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
900 if [[ -n "$NOCOR" ]] ; then
901 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files
902 setopt nocorrect # do not try to correct the spelling if possible
904 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files
905 setopt correct # try to correct the spelling if possible
906 zstyle -e ':completion:*' completer '
907 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
908 _last_try="$HISTNO$BUFFER$CURSOR"
909 reply=(_complete _match _prefix _files)
911 if [[ $words[1] = (rm|mv) ]]; then
912 reply=(_complete _files)
914 reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files)
918 # zstyle ':completion:*' completer _complete _correct _approximate
919 # zstyle ':completion:*' expand prefix suffix
921 # automatic rehash? Credits go to Frank Terbeck
924 # [[ -z ${BUFFER} ]] && zle accept-line && return
925 # buf=( ${(z)BUFFER} )
926 # [[ -z ${commands[${buf[1]}]} ]] && rehash
930 # bindkey "^M" my_accept
932 # command for process lists, the local web server details and host completion
933 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
936 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
937 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
939 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
941 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
942 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
954 zstyle ':completion:*:hosts' hosts $hosts
955 # zstyle '*' hosts $hosts
957 # specify your logins:
959 # {grml,grml1}@foo.invalid
960 # grml-devel@bar.invalid
963 # {fred,root}@foo.invalid
966 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
967 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
969 # specify specific port/service settings:
970 # telnet_users_hosts_ports=(
973 # @mail-server:{smtp,pop3}
977 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
979 # use generic completion system for programs not yet defined:
980 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
982 # see upgrade function in this file
983 compdef _hosts upgrade
989 # people should use 'grml-x'!
991 if [ -e /etc/X11/xorg.conf ] ; then
992 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
994 echo "Please use the script \"grml-x\" for starting the X Window System
995 because there does not exist /etc/X11/xorg.conf yet.
996 If you want to use startx anyway please call \"/usr/bin/startx\"."
1002 if [ -e /etc/X11/xorg.conf ] ; then
1003 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
1005 echo "Please use the script \"grml-x\" for starting the X Window System.
1006 because there does not exist /etc/X11/xorg.conf yet.
1007 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
1012 if [ -x $(which 915resolution) ] ; then
1013 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
1016 alias grml-version='cat /etc/grml_version'
1018 if [ -x $(which rebuildfstab) ] ; then
1019 alias grml-rebuildfstab='rebuildfstab -v -r -config'
1022 if [ -x $(which grml-debootstrap) ] ; then
1023 alias debian2hd='print "Installing debian to harddisk is possible via using grml-debootstrap." ; return 1'
1028 # {{{ now run the functions
1030 is4 && isgrml && grmlstuff
1035 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
1038 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
1039 # You use it as follows:
1040 # $ NTREF=/reference/file
1042 # This lists all the files in the current directory newer than the reference file.
1043 # You can also specify the reference file inline; note quotes:
1044 # $ ls -l *(e:'nt ~/.zshenv':)
1046 if [[ -n $1 ]]; then
1049 [[ $REPLY -nt $NTREF ]]
1053 # shell functions {{{
1054 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
1055 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
1057 if [[ "$#*" -eq 0 ]]; then
1058 [ -r ~/.zshrc ] && . ~/.zshrc
1067 compdef _functions reload freload
1069 # list symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
1071 [ -z "$1" ] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
1074 while [ -h "$file" ] ; do
1076 file=$(readlink "$file")
1081 # fast manual access
1082 if type -p qma &>/dev/null ; then
1083 manzsh() { qma zshall "$1" }
1086 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1087 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
1088 # manzsh() { man zshall | $MYLESS -p $1 ; }
1091 if [ -x $(which most) ] ; then
1092 # use "dchange <package-name>" to view Debian's changelog of the package:
1094 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
1095 most /usr/share/doc/${1}/changelog.Debian.gz
1097 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1098 most /usr/share/doc/${1}/changelog.gz
1100 echo "No changelog for package $1 found, sorry."
1105 _dchange() { _files -W /usr/share/doc -/ }
1106 compdef _dchange dchange
1108 # use "uchange <package-name>" to view upstream's changelog of the package:
1110 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1111 most /usr/share/doc/${1}/changelog.gz
1113 echo "No changelog for package $1 found, sorry."
1117 _uchange() { _files -W /usr/share/doc -/ }
1118 compdef _uchange uchange
1123 ZSH_PROFILE_RC=1 $SHELL "$@"
1126 # edit alias via zle:
1128 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1130 compdef _aliases edalias
1132 # edit function via zle:
1134 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1136 compdef _functions edfunc
1138 # use it e.g. via 'Restart apache2'
1139 if [ -d /etc/init.d ] ; then
1140 for i in Start Restart Stop Force-Reload Reload ; do
1141 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1143 # now the completion for this:
1144 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
1147 # provide useful information on globbing
1154 p named pipes (FIFOs)
1155 * executable plain files (0100)
1156 % device files (character or block special)
1157 %b block special files
1158 %c character special files
1159 r owner-readable files (0400)
1160 w owner-writable files (0200)
1161 x owner-executable files (0100)
1162 A group-readable files (0040)
1163 I group-writable files (0020)
1164 E group-executable files (0010)
1165 R world-readable files (0004)
1166 W world-writable files (0002)
1167 X world-executable files (0001)
1168 s setuid files (04000)
1169 S setgid files (02000)
1170 t files with the sticky bit (01000)
1172 print *(m-1) # Files modified up to a day ago
1173 print *(a1) # Files accessed a day ago
1174 print *(@) # Just symlinks
1175 print *(Lk+50) # Files bigger than 50 kilobytes
1176 print *(Lk-50) # Files smaller than 50 kilobytes
1177 print **/*.c # All *.c files recursively starting in \$PWD
1178 print **/*.c~file.c # Same as above, but excluding 'file.c'
1179 print (foo|bar).* # Files starting with 'foo' or 'bar'
1180 print *~*.* # All Files that do not contain a dot
1181 chmod 644 *(.^x) # make all plain non-executable files publically readable
1182 print -l *(.c|.h) # Lists *.c and *.h
1183 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1184 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1186 alias help-zshglob=H-Glob
1188 type -p qma &>/dev/null && alias ?='qma zshall'
1190 # grep for running process, like: 'any vim'
1192 if [ -z "$1" ] ; then
1193 echo "any - grep for process(es) by keyword" >&2
1194 echo "Usage: any <keyword>" >&2 ; return 1
1197 local LENGTH=$(expr length $STRING)
1198 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1199 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1200 ps xauwww| grep "[$FIRSCHAR]$REST"
1204 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1205 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1206 [ -r /proc/1/maps ] && deswap() {
1207 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1208 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1209 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1212 # print hex value of a number
1214 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1217 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1218 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1220 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1221 perl -e "print eval($CALC),\"\n\";"
1223 functions peval &>/dev/null && alias calc=peval
1225 # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
1226 # certain circumstances, so work around it, no matter which environment we have
1228 if [ -z "$DISPLAY" ] ; then
1229 consolechars -f /usr/share/consolefonts/default8x16.psf.gz
1236 # just press 'asdf' keys to toggle between dvorak and us keyboard layout
1238 if [ -n "$XKEYBOARD" -a -n "$KEYTABLE" ] ; then
1239 echo -n "Switching to $KEYTABLE keyboard layout: "
1240 [ -z "$DISPLAY" ] && $SUDO loadkeys $KEYTABLE &>/dev/null || setxkbmap $XKEYBOARD &>/dev/null
1242 echo -n 'Switching to us keyboard layout: '
1243 [ -z "$DISPLAY" ] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null
1248 echo -n 'Switching to dvorak keyboard layout: '
1249 [ -z "$DISPLAY" ] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null
1252 # just press 'asdf' key to toggle from neon layout to us keyboard layout
1254 echo -n 'Switching to us keyboard layout: '
1255 setxkbmap us && echo 'Done' || echo 'Failed'
1258 # set up an ipv6 tunnel
1262 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1263 print 'ipv6 tunnel already set up, nothing to be done.'
1264 print 'execute: "ifconfig sit1 down ; ifconfig sit0 down" to remove ipv6-tunnel.' ; return 1
1266 [ -n "$PUBLIC_IP" ] || local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \
1267 awk '/inet addr:/ {print $2}' | tr -d 'addr:')
1268 [ -n "$PUBLIC_IP" ] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 }
1269 local IPV6ADDR=$(printf "2002:%02x%02x:%02x%02x:1::1" $(print ${PUBLIC_IP//./ }))
1270 print -n "Setting up ipv6 tunnel $IPV6ADDR via ${PUBLIC_IP}: "
1271 ifconfig sit0 tunnel ::192.88.99.1 up
1272 ifconfig sit1 add "$IPV6ADDR" && print done || print failed
1276 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1277 print 'ipv6 tunnel available' ; return 0
1279 print 'ipv6 tunnel not available' ; return 1
1283 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1284 print -n 'Stopping ipv6 tunnel (sit0 + sit1): '
1285 ifconfig sit1 down ; ifconfig sit0 down && print done || print failed
1287 print 'No ipv6 tunnel found, nothing to be done.' ; return 1
1291 print "Usage: ipv6-tunnel [start|stop|status]">&2 ; return 1
1296 # run dhclient for wireless device
1298 salias dhclient "$(wavemon -d | awk '/device/{print $2}')"
1301 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1303 # NO_SWITCH="yes" command bash "$@"
1306 # exec $SHELL $SHELL_ARGS "$@"
1311 # log out? set timeout in seconds {{{
1313 # do not log out in some specific terminals:
1314 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1319 # {{{ make sure our environment is clean regarding colors
1320 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1323 # source another config file if present {{{
1324 if [ -r /etc/zsh/zshrc.local ]; then
1325 source /etc/zsh/zshrc.local
1329 # "persistent history" {{{
1330 # just write important commands you always need to ~/.important_commands
1331 if [ -r ~/.important_commands ] ; then
1332 fc -R ~/.important_commands
1336 # add variable to be able to check whether the file has been read {{{
1337 ZSHRC_GLOBAL_HAS_BEEN_READ=1
1340 ## END OF FILE #################################################################
1341 # vim:foldmethod=marker expandtab