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: Mit Jun 20 10:28:28 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 ################################################################################
15 # zsh-refcard-tag documentation:
16 # You may notice strange looking comments in the zshrc (and ~/.zshrc as
17 # well). These are there for a purpose. grml's zsh-refcard can now be
18 # automatically generated from the contents of the actual comfiguration
19 # files. However, we need a little extra information on which comments
20 # and what lines of code to take into account (and for what purpose).
22 # Here is what they mean:
24 # List of tags (comment types) used:
25 # #a# Next line contains an important alias, that should
26 # be included in the grml-zsh-refcard.
27 # (placement tag: @@INSERT-aliases@@)
28 # #f# Next line contains the beginning of an important function.
29 # (placement tag: @@INSERT-functions@@)
30 # #v# Next line contains an important variable.
31 # (placement tag: @@INSERT-variables@@)
32 # #k# Next line contains an important keybinding.
33 # (placement tag: @@INSERT-keybindings@@)
34 # #d# Hashed directories list generation:
35 # start denotes the start of a list of 'hash -d'
37 # end denotes its end.
38 # (placement tag: @@INSERT-hasheddirs@@)
39 # #A# Abbreviation expansion list generation:
40 # start denotes the beginning of abbreviations.
41 # end denotes their end.
42 # Lines within this section that end in '#d .*' provide
43 # extra documentation to be included in the refcard.
44 # (placement tag: @@INSERT-abbrev@@)
45 # #m# This tag allows you to manually generate refcard entries
46 # for code lines that are hard/impossible to parse.
48 # #m# k ESC-h Call the run-help function
49 # That would add a refcard entry in the keybindings table
50 # for 'ESC-h' with the given comment.
51 # So the systax is: #m# <section> <argument> <comment>
52 # #o# This tag lets you insert entries to the 'other' hash.
53 # Generally, this should not be used. It is there for
54 # things that cannot be done easily in another way.
55 # (placement tag: @@INSERT-other-foobar@@)
57 # All of these tags (except for m and o) take two arguments, the first
58 # within the tag, the other after the tag:
60 # #<tag><section># <comment>
62 # Where <section> is really just a number, which are defined by the
63 # @secmap array on top of 'genrefcard.pl'. The reason for numbers
64 # instead of names is, that for the reader, the tag should not differ
65 # much from a regular comment. For zsh, it is a regular comment indeed.
66 # The numbers have got the following meanings:
75 # So, the following will add an entrie to the 'functions' table in the
76 # 'system' section, with a (hopefully) descriptive comment:
77 # #f1# Edit an alias via zle
80 # It will then show up in the @@INSERT-aliases-system@@ replacement tag
81 # that can be found in 'grml-zsh-refcard.tex.in'.
82 # If the section number is ommited, the 'default' section is assumed.
83 # Furthermore, in 'grml-zsh-refcard.tex.in' @@INSERT-aliases@@ is
84 # exactly the same as @@INSERT-aliases-default@@. If you want a list of
85 # *all* aliases, for example, use @@INSERT-aliases-all@@.
91 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
92 if [[ -n $ZSH_PROFILE_RC ]] ; then
98 if [ -n "$LANG" ] ; then
101 [ -r /etc/default/locale ] && source /etc/default/locale
103 [ -n "$LANG" ] && export LANG || export LANG="en_US.iso885915"
104 [ -n "$LC_ALL" ] && export LC_ALL
105 [ -n "$LC_MESSAGES" ] && export LC_MESSAGES
107 [ -r /etc/sysconfig/keyboard ] && source /etc/sysconfig/keyboard
108 [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
111 # check for potentially old files in 'completion.d' {{{
113 xof=(/etc/zsh/completion.d/*~/etc/zsh/completion.d/_*(N))
114 if (( ${#xof} > 0 )) ; then
115 printf '\n -!- INFORMATION\n\n'
116 printf ' -!- %s file(s) not starting with an underscore (_) found in\n' ${#xof}
117 printf ' -!- /etc/zsh/completion.d/.\n\n'
118 printf ' -!- While this has been the case in old versions of grml-etc-core,\n'
119 printf ' -!- recent versions of the grml-zsh-setup have all these files rewritten\n'
120 printf ' -!- and renamed. Furthermore, the grml-zsh-setup will *only* add files\n'
121 printf ' -!- named _* to that directory.\n\n'
122 printf ' -!- If you added functions to completion.d yourself, please consider\n'
123 printf ' -!- moving them to /etc/zsh/functions.d/. Files in that directory, not\n'
124 printf ' -!- starting with an underscore are marked for automatic loading\n'
125 printf ' -!- by default (so that is quite convenient).\n\n'
126 printf ' -!- If there are files *not* starting with an underscore from an older\n'
127 printf ' -!- grml-etc-core in completion.d, you may safely remove them.\n\n'
128 printf ' -!- Delete the files for example via running:\n\n'
129 printf " rm ${xof}\n\n"
130 printf ' -!- Note, that this message will *not* go away, unless you yourself\n'
131 printf ' -!- resolve the situation manually.\n\n'
132 BROKEN_COMPLETION_DIR=1
137 # {{{ check for version/system
138 # check for versions (compatibility reasons)
139 if autoload is-at-least && is-at-least 2>/dev/null ; then
140 is4() { is-at-least 4 }
141 is42() { is-at-least 4.2 }
144 [[ $ZSH_VERSION == 4.* ]] && return 0
148 [[ $ZSH_VERSION == 4.<2->* ]] && return 0
153 # grml specific stuff
154 #f1# Checks whether or not you're running grml
156 [ -f /etc/grml_version ] && return 0
160 #f1# Checks whether or not you're running a grml cd
162 [ -f /etc/grml_cd ] && return 0
167 #f1# Checks whether or not you're running grml-small
169 [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
172 isgrmlsmall() { return 1 }
175 #f1# are we running within an utf environment?
177 case "$LANG $CHARSET $LANGUAGE" in
184 # check for user, if not running as root set $SUDO to sudo
185 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
188 # creates an alias and precedes the command with
189 # sudo if $EUID is not zero.
190 local only=0 ; local multi=0
191 while [[ ${1} == -* ]] ; do
195 (--) shift ; break ;;
197 printf 'usage: salias [-h|-o|-a] <alias-expression>\n'
198 printf ' -h shows this help text.\n'
199 printf ' -a replace '\'' ; '\'' sequences with '\'' ; sudo '\''.\n'
200 printf ' be careful using this option.\n'
201 printf ' -o only sets an alias if a preceding sudo would be needed.\n'
204 (*) printf "unkown option: '%s'\n" "${1}" ; return 1 ;;
208 if (( ${#argv} > 1 )) ; then
209 printf 'Too many arguments %s\n' "${#argv}"
212 key="${1%%\=*}" ; val="${1#*\=}"
213 if (( EUID == 0 )) && (( only == 0 )); then
214 alias -- "${key}=${val}"
215 elif (( EUID > 0 )) ; then
216 (( multi > 0 )) && val="${val// ; / ; sudo }"
217 alias -- "${key}=sudo ${val}"
222 # change directory to home on first invocation of zsh
223 # important for rungetty -> autologin
224 # Thanks go to Bart Schaefer!
225 isgrml && checkhome() {
226 if [[ -z "$ALREADY_DID_CD_HOME" ]]; then
227 export ALREADY_DID_CD_HOME=$HOME
233 # {{{ set some variables
235 export EDITOR=${EDITOR:-vim}
237 export MAIL=${MAIL:-/var/mail/$USER}
238 # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
239 export SHELL='/bin/zsh'
240 [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
241 [ -x $(which dircolors) ] && eval `dircolors -b`
243 # Search path for the cd comman
246 # completion functions go to /etc/zsh/completion.d
247 # function files may be put into /etc/zsh/functions.d, from where they
248 # will be automatically autoloaded.
249 if [ -n "$BROKEN_COMPLETION_DIR" ] ; then
250 print 'Warning: not setting completion directories because broken files have been found.'>&2
252 [[ -d /etc/zsh/completion.d ]] && fpath+=( /etc/zsh/completion.d )
253 if [[ -d /etc/zsh/functions.d ]] ; then
254 fpath+=( /etc/zsh/functions.d )
255 for func in /etc/zsh/functions.d/[^_]*[^~] ; do
256 autoload -U ${func:t}
261 # automatically remove duplicates from these arrays
262 typeset -U path cdpath fpath manpath
266 if [[ "$TERM" != emacs ]]; then
267 [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
268 [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
269 [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
270 [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
271 [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
272 [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
273 [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
274 [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
275 [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
276 [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
277 [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
278 [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
280 [[ "$terminfo[kcuu1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
281 [[ "$terminfo[kcud1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
282 [[ "$terminfo[kcuf1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
283 [[ "$terminfo[kcub1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
284 [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
285 [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
286 [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
287 [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
290 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
291 # use emacs style per default:
296 #if [[ "$TERM" == screen ]]; then
297 bindkey '\e[1~' beginning-of-line # home
298 bindkey '\e[4~' end-of-line # end
299 bindkey '\e[A' up-line-or-search # cursor up
300 bindkey '\e[B' down-line-or-search # <ESC>-
301 bindkey '^x' history-beginning-search-backward # alternative ways of searching the shell history
302 # bindkey -s '^L' "|less\n" # ctrl-L pipes to less
303 # bindkey -s '^B' " &\n" # ctrl-B runs it in the background
304 # if terminal type is set to 'rxvt':
305 bindkey '\e[7~' beginning-of-line # home
306 bindkey '\e[8~' end-of-line # end
309 # insert unicode character
310 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an §
311 # See for example http://unicode.org/charts/ for unicode characters code
312 autoload insert-unicode-char
313 zle -N insert-unicode-char
314 #k# Insert Unicode character
315 bindkey '^Xi' insert-unicode-char
317 # just type 'cd ...' to get 'cd ../..'
318 # rationalise-dot() {
319 # if [[ $LBUFFER = *.. ]]; then
325 # zle -N rationalise-dot
326 # bindkey . rationalise-dot
328 # bindkey '\eq' push-line-or-edit
331 # power completion - abbreviation expansion {{{
332 # power completion / abbreviation expansion / buffer expansion
333 # see http://zshwiki.org/home/examples/zleiab for details
334 # less risky than the global aliases but powerful as well
335 # just type the abbreviation key and afterwards ',.' to expand it
338 setopt interactivecomments
340 # key # value (#d additional doc string)
346 'G' '|& grep --color=auto'
348 'Hl' ' --help |& less -r' #d (Display help in pager)
352 'N' '&>/dev/null' #d (No Output)
353 'R' '| tr A-z N-za-m' #d (ROT13)
359 'hide' "echo -en '\033]50;nil2\007'"
360 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
361 'small' 'echo -en "\033]50;6x10\007"'
362 'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
363 'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
364 'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
365 'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
366 'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
367 'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
371 'co' "./configure && make && sudo make install"
372 'CH' "./configure --help"
373 'conkeror' 'firefox -chrome chrome://conkeror/content'
375 'lad' $'ls -d .*(/)\n# only show dot-directories'
376 'lsa' $'ls -a .*(.)\n# only show dot-files'
377 'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
378 'lsl' $'ls -l *(@[1,10])\n# only symlinks'
379 'lsx' $'ls -l *(*[1,10])\n# only executables'
380 'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
381 'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
382 'lsd' $'ls -d *(/)\n# only show directories'
383 'lse' $'ls -d *(/^F)\n# only show empty directories'
384 'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
385 'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
386 'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
388 '600' 'chmod u+rw-x,g-rwx,o-rwx'
390 '700' 'chmod u+rwx,g-rwx,o-rwx'
391 'r--' 'chmod u+r-wx,g-rwx,o-rwx'
392 '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
393 '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
395 'cmplayer' 'mplayer -vo -fs -zoom fbdev'
396 'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
397 'fblinks' 'links2 -driver fb'
398 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
399 'insecscp' 'scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
400 'fori' 'for i ({..}) { }'
403 'se' 'setopt interactivecomments'
404 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
405 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
406 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3'
408 'D' 'export DISPLAY=:0.0'
409 'mp' 'mplayer -vo xv -fs -zoom'
414 matched_chars='[.-|_a-zA-Z0-9]#'
415 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
416 LBUFFER+=${abk[$MATCH]:-$MATCH}
420 bindkey ",." globalias
424 autoload -U zmv # who needs mmv or rename?
425 autoload history-search-end
427 # we don't want to quote/espace URLs on our own...
428 # if autoload -U url-quote-magic ; then
429 # zle -N self-insert url-quote-magic
430 # zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
432 # print 'Notice: no url-quote-magic available :('
434 alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
436 #m# k ESC-h Call \kbd{run-help} for the 1st word on the commandline
437 alias run-help >&/dev/null && unalias run-help
438 autoload run-help # use via 'esc-h'
441 if autoload -U compinit && compinit 2>/dev/null ; then
442 compinit 2>/dev/null || print 'Notice: no compinit available :('
444 print 'Notice: no compinit available :('
449 is4 && autoload -U zed # use ZLE editor to edit a file or function
451 is4 && for mod in complist deltochar mathfunc ; do
452 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
455 # autoload zsh modules when they are referenced
456 is4 && for opt mod in a stat \
460 zmodload -${opt} zsh/${mod} ${mod}
463 is4 && autoload -U insert-files && \
464 zle -N insert-files && \
466 bindkey "^Xf" insert-files # C-x-f
468 bindkey ' ' magic-space # also do history expansion on space
469 #k# Trigger menu-complete
470 bindkey '\ei' menu-complete # menu completion via esc-i
472 # press esc-e for editing command line in $EDITOR or $VISUAL
473 is4 && autoload -U edit-command-line && \
474 zle -N edit-command-line && \
475 #k# Edit the current line in \kbd{\$EDITOR}
476 bindkey '\ee' edit-command-line
478 #k# menu selection: pick item but stay in the menu
479 is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
481 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
482 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
483 #k# Insert a timestamp on the commandline (yyyy-mm-dd)
484 bindkey '^Ed' _bkdate
487 # press esc-m for inserting last typed word again (thanks to caphuso!)
488 insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
489 zle -N insert-last-typed-word;
490 #k# Insert last typed word
491 bindkey "\em" insert-last-typed-word
493 # set command prediction from history, see 'man 1 zshcontrib'
494 # is4 && autoload -U predict-on && \
495 # zle -N predict-on && \
496 # zle -N predict-off && \
497 # bindkey "^X^Z" predict-on && \
498 # bindkey "^Z" predict-off
500 #k# Shortcut for \kbd{fg<enter>}
501 bindkey -s '^z' "fg\n"
503 # press ctrl-q to quote line:
505 # zle beginning-of-line
507 # # RBUFFER="'$RBUFFER'"
508 # RBUFFER=${(q)RBUFFER}
511 # zle -N mquote && bindkey '^q' mquote
513 # run command line as user root via sudo:
514 _sudo-command-line() {
515 [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
517 zle -N sudo-command-line _sudo-command-line
518 #k# Put the current commandline into a \kbd{sudo} call
519 bindkey "^Os" sudo-command-line
521 ### jump behind the first word on the cmdline.
522 ### useful to add options.
523 function jump_after_first_word() {
526 if (( ${#words} <= 1 )) ; then
529 CURSOR=${#${words[1]}}
532 zle -N jump_after_first_word
533 bindkey '^x1' jump_after_first_word
537 # {{{ set some important options
538 # Please update these tags, if you change the umask settings below.
540 #o# r_umaskstr rwxrwxr-x
542 #o# umaskstr rwxr-xr-x
543 (( EUID != 0 )) && umask 002 || umask 022
546 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
547 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
548 setopt extended_history # save each command's beginning timestamp and the duration to the history file
549 is4 && setopt histignorealldups # If a new command line being added to the history
550 # list duplicates an older one, the older command is removed from the list
551 setopt histignorespace # remove command lines from the history list when
552 # the first character on the line is a space
553 # setopt histallowclobber # add `|' to output redirections in the history
554 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
555 setopt auto_cd # if a command is issued that can't be executed as a normal command,
556 # and the command is the name of a directory, perform the cd command to that directory
557 setopt extended_glob # in order to use #, ~ and ^ for filename generation
558 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
559 # -> searches for word not in compressed files
560 # don't forget to quote '^', '~' and '#'!
561 setopt notify # report the status of backgrounds jobs immediately
562 setopt hash_list_all # Whenever a command completion is attempted, make sure \
563 # the entire command path is hashed first.
564 setopt completeinword # not just at the end
565 # setopt nocheckjobs # don't warn me about bg processes when exiting
566 setopt nohup # and don't kill them, either
567 # setopt printexitvalue # alert me if something failed
568 # setopt dvorak # with spelling correction, assume dvorak kb
569 setopt auto_pushd # make cd push the old directory onto the directory stack.
570 setopt nonomatch # try to avoid the 'zsh: no matches found...'
571 setopt nobeep # avoid "beep"ing
573 MAILCHECK=30 # mailchecks
574 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 secondes
575 watch=(notme root) # watch for everyone but me and root
577 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
578 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
580 # WORDCHARS='*?_[]~=&;!#$%^(){}'
581 # WORDCHARS='${WORDCHARS:s@/@}'
583 # only slash should be considered as a word separator:
584 slash-backward-kill-word() {
585 local WORDCHARS="${WORDCHARS:s@/@}"
587 zle backward-kill-word
589 zle -N slash-backward-kill-word
590 # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
591 #k# Kill everything in a word up to its last \kbd{/}
592 bindkey '\ev' slash-backward-kill-word
596 export ZSHDIR=$HOME/.zsh
598 HISTFILE=$HOME/.zsh_history
599 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
600 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
603 # dirstack handling {{{
605 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
606 dirstack=( ${(uf)"$(< ~/.zdirs)"} )
607 # "cd -" won't work after login by just setting $OLDPWD, so
608 [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD
611 builtin dirs -pl >! ~/.zdirs
615 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
616 if [ -n "$BATTERY" ] ; then
617 if [ -x $(which acpi) ] ; then
618 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
619 [ -z "$PERCENT" ] && PERCENT='acpi not present'
620 if [ "${PERCENT%%%}" -lt 20 ] ; then
621 PERCENT="warning: ${PERCENT}%"
628 if autoload promptinit && promptinit 2>/dev/null ; then
629 promptinit # people should be able to use their favourite prompt
631 print 'Notice: no promptinit available :('
634 # precmd() => a function which is executed just before each prompt
635 # use 'NOPRECMD=1' to disable the precmd + preexec commands
637 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
639 # make sure to use right prompt only when not running a command
640 is4 && setopt transient_rprompt
642 is4 && [[ -z $NOPRECMD ]] && precmd () {
643 [[ -n $NOPRECMD ]] && return 0
644 # allow manual overwriting of RPROMPT
645 if [[ -n $RPROMPT ]] ; then
646 [[ $TERM == screen* ]] && echo -n $'\ekzsh\e\\'
649 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
650 if [[ -z $DONTSETRPROMPT ]] ; then
651 if [[ -n $BATTERY ]] ; then
652 RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
653 # RPROMPT="${PERCENT}${SCREENTITLE}"
655 RPROMPT="%(?..:()% ${SCREENTITLE}"
656 # RPROMPT="${SCREENTITLE}"
659 # adjust title of xterm
660 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
661 case $TERM in (xterm*|rxvt)
662 print -Pn "\e]0;%n@%m: %~\a"
667 # chpwd () => a function which is executed whenever the directory is changed
669 # preexec() => a function running before every command
670 is4 && [[ -z $NOPRECMD ]] && preexec () {
671 [[ -n $NOPRECMD ]] && return 0
672 # set hostname if not running on host with name 'grml'
673 local HOSTNAME=$(hostname)
674 if [[ "$HOSTNAME" != grml ]] ; then
677 # get the name of the program currently running and hostname of local machine
678 # set screen window title if running in a screen
679 if [[ "$TERM" == screen* ]]; then
680 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
681 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
682 echo -ne "\ek$CMD\e\\"
684 # set the screen title to "zsh" when sitting at the command prompt:
685 if [[ "$TERM" == screen* ]]; then
686 SCREENTITLE=$'%{\ekzsh\e\\%}'
690 # adjust title of xterm
691 case $TERM in (xterm*|rxvt)
692 print -Pn "\e]0;%n@%m: $1\a"
698 if autoload colors && colors 2>/dev/null ; then
699 BLUE="%{${fg[blue]}%}"
700 RED="%{${fg_bold[red]}%}"
701 GREEN="%{${fg[green]}%}"
702 CYAN="%{${fg[cyan]}%}"
703 WHITE="%{${fg[white]}%}"
704 NO_COLOUR="%{${reset_color}%}"
708 GREEN=$'%{\e[1;32m%}'
710 WHITE=$'%{\e[1;37m%}'
711 NO_COLOUR=$'%{\e[0m%}'
714 EXITCODE="%(?..%?%1v )"
715 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
716 PS3='?# ' # selection prompt used within a select loop.
717 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
719 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
720 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
721 debian_chroot=$(cat /etc/debian_chroot)
724 # don't use colors on dumb terminals (like emacs):
725 if [[ "$TERM" == dumb ]] ; then
726 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
728 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
729 # set variable identifying the chroot you work in (used in the prompt below)
730 if [[ -n $GRMLPROMPT ]]; then
731 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
732 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
734 if (( EUID != 0 )); then
735 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
737 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
742 # if we are inside a grml-chroot set a specific prompt theme
743 if [ -n "$GRML_CHROOT" ] ; then
744 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
748 # {{{ 'hash' some often used directories
750 hash -d deb=/var/cache/apt/archives
751 hash -d doc=/usr/share/doc
752 hash -d linux=/lib/modules/$(command uname -r)/build/
754 hash -d slog=/var/log/syslog
756 hash -d templ=/usr/share/doc/grml-templates
757 hash -d tt=/usr/share/doc/texttools-doc
763 if [ $UID = 0 ] ; then
764 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
765 elif [ -r $HOME/.screenrc ] ; then
766 alias screen="/usr/bin/screen -c $HOME/.screenrc"
768 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
771 # do we have GNU ls with color-support?
772 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
773 #a1# execute \kbd{@a@}:\quad ls with colors
774 alias ls='ls -b -CF --color=auto'
775 #a1# execute \kbd{@a@}:\quad list all files, with colors
776 alias la='ls -la --color=auto'
777 #a1# long colored list, without dotfiles (@a@)
778 alias ll='ls -l --color=auto'
779 #a1# long colored list, human readable sizes (@a@)
780 alias lh='ls -hAl --color=auto'
781 #a1# List files, append qualifier to filenames \\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...)
782 alias l='ls -lF --color=auto'
791 alias mdstat='cat /proc/mdstat'
792 alias ...='cd ../../'
794 alias cp='nocorrect cp' # no spelling correction on cp
795 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
796 alias mv='nocorrect mv' # no spelling correction on mv
797 alias rm='nocorrect rm' # no spelling correction on rm
799 #a1# Execute \kbd{rmdir}
801 #a1# Execute \kbd{rmdir}
804 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
805 alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
806 alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
808 alias utf2iso='if isutfenv ; then
809 for ENV in `env | grep UTF` ; do
810 eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')"
813 alias iso2utf='if isutfenv ; then
814 for ENV in `env | grep '\.iso'` ; do
815 eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')"
819 # set up software synthesizer via speakup
821 aumix -w 90 -v 90 -p 90 -m 90
822 if ! [ -r /dev/softsynth ] ; then
823 flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
829 nice -n -20 speechd-up
831 flite -o play -t "Finished setting up software synthesizer"
835 # I like clean prompt, so provide simple way to get that
836 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
838 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
839 if [ -x $(which truecrypt) ] ; then
841 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
843 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
847 #f1# Hints for the use of zsh on grml
848 zsh-help(){print "$bg[white]$fg[black]
849 zsh-help - hints for use of zsh on grml
850 =======================================$reset_color
852 Main configuration of zsh happens in /etc/zsh/zshrc (global)
853 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
854 The files are part of the package grml-etc-core, if you want to
855 use them on a non-grml-system just get the tar.gz from
856 http://deb.grml.org/ or get the files from the mercurial
859 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
860 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
862 If you want to stay in sync with zsh configuration of grml
863 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
864 your own stuff in \$HOME/.zshrc.local. System wide configuration
865 without touching configuration files of grml can take place
866 in /etc/zsh/zshrc.local.
868 If you want to use the configuration of user grml also when
869 running as user root just run 'zshskel' which will source
870 the file /etc/skel/.zshrc.
872 For information regarding zsh start at http://grml.org/zsh/
874 Take a look at grml's zsh refcard:
875 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
877 Check out the main zsh refcard:
878 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
880 And of course visit the zsh-lovers:
883 You can adjust some options through environment variables when
884 invoking zsh without having to edit configuration files.
885 Basically meant for bash users who are not used to the power of
888 \"NOCOR=1 zsh\" => deactivate automatic correction
889 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
890 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
891 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
893 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
894 Enjoy your grml system with the zsh!$reset_color"
898 if [ -r /etc/debian_version ] ; then
899 #a3# Execute \kbd{apt-cache search}
900 alias acs='apt-cache search'
901 #a3# Execute \kbd{apt-cache show}
902 alias acsh='apt-cache show'
903 #a3# Execute \kbd{apt-cache policy}
904 alias acp='apt-cache policy'
905 #a3# Execute \kbd{apt-get dist-upgrade}
906 salias adg="apt-get dist-upgrade"
907 #a3# Execute \kbd{apt-get install}
908 salias agi="apt-get install"
909 #a3# Execute \kbd{aptitude install}
910 salias ati="aptitude install"
911 #a3# Execute \kbd{apt-get upgrade}
912 salias ag="apt-get upgrade"
913 #a3# Execute \kbd{apt-get update}
914 salias au="apt-get update"
915 #a3# Execute \kbd{aptitude update ; aptitude upgrade}
916 salias -a up="aptitude update ; aptitude upgrade"
917 #a3# Execute \kbd{dpkg-buildpackage}
918 alias dbp='dpkg-buildpackage'
919 #a3# Execute \kbd{grep-excuses}
920 alias ge='grep-excuses'
923 #f3# Execute \kbd{apt-get update \&\& }\\&\quad \kbd{apt-get dist-upgrade}
925 if [ -z "$1" ] ; then
927 $SUDO apt-get -u upgrade
929 ssh $1 $SUDO apt-get update
930 # ask before the upgrade
932 ssh $1 $SUDO apt-get --no-act upgrade
933 echo -n 'Process the upgrade?'
935 if [[ $dummy == "y" ]] ; then
936 ssh $1 $SUDO apt-get -u upgrade --yes
941 isgrmlcd && alias su="sudo -s" # get a root shell
942 #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog}
943 alias llog="$PAGER /var/log/syslog" # take a look at the syslog
944 #a1# Take a look at the syslog: \kbd{tail -f /var/log/syslog}
945 alias tlog="tail -f /var/log/syslog" # follow the syslog
946 #a1# (Re)-source \kbd{/etc/skel/.zshrc}
947 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
950 # sort installed Debian-packages by size
951 if [ -x $(which grep-status) ] ; then
952 #a3# List installed Debian-packages sorted by size
953 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package -n "install ok installed" | paste -sd " \n" | sort -rn'
956 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
957 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
958 if [ -x $(which wodim) ] ; then
959 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
960 See #377109 in the BTS of Debian for more details.
962 Please use the wodim binary instead' ; return 1"
966 # get_tw_cli has been renamed into get_3ware
967 if [ -x $(which get_3ware) ] ; then
969 echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
974 # I hate lacking backward compability, so provide an alternative therefore
975 if ! [ -x $(which apache2-ssl-certificate) ] ; then
976 apache2-ssl-certificate(){
978 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
979 print 'You might want to take a look at Debian the package ssl-cert as well.'
980 print 'To generate a certificate for use with apache2 follow the instructions:'
984 export RANDFILE=/dev/random
985 mkdir /etc/apache2/ssl/
986 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
987 chmod 600 /etc/apache2/ssl/apache.pem
989 Run "grml-tips ssl-certificate" if you need further instructions.
995 # {{{ Use hard limits, except for a smaller stack and no core dumps
998 isgrmlcd && limit core 0 # important for a live-cd-system
1002 # {{{ completion stuff
1004 # called later (via is4 && grmlcomp)
1005 # notice: use 'zstyle' for getting current settings
1006 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
1008 ## completion system
1009 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
1010 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
1011 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
1012 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
1013 zstyle ':completion:*:correct:*' original true #
1014 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
1015 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
1016 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
1017 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
1018 zstyle ':completion:*:history-words' list false #
1019 zstyle ':completion:*:history-words' menu yes # activate menu
1020 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
1021 zstyle ':completion:*:history-words' stop yes #
1022 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
1023 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
1024 zstyle ':completion:*' group-name ''
1025 if [[ -z "$NOMENU" ]] ; then
1026 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
1028 setopt no_auto_menu # don't use any menus at all
1030 zstyle ':completion:*:messages' format '%d' #
1031 zstyle ':completion:*:options' auto-description '%d' #
1032 zstyle ':completion:*:options' description 'yes' # describe options in full
1033 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
1034 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
1035 zstyle ':completion:*' verbose true # provide verbose completion information
1036 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
1037 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
1038 zstyle ':completion:correct:' prompt 'correct to: %e' #
1039 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
1041 # complete manual by their section
1042 zstyle ':completion:*:manuals' separate-sections true
1043 zstyle ':completion:*:manuals.*' insert-sections true
1044 zstyle ':completion:*:man:*' menu yes select
1047 # run rehash on completion so new installed program are found automatically:
1049 (( CURRENT == 1 )) && rehash
1050 return 1 # Because we didn't really complete anything
1052 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
1053 if [[ -n "$NOCOR" ]] ; then
1054 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files
1055 setopt nocorrect # do not try to correct the spelling if possible
1057 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files
1058 setopt correct # try to correct the spelling if possible
1059 zstyle -e ':completion:*' completer '
1060 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
1061 _last_try="$HISTNO$BUFFER$CURSOR"
1062 reply=(_complete _match _prefix _files)
1064 if [[ $words[1] = (rm|mv) ]]; then
1065 reply=(_complete _files)
1067 reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files)
1071 # zstyle ':completion:*' completer _complete _correct _approximate
1072 # zstyle ':completion:*' expand prefix suffix
1074 # automatic rehash? Credits go to Frank Terbeck
1077 # [[ -z ${BUFFER} ]] && zle accept-line && return
1078 # buf=( ${(z)BUFFER} )
1079 # [[ -z ${commands[${buf[1]}]} ]] && rehash
1083 # bindkey "^M" my_accept
1085 # command for process lists, the local web server details and host completion
1086 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
1089 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
1090 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
1092 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
1094 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
1095 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
1107 zstyle ':completion:*:hosts' hosts $hosts
1108 # zstyle '*' hosts $hosts
1110 # specify your logins:
1112 # {grml,grml1}@foo.invalid
1113 # grml-devel@bar.invalid
1116 # {fred,root}@foo.invalid
1119 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
1120 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
1122 # specify specific port/service settings:
1123 # telnet_users_hosts_ports=(
1126 # @mail-server:{smtp,pop3}
1128 # @proxy-server:8000
1130 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
1132 # use generic completion system for programs not yet defined:
1133 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
1135 # see upgrade function in this file
1136 compdef _hosts upgrade
1142 # people should use 'grml-x'!
1144 if [ -e /etc/X11/xorg.conf ] ; then
1145 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
1147 echo "Please use the script \"grml-x\" for starting the X Window System
1148 because there does not exist /etc/X11/xorg.conf yet.
1149 If you want to use startx anyway please call \"/usr/bin/startx\"."
1155 if [ -e /etc/X11/xorg.conf ] ; then
1156 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
1158 echo "Please use the script \"grml-x\" for starting the X Window System.
1159 because there does not exist /etc/X11/xorg.conf yet.
1160 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
1165 if [ -x $(which 915resolution) ] ; then
1166 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
1169 #a1# Output version of running grml
1170 alias grml-version='cat /etc/grml_version'
1172 if [ -x $(which rebuildfstab) ] ; then
1173 #a1# Rebuild /etc/fstab
1174 alias grml-rebuildfstab='rebuildfstab -v -r -config'
1177 if [ -x $(which grml-debootstrap) ] ; then
1178 alias debian2hd='print "Installing debian to harddisk is possible via using grml-debootstrap." ; return 1'
1183 # {{{ now run the functions
1185 is4 && isgrml && grmlstuff
1190 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
1193 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
1194 # You use it as follows:
1195 # $ NTREF=/reference/file
1197 # This lists all the files in the current directory newer than the reference file.
1198 # You can also specify the reference file inline; note quotes:
1199 # $ ls -l *(e:'nt ~/.zshenv':)
1201 if [[ -n $1 ]]; then
1204 [[ $REPLY -nt $NTREF ]]
1208 # shell functions {{{
1209 #f1# Provide csh compatibility
1210 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
1211 #f1# Reload an autoloadable function
1212 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
1213 #f1# Reload zsh setup
1215 if [[ "$#*" -eq 0 ]]; then
1216 [ -r ~/.zshrc ] && . ~/.zshrc
1225 compdef _functions reload freload
1227 #f1# List symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
1229 [ -z "$1" ] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
1232 while [ -h "$file" ] ; do
1234 file=$(readlink "$file")
1239 # fast manual access
1240 if type -p qma &>/dev/null ; then
1241 #f1# View the zsh manual
1242 manzsh() { qma zshall "$1" }
1245 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1246 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
1247 # manzsh() { man zshall | $MYLESS -p $1 ; }
1250 if [ -x $(which most) ] ; then
1251 #f1# View Debian's changelog of a given package
1253 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
1254 most /usr/share/doc/${1}/changelog.Debian.gz
1256 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1257 most /usr/share/doc/${1}/changelog.gz
1259 echo "No changelog for package $1 found, sorry."
1264 _dchange() { _files -W /usr/share/doc -/ }
1265 compdef _dchange dchange
1267 #f1# View Debian's NEWS of a given package
1269 if [ -r /usr/share/doc/${1}/NEWS.Debian.gz ] ; then
1270 most /usr/share/doc/${1}/NEWS.Debian.gz
1272 if [ -r /usr/share/doc/${1}/NEWS.gz ] ; then
1273 most /usr/share/doc/${1}/NEWS.gz
1275 echo "No NEWS file for package $1 found, sorry."
1280 _dnews() { _files -W /usr/share/doc -/ }
1281 compdef _dnews dnews
1283 #f1# View upstream's changelog of a given package
1285 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1286 most /usr/share/doc/${1}/changelog.gz
1288 echo "No changelog for package $1 found, sorry."
1292 _uchange() { _files -W /usr/share/doc -/ }
1293 compdef _uchange uchange
1298 ZSH_PROFILE_RC=1 $SHELL "$@"
1301 #f1# Edit an alias via zle
1303 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1305 compdef _aliases edalias
1307 #f1# Edit a function via zle
1309 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1311 compdef _functions edfunc
1313 # use it e.g. via 'Restart apache2'
1314 #m# f6 Start() \kbd{/etc/init.d/\em{process}}\quad\kbd{start}
1315 #m# f6 Restart() \kbd{/etc/init.d/\em{process}}\quad\kbd{restart}
1316 #m# f6 Stop() \kbd{/etc/init.d/\em{process}}\quad\kbd{stop}
1317 #m# f6 Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{reload}
1318 #m# f6 Force-Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{force-reload}
1319 if [ -d /etc/init.d ] ; then
1320 for i in Start Restart Stop Force-Reload Reload ; do
1321 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1325 #f1# Provides useful information on globbing
1332 p named pipes (FIFOs)
1333 * executable plain files (0100)
1334 % device files (character or block special)
1335 %b block special files
1336 %c character special files
1337 r owner-readable files (0400)
1338 w owner-writable files (0200)
1339 x owner-executable files (0100)
1340 A group-readable files (0040)
1341 I group-writable files (0020)
1342 E group-executable files (0010)
1343 R world-readable files (0004)
1344 W world-writable files (0002)
1345 X world-executable files (0001)
1346 s setuid files (04000)
1347 S setgid files (02000)
1348 t files with the sticky bit (01000)
1350 print *(m-1) # Files modified up to a day ago
1351 print *(a1) # Files accessed a day ago
1352 print *(@) # Just symlinks
1353 print *(Lk+50) # Files bigger than 50 kilobytes
1354 print *(Lk-50) # Files smaller than 50 kilobytes
1355 print **/*.c # All *.c files recursively starting in \$PWD
1356 print **/*.c~file.c # Same as above, but excluding 'file.c'
1357 print (foo|bar).* # Files starting with 'foo' or 'bar'
1358 print *~*.* # All Files that do not contain a dot
1359 chmod 644 *(.^x) # make all plain non-executable files publically readable
1360 print -l *(.c|.h) # Lists *.c and *.h
1361 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1362 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1364 alias help-zshglob=H-Glob
1366 type -p qma &>/dev/null && alias ?='qma zshall'
1368 # grep for running process, like: 'any vim'
1370 if [ -z "$1" ] ; then
1371 echo "any - grep for process(es) by keyword" >&2
1372 echo "Usage: any <keyword>" >&2 ; return 1
1375 local LENGTH=$(expr length $STRING)
1376 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1377 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1378 ps xauwww| grep "[$FIRSCHAR]$REST"
1382 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1383 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1384 [ -r /proc/1/maps ] && deswap() {
1385 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1386 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1387 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1390 # print hex value of a number
1392 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1395 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1396 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1398 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1399 perl -e "print eval($CALC),\"\n\";"
1401 functions peval &>/dev/null && alias calc=peval
1403 # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
1404 # certain circumstances, so work around it, no matter which environment we have
1406 if [ -z "$DISPLAY" ] ; then
1407 consolechars -f /usr/share/consolefonts/default8x16.psf.gz
1414 # just press 'asdf' keys to toggle between dvorak and us keyboard layout
1416 if [ -n "$XKEYBOARD" -a -n "$KEYTABLE" ] ; then
1417 echo -n "Switching to $KEYTABLE keyboard layout: "
1418 [ -z "$DISPLAY" ] && $SUDO loadkeys $KEYTABLE &>/dev/null || setxkbmap $XKEYBOARD &>/dev/null
1420 echo -n 'Switching to us keyboard layout: '
1421 [ -z "$DISPLAY" ] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null
1426 echo -n 'Switching to dvorak keyboard layout: '
1427 [ -z "$DISPLAY" ] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null
1430 # just press 'asdf' key to toggle from neon layout to us keyboard layout
1432 echo -n 'Switching to us keyboard layout: '
1433 setxkbmap us && echo 'Done' || echo 'Failed'
1436 # set up an ipv6 tunnel
1440 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1441 print 'ipv6 tunnel already set up, nothing to be done.'
1442 print 'execute: "ifconfig sit1 down ; ifconfig sit0 down" to remove ipv6-tunnel.' ; return 1
1444 [ -n "$PUBLIC_IP" ] || local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \
1445 awk '/inet addr:/ {print $2}' | tr -d 'addr:')
1446 [ -n "$PUBLIC_IP" ] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 }
1447 local IPV6ADDR=$(printf "2002:%02x%02x:%02x%02x:1::1" $(print ${PUBLIC_IP//./ }))
1448 print -n "Setting up ipv6 tunnel $IPV6ADDR via ${PUBLIC_IP}: "
1449 ifconfig sit0 tunnel ::192.88.99.1 up
1450 ifconfig sit1 add "$IPV6ADDR" && print done || print failed
1454 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1455 print 'ipv6 tunnel available' ; return 0
1457 print 'ipv6 tunnel not available' ; return 1
1461 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1462 print -n 'Stopping ipv6 tunnel (sit0 + sit1): '
1463 ifconfig sit1 down ; ifconfig sit0 down && print done || print failed
1465 print 'No ipv6 tunnel found, nothing to be done.' ; return 1
1469 print "Usage: ipv6-tunnel [start|stop|status]">&2 ; return 1
1474 # run dhclient for wireless device
1476 salias dhclient "$(wavemon -d | awk '/device/{print $2}')"
1479 # spawn a minimally set up ksh - useful if you want to umount /usr/.
1481 exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh
1484 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1486 # NO_SWITCH="yes" command bash "$@"
1489 # exec $SHELL $SHELL_ARGS "$@"
1494 # log out? set timeout in seconds {{{
1496 # do not log out in some specific terminals:
1497 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1502 # {{{ make sure our environment is clean regarding colors
1503 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1506 # source another config file if present {{{
1507 if [ -r /etc/zsh/zshrc.local ]; then
1508 source /etc/zsh/zshrc.local
1512 # "persistent history" {{{
1513 # just write important commands you always need to ~/.important_commands
1514 if [ -r ~/.important_commands ] ; then
1515 fc -R ~/.important_commands
1519 ## genrefcard.pl settings {{{
1520 ### example: split funtions-search 8,16,24,32
1521 #@# split functions-search 8
1524 # add variable to be able to check whether the file has been read {{{
1525 ZSHRC_GLOBAL_HAS_BEEN_READ=1
1528 ## END OF FILE #################################################################
1529 # vim:foldmethod=marker expandtab