2 # Purpose: config file for zsh (z shell)
3 # Authors: grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
4 # Bug-Reports: see http://grml.org/bugs/
5 # License: This file is licensed under the GPL v2.
6 # Latest change: Sam Dez 22 19:17:27 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
95 # utility functions {{{
96 # this function checks if a command exists and returns either true
97 # or false. This avoids using 'which' and 'whence', which will
98 # avoid problems with aliases for which on certain weird systems. :-)
102 if [[ ${1} == '-c' ]] ; then
109 if (( ${#argv} != 1 )) ; then
110 printf 'usage: check_com [-c] <command>\n' >&2
114 if (( comonly > 0 )) ; then
115 [[ -n ${commands[$1]} ]] && return 0
119 if [[ -n ${commands[$1]} ]] \
120 || [[ -n ${functions[$1]} ]] \
121 || [[ -n ${aliases[$1]} ]] \
122 || [[ -n ${reswords[(r)$1]} ]] ; then
130 # creates an alias and precedes the command with
131 # sudo if $EUID is not zero.
133 local only=0 ; local multi=0
134 while [[ ${1} == -* ]] ; do
138 (--) shift ; break ;;
140 printf 'usage: salias [-h|-o|-a] <alias-expression>\n'
141 printf ' -h shows this help text.\n'
142 printf ' -a replace '\'' ; '\'' sequences with '\'' ; sudo '\''.\n'
143 printf ' be careful using this option.\n'
144 printf ' -o only sets an alias if a preceding sudo would be needed.\n'
147 (*) printf "unkown option: '%s'\n" "${1}" ; return 1 ;;
152 if (( ${#argv} > 1 )) ; then
153 printf 'Too many arguments %s\n' "${#argv}"
157 key="${1%%\=*}" ; val="${1#*\=}"
158 if (( EUID == 0 )) && (( only == 0 )); then
159 alias -- "${key}=${val}"
160 elif (( EUID > 0 )) ; then
161 (( multi > 0 )) && val="${val// ; / ; sudo }"
162 alias -- "${key}=sudo ${val}"
168 # Check if we can read given files and source those we can.
170 if (( ${#argv} < 1 )) ; then
171 printf 'usage: xsource FILE(s)...\n' >&2
175 while (( ${#argv} > 0 )) ; do
176 [[ -r ${1} ]] && source ${1}
182 # Check if we can read a given file and 'cat(1)' it.
184 if (( ${#argv} != 1 )) ; then
185 printf 'usage: xcat FILE\n' >&2
189 [[ -r ${1} ]] && cat ${1}
193 # Remove these functions again, they are of use only in these
194 # setup files. This should be called at the end of .zshrc.
197 funcs=(check_com salias xcat xsource xunfunction)
199 for func in $funcs ; do
200 [[ -n ${functions[$func]} ]] \
208 if [[ -z "$LANG" ]] ; then
209 xsource "/etc/default/locale"
212 export LANG=${LANG:-en_US.iso885915}
213 for var in LC_ALL LC_MESSAGES ; do
214 [[ -n ${(P)var} ]] && export $var
217 xsource "/etc/sysconfig/keyboard"
219 TZ=$(xcat /etc/timezone)
222 # check for potentially old files in 'completion.d' {{{
224 xof=(/etc/zsh/completion.d/*~/etc/zsh/completion.d/_*(N))
225 if (( ${#xof} > 0 )) ; then
226 printf '\n -!- INFORMATION\n\n'
227 printf ' -!- %s file(s) not starting with an underscore (_) found in\n' ${#xof}
228 printf ' -!- /etc/zsh/completion.d/.\n\n'
229 printf ' -!- While this has been the case in old versions of grml-etc-core,\n'
230 printf ' -!- recent versions of the grml-zsh-setup have all these files rewritten\n'
231 printf ' -!- and renamed. Furthermore, the grml-zsh-setup will *only* add files\n'
232 printf ' -!- named _* to that directory.\n\n'
233 printf ' -!- If you added functions to completion.d yourself, please consider\n'
234 printf ' -!- moving them to /etc/zsh/functions.d/. Files in that directory, not\n'
235 printf ' -!- starting with an underscore are marked for automatic loading\n'
236 printf ' -!- by default (so that is quite convenient).\n\n'
237 printf ' -!- If there are files *not* starting with an underscore from an older\n'
238 printf ' -!- grml-etc-core in completion.d, you may safely remove them.\n\n'
239 printf ' -!- Delete the files for example via running:\n\n'
240 printf " rm ${xof}\n\n"
241 printf ' -!- Note, that this message will *not* go away, unless you yourself\n'
242 printf ' -!- resolve the situation manually.\n\n'
243 BROKEN_COMPLETION_DIR=1
248 # {{{ check for version/system
249 # check for versions (compatibility reasons)
250 if autoload is-at-least && is-at-least 2>/dev/null ; then
251 is4() { is-at-least 4 }
252 is41() { is-at-least 4.1 }
253 is42() { is-at-least 4.2 }
256 [[ $ZSH_VERSION == 4.* ]] && return 0
260 [[ $ZSH_VERSION == 4.<2->* ]] && return 0
265 #f1# Checks whether or not you're running grml
267 [[ -f /etc/grml_version ]] && return 0
271 #f1# Checks whether or not you're running a grml cd
273 [[ -f /etc/grml_cd ]] && return 0
278 #f1# Checks whether or not you're running grml-small
280 [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
283 isgrmlsmall() { return 1 }
286 #f1# are we running within an utf environment?
288 case "$LANG $CHARSET $LANGUAGE" in
295 # check for user, if not running as root set $SUDO to sudo
296 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
298 # change directory to home on first invocation of zsh
299 # important for rungetty -> autologin
300 # Thanks go to Bart Schaefer!
301 isgrml && checkhome() {
302 if [[ -z "$ALREADY_DID_CD_HOME" ]] ; then
303 export ALREADY_DID_CD_HOME=$HOME
309 # {{{ set some variables
311 if check_com -c vim ; then
312 export EDITOR=${EDITOR:-vim}
314 export EDITOR=${EDITOR:-vi}
318 export MAIL=${MAIL:-/var/mail/$USER}
320 # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
321 export SHELL='/bin/zsh'
323 # color setup for ls:
324 check_com -c dircolors && eval $(dircolors -b)
326 # set width of man pages to 80 for more convenient reading
327 # (( ${+MANWIDTH} )) || export MANWIDTH=80
329 # Search path for the cd command
332 # completion functions go to /etc/zsh/completion.d
333 # function files may be put into /etc/zsh/functions.d, from where they
334 # will be automatically autoloaded.
335 if [[ -n "$BROKEN_COMPLETION_DIR" ]] ; then
336 print 'Warning: not setting completion directories because broken files have been found.' >&2
338 [[ -d /etc/zsh/completion.d ]] && fpath+=( /etc/zsh/completion.d )
339 if [[ -d /etc/zsh/functions.d ]] ; then
340 fpath+=( /etc/zsh/functions.d )
341 for func in /etc/zsh/functions.d/[^_]*[^~] ; do
342 autoload -U ${func:t}
347 # automatically remove duplicates from these arrays
348 typeset -U path cdpath fpath manpath
352 if [[ "$TERM" != emacs ]] ; then
353 [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
354 [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
355 [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
356 [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
357 [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
358 [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
359 [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
360 [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
361 [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
362 [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
363 [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
364 [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
366 [[ "$terminfo[kcuu1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
367 [[ "$terminfo[kcud1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
368 [[ "$terminfo[kcuf1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
369 [[ "$terminfo[kcub1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
370 [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
371 [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
372 [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
373 [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
376 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
377 # use emacs style per default:
382 #if [[ "$TERM" == screen ]] ; then
383 bindkey '\e[1~' beginning-of-line # home
384 bindkey '\e[4~' end-of-line # end
385 bindkey '\e[A' up-line-or-search # cursor up
386 bindkey '\e[B' down-line-or-search # <ESC>-
387 bindkey '^x' history-beginning-search-backward # alternative ways of searching the shell history
388 # bindkey -s '^L' "|less\n" # ctrl-L pipes to less
389 # bindkey -s '^B' " &\n" # ctrl-B runs it in the background
390 # if terminal type is set to 'rxvt':
391 bindkey '\e[7~' beginning-of-line # home
392 bindkey '\e[8~' end-of-line # end
395 # insert unicode character
396 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an §
397 # See for example http://unicode.org/charts/ for unicode characters code
398 autoload insert-unicode-char
399 zle -N insert-unicode-char
400 #k# Insert Unicode character
401 bindkey '^Xi' insert-unicode-char
403 # just type 'cd ...' to get 'cd ../..'
404 # rationalise-dot() {
405 # if [[ $LBUFFER == *.. ]] ; then
411 # zle -N rationalise-dot
412 # bindkey . rationalise-dot
414 # bindkey '\eq' push-line-or-edit
417 # a generic accept-line wrapper {{{
419 # This widget can prevent unwanted autocorrections from command-name
420 # to _command-name, rehash automatically on enter and call any number
421 # of builtin and user-defined widgets in different contexts.
423 # For a broader description, see:
424 # <http://bewatermyfriend.org/posts/2007/12-26.11-50-38-tooltime.html>
426 # The code is imported from the file 'zsh/functions/accept-line' from
427 # <http://ft.bewatermyfriend.org/comp/zsh/zsh-dotfiles.tar.bz2>, which
428 # distributed under the same terms as zsh itself.
430 # A newly added command will may not be found or will cause false
431 # correction attempts, if you got auto-correction set. By setting the
432 # following style, we force accept-line() to rehash, if it cannot
433 # find the first word on the command line in the $command[] hash.
434 zstyle ':acceptline:*' rehash true
436 function Accept-Line() {
437 setopt localoptions noksharrays
442 zstyle -a ":acceptline:${alcontext}" actions subs
444 (( ${#subs} < 1 )) && return 0
447 for sub in ${subs} ; do
448 [[ ${sub} == 'accept-line' ]] && sub='.accept-line'
451 (( aldone > 0 )) && break
455 function Accept-Line-getdefault() {
458 zstyle -s ":acceptline:${alcontext}" default_action default_action
459 case ${default_action} in
461 printf ".accept-line"
464 printf ${default_action}
469 function accept-line() {
470 setopt localoptions noksharrays
473 local buf com fname format msg default_action
477 cmdline=(${(z)BUFFER})
481 zstyle -t ":acceptline:${alcontext}" rehash \
482 && [[ -z ${commands[$com]} ]] \
485 if [[ -n ${reswords[(r)$com]} ]] \
486 || [[ -n ${aliases[$com]} ]] \
487 || [[ -n ${functions[$com]} ]] \
488 || [[ -n ${builtins[$com]} ]] \
489 || [[ -n ${commands[$com]} ]] ; then
491 # there is something sensible to execute, just do it.
495 default_action=$(Accept-Line-getdefault)
496 zstyle -T ":acceptline:${alcontext}" call_default \
497 && zle ${default_action}
501 if [[ -o correct ]] \
502 || [[ -o correctall ]] \
503 && [[ -n ${functions[$fname]} ]] ; then
505 # nothing there to execute but there is a function called
506 # _command_name; a completion widget. Makes no sense to
507 # call it on the commandline, but the correct{,all} options
508 # will ask for it nevertheless, so warn the user.
509 if [[ ${LASTWIDGET} == 'accept-line' ]] ; then
510 # Okay, we warned the user before, he called us again,
511 # so have it his way.
515 default_action=$(Accept-Line-getdefault)
516 zstyle -T ":acceptline:${alcontext}" call_default \
517 && zle ${default_action}
521 # prepare warning message for the user, configurable via zstyle.
522 zstyle -s ":acceptline:${alcontext}" compwarnfmt msg
524 if [[ -z ${msg} ]] ; then
525 msg="%c will not execute and completion %f exists."
528 zformat -f msg "${msg}" "c:${com}" "f:${fname}"
532 elif [[ -n ${buf//[$' \t\n']##/} ]] ; then
533 # If we are here, the commandline contains something that is not
534 # executable, which is neither subject to _command_name correction
535 # and is not empty. might be a variable assignment
539 default_action=$(Accept-Line-getdefault)
540 zstyle -T ":acceptline:${alcontext}" call_default \
541 && zle ${default_action}
545 # If we got this far, the commandline only contains whitespace, or is empty.
549 default_action=$(Accept-Line-getdefault)
550 zstyle -T ":acceptline:${alcontext}" call_default \
551 && zle ${default_action}
559 # power completion - abbreviation expansion {{{
560 # power completion / abbreviation expansion / buffer expansion
561 # see http://zshwiki.org/home/examples/zleiab for details
562 # less risky than the global aliases but powerful as well
563 # just type the abbreviation key and afterwards ',.' to expand it
566 setopt interactivecomments
568 # key # value (#d additional doc string)
574 'G' '|& grep --color=auto'
576 'Hl' ' --help |& less -r' #d (Display help in pager)
580 'N' '&>/dev/null' #d (No Output)
581 'R' '| tr A-z N-za-m' #d (ROT13)
587 'hide' "echo -en '\033]50;nil2\007'"
588 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
589 'small' 'echo -en "\033]50;6x10\007"'
590 'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
591 'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
592 'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
593 'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
594 'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
595 'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
599 'co' "./configure && make && sudo make install"
600 'CH' "./configure --help"
601 'conkeror' 'firefox -chrome chrome://conkeror/content'
603 'lad' $'ls -d .*(/)\n# only show dot-directories'
604 'lsa' $'ls -a .*(.)\n# only show dot-files'
605 'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
606 'lsl' $'ls -l *(@[1,10])\n# only symlinks'
607 'lsx' $'ls -l *(*[1,10])\n# only executables'
608 'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
609 'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
610 'lsd' $'ls -d *(/)\n# only show directories'
611 'lse' $'ls -d *(/^F)\n# only show empty directories'
612 'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
613 'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
614 'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
616 '600' 'chmod u+rw-x,g-rwx,o-rwx'
618 '700' 'chmod u+rwx,g-rwx,o-rwx'
619 'r--' 'chmod u+r-wx,g-rwx,o-rwx'
620 '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
621 '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
623 'cmplayer' 'mplayer -vo -fs -zoom fbdev'
624 'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
625 'fblinks' 'links2 -driver fb'
626 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
627 'insecscp' 'scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
628 'fori' 'for i ({..}) { }'
631 'se' 'setopt interactivecomments'
632 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
633 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
634 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3'
636 'D' 'export DISPLAY=:0.0'
637 'mp' 'mplayer -vo xv -fs -zoom'
642 matched_chars='[.-|_a-zA-Z0-9]#'
643 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
644 LBUFFER+=${abk[$MATCH]:-$MATCH}
648 bindkey ",." globalias
652 autoload -U zmv # who needs mmv or rename?
653 autoload history-search-end
655 # we don't want to quote/espace URLs on our own...
656 # if autoload -U url-quote-magic ; then
657 # zle -N self-insert url-quote-magic
658 # zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
660 # print 'Notice: no url-quote-magic available :('
662 alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
664 #m# k ESC-h Call \kbd{run-help} for the 1st word on the command line
665 alias run-help >&/dev/null && unalias run-help
666 autoload run-help # use via 'esc-h'
669 if autoload -U compinit && compinit 2>/dev/null ; then
670 compinit 2>/dev/null || print 'Notice: no compinit available :('
672 print 'Notice: no compinit available :('
677 is4 && autoload -U zed # use ZLE editor to edit a file or function
680 for mod in complist deltochar mathfunc ; do
681 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
684 # autoload zsh modules when they are referenced
693 while (( ${#tmpargs} > 0 )) ; do
694 zmodload -${tmpargs[1]} zsh/${tmpargs[2]} ${tmpargs[2]}
700 if is4 && autoload -U insert-files && zle -N insert-files ; then
702 bindkey "^Xf" insert-files # C-x-f
705 bindkey ' ' magic-space # also do history expansion on space
706 #k# Trigger menu-complete
707 bindkey '\ei' menu-complete # menu completion via esc-i
709 # press esc-e for editing command line in $EDITOR or $VISUAL
710 if is4 && autoload -U edit-command-line && zle -N edit-command-line ; then
711 #k# Edit the current line in \kbd{\$EDITOR}
712 bindkey '\ee' edit-command-line
715 if is4 && [[ -n ${(k)modules[zsh/complist]} ]] ; then
716 #k# menu selection: pick item but stay in the menu
717 bindkey -M menuselect '\e^M' accept-and-menu-complete
719 # use the vi navigation keys (hjkl) besides cursor keys in menu completion
720 #bindkey -M menuselect 'h' vi-backward-char # left
721 #bindkey -M menuselect 'k' vi-up-line-or-history # up
722 #bindkey -M menuselect 'l' vi-forward-char # right
723 #bindkey -M menuselect 'j' vi-down-line-or-history # bottom
725 # accept a completion and try to complete again by using menu
726 # completion; very useful with completing directories
727 # by using 'undo' one's got a simple file browser
728 bindkey -M menuselect '^o' accept-and-infer-next-history
731 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
732 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
735 #k# Insert a timestamp on the command line (yyyy-mm-dd)
736 bindkey '^Ed' _bkdate
738 # press esc-m for inserting last typed word again (thanks to caphuso!)
739 insert-last-typed-word() { zle insert-last-word -- 0 -1 };
740 zle -N insert-last-typed-word;
742 #k# Insert last typed word
743 bindkey "\em" insert-last-typed-word
745 # set command prediction from history, see 'man 1 zshcontrib'
746 # is4 && autoload -U predict-on && \
747 # zle -N predict-on && \
748 # zle -N predict-off && \
749 # bindkey "^X^Z" predict-on && \
750 # bindkey "^Z" predict-off
752 #k# Shortcut for \kbd{fg<enter>}
753 bindkey -s '^z' "fg\n"
755 # press ctrl-q to quote line:
757 # zle beginning-of-line
759 # # RBUFFER="'$RBUFFER'"
760 # RBUFFER=${(q)RBUFFER}
763 # zle -N mquote && bindkey '^q' mquote
765 # run command line as user root via sudo:
766 sudo-command-line() {
767 [[ -z $BUFFER ]] && zle up-history
768 [[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER"
770 zle -N sudo-command-line
772 #k# Put the current command line into a \kbd{sudo} call
773 bindkey "^Os" sudo-command-line
775 ### jump behind the first word on the cmdline.
776 ### useful to add options.
777 function jump_after_first_word() {
781 if (( ${#words} <= 1 )) ; then
784 CURSOR=${#${words[1]}}
787 zle -N jump_after_first_word
789 bindkey '^x1' jump_after_first_word
793 # {{{ set some important options
794 # Please update these tags, if you change the umask settings below.
796 #o# r_umaskstr rwxrwxr-x
798 #o# umaskstr rwxr-xr-x
799 (( EUID != 0 )) && umask 002 || umask 022
802 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
803 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
804 setopt extended_history # save each command's beginning timestamp and the duration to the history file
805 is4 && setopt histignorealldups # If a new command line being added to the history
806 # list duplicates an older one, the older command is removed from the list
807 setopt histignorespace # remove command lines from the history list when
808 # the first character on the line is a space
809 # setopt histallowclobber # add `|' to output redirections in the history
810 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
811 setopt auto_cd # if a command is issued that can't be executed as a normal command,
812 # and the command is the name of a directory, perform the cd command to that directory
813 setopt extended_glob # in order to use #, ~ and ^ for filename generation
814 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
815 # -> searches for word not in compressed files
816 # don't forget to quote '^', '~' and '#'!
817 setopt notify # report the status of backgrounds jobs immediately
818 setopt hash_list_all # Whenever a command completion is attempted, make sure \
819 # the entire command path is hashed first.
820 setopt completeinword # not just at the end
821 # setopt nocheckjobs # don't warn me about bg processes when exiting
822 setopt nohup # and don't kill them, either
823 # setopt printexitvalue # alert me if something failed
824 # setopt dvorak # with spelling correction, assume dvorak kb
825 setopt auto_pushd # make cd push the old directory onto the directory stack.
826 setopt nonomatch # try to avoid the 'zsh: no matches found...'
827 setopt nobeep # avoid "beep"ing
828 setopt pushd_ignore_dups # don't push the same dir twice.
830 MAILCHECK=30 # mailchecks
831 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 seconds
832 watch=(notme root) # watch for everyone but me and root
834 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
835 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
837 # WORDCHARS='*?_[]~=&;!#$%^(){}'
838 # WORDCHARS='${WORDCHARS:s@/@}'
840 # only slash should be considered as a word separator:
841 slash-backward-kill-word() {
842 local WORDCHARS="${WORDCHARS:s@/@}"
844 zle backward-kill-word
846 zle -N slash-backward-kill-word
848 #k# Kill everything in a word up to its last \kbd{/}
849 bindkey '\ev' slash-backward-kill-word
858 HISTFILE=$HOME/.zsh_history
859 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
860 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
864 # dirstack handling {{{
867 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then
868 dirstack=( ${(f)"$(< ~/.zdirs)"} )
869 # "cd -" won't work after login by just setting $OLDPWD, so
870 [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD
874 builtin dirs -pl >! ~/.zdirs
879 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
880 if [[ -n "$BATTERY" ]] ; then
881 if check_com -c acpi ; then
882 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
883 [[ -z "$PERCENT" ]] && PERCENT='acpi not present'
885 if [[ "${PERCENT%%%}" -lt 20 ]] ; then
886 PERCENT="warning: ${PERCENT}%"
892 # display version control information on right side of prompt if $VCS is set {{{
893 # based on Mike Hommey's http://web.glandium.org/blog/?p=170
895 local vcs base_dir sub_dir ref
899 sub_dir=$(readlink -f "${PWD}")
900 sub_dir=${sub_dir#$1}
905 base_dir=$(git-rev-parse --show-cdup 2>/dev/null) || return 1
906 base_dir=$(readlink -f "$base_dir/..")
907 sub_dir=$(git-rev-parse --show-prefix)
909 ref=$(git-symbolic-ref -q HEAD || git-name-rev --name-only HEAD 2>/dev/null)
910 ref=${ref#refs/heads/}
915 [[ -d ".svn" ]] || return 1
917 while [[ -d "$base_dir/../.svn" ]]; do base_dir="$base_dir/.."; done
918 base_dir=$(readlink -f "$base_dir")
919 sub_dir=$(sub_dir "${base_dir}")
920 ref=$(svn info "$base_dir" | awk '/^URL/ { sub(".*/","",$0); r=$0 } /^Revision/ { sub("[^0-9]*","",$0); print r":"$0 }')
925 [[ -f ~/.svk/config ]] || return 1
926 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
929 base_dir=${base_dir%%
931 sub_dir=$(sub_dir "${base_dir}")
937 while [[ ! -d "$base_dir/.hg" ]]; do
938 base_dir="$base_dir/.."
939 [[ $(readlink -f "${base_dir}") = "/" ]] && return 1
941 base_dir=$(readlink -f "$base_dir")
942 sub_dir=$(sub_dir "${base_dir}")
943 ref=$(< "${base_dir}/.hg/branch")
952 # echo "${vcs:+($vcs)}${base_dir/$HOME/~}${vcs:+[$ref]${sub_dir}}"
953 echo "${vcs:+($vcs)}${base_dir}${vcs:+[$ref]${sub_dir}}"
958 if autoload promptinit && promptinit 2>/dev/null ; then
959 promptinit # people should be able to use their favourite prompt
961 print 'Notice: no promptinit available :('
965 # precmd() => a function which is executed just before each prompt
966 # use 'NOPRECMD=1' to disable the precmd + preexec commands
968 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
970 # make sure to use right prompt only when not running a command
971 is41 && setopt transient_rprompt
973 is4 && [[ -z $NOPRECMD ]] && precmd () {
974 [[ -n $NOPRECMD ]] && return 0
975 # allow manual overwriting of RPROMPT
976 if [[ -n $RPROMPT ]] ; then
977 [[ $TERM == screen* ]] && echo -n $'\ekzsh\e\\'
980 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
981 if [[ -z $DONTSETRPROMPT ]] ; then
982 if [[ -n $BATTERY ]] ; then
983 RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
984 # RPROMPT="${PERCENT}${SCREENTITLE}"
985 elif [[ -n $VCS ]] ; then
986 RPROMPT="%(?..:()% $(__vcs_dir)${SCREENTITLE}"
988 RPROMPT="%(?..:()% ${SCREENTITLE}"
989 # RPROMPT="${SCREENTITLE}"
992 # adjust title of xterm
993 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
996 print -Pn "\e]0;%n@%m: %~\a"
1001 # chpwd () => a function which is executed whenever the directory is changed
1003 # preexec() => a function running before every command
1004 is4 && [[ -z $NOPRECMD ]] && \
1006 [[ -n $NOPRECMD ]] && return 0
1007 # set hostname if not running on host with name 'grml'
1008 if [[ -n "$HOSTNAME" ]] && [[ "$HOSTNAME" != $(hostname) ]] ; then
1011 # get the name of the program currently running and hostname of local machine
1012 # set screen window title if running in a screen
1013 if [[ "$TERM" == screen* ]] ; then
1014 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # don't use hostname
1015 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
1016 echo -ne "\ek$CMD\e\\"
1018 # set the screen title to "zsh" when sitting at the command prompt:
1019 if [[ "$TERM" == screen* ]] ; then
1020 SCREENTITLE=$'%{\ekzsh\e\\%}'
1024 # adjust title of xterm
1027 print -Pn "\e]0;%n@%m: $1\a"
1033 if autoload colors && colors 2>/dev/null ; then
1034 BLUE="%{${fg[blue]}%}"
1035 RED="%{${fg_bold[red]}%}"
1036 GREEN="%{${fg[green]}%}"
1037 CYAN="%{${fg[cyan]}%}"
1038 WHITE="%{${fg[white]}%}"
1039 NO_COLOUR="%{${reset_color}%}"
1041 BLUE=$'%{\e[1;34m%}'
1043 GREEN=$'%{\e[1;32m%}'
1044 CYAN=$'%{\e[1;36m%}'
1045 WHITE=$'%{\e[1;37m%}'
1046 NO_COLOUR=$'%{\e[0m%}'
1049 EXITCODE="%(?..%?%1v )"
1050 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
1051 PS3='?# ' # selection prompt used within a select loop.
1052 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
1054 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
1055 if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then
1056 debian_chroot=$(cat /etc/debian_chroot)
1059 # don't use colors on dumb terminals (like emacs):
1060 if [[ "$TERM" == dumb ]] ; then
1061 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
1063 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
1064 # set variable identifying the chroot you work in (used in the prompt below)
1065 if [[ -n $GRMLPROMPT ]] ; then
1066 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
1067 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
1069 if (( EUID != 0 )); then
1070 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
1072 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
1077 # if we are inside a grml-chroot set a specific prompt theme
1078 if [[ -n "$GRML_CHROOT" ]] ; then
1079 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
1083 # {{{ 'hash' some often used directories
1085 hash -d deb=/var/cache/apt/archives
1086 hash -d doc=/usr/share/doc
1087 hash -d linux=/lib/modules/$(command uname -r)/build/
1088 hash -d log=/var/log
1089 hash -d slog=/var/log/syslog
1090 hash -d src=/usr/src
1091 hash -d templ=/usr/share/doc/grml-templates
1092 hash -d tt=/usr/share/doc/texttools-doc
1093 hash -d www=/var/www
1098 if [[ $UID -eq 0 ]] ; then
1099 [[ -r /etc/grml/screenrc ]] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
1100 elif [[ -r $HOME/.screenrc ]] ; then
1101 alias screen="/usr/bin/screen -c $HOME/.screenrc"
1103 [[ -r /etc/grml/screenrc_grml ]] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
1106 # do we have GNU ls with color-support?
1107 if ls --help 2>/dev/null | grep -- --color= >/dev/null && [[ "$TERM" != dumb ]] ; then
1108 #a1# execute \kbd{@a@}:\quad ls with colors
1109 alias ls='ls -b -CF --color=auto'
1110 #a1# execute \kbd{@a@}:\quad list all files, with colors
1111 alias la='ls -la --color=auto'
1112 #a1# long colored list, without dotfiles (@a@)
1113 alias ll='ls -l --color=auto'
1114 #a1# long colored list, human readable sizes (@a@)
1115 alias lh='ls -hAl --color=auto'
1116 #a1# List files, append qualifier to filenames \\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...)
1117 alias l='ls -lF --color=auto'
1119 alias ls='ls -b -CF'
1126 alias mdstat='cat /proc/mdstat'
1127 alias ...='cd ../../'
1129 # generate alias named "$KERNELVERSION-reboot" so you can use boot with kexec:
1130 if [[ -x /sbin/kexec ]] && [[ -r /proc/cmdline ]] ; then
1131 alias "$(uname -r)-reboot"="kexec -l --initrd=/boot/initrd.img-"$(uname -r)" --command-line=\"$(cat /proc/cmdline)\" /boot/vmlinuz-"$(uname -r)""
1134 alias cp='nocorrect cp' # no spelling correction on cp
1135 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
1136 alias mv='nocorrect mv' # no spelling correction on mv
1137 alias rm='nocorrect rm' # no spelling correction on rm
1139 #a1# Execute \kbd{rmdir}
1141 #a1# Execute \kbd{rmdir}
1144 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
1145 alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
1146 alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
1148 # make sure it is not assigned yet
1149 [[ $(whence -w utf2iso &>/dev/null) == 'utf2iso: alias' ]] && unalias utf2iso
1153 for ENV in $(env | command grep -i '.utf') ; do
1154 eval export "$(echo $ENV | sed 's/UTF-8/iso885915/ ; s/utf8/iso885915/')"
1159 # make sure it is not assigned yet
1160 [[ $(whence -w iso2utf &>/dev/null) == 'iso2utf: alias' ]] && unalias iso2utf
1162 if ! isutfenv ; then
1163 for ENV in $(env | command grep -i '\.iso') ; do
1164 eval export "$(echo $ENV | sed 's/iso.*/UTF-8/ ; s/ISO.*/UTF-8/')"
1169 # set up software synthesizer via speakup
1171 aumix -w 90 -v 90 -p 90 -m 90
1172 if ! [[ -r /dev/softsynth ]] ; then
1173 flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
1176 setopt singlelinezle
1179 nice -n -20 speechd-up
1181 flite -o play -t "Finished setting up software synthesizer"
1185 # I like clean prompt, so provide simple way to get that
1186 check_com 0 || alias 0='return 0'
1188 # for really lazy people like mika:
1189 check_com S &>/dev/null || alias S='screen'
1190 check_com s &>/dev/null || alias s='ssh'
1192 # get top 10 shell commands:
1193 alias top10='print -l ? ${(o)history%% *} | uniq -c | sort -nr | head -n 10'
1195 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
1196 if check_com -c truecrypt ; then
1198 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
1200 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
1204 #f1# Hints for the use of zsh on grml
1206 print "$bg[white]$fg[black]
1207 zsh-help - hints for use of zsh on grml
1208 =======================================$reset_color"
1211 Main configuration of zsh happens in /etc/zsh/zshrc (global)
1212 and /etc/skel/.zshrc which is copied to $HOME/.zshrc once.
1213 The files are part of the package grml-etc-core, if you want to
1214 use them on a non-grml-system just get the tar.gz from
1215 http://deb.grml.org/ or get the files from the mercurial
1218 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
1219 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
1221 If you want to stay in sync with zsh configuration of grml
1222 run '\''ln -sf /etc/skel/.zshrc $HOME/.zshrc'\'' and configure
1223 your own stuff in $HOME/.zshrc.local. System wide configuration
1224 without touching configuration files of grml can take place
1225 in /etc/zsh/zshrc.local.
1227 If you want to use the configuration of user grml also when
1228 running as user root just run '\''zshskel'\'' which will source
1229 the file /etc/skel/.zshrc.
1231 For information regarding zsh start at http://grml.org/zsh/
1233 Take a look at grml'\''s zsh refcard:
1234 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
1236 Check out the main zsh refcard:
1237 % '$BROWSER' http://www.bash2zsh.com/zsh_refcard/refcard.pdf
1239 And of course visit the zsh-lovers:
1242 You can adjust some options through environment variables when
1243 invoking zsh without having to edit configuration files.
1244 Basically meant for bash users who are not used to the power of
1247 "NOCOR=1 zsh" => deactivate automatic correction
1248 "NOMENU=1 zsh" => do not use menu completion (note: use strg-d for completion instead!)
1249 "NOPRECMD=1 zsh" => disable the precmd + preexec commands (set GNU screen title)
1250 "BATTERY=1 zsh" => activate battery status (via acpi) on right side of prompt'
1253 $bg[white]$fg[black]
1254 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
1255 Enjoy your grml system with the zsh!$reset_color"
1259 if [[ -r /etc/debian_version ]] ; then
1260 #a3# Execute \kbd{apt-cache search}
1261 alias acs='apt-cache search'
1262 #a3# Execute \kbd{apt-cache show}
1263 alias acsh='apt-cache show'
1264 #a3# Execute \kbd{apt-cache policy}
1265 alias acp='apt-cache policy'
1266 #a3# Execute \kbd{apt-get dist-upgrade}
1267 salias adg="apt-get dist-upgrade"
1268 #a3# Execute \kbd{apt-get install}
1269 salias agi="apt-get install"
1270 #a3# Execute \kbd{aptitude install}
1271 salias ati="aptitude install"
1272 #a3# Execute \kbd{apt-get upgrade}
1273 salias ag="apt-get upgrade"
1274 #a3# Execute \kbd{apt-get update}
1275 salias au="apt-get update"
1276 #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade}
1277 salias -a up="aptitude update ; aptitude safe-upgrade"
1278 #a3# Execute \kbd{dpkg-buildpackage}
1279 alias dbp='dpkg-buildpackage'
1280 #a3# Execute \kbd{grep-excuses}
1281 alias ge='grep-excuses'
1284 #f3# Execute \kbd{apt-get update \&\& }\\&\quad \kbd{apt-get dist-upgrade}
1286 if [[ -z "$1" ]] ; then
1287 $SUDO apt-get update
1288 $SUDO apt-get -u upgrade
1290 ssh $1 $SUDO apt-get update
1291 # ask before the upgrade
1293 ssh $1 $SUDO apt-get --no-act upgrade
1294 echo -n 'Process the upgrade?'
1296 if [[ $dummy == "y" ]] ; then
1297 ssh $1 $SUDO apt-get -u upgrade --yes
1302 isgrmlcd && alias su="sudo -s" # get a root shell
1303 #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog}
1304 alias llog="$PAGER /var/log/syslog" # take a look at the syslog
1305 #a1# Take a look at the syslog: \kbd{tail -f /var/log/syslog}
1306 alias tlog="tail -f /var/log/syslog" # follow the syslog
1307 #a1# (Re)-source \kbd{/etc/skel/.zshrc}
1308 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
1311 # sort installed Debian-packages by size
1312 if check_com -c grep-status ; then
1313 #a3# List installed Debian-packages sorted by size
1314 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package -n "install ok installed" | paste -sd " \n" | sort -rn'
1317 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
1318 if [[ -L /usr/bin/cdrecord ]] || ! check_com -c cdrecord ; then
1319 if check_com -c wodim ; then
1320 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
1321 See #377109 in the BTS of Debian for more details.
1323 Please use the wodim binary instead' ; return 1"
1327 # get_tw_cli has been renamed into get_3ware
1328 if check_com -c get_3ware ; then
1330 echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
1335 # I hate lacking backward compatibility, so provide an alternative therefore
1336 if ! check_com -c apache2-ssl-certificate ; then
1338 apache2-ssl-certificate() {
1340 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
1341 print 'You might want to take a look at Debian the package ssl-cert as well.'
1342 print 'To generate a certificate for use with apache2 follow the instructions:'
1346 export RANDFILE=/dev/random
1347 mkdir /etc/apache2/ssl/
1348 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
1349 chmod 600 /etc/apache2/ssl/apache.pem
1351 Run "grml-tips ssl-certificate" if you need further instructions.
1357 # {{{ Use hard limits, except for a smaller stack and no core dumps
1360 isgrmlcd && limit core 0 # important for a live-cd-system
1364 # {{{ completion system
1366 # called later (via is4 && grmlcomp)
1367 # notice: use 'zstyle' for getting current settings
1368 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
1370 # TODO: This could use some additional information
1372 # allow one error for every three characters typed in approximate completer
1373 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )'
1375 # don't complete backup files as executables
1376 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '(aptitude-*|*\~)'
1378 # start menu completion only if it could find no unambiguous initial string
1379 zstyle ':completion:*:correct:*' insert-unambiguous true
1380 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}'
1381 zstyle ':completion:*:correct:*' original true
1383 # activate color-completion
1384 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
1386 # format on completion
1387 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}'
1389 # complete 'cd -<tab>' with menu
1390 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select
1392 # insert all expansions for expand completer
1393 zstyle ':completion:*:expand:*' tag-order all-expansions
1394 zstyle ':completion:*:history-words' list false
1397 zstyle ':completion:*:history-words' menu yes
1399 # ignore duplicate entries
1400 zstyle ':completion:*:history-words' remove-all-dups yes
1401 zstyle ':completion:*:history-words' stop yes
1403 # match uppercase from lowercase
1404 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
1406 # separate matches into groups
1407 zstyle ':completion:*:matches' group 'yes'
1408 zstyle ':completion:*' group-name ''
1410 if [[ -z "$NOMENU" ]] ; then
1411 # if there are more than 5 options allow selecting from a menu
1412 zstyle ':completion:*' menu select=5
1414 # don't use any menus at all
1418 zstyle ':completion:*:messages' format '%d'
1419 zstyle ':completion:*:options' auto-description '%d'
1421 # describe options in full
1422 zstyle ':completion:*:options' description 'yes'
1424 # on processes completion complete all user processes
1425 zstyle ':completion:*:processes' command 'ps -au$USER'
1427 # offer indexes before parameters in subscripts
1428 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
1430 # provide verbose completion information
1431 zstyle ':completion:*' verbose true
1433 # recent (as of Dec 2007) zsh versions are able to provide descriptions
1434 # for commands (read: 1st word in the line) that it will list for the user
1435 # to choose from. The following disables that, because it's not exactly fast.
1436 zstyle ':completion:*:-command-:*:' verbose false
1438 # set format for warnings
1439 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d'
1441 # define files to ignore for zcompile
1442 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)'
1443 zstyle ':completion:correct:' prompt 'correct to: %e'
1445 # Ignore completion functions for commands you don't have:
1446 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*'
1448 # complete manual by their section
1449 zstyle ':completion:*:manuals' separate-sections true
1450 zstyle ':completion:*:manuals.*' insert-sections true
1451 zstyle ':completion:*:man:*' menu yes select
1453 # run rehash on completion so new installed program are found automatically:
1455 (( CURRENT == 1 )) && rehash
1460 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
1461 if [[ -n "$NOCOR" ]] ; then
1462 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored
1465 # try to be smart about when to use what completer...
1467 zstyle -e ':completion:*' completer '
1468 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]] ; then
1469 _last_try="$HISTNO$BUFFER$CURSOR"
1470 reply=(_complete _match _ignored _prefix _files)
1472 if [[ $words[1] == (rm|mv) ]] ; then
1473 reply=(_complete _files)
1475 reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files)
1480 # zstyle ':completion:*' completer _complete _correct _approximate
1481 # zstyle ':completion:*' expand prefix suffix
1483 # command for process lists, the local web server details and host completion
1484 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
1487 [[ -d $ZSHDIR/cache ]] && zstyle ':completion:*' use-cache yes && \
1488 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
1490 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
1492 [[ -r ~/.ssh/known_hosts ]] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
1493 [[ -r /etc/hosts ]] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
1505 zstyle ':completion:*:hosts' hosts $hosts
1506 # zstyle '*' hosts $hosts
1508 # specify your logins:
1510 # {grml,grml1}@foo.invalid
1511 # grml-devel@bar.invalid
1514 # {fred,root}@foo.invalid
1517 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
1518 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
1520 # specify specific port/service settings:
1521 # telnet_users_hosts_ports=(
1524 # @mail-server:{smtp,pop3}
1526 # @proxy-server:8000
1528 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
1530 # use generic completion system for programs not yet defined; (_gnu_generic works
1531 # with commands that provide a --help option with "standard" gnu-like output.)
1532 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
1534 # see upgrade function in this file
1535 compdef _hosts upgrade
1541 # people should use 'grml-x'!
1543 if [[ -e /etc/X11/xorg.conf ]] ; then
1544 [[ -x /usr/bin/startx ]] && /usr/bin/startx "$@" || /usr/X11R6/bin/startx "$@"
1546 echo "Please use the script \"grml-x\" for starting the X Window System
1547 because there does not exist /etc/X11/xorg.conf yet.
1548 If you want to use startx anyway please call \"/usr/bin/startx\"."
1554 if [[ -e /etc/X11/xorg.conf ]] ; then
1555 [[ -x /usr/bin/xinit ]] && /usr/bin/xinit || /usr/X11R6/bin/xinit
1557 echo "Please use the script \"grml-x\" for starting the X Window System.
1558 because there does not exist /etc/X11/xorg.conf yet.
1559 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
1564 if check_com -c 915resolution ; then
1565 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
1568 #a1# Output version of running grml
1569 alias grml-version='cat /etc/grml_version'
1571 if check_com -c rebuildfstab ; then
1572 #a1# Rebuild /etc/fstab
1573 alias grml-rebuildfstab='rebuildfstab -v -r -config'
1576 if check_com -c grml-debootstrap ; then
1577 alias debian2hd='print "Installing debian to harddisk is possible via using grml-debootstrap." ; return 1'
1582 # {{{ now run the functions
1584 is4 && isgrml && grmlstuff
1589 is4 && xsource "/etc/zsh/keephack"
1592 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
1593 # You use it as follows:
1594 # $ NTREF=/reference/file
1596 # This lists all the files in the current directory newer than the reference file.
1597 # You can also specify the reference file inline; note quotes:
1598 # $ ls -l *(e:'nt ~/.zshenv':)
1600 if [[ -n $1 ]] ; then
1603 [[ $REPLY -nt $NTREF ]]
1607 # shell functions {{{
1609 #f1# Provide csh compatibility
1610 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
1612 #f1# Reload an autoloadable function
1613 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
1615 #f1# Reload zsh setup
1617 if [[ "$#*" -eq 0 ]] ; then
1618 [[ -r ~/.zshrc ]] && . ~/.zshrc
1627 compdef _functions reload freload
1629 #f1# List symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
1631 [[ -z "$1" ]] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
1634 while [[ -h "$file" ]] ; do
1636 file=$(readlink "$file")
1641 # fast manual access
1642 if check_com qma ; then
1643 #f1# View the zsh manual
1644 manzsh() { qma zshall "$1" }
1647 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1648 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
1649 # [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
1650 # manzsh() { man zshall | $MYLESS -p $1 ; }
1653 if check_com -c most ; then
1654 #f1# View Debian's changelog of a given package
1656 if [[ -r /usr/share/doc/${1}/changelog.Debian.gz ]] ; then
1657 most /usr/share/doc/${1}/changelog.Debian.gz
1658 elif [[ -r /usr/share/doc/${1}/changelog.gz ]] ; then
1659 most /usr/share/doc/${1}/changelog.gz
1661 if check_com -c aptitude ; then
1662 echo "No changelog for package $1 found, using aptitude to retrieve it."
1664 aptitude -t unstable changelog ${1}
1666 aptitude changelog ${1}
1669 echo "No changelog for package $1 found, sorry."
1674 _dchange() { _files -W /usr/share/doc -/ }
1675 compdef _dchange dchange
1677 #f1# View Debian's NEWS of a given package
1679 if [[ -r /usr/share/doc/${1}/NEWS.Debian.gz ]] ; then
1680 most /usr/share/doc/${1}/NEWS.Debian.gz
1682 if [[ -r /usr/share/doc/${1}/NEWS.gz ]] ; then
1683 most /usr/share/doc/${1}/NEWS.gz
1685 echo "No NEWS file for package $1 found, sorry."
1690 _dnews() { _files -W /usr/share/doc -/ }
1691 compdef _dnews dnews
1693 #f1# View upstream's changelog of a given package
1695 if [[ -r /usr/share/doc/${1}/changelog.gz ]] ; then
1696 most /usr/share/doc/${1}/changelog.gz
1698 echo "No changelog for package $1 found, sorry."
1702 _uchange() { _files -W /usr/share/doc -/ }
1703 compdef _uchange uchange
1708 ZSH_PROFILE_RC=1 $SHELL "$@"
1711 #f1# Edit an alias via zle
1713 [[ -z "$1" ]] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1715 compdef _aliases edalias
1717 #f1# Edit a function via zle
1719 [[ -z "$1" ]] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1721 compdef _functions edfunc
1723 # use it e.g. via 'Restart apache2'
1724 #m# f6 Start() \kbd{/etc/init.d/\em{process}}\quad\kbd{start}
1725 #m# f6 Restart() \kbd{/etc/init.d/\em{process}}\quad\kbd{restart}
1726 #m# f6 Stop() \kbd{/etc/init.d/\em{process}}\quad\kbd{stop}
1727 #m# f6 Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{reload}
1728 #m# f6 Force-Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{force-reload}
1729 if [[ -d /etc/init.d ]] ; then
1730 for i in Start Restart Stop Force-Reload Reload ; do
1731 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1735 #f1# Provides useful information on globbing
1742 p named pipes (FIFOs)
1743 * executable plain files (0100)
1744 % device files (character or block special)
1745 %b block special files
1746 %c character special files
1747 r owner-readable files (0400)
1748 w owner-writable files (0200)
1749 x owner-executable files (0100)
1750 A group-readable files (0040)
1751 I group-writable files (0020)
1752 E group-executable files (0010)
1753 R world-readable files (0004)
1754 W world-writable files (0002)
1755 X world-executable files (0001)
1756 s setuid files (04000)
1757 S setgid files (02000)
1758 t files with the sticky bit (01000)
1760 print *(m-1) # Files modified up to a day ago
1761 print *(a1) # Files accessed a day ago
1762 print *(@) # Just symlinks
1763 print *(Lk+50) # Files bigger than 50 kilobytes
1764 print *(Lk-50) # Files smaller than 50 kilobytes
1765 print **/*.c # All *.c files recursively starting in \$PWD
1766 print **/*.c~file.c # Same as above, but excluding 'file.c'
1767 print (foo|bar).* # Files starting with 'foo' or 'bar'
1768 print *~*.* # All Files that do not contain a dot
1769 chmod 644 *(.^x) # make all plain non-executable files publically readable
1770 print -l *(.c|.h) # Lists *.c and *.h
1771 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1772 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1774 alias help-zshglob=H-Glob
1776 check_com -c qma && alias ?='qma zshall'
1778 # grep for running process, like: 'any vim'
1780 if [[ -z "$1" ]] ; then
1781 echo "any - grep for process(es) by keyword" >&2
1782 echo "Usage: any <keyword>" >&2 ; return 1
1785 local LENGTH=$(expr length $STRING)
1786 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1787 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1788 ps xauwww| grep "[$FIRSCHAR]$REST"
1792 # After resuming from suspend, system is paging heavily, leading to very bad interactivity.
1793 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1794 [[ -r /proc/1/maps ]] && \
1796 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1797 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1798 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1801 # print hex value of a number
1803 [[ -n "$1" ]] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1806 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1807 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1809 [[ -n "$1" ]] && CALC="$*" || print "Usage: calc [expression]"
1810 perl -e "print eval($CALC),\"\n\";"
1812 functions peval &>/dev/null && alias calc=peval
1814 # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
1815 # certain circumstances, so work around it, no matter which environment we have
1817 if [[ -z "$DISPLAY" ]] ; then
1818 consolechars -f /usr/share/consolefonts/default8x16.psf.gz
1825 # just press 'asdf' keys to toggle between dvorak and us keyboard layout
1827 echo -n 'Switching to us keyboard layout: '
1828 [[ -z "$DISPLAY" ]] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null
1832 echo -n 'Switching to dvorak keyboard layout: '
1833 [[ -z "$DISPLAY" ]] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null
1836 # just press 'asdf' key to toggle from neon layout to us keyboard layout
1838 echo -n 'Switching to us keyboard layout: '
1839 setxkbmap us && echo 'Done' || echo 'Failed'
1842 # set up an ipv6 tunnel
1846 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1847 print 'ipv6 tunnel already set up, nothing to be done.'
1848 print 'execute: "ifconfig sit1 down ; ifconfig sit0 down" to remove ipv6-tunnel.' ; return 1
1850 [[ -n "$PUBLIC_IP" ]] || \
1851 local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \
1852 awk '/inet addr:/ {print $2}' | tr -d 'addr:')
1854 [[ -n "$PUBLIC_IP" ]] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 }
1855 local IPV6ADDR=$(printf "2002:%02x%02x:%02x%02x:1::1" $(print ${PUBLIC_IP//./ }))
1856 print -n "Setting up ipv6 tunnel $IPV6ADDR via ${PUBLIC_IP}: "
1857 ifconfig sit0 tunnel ::192.88.99.1 up
1858 ifconfig sit1 add "$IPV6ADDR" && print done || print failed
1862 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1863 print 'ipv6 tunnel available' ; return 0
1865 print 'ipv6 tunnel not available' ; return 1
1869 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1870 print -n 'Stopping ipv6 tunnel (sit0 + sit1): '
1871 ifconfig sit1 down ; ifconfig sit0 down && print done || print failed
1873 print 'No ipv6 tunnel found, nothing to be done.' ; return 1
1877 print "Usage: ipv6-tunnel [start|stop|status]">&2 ; return 1
1882 # run dhclient for wireless device
1884 salias dhclient "$(wavemon -d | awk '/device/{print $2}')"
1887 # spawn a minimally set up ksh - useful if you want to umount /usr/.
1889 exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh
1892 # make a backup of a file
1894 cp -a "$1" "${1}_$(date --iso-8601=seconds)"
1897 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1899 # NO_SWITCH="yes" command bash "$@"
1902 # exec $SHELL $SHELL_ARGS "$@"
1907 # log out? set timeout in seconds {{{
1909 # do not log out in some specific terminals:
1910 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]] ; then
1915 # {{{ make sure our environment is clean regarding colors
1916 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1919 # source another config file if present {{{
1920 xsource "/etc/zsh/zshrc.local"
1923 # "persistent history" {{{
1924 # just write important commands you always need to ~/.important_commands
1925 if [[ -r ~/.important_commands ]] ; then
1926 fc -R ~/.important_commands
1930 ## genrefcard.pl settings {{{
1931 ### example: split functions-search 8,16,24,32
1932 #@# split functions-search 8
1935 # add variable to be able to check whether the file has been read {{{
1936 ZSHRC_GLOBAL_HAS_BEEN_READ=1
1939 ## END OF FILE #################################################################
1940 # vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4