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: Mon Nov 05 12:20:29 CET 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 configuration
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 syntax 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 entry 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 omitted, 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@@.
89 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
90 if [[ -n $ZSH_PROFILE_RC ]] ; then
96 if [ -n "$LANG" ] ; then
99 [ -r /etc/default/locale ] && source /etc/default/locale
101 [ -n "$LANG" ] && export LANG || export LANG="en_US.iso885915"
102 [ -n "$LC_ALL" ] && export LC_ALL
103 [ -n "$LC_MESSAGES" ] && export LC_MESSAGES
105 [ -r /etc/sysconfig/keyboard ] && source /etc/sysconfig/keyboard
106 [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
109 # check for potentially old files in 'completion.d' {{{
111 xof=(/etc/zsh/completion.d/*~/etc/zsh/completion.d/_*(N))
112 if (( ${#xof} > 0 )) ; then
113 printf '\n -!- INFORMATION\n\n'
114 printf ' -!- %s file(s) not starting with an underscore (_) found in\n' ${#xof}
115 printf ' -!- /etc/zsh/completion.d/.\n\n'
116 printf ' -!- While this has been the case in old versions of grml-etc-core,\n'
117 printf ' -!- recent versions of the grml-zsh-setup have all these files rewritten\n'
118 printf ' -!- and renamed. Furthermore, the grml-zsh-setup will *only* add files\n'
119 printf ' -!- named _* to that directory.\n\n'
120 printf ' -!- If you added functions to completion.d yourself, please consider\n'
121 printf ' -!- moving them to /etc/zsh/functions.d/. Files in that directory, not\n'
122 printf ' -!- starting with an underscore are marked for automatic loading\n'
123 printf ' -!- by default (so that is quite convenient).\n\n'
124 printf ' -!- If there are files *not* starting with an underscore from an older\n'
125 printf ' -!- grml-etc-core in completion.d, you may safely remove them.\n\n'
126 printf ' -!- Delete the files for example via running:\n\n'
127 printf " rm ${xof}\n\n"
128 printf ' -!- Note, that this message will *not* go away, unless you yourself\n'
129 printf ' -!- resolve the situation manually.\n\n'
130 BROKEN_COMPLETION_DIR=1
135 # {{{ check for version/system
136 # check for versions (compatibility reasons)
137 if autoload is-at-least && is-at-least 2>/dev/null ; then
138 is4() { is-at-least 4 }
139 is41() { is-at-least 4.1 }
140 is42() { is-at-least 4.2 }
143 [[ $ZSH_VERSION == 4.* ]] && return 0
147 [[ $ZSH_VERSION == 4.<2->* ]] && return 0
152 # grml specific stuff
153 #f1# Checks whether or not you're running grml
155 [ -f /etc/grml_version ] && return 0
159 #f1# Checks whether or not you're running a grml cd
161 [ -f /etc/grml_cd ] && return 0
166 #f1# Checks whether or not you're running grml-small
168 [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
171 isgrmlsmall() { return 1 }
174 #f1# are we running within an utf environment?
176 case "$LANG $CHARSET $LANGUAGE" in
183 # check for user, if not running as root set $SUDO to sudo
184 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
187 # creates an alias and precedes the command with
188 # sudo if $EUID is not zero.
189 local only=0 ; local multi=0
190 while [[ ${1} == -* ]] ; do
194 (--) shift ; break ;;
196 printf 'usage: salias [-h|-o|-a] <alias-expression>\n'
197 printf ' -h shows this help text.\n'
198 printf ' -a replace '\'' ; '\'' sequences with '\'' ; sudo '\''.\n'
199 printf ' be careful using this option.\n'
200 printf ' -o only sets an alias if a preceding sudo would be needed.\n'
203 (*) printf "unkown option: '%s'\n" "${1}" ; return 1 ;;
207 if (( ${#argv} > 1 )) ; then
208 printf 'Too many arguments %s\n' "${#argv}"
211 key="${1%%\=*}" ; val="${1#*\=}"
212 if (( EUID == 0 )) && (( only == 0 )); then
213 alias -- "${key}=${val}"
214 elif (( EUID > 0 )) ; then
215 (( multi > 0 )) && val="${val// ; / ; sudo }"
216 alias -- "${key}=sudo ${val}"
221 # change directory to home on first invocation of zsh
222 # important for rungetty -> autologin
223 # Thanks go to Bart Schaefer!
224 isgrml && checkhome() {
225 if [[ -z "$ALREADY_DID_CD_HOME" ]]; then
226 export ALREADY_DID_CD_HOME=$HOME
232 # {{{ set some variables
234 if type -p vim &>/dev/null ; then
235 export EDITOR=${EDITOR:-vim}
237 export EDITOR=${EDITOR:-vi}
240 export MAIL=${MAIL:-/var/mail/$USER}
241 # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
242 export SHELL='/bin/zsh'
243 [ -x $(which dircolors) ] && eval `dircolors -b`
245 # Search path for the cd command
248 # completion functions go to /etc/zsh/completion.d
249 # function files may be put into /etc/zsh/functions.d, from where they
250 # will be automatically autoloaded.
251 if [ -n "$BROKEN_COMPLETION_DIR" ] ; then
252 print 'Warning: not setting completion directories because broken files have been found.'>&2
254 [[ -d /etc/zsh/completion.d ]] && fpath+=( /etc/zsh/completion.d )
255 if [[ -d /etc/zsh/functions.d ]] ; then
256 fpath+=( /etc/zsh/functions.d )
257 for func in /etc/zsh/functions.d/[^_]*[^~] ; do
258 autoload -U ${func:t}
263 # automatically remove duplicates from these arrays
264 typeset -U path cdpath fpath manpath
268 if [[ "$TERM" != emacs ]]; then
269 [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
270 [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
271 [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
272 [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
273 [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
274 [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
275 [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
276 [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
277 [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
278 [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
279 [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
280 [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
282 [[ "$terminfo[kcuu1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
283 [[ "$terminfo[kcud1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
284 [[ "$terminfo[kcuf1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
285 [[ "$terminfo[kcub1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
286 [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
287 [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
288 [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
289 [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
292 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
293 # use emacs style per default:
298 #if [[ "$TERM" == screen ]]; then
299 bindkey '\e[1~' beginning-of-line # home
300 bindkey '\e[4~' end-of-line # end
301 bindkey '\e[A' up-line-or-search # cursor up
302 bindkey '\e[B' down-line-or-search # <ESC>-
303 bindkey '^x' history-beginning-search-backward # alternative ways of searching the shell history
304 # bindkey -s '^L' "|less\n" # ctrl-L pipes to less
305 # bindkey -s '^B' " &\n" # ctrl-B runs it in the background
306 # if terminal type is set to 'rxvt':
307 bindkey '\e[7~' beginning-of-line # home
308 bindkey '\e[8~' end-of-line # end
311 # insert unicode character
312 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an §
313 # See for example http://unicode.org/charts/ for unicode characters code
314 autoload insert-unicode-char
315 zle -N insert-unicode-char
316 #k# Insert Unicode character
317 bindkey '^Xi' insert-unicode-char
319 # just type 'cd ...' to get 'cd ../..'
320 # rationalise-dot() {
321 # if [[ $LBUFFER = *.. ]]; then
327 # zle -N rationalise-dot
328 # bindkey . rationalise-dot
330 # bindkey '\eq' push-line-or-edit
333 # power completion - abbreviation expansion {{{
334 # power completion / abbreviation expansion / buffer expansion
335 # see http://zshwiki.org/home/examples/zleiab for details
336 # less risky than the global aliases but powerful as well
337 # just type the abbreviation key and afterwards ',.' to expand it
340 setopt interactivecomments
342 # key # value (#d additional doc string)
348 'G' '|& grep --color=auto'
350 'Hl' ' --help |& less -r' #d (Display help in pager)
354 'N' '&>/dev/null' #d (No Output)
355 'R' '| tr A-z N-za-m' #d (ROT13)
361 'hide' "echo -en '\033]50;nil2\007'"
362 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
363 'small' 'echo -en "\033]50;6x10\007"'
364 'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
365 'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
366 'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
367 'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
368 'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
369 'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
373 'co' "./configure && make && sudo make install"
374 'CH' "./configure --help"
375 'conkeror' 'firefox -chrome chrome://conkeror/content'
377 'lad' $'ls -d .*(/)\n# only show dot-directories'
378 'lsa' $'ls -a .*(.)\n# only show dot-files'
379 'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
380 'lsl' $'ls -l *(@[1,10])\n# only symlinks'
381 'lsx' $'ls -l *(*[1,10])\n# only executables'
382 'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
383 'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
384 'lsd' $'ls -d *(/)\n# only show directories'
385 'lse' $'ls -d *(/^F)\n# only show empty directories'
386 'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
387 'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
388 'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
390 '600' 'chmod u+rw-x,g-rwx,o-rwx'
392 '700' 'chmod u+rwx,g-rwx,o-rwx'
393 'r--' 'chmod u+r-wx,g-rwx,o-rwx'
394 '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
395 '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
397 'cmplayer' 'mplayer -vo -fs -zoom fbdev'
398 'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
399 'fblinks' 'links2 -driver fb'
400 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
401 'insecscp' 'scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
402 'fori' 'for i ({..}) { }'
405 'se' 'setopt interactivecomments'
406 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
407 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
408 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3'
410 'D' 'export DISPLAY=:0.0'
411 'mp' 'mplayer -vo xv -fs -zoom'
416 matched_chars='[.-|_a-zA-Z0-9]#'
417 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
418 LBUFFER+=${abk[$MATCH]:-$MATCH}
422 bindkey ",." globalias
426 autoload -U zmv # who needs mmv or rename?
427 autoload history-search-end
429 # we don't want to quote/espace URLs on our own...
430 # if autoload -U url-quote-magic ; then
431 # zle -N self-insert url-quote-magic
432 # zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
434 # print 'Notice: no url-quote-magic available :('
436 alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
438 #m# k ESC-h Call \kbd{run-help} for the 1st word on the command line
439 alias run-help >&/dev/null && unalias run-help
440 autoload run-help # use via 'esc-h'
443 if autoload -U compinit && compinit 2>/dev/null ; then
444 compinit 2>/dev/null || print 'Notice: no compinit available :('
446 print 'Notice: no compinit available :('
451 is4 && autoload -U zed # use ZLE editor to edit a file or function
453 is4 && for mod in complist deltochar mathfunc ; do
454 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
457 # autoload zsh modules when they are referenced
466 while (( ${#tmpargs} > 0 )) ; do
467 zmodload -${tmpargs[1]} zsh/${tmpargs[2]} ${tmpargs[2]}
473 is4 && autoload -U insert-files && \
474 zle -N insert-files && \
476 bindkey "^Xf" insert-files # C-x-f
478 bindkey ' ' magic-space # also do history expansion on space
479 #k# Trigger menu-complete
480 bindkey '\ei' menu-complete # menu completion via esc-i
482 # press esc-e for editing command line in $EDITOR or $VISUAL
483 is4 && autoload -U edit-command-line && \
484 zle -N edit-command-line && \
485 #k# Edit the current line in \kbd{\$EDITOR}
486 bindkey '\ee' edit-command-line
488 #k# menu selection: pick item but stay in the menu
489 is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
491 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
492 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
493 #k# Insert a timestamp on the command line (yyyy-mm-dd)
494 bindkey '^Ed' _bkdate
497 # press esc-m for inserting last typed word again (thanks to caphuso!)
498 insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
499 zle -N insert-last-typed-word;
500 #k# Insert last typed word
501 bindkey "\em" insert-last-typed-word
503 # set command prediction from history, see 'man 1 zshcontrib'
504 # is4 && autoload -U predict-on && \
505 # zle -N predict-on && \
506 # zle -N predict-off && \
507 # bindkey "^X^Z" predict-on && \
508 # bindkey "^Z" predict-off
510 #k# Shortcut for \kbd{fg<enter>}
511 bindkey -s '^z' "fg\n"
513 # press ctrl-q to quote line:
515 # zle beginning-of-line
517 # # RBUFFER="'$RBUFFER'"
518 # RBUFFER=${(q)RBUFFER}
521 # zle -N mquote && bindkey '^q' mquote
523 # run command line as user root via sudo:
524 sudo-command-line() {
525 [[ -z $BUFFER ]] && zle up-history
526 [[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER"
528 zle -N sudo-command-line
529 #k# Put the current command line into a \kbd{sudo} call
530 bindkey "^Os" sudo-command-line
532 ### jump behind the first word on the cmdline.
533 ### useful to add options.
534 function jump_after_first_word() {
537 if (( ${#words} <= 1 )) ; then
540 CURSOR=${#${words[1]}}
543 zle -N jump_after_first_word
544 bindkey '^x1' jump_after_first_word
548 # {{{ set some important options
549 # Please update these tags, if you change the umask settings below.
551 #o# r_umaskstr rwxrwxr-x
553 #o# umaskstr rwxr-xr-x
554 (( EUID != 0 )) && umask 002 || umask 022
557 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
558 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
559 setopt extended_history # save each command's beginning timestamp and the duration to the history file
560 is4 && setopt histignorealldups # If a new command line being added to the history
561 # list duplicates an older one, the older command is removed from the list
562 setopt histignorespace # remove command lines from the history list when
563 # the first character on the line is a space
564 # setopt histallowclobber # add `|' to output redirections in the history
565 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
566 setopt auto_cd # if a command is issued that can't be executed as a normal command,
567 # and the command is the name of a directory, perform the cd command to that directory
568 setopt extended_glob # in order to use #, ~ and ^ for filename generation
569 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
570 # -> searches for word not in compressed files
571 # don't forget to quote '^', '~' and '#'!
572 setopt notify # report the status of backgrounds jobs immediately
573 setopt hash_list_all # Whenever a command completion is attempted, make sure \
574 # the entire command path is hashed first.
575 setopt completeinword # not just at the end
576 # setopt nocheckjobs # don't warn me about bg processes when exiting
577 setopt nohup # and don't kill them, either
578 # setopt printexitvalue # alert me if something failed
579 # setopt dvorak # with spelling correction, assume dvorak kb
580 setopt auto_pushd # make cd push the old directory onto the directory stack.
581 setopt nonomatch # try to avoid the 'zsh: no matches found...'
582 setopt nobeep # avoid "beep"ing
583 setopt pushd_ignore_dups # don't push the same dir twice.
585 MAILCHECK=30 # mailchecks
586 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 seconds
587 watch=(notme root) # watch for everyone but me and root
589 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
590 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
592 # WORDCHARS='*?_[]~=&;!#$%^(){}'
593 # WORDCHARS='${WORDCHARS:s@/@}'
595 # only slash should be considered as a word separator:
596 slash-backward-kill-word() {
597 local WORDCHARS="${WORDCHARS:s@/@}"
599 zle backward-kill-word
601 zle -N slash-backward-kill-word
602 # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
603 #k# Kill everything in a word up to its last \kbd{/}
604 bindkey '\ev' slash-backward-kill-word
608 export ZSHDIR=$HOME/.zsh
610 HISTFILE=$HOME/.zsh_history
611 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
612 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
615 # dirstack handling {{{
617 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
618 dirstack=( ${(f)"$(< ~/.zdirs)"} )
619 # "cd -" won't work after login by just setting $OLDPWD, so
620 [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD
623 builtin dirs -pl >! ~/.zdirs
627 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
628 if [ -n "$BATTERY" ] ; then
629 if [ -x $(which acpi) ] ; then
630 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
631 [ -z "$PERCENT" ] && PERCENT='acpi not present'
632 if [ "${PERCENT%%%}" -lt 20 ] ; then
633 PERCENT="warning: ${PERCENT}%"
639 # display version control information on right side of prompt if $VCS is set {{{
640 # based on Mike Hommey's http://web.glandium.org/blog/?p=170
642 local vcs base_dir sub_dir ref
645 sub_dir=$(readlink -f "${PWD}")
646 sub_dir=${sub_dir#$1}
651 base_dir=$(git-rev-parse --show-cdup 2>/dev/null) || return 1
652 base_dir=$(readlink -f "$base_dir/..")
653 sub_dir=$(git-rev-parse --show-prefix)
655 ref=$(git-symbolic-ref -q HEAD || git-name-rev --name-only HEAD 2>/dev/null)
656 ref=${ref#refs/heads/}
661 [ -d ".svn" ] || return 1
663 while [ -d "$base_dir/../.svn" ]; do base_dir="$base_dir/.."; done
664 base_dir=$(readlink -f "$base_dir")
665 sub_dir=$(sub_dir "${base_dir}")
666 ref=$(svn info "$base_dir" | awk '/^URL/ { sub(".*/","",$0); r=$0 } /^Revision/ { sub("[^0-9]*","",$0); print r":"$0 }')
671 [ -f ~/.svk/config ] || return 1
672 base_dir=$(awk '/: *$/ { sub(/^ */,"",$0); sub(/: *$/,"",$0); if (match("'${PWD}'", $0"(/|$)")) { print $0; d=1; } } /depotpath/ && d == 1 { sub(".*/","",$0); r=$0 } /revision/ && d == 1 { print r ":" $2; exit 1 }' ~/.svk/config) && return 1
675 base_dir=${base_dir%%
677 sub_dir=$(sub_dir "${base_dir}")
683 while [ ! -d "$base_dir/.hg" ]; do base_dir="$base_dir/.."; [ $(readlink -f "${base_dir}") = "/" ] && return 1; done
684 base_dir=$(readlink -f "$base_dir")
685 sub_dir=$(sub_dir "${base_dir}")
686 ref=$(< "${base_dir}/.hg/branch")
695 # echo "${vcs:+($vcs)}${base_dir/$HOME/~}${vcs:+[$ref]${sub_dir}}"
696 echo "${vcs:+($vcs)}${base_dir}${vcs:+[$ref]${sub_dir}}"
701 if autoload promptinit && promptinit 2>/dev/null ; then
702 promptinit # people should be able to use their favourite prompt
704 print 'Notice: no promptinit available :('
708 # precmd() => a function which is executed just before each prompt
709 # use 'NOPRECMD=1' to disable the precmd + preexec commands
711 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
713 # make sure to use right prompt only when not running a command
714 is41 && setopt transient_rprompt
716 is4 && [[ -z $NOPRECMD ]] && precmd () {
717 [[ -n $NOPRECMD ]] && return 0
718 # allow manual overwriting of RPROMPT
719 if [[ -n $RPROMPT ]] ; then
720 [[ $TERM == screen* ]] && echo -n $'\ekzsh\e\\'
723 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
724 if [[ -z $DONTSETRPROMPT ]] ; then
725 if [[ -n $BATTERY ]] ; then
726 RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
727 # RPROMPT="${PERCENT}${SCREENTITLE}"
728 elif [[ -n $VCS ]] ; then
729 RPROMPT="%(?..:()% $(__vcs_dir)${SCREENTITLE}"
731 RPROMPT="%(?..:()% ${SCREENTITLE}"
732 # RPROMPT="${SCREENTITLE}"
735 # adjust title of xterm
736 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
737 case $TERM in (xterm*|rxvt)
738 print -Pn "\e]0;%n@%m: %~\a"
743 # chpwd () => a function which is executed whenever the directory is changed
745 # preexec() => a function running before every command
746 is4 && [[ -z $NOPRECMD ]] && preexec () {
747 [[ -n $NOPRECMD ]] && return 0
748 # set hostname if not running on host with name 'grml'
749 local HOSTNAME=$(hostname)
750 if [[ "$HOSTNAME" != grml ]] ; then
753 # get the name of the program currently running and hostname of local machine
754 # set screen window title if running in a screen
755 if [[ "$TERM" == screen* ]]; then
756 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # don't use hostname
757 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
758 echo -ne "\ek$CMD\e\\"
760 # set the screen title to "zsh" when sitting at the command prompt:
761 if [[ "$TERM" == screen* ]]; then
762 SCREENTITLE=$'%{\ekzsh\e\\%}'
766 # adjust title of xterm
767 case $TERM in (xterm*|rxvt)
768 print -Pn "\e]0;%n@%m: $1\a"
774 if autoload colors && colors 2>/dev/null ; then
775 BLUE="%{${fg[blue]}%}"
776 RED="%{${fg_bold[red]}%}"
777 GREEN="%{${fg[green]}%}"
778 CYAN="%{${fg[cyan]}%}"
779 WHITE="%{${fg[white]}%}"
780 NO_COLOUR="%{${reset_color}%}"
784 GREEN=$'%{\e[1;32m%}'
786 WHITE=$'%{\e[1;37m%}'
787 NO_COLOUR=$'%{\e[0m%}'
790 EXITCODE="%(?..%?%1v )"
791 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
792 PS3='?# ' # selection prompt used within a select loop.
793 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
795 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
796 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
797 debian_chroot=$(cat /etc/debian_chroot)
800 # don't use colors on dumb terminals (like emacs):
801 if [[ "$TERM" == dumb ]] ; then
802 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
804 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
805 # set variable identifying the chroot you work in (used in the prompt below)
806 if [[ -n $GRMLPROMPT ]]; then
807 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
808 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
810 if (( EUID != 0 )); then
811 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
813 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
818 # if we are inside a grml-chroot set a specific prompt theme
819 if [ -n "$GRML_CHROOT" ] ; then
820 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
824 # {{{ 'hash' some often used directories
826 hash -d deb=/var/cache/apt/archives
827 hash -d doc=/usr/share/doc
828 hash -d linux=/lib/modules/$(command uname -r)/build/
830 hash -d slog=/var/log/syslog
832 hash -d templ=/usr/share/doc/grml-templates
833 hash -d tt=/usr/share/doc/texttools-doc
839 if [ $UID = 0 ] ; then
840 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
841 elif [ -r $HOME/.screenrc ] ; then
842 alias screen="/usr/bin/screen -c $HOME/.screenrc"
844 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
847 # do we have GNU ls with color-support?
848 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
849 #a1# execute \kbd{@a@}:\quad ls with colors
850 alias ls='ls -b -CF --color=auto'
851 #a1# execute \kbd{@a@}:\quad list all files, with colors
852 alias la='ls -la --color=auto'
853 #a1# long colored list, without dotfiles (@a@)
854 alias ll='ls -l --color=auto'
855 #a1# long colored list, human readable sizes (@a@)
856 alias lh='ls -hAl --color=auto'
857 #a1# List files, append qualifier to filenames \\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...)
858 alias l='ls -lF --color=auto'
867 alias mdstat='cat /proc/mdstat'
868 alias ...='cd ../../'
870 # generate alias named "$KERNELVERSION-reboot" so you can use boot with kexec:
871 if [ -x /sbin/kexec -a -r /proc/cmdline ] ; then
872 alias "$(uname -r)-reboot"="kexec -l --initrd=/boot/initrd.img-"$(uname -r)" --command-line=\"$(cat /proc/cmdline)\" /boot/vmlinuz-"$(uname -r)""
875 alias cp='nocorrect cp' # no spelling correction on cp
876 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
877 alias mv='nocorrect mv' # no spelling correction on mv
878 alias rm='nocorrect rm' # no spelling correction on rm
880 #a1# Execute \kbd{rmdir}
882 #a1# Execute \kbd{rmdir}
885 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
886 alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
887 alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
889 # make sure it is not assigned yet
890 [[ $(whence -w utf2iso &>/dev/null) == 'utf2iso: alias' ]] && unalias utf2iso
893 for ENV in $(env | command grep -i '.utf') ; do
894 eval export "$(echo $ENV | sed 's/UTF-8/iso885915/ ; s/utf8/iso885915/')"
899 # make sure it is not assigned yet
900 [[ $(whence -w iso2utf &>/dev/null) == 'iso2utf: alias' ]] && unalias iso2utf
903 for ENV in $(env | command grep -i '\.iso') ; do
904 eval export "$(echo $ENV | sed 's/iso.*/UTF-8/ ; s/ISO.*/UTF-8/')"
909 # set up software synthesizer via speakup
911 aumix -w 90 -v 90 -p 90 -m 90
912 if ! [ -r /dev/softsynth ] ; then
913 flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
919 nice -n -20 speechd-up
921 flite -o play -t "Finished setting up software synthesizer"
925 # I like clean prompt, so provide simple way to get that
926 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
928 # for really lazy people like mika:
929 type S &>/dev/null || alias S='screen'
930 type s &>/dev/null || alias s='ssh'
932 # get top 10 shell commands:
933 alias top10='print -l ? ${(o)history%% *} | uniq -c | sort -nr | head -n 10'
935 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
936 if [ -x $(which truecrypt) ] ; then
938 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
940 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
944 #f1# Hints for the use of zsh on grml
945 zsh-help(){print "$bg[white]$fg[black]
946 zsh-help - hints for use of zsh on grml
947 =======================================$reset_color
949 Main configuration of zsh happens in /etc/zsh/zshrc (global)
950 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
951 The files are part of the package grml-etc-core, if you want to
952 use them on a non-grml-system just get the tar.gz from
953 http://deb.grml.org/ or get the files from the mercurial
956 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
957 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
959 If you want to stay in sync with zsh configuration of grml
960 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
961 your own stuff in \$HOME/.zshrc.local. System wide configuration
962 without touching configuration files of grml can take place
963 in /etc/zsh/zshrc.local.
965 If you want to use the configuration of user grml also when
966 running as user root just run 'zshskel' which will source
967 the file /etc/skel/.zshrc.
969 For information regarding zsh start at http://grml.org/zsh/
971 Take a look at grml's zsh refcard:
972 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
974 Check out the main zsh refcard:
975 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
977 And of course visit the zsh-lovers:
980 You can adjust some options through environment variables when
981 invoking zsh without having to edit configuration files.
982 Basically meant for bash users who are not used to the power of
985 \"NOCOR=1 zsh\" => deactivate automatic correction
986 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
987 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
988 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
990 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
991 Enjoy your grml system with the zsh!$reset_color"
995 if [ -r /etc/debian_version ] ; then
996 #a3# Execute \kbd{apt-cache search}
997 alias acs='apt-cache search'
998 #a3# Execute \kbd{apt-cache show}
999 alias acsh='apt-cache show'
1000 #a3# Execute \kbd{apt-cache policy}
1001 alias acp='apt-cache policy'
1002 #a3# Execute \kbd{apt-get dist-upgrade}
1003 salias adg="apt-get dist-upgrade"
1004 #a3# Execute \kbd{apt-get install}
1005 salias agi="apt-get install"
1006 #a3# Execute \kbd{aptitude install}
1007 salias ati="aptitude install"
1008 #a3# Execute \kbd{apt-get upgrade}
1009 salias ag="apt-get upgrade"
1010 #a3# Execute \kbd{apt-get update}
1011 salias au="apt-get update"
1012 #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade}
1013 salias -a up="aptitude update ; aptitude safe-upgrade"
1014 #a3# Execute \kbd{dpkg-buildpackage}
1015 alias dbp='dpkg-buildpackage'
1016 #a3# Execute \kbd{grep-excuses}
1017 alias ge='grep-excuses'
1020 #f3# Execute \kbd{apt-get update \&\& }\\&\quad \kbd{apt-get dist-upgrade}
1022 if [ -z "$1" ] ; then
1023 $SUDO apt-get update
1024 $SUDO apt-get -u upgrade
1026 ssh $1 $SUDO apt-get update
1027 # ask before the upgrade
1029 ssh $1 $SUDO apt-get --no-act upgrade
1030 echo -n 'Process the upgrade?'
1032 if [[ $dummy == "y" ]] ; then
1033 ssh $1 $SUDO apt-get -u upgrade --yes
1038 isgrmlcd && alias su="sudo -s" # get a root shell
1039 #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog}
1040 alias llog="$PAGER /var/log/syslog" # take a look at the syslog
1041 #a1# Take a look at the syslog: \kbd{tail -f /var/log/syslog}
1042 alias tlog="tail -f /var/log/syslog" # follow the syslog
1043 #a1# (Re)-source \kbd{/etc/skel/.zshrc}
1044 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
1047 # sort installed Debian-packages by size
1048 if [ -x $(which grep-status) ] ; then
1049 #a3# List installed Debian-packages sorted by size
1050 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package -n "install ok installed" | paste -sd " \n" | sort -rn'
1053 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
1054 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
1055 if [ -x $(which wodim) ] ; then
1056 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
1057 See #377109 in the BTS of Debian for more details.
1059 Please use the wodim binary instead' ; return 1"
1063 # get_tw_cli has been renamed into get_3ware
1064 if [ -x $(which get_3ware) ] ; then
1066 echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
1071 # I hate lacking backward compatibility, so provide an alternative therefore
1072 if ! [ -x $(which apache2-ssl-certificate) ] ; then
1073 apache2-ssl-certificate(){
1075 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
1076 print 'You might want to take a look at Debian the package ssl-cert as well.'
1077 print 'To generate a certificate for use with apache2 follow the instructions:'
1081 export RANDFILE=/dev/random
1082 mkdir /etc/apache2/ssl/
1083 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
1084 chmod 600 /etc/apache2/ssl/apache.pem
1086 Run "grml-tips ssl-certificate" if you need further instructions.
1092 # {{{ Use hard limits, except for a smaller stack and no core dumps
1095 isgrmlcd && limit core 0 # important for a live-cd-system
1099 # {{{ completion stuff
1101 # called later (via is4 && grmlcomp)
1102 # notice: use 'zstyle' for getting current settings
1103 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
1105 ## completion system
1106 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
1107 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '(aptitude-*|*\~)' # don't complete backup files as executables
1108 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
1109 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
1110 zstyle ':completion:*:correct:*' original true #
1111 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
1112 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
1113 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
1114 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
1115 zstyle ':completion:*:history-words' list false #
1116 zstyle ':completion:*:history-words' menu yes # activate menu
1117 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
1118 zstyle ':completion:*:history-words' stop yes #
1119 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
1120 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
1121 zstyle ':completion:*' group-name ''
1122 if [[ -z "$NOMENU" ]] ; then
1123 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
1125 setopt no_auto_menu # don't use any menus at all
1127 zstyle ':completion:*:messages' format '%d' #
1128 zstyle ':completion:*:options' auto-description '%d' #
1129 zstyle ':completion:*:options' description 'yes' # describe options in full
1130 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
1131 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
1132 zstyle ':completion:*' verbose true # provide verbose completion information
1133 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
1134 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
1135 zstyle ':completion:correct:' prompt 'correct to: %e' #
1136 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
1138 # complete manual by their section
1139 zstyle ':completion:*:manuals' separate-sections true
1140 zstyle ':completion:*:manuals.*' insert-sections true
1141 zstyle ':completion:*:man:*' menu yes select
1144 # run rehash on completion so new installed program are found automatically:
1146 (( CURRENT == 1 )) && rehash
1147 return 1 # Because we didn't really complete anything
1149 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
1150 if [[ -n "$NOCOR" ]] ; then
1151 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored
1152 setopt nocorrect # do not try to correct the spelling if possible
1154 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _ignored _correct _approximate _files
1155 setopt correct # try to correct the spelling if possible
1156 zstyle -e ':completion:*' completer '
1157 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
1158 _last_try="$HISTNO$BUFFER$CURSOR"
1159 reply=(_complete _match _ignored _prefix _files)
1161 if [[ $words[1] = (rm|mv) ]]; then
1162 reply=(_complete _files)
1164 reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files)
1168 # zstyle ':completion:*' completer _complete _correct _approximate
1169 # zstyle ':completion:*' expand prefix suffix
1171 # automatic rehash? Credits go to Frank Terbeck
1174 # [[ -z ${BUFFER} ]] && zle accept-line && return
1175 # buf=( ${(z)BUFFER} )
1176 # [[ -z ${commands[${buf[1]}]} ]] && rehash
1180 # bindkey "^M" my_accept
1182 # command for process lists, the local web server details and host completion
1183 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
1186 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
1187 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
1189 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
1191 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
1192 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
1204 zstyle ':completion:*:hosts' hosts $hosts
1205 # zstyle '*' hosts $hosts
1207 # specify your logins:
1209 # {grml,grml1}@foo.invalid
1210 # grml-devel@bar.invalid
1213 # {fred,root}@foo.invalid
1216 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
1217 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
1219 # specify specific port/service settings:
1220 # telnet_users_hosts_ports=(
1223 # @mail-server:{smtp,pop3}
1225 # @proxy-server:8000
1227 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
1229 # use generic completion system for programs not yet defined:
1230 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
1232 # see upgrade function in this file
1233 compdef _hosts upgrade
1239 # people should use 'grml-x'!
1241 if [ -e /etc/X11/xorg.conf ] ; then
1242 [ -x /usr/bin/startx ] && /usr/bin/startx "$@" || /usr/X11R6/bin/startx "$@"
1244 echo "Please use the script \"grml-x\" for starting the X Window System
1245 because there does not exist /etc/X11/xorg.conf yet.
1246 If you want to use startx anyway please call \"/usr/bin/startx\"."
1252 if [ -e /etc/X11/xorg.conf ] ; then
1253 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
1255 echo "Please use the script \"grml-x\" for starting the X Window System.
1256 because there does not exist /etc/X11/xorg.conf yet.
1257 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
1262 if [ -x $(which 915resolution) ] ; then
1263 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
1266 #a1# Output version of running grml
1267 alias grml-version='cat /etc/grml_version'
1269 if [ -x $(which rebuildfstab) ] ; then
1270 #a1# Rebuild /etc/fstab
1271 alias grml-rebuildfstab='rebuildfstab -v -r -config'
1274 if [ -x $(which grml-debootstrap) ] ; then
1275 alias debian2hd='print "Installing debian to harddisk is possible via using grml-debootstrap." ; return 1'
1280 # {{{ now run the functions
1282 is4 && isgrml && grmlstuff
1287 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
1290 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
1291 # You use it as follows:
1292 # $ NTREF=/reference/file
1294 # This lists all the files in the current directory newer than the reference file.
1295 # You can also specify the reference file inline; note quotes:
1296 # $ ls -l *(e:'nt ~/.zshenv':)
1298 if [[ -n $1 ]]; then
1301 [[ $REPLY -nt $NTREF ]]
1305 # shell functions {{{
1306 #f1# Provide csh compatibility
1307 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
1308 #f1# Reload an autoloadable function
1309 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
1310 #f1# Reload zsh setup
1312 if [[ "$#*" -eq 0 ]]; then
1313 [ -r ~/.zshrc ] && . ~/.zshrc
1322 compdef _functions reload freload
1324 #f1# List symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
1326 [ -z "$1" ] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
1329 while [ -h "$file" ] ; do
1331 file=$(readlink "$file")
1336 # fast manual access
1337 if type -p qma &>/dev/null ; then
1338 #f1# View the zsh manual
1339 manzsh() { qma zshall "$1" }
1342 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1343 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
1344 # [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
1345 # manzsh() { man zshall | $MYLESS -p $1 ; }
1348 if [ -x $(which most) ] ; then
1349 #f1# View Debian's changelog of a given package
1351 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
1352 most /usr/share/doc/${1}/changelog.Debian.gz
1353 elif [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1354 most /usr/share/doc/${1}/changelog.gz
1356 if type -p aptitude &>/dev/null ; then
1357 echo "No changelog for package $1 found, using aptitude to retrieve it."
1359 aptitude -t unstable changelog ${1}
1361 aptitude changelog ${1}
1364 echo "No changelog for package $1 found, sorry."
1369 _dchange() { _files -W /usr/share/doc -/ }
1370 compdef _dchange dchange
1372 #f1# View Debian's NEWS of a given package
1374 if [ -r /usr/share/doc/${1}/NEWS.Debian.gz ] ; then
1375 most /usr/share/doc/${1}/NEWS.Debian.gz
1377 if [ -r /usr/share/doc/${1}/NEWS.gz ] ; then
1378 most /usr/share/doc/${1}/NEWS.gz
1380 echo "No NEWS file for package $1 found, sorry."
1385 _dnews() { _files -W /usr/share/doc -/ }
1386 compdef _dnews dnews
1388 #f1# View upstream's changelog of a given package
1390 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1391 most /usr/share/doc/${1}/changelog.gz
1393 echo "No changelog for package $1 found, sorry."
1397 _uchange() { _files -W /usr/share/doc -/ }
1398 compdef _uchange uchange
1403 ZSH_PROFILE_RC=1 $SHELL "$@"
1406 #f1# Edit an alias via zle
1408 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1410 compdef _aliases edalias
1412 #f1# Edit a function via zle
1414 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1416 compdef _functions edfunc
1418 # use it e.g. via 'Restart apache2'
1419 #m# f6 Start() \kbd{/etc/init.d/\em{process}}\quad\kbd{start}
1420 #m# f6 Restart() \kbd{/etc/init.d/\em{process}}\quad\kbd{restart}
1421 #m# f6 Stop() \kbd{/etc/init.d/\em{process}}\quad\kbd{stop}
1422 #m# f6 Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{reload}
1423 #m# f6 Force-Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{force-reload}
1424 if [ -d /etc/init.d ] ; then
1425 for i in Start Restart Stop Force-Reload Reload ; do
1426 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1430 #f1# Provides useful information on globbing
1437 p named pipes (FIFOs)
1438 * executable plain files (0100)
1439 % device files (character or block special)
1440 %b block special files
1441 %c character special files
1442 r owner-readable files (0400)
1443 w owner-writable files (0200)
1444 x owner-executable files (0100)
1445 A group-readable files (0040)
1446 I group-writable files (0020)
1447 E group-executable files (0010)
1448 R world-readable files (0004)
1449 W world-writable files (0002)
1450 X world-executable files (0001)
1451 s setuid files (04000)
1452 S setgid files (02000)
1453 t files with the sticky bit (01000)
1455 print *(m-1) # Files modified up to a day ago
1456 print *(a1) # Files accessed a day ago
1457 print *(@) # Just symlinks
1458 print *(Lk+50) # Files bigger than 50 kilobytes
1459 print *(Lk-50) # Files smaller than 50 kilobytes
1460 print **/*.c # All *.c files recursively starting in \$PWD
1461 print **/*.c~file.c # Same as above, but excluding 'file.c'
1462 print (foo|bar).* # Files starting with 'foo' or 'bar'
1463 print *~*.* # All Files that do not contain a dot
1464 chmod 644 *(.^x) # make all plain non-executable files publically readable
1465 print -l *(.c|.h) # Lists *.c and *.h
1466 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1467 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1469 alias help-zshglob=H-Glob
1471 type -p qma &>/dev/null && alias ?='qma zshall'
1473 # grep for running process, like: 'any vim'
1475 if [ -z "$1" ] ; then
1476 echo "any - grep for process(es) by keyword" >&2
1477 echo "Usage: any <keyword>" >&2 ; return 1
1480 local LENGTH=$(expr length $STRING)
1481 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1482 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1483 ps xauwww| grep "[$FIRSCHAR]$REST"
1487 # After resuming from suspend, system is paging heavily, leading to very bad interactivity.
1488 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1489 [ -r /proc/1/maps ] && deswap() {
1490 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1491 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1492 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1495 # print hex value of a number
1497 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1500 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1501 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1503 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1504 perl -e "print eval($CALC),\"\n\";"
1506 functions peval &>/dev/null && alias calc=peval
1508 # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
1509 # certain circumstances, so work around it, no matter which environment we have
1511 if [ -z "$DISPLAY" ] ; then
1512 consolechars -f /usr/share/consolefonts/default8x16.psf.gz
1519 # just press 'asdf' keys to toggle between dvorak and us keyboard layout
1521 echo -n 'Switching to us keyboard layout: '
1522 [ -z "$DISPLAY" ] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null
1526 echo -n 'Switching to dvorak keyboard layout: '
1527 [ -z "$DISPLAY" ] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null
1530 # just press 'asdf' key to toggle from neon layout to us keyboard layout
1532 echo -n 'Switching to us keyboard layout: '
1533 setxkbmap us && echo 'Done' || echo 'Failed'
1536 # set up an ipv6 tunnel
1540 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1541 print 'ipv6 tunnel already set up, nothing to be done.'
1542 print 'execute: "ifconfig sit1 down ; ifconfig sit0 down" to remove ipv6-tunnel.' ; return 1
1544 [ -n "$PUBLIC_IP" ] || local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \
1545 awk '/inet addr:/ {print $2}' | tr -d 'addr:')
1546 [ -n "$PUBLIC_IP" ] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 }
1547 local IPV6ADDR=$(printf "2002:%02x%02x:%02x%02x:1::1" $(print ${PUBLIC_IP//./ }))
1548 print -n "Setting up ipv6 tunnel $IPV6ADDR via ${PUBLIC_IP}: "
1549 ifconfig sit0 tunnel ::192.88.99.1 up
1550 ifconfig sit1 add "$IPV6ADDR" && print done || print failed
1554 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1555 print 'ipv6 tunnel available' ; return 0
1557 print 'ipv6 tunnel not available' ; return 1
1561 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1562 print -n 'Stopping ipv6 tunnel (sit0 + sit1): '
1563 ifconfig sit1 down ; ifconfig sit0 down && print done || print failed
1565 print 'No ipv6 tunnel found, nothing to be done.' ; return 1
1569 print "Usage: ipv6-tunnel [start|stop|status]">&2 ; return 1
1574 # run dhclient for wireless device
1576 salias dhclient "$(wavemon -d | awk '/device/{print $2}')"
1579 # spawn a minimally set up ksh - useful if you want to umount /usr/.
1581 exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh
1584 # make a backup of a file
1586 cp -a "$1" "${1}_$(date --iso-8601=seconds)"
1589 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1591 # NO_SWITCH="yes" command bash "$@"
1594 # exec $SHELL $SHELL_ARGS "$@"
1599 # log out? set timeout in seconds {{{
1601 # do not log out in some specific terminals:
1602 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1607 # {{{ make sure our environment is clean regarding colors
1608 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1611 # source another config file if present {{{
1612 if [ -r /etc/zsh/zshrc.local ]; then
1613 source /etc/zsh/zshrc.local
1617 # "persistent history" {{{
1618 # just write important commands you always need to ~/.important_commands
1619 if [ -r ~/.important_commands ] ; then
1620 fc -R ~/.important_commands
1624 ## genrefcard.pl settings {{{
1625 ### example: split functions-search 8,16,24,32
1626 #@# split functions-search 8
1629 # add variable to be able to check whether the file has been read {{{
1630 ZSHRC_GLOBAL_HAS_BEEN_READ=1
1633 ## END OF FILE #################################################################
1634 # vim:foldmethod=marker expandtab