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 ################################################################################
7 # This file is sourced only for interactive shells. It
8 # should contain commands to set up aliases, functions,
9 # options, key bindings, etc.
11 # Global Order: zshenv, zprofile, zshrc, zlogin
12 ################################################################################
14 # zsh-refcard-tag documentation: {{{
15 # You may notice strange looking comments in this file.
16 # These are there for a purpose. grml's zsh-refcard can now be
17 # automatically generated from the contents of the actual configuration
18 # file. However, we need a little extra information on which comments
19 # and what lines of code to take into account (and for what purpose).
21 # Here is what they mean:
23 # List of tags (comment types) used:
24 # #a# Next line contains an important alias, that should
25 # be included in the grml-zsh-refcard.
26 # (placement tag: @@INSERT-aliases@@)
27 # #f# Next line contains the beginning of an important function.
28 # (placement tag: @@INSERT-functions@@)
29 # #v# Next line contains an important variable.
30 # (placement tag: @@INSERT-variables@@)
31 # #k# Next line contains an important keybinding.
32 # (placement tag: @@INSERT-keybindings@@)
33 # #d# Hashed directories list generation:
34 # start denotes the start of a list of 'hash -d'
36 # end denotes its end.
37 # (placement tag: @@INSERT-hasheddirs@@)
38 # #A# Abbreviation expansion list generation:
39 # start denotes the beginning of abbreviations.
40 # end denotes their end.
41 # Lines within this section that end in '#d .*' provide
42 # extra documentation to be included in the refcard.
43 # (placement tag: @@INSERT-abbrev@@)
44 # #m# This tag allows you to manually generate refcard entries
45 # for code lines that are hard/impossible to parse.
47 # #m# k ESC-h Call the run-help function
48 # That would add a refcard entry in the keybindings table
49 # for 'ESC-h' with the given comment.
50 # So the syntax is: #m# <section> <argument> <comment>
51 # #o# This tag lets you insert entries to the 'other' hash.
52 # Generally, this should not be used. It is there for
53 # things that cannot be done easily in another way.
54 # (placement tag: @@INSERT-other-foobar@@)
56 # All of these tags (except for m and o) take two arguments, the first
57 # within the tag, the other after the tag:
59 # #<tag><section># <comment>
61 # Where <section> is really just a number, which are defined by the
62 # @secmap array on top of 'genrefcard.pl'. The reason for numbers
63 # instead of names is, that for the reader, the tag should not differ
64 # much from a regular comment. For zsh, it is a regular comment indeed.
65 # The numbers have got the following meanings:
74 # So, the following will add an entry to the 'functions' table in the
75 # 'system' section, with a (hopefully) descriptive comment:
76 # #f1# Edit an alias via zle
79 # It will then show up in the @@INSERT-aliases-system@@ replacement tag
80 # that can be found in 'grml-zsh-refcard.tex.in'.
81 # If the section number is omitted, the 'default' section is assumed.
82 # Furthermore, in 'grml-zsh-refcard.tex.in' @@INSERT-aliases@@ is
83 # exactly the same as @@INSERT-aliases-default@@. If you want a list of
84 # *all* aliases, for example, use @@INSERT-aliases-all@@.
88 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
89 if [[ $ZSH_PROFILE_RC -gt 0 ]] ; then
94 # setting some default values {{{
96 # load .zshrc.pre to give the user the chance to overwrite the defaults
97 [[ -r ${HOME}/.zshrc.pre ]] && source ${HOME}/.zshrc.pre
101 NOPRECMD=${NOPRECMD:-0}
102 BATTERY=${BATTERY:-0}
103 GRMLSMALL_SPECIFIC=${GRMLSMALL_SPECIFIC:-1}
104 GRML_ALWAYS_LOAD_ALL=${GRML_ALWAYS_LOAD_ALL:-0}
105 GRML_WARN_SKEL=${GRML_WARN_SKEL:-1}
107 if (( GRML_WARN_SKEL != 0 )) ; then
111 You updated grml'\''s zshrc which brings a major change.
112 The configuration is kept only in one file, being the global zshrc.
113 In the past, the configuration was split in two files, with the
114 second file being the .zshrc file from /etc/skel.
116 If you have a .zshrc file in your home directory that originally
117 came from the skel directory, please remove it. This is also the case
118 if you followed earlier instructions from the grml-zsh-refcard or
119 from <http://grml.org/console> on non-grml systems.
121 Please see the current grml-zsh-refcard for updated installation
122 information. In short, you don'\''t want a .zshrc.global file. Install
123 the global zshrc to ~/.zshrc and be done.
125 If you need changes to the configuration, use ~/.zshrc.pre and
128 To remove this warning execute '\''grml_do_not_warn_skel'\''.
132 function grml_do_not_warn_skel() {
133 printf '# Do not warn about old skel dot-files anymore\n' >>! ~/.zshrc.pre
134 printf 'GRML_WARN_SKEL=0\n' >>! ~/.zshrc.pre
141 # {{{ check for version/system
142 # check for versions (compatibility reasons)
144 [[ $ZSH_VERSION == <4->* ]] && return 0
149 [[ $ZSH_VERSION == 4.<1->* || $ZSH_VERSION == <5->* ]] && return 0
154 [[ $ZSH_VERSION == 4.<2->* || $ZSH_VERSION == <5->* ]] && return 0
159 [[ $ZSH_VERSION == 4.2.<5->* || $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0
164 [[ $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0
168 #f1# Checks whether or not you're running grml
170 [[ -f /etc/grml_version ]] && return 0
174 #f1# Checks whether or not you're running a grml cd
176 [[ -f /etc/grml_cd ]] && return 0
181 #f1# Checks whether or not you're running grml-small
183 [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
186 isgrmlsmall() { return 1 }
190 [[ $OSTYPE == darwin* ]] && return 0
194 #f1# are we running within an utf environment?
196 case "$LANG $CHARSET $LANGUAGE" in
203 # check for user, if not running as root set $SUDO to sudo
204 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
206 # change directory to home on first invocation of zsh
207 # important for rungetty -> autologin
208 # Thanks go to Bart Schaefer!
209 isgrml && checkhome() {
210 if [[ -z "$ALREADY_DID_CD_HOME" ]] ; then
211 export ALREADY_DID_CD_HOME=$HOME
216 # check for zsh v3.1.7+
218 if ! [[ ${ZSH_VERSION} == 3.1.<7->* \
219 || ${ZSH_VERSION} == 3.<2->.<->* \
220 || ${ZSH_VERSION} == <4->.<->* ]] ; then
223 printf '-!- In this configuration we try to make use of features, that only\n'
224 printf '-!- require version 3.1.7 of the shell; That way this setup can be\n'
225 printf '-!- used with a wide range of zsh versions, while using fairly\n'
226 printf '-!- advanced features in all supported versions.\n'
228 printf '-!- However, you are running zsh version %s.\n' "$ZSH_VERSION"
230 printf '-!- While this *may* work, it might as well fail.\n'
231 printf '-!- Please consider updating to at least version 3.1.7 of zsh.\n'
233 printf '-!- DO NOT EXPECT THIS TO WORK FLAWLESSLY!\n'
234 printf '-!- If it does today, you'\''ve been lucky.\n'
236 printf '-!- Ye been warned!\n'
239 function zstyle() { : }
244 # utility functions {{{
245 # this function checks if a command exists and returns either true
246 # or false. This avoids using 'which' and 'whence', which will
247 # avoid problems with aliases for which on certain weird systems. :-)
251 if [[ ${1} == '-c' ]] ; then
258 if (( ${#argv} != 1 )) ; then
259 printf 'usage: check_com [-c] <command>\n' >&2
263 if (( comonly > 0 )) ; then
264 [[ -n ${commands[$1]} ]] && return 0
268 if [[ -n ${commands[$1]} ]] \
269 || [[ -n ${functions[$1]} ]] \
270 || [[ -n ${aliases[$1]} ]] \
271 || [[ -n ${reswords[(r)$1]} ]] ; then
279 # creates an alias and precedes the command with
280 # sudo if $EUID is not zero.
282 local only=0 ; local multi=0
283 while [[ ${1} == -* ]] ; do
287 (--) shift ; break ;;
289 printf 'usage: salias [-h|-o|-a] <alias-expression>\n'
290 printf ' -h shows this help text.\n'
291 printf ' -a replace '\'' ; '\'' sequences with '\'' ; sudo '\''.\n'
292 printf ' be careful using this option.\n'
293 printf ' -o only sets an alias if a preceding sudo would be needed.\n'
296 (*) printf "unkown option: '%s'\n" "${1}" ; return 1 ;;
301 if (( ${#argv} > 1 )) ; then
302 printf 'Too many arguments %s\n' "${#argv}"
306 key="${1%%\=*}" ; val="${1#*\=}"
307 if (( EUID == 0 )) && (( only == 0 )); then
308 alias -- "${key}=${val}"
309 elif (( EUID > 0 )) ; then
310 (( multi > 0 )) && val="${val// ; / ; sudo }"
311 alias -- "${key}=sudo ${val}"
317 # a "print -l ${(u)foo}"-workaround for pre-4.2.0 shells
319 # Where foo is the *name* of the parameter you want printed.
320 # Note that foo is no typo; $foo would be wrong here!
327 if [[ -z ${parameter} ]] ; then
328 printf 'usage: uprint <parameter>\n'
332 for w in ${(P)parameter} ; do
333 [[ -z ${(M)u:#${w}} ]] && u=( ${u} ${w} )
336 builtin print -l ${u}
340 # Check if we can read given files and source those we can.
342 if (( ${#argv} < 1 )) ; then
343 printf 'usage: xsource FILE(s)...\n' >&2
347 while (( ${#argv} > 0 )) ; do
348 [[ -r ${1} ]] && source ${1}
354 # Check if we can read a given file and 'cat(1)' it.
356 if (( ${#argv} != 1 )) ; then
357 printf 'usage: xcat FILE\n' >&2
361 [[ -r ${1} ]] && cat ${1}
365 # Remove these functions again, they are of use only in these
366 # setup files. This should be called at the end of .zshrc.
369 funcs=(salias xcat xsource xunfunction zrcautoload)
371 for func in $funcs ; do
372 [[ -n ${functions[$func]} ]] \
378 # autoload wrapper - use this one instead of autoload directly
379 function zrcautoload() {
380 setopt local_options extended_glob
386 for fdir in ${fpath} ; do
387 [[ -e ${fdir}/${ffile} ]] && (( ffound = 1 ))
390 (( ffound == 0 )) && return 1
391 if [[ $ZSH_VERSION == 3.1.<6-> || $ZSH_VERSION == <4->* ]] ; then
392 autoload -U ${ffile} || return 1
394 autoload ${ffile} || return 1
401 # Load is-at-least() for more precise version checks {{{
403 # Note that this test will *always* fail, if the is-at-least
404 # function could not be marked for autoloading.
405 zrcautoload is-at-least || is-at-least() { return 1 }
410 if [[ -z "$LANG" ]] ; then
411 xsource "/etc/default/locale"
414 export LANG=${LANG:-en_US.iso885915}
415 for var in LC_ALL LC_MESSAGES ; do
416 [[ -n ${(P)var} ]] && export $var
419 xsource "/etc/sysconfig/keyboard"
421 TZ=$(xcat /etc/timezone)
424 # check for potentially old files in 'completion.d' {{{
426 xof=(/etc/zsh/completion.d/*~/etc/zsh/completion.d/_*(N))
427 if (( ${#xof} > 0 )) ; then
428 printf '\n -!- INFORMATION\n\n'
429 printf ' -!- %s file(s) not starting with an underscore (_) found in\n' ${#xof}
430 printf ' -!- /etc/zsh/completion.d/.\n\n'
431 printf ' -!- While this has been the case in old versions of grml-etc-core,\n'
432 printf ' -!- recent versions of the grml-zsh-setup have all these files rewritten\n'
433 printf ' -!- and renamed. Furthermore, the grml-zsh-setup will *only* add files\n'
434 printf ' -!- named _* to that directory.\n\n'
435 printf ' -!- If you added functions to completion.d yourself, please consider\n'
436 printf ' -!- moving them to /etc/zsh/functions.d/. Files in that directory, not\n'
437 printf ' -!- starting with an underscore are marked for automatic loading\n'
438 printf ' -!- by default (so that is quite convenient).\n\n'
439 printf ' -!- If there are files *not* starting with an underscore from an older\n'
440 printf ' -!- grml-etc-core in completion.d, you may safely remove them.\n\n'
441 printf ' -!- Delete the files for example via running:\n\n'
442 printf " rm ${xof}\n\n"
443 printf ' -!- Note, that this message will *not* go away, unless you yourself\n'
444 printf ' -!- resolve the situation manually.\n\n'
445 BROKEN_COMPLETION_DIR=1
450 # {{{ set some variables
451 if check_com -c vim ; then
453 export EDITOR=${EDITOR:-vim}
455 export EDITOR=${EDITOR:-vi}
459 export PAGER=${PAGER:-less}
462 export MAIL=${MAIL:-/var/mail/$USER}
464 # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
465 export SHELL='/bin/zsh'
467 # color setup for ls:
468 check_com -c dircolors && eval $(dircolors -b)
469 # color setup for ls on OS X:
470 isdarwin && export CLICOLOR=1
472 # do MacPorts setup on darwin
473 if isdarwin && [[ -d /opt/local ]]; then
474 # Note: PATH gets set in /etc/zprofile on Darwin, so this can't go into
476 PATH="/opt/local/bin:/opt/local/sbin:$PATH"
477 MANPATH="/opt/local/share/man:$MANPATH"
479 # do Fink setup on darwin
480 isdarwin && xsource /sw/bin/init.sh
482 # set width of man pages to 80 for more convenient reading
483 # export MANWIDTH=${MANWIDTH:-80}
485 # Search path for the cd command
488 # completion functions go to /etc/zsh/completion.d
489 # function files may be put into /etc/zsh/functions.d, from where they
490 # will be automatically autoloaded.
491 if [[ -n "$BROKEN_COMPLETION_DIR" ]] ; then
492 print 'Warning: not setting completion directories because broken files have been found.' >&2
494 [[ -d /etc/zsh/completion.d ]] && fpath=( $fpath /etc/zsh/completion.d )
495 if [[ -d /etc/zsh/functions.d ]] ; then
496 fpath+=( /etc/zsh/functions.d )
497 for func in /etc/zsh/functions.d/[^_]*[^~](N.) ; do
498 zrcautoload -U ${func:t}
503 # automatically remove duplicates from these arrays
504 typeset -U path cdpath fpath manpath
508 if [[ "$TERM" != emacs ]] ; then
509 [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
510 [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
511 [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
512 [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
513 [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
514 [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
515 [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
516 [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
517 [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
518 [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
519 [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
520 [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
522 [[ "$terminfo[kcuu1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
523 [[ "$terminfo[kcud1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
524 [[ "$terminfo[kcuf1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
525 [[ "$terminfo[kcub1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
526 [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
527 [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
528 [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
529 [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
532 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
533 # use emacs style per default:
538 #if [[ "$TERM" == screen ]] ; then
539 bindkey '\e[1~' beginning-of-line # home
540 bindkey '\e[4~' end-of-line # end
541 bindkey '\e[A' up-line-or-search # cursor up
542 bindkey '\e[B' down-line-or-search # <ESC>-
544 bindkey '^xp' history-beginning-search-backward
545 bindkey '^xP' history-beginning-search-forward
546 # bindkey -s '^L' "|less\n" # ctrl-L pipes to less
547 # bindkey -s '^B' " &\n" # ctrl-B runs it in the background
548 # if terminal type is set to 'rxvt':
549 bindkey '\e[7~' beginning-of-line # home
550 bindkey '\e[8~' end-of-line # end
553 # insert unicode character
554 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an §
555 # See for example http://unicode.org/charts/ for unicode characters code
556 zrcautoload insert-unicode-char
557 zle -N insert-unicode-char
558 #k# Insert Unicode character
559 bindkey '^Xi' insert-unicode-char
561 # just type 'cd ...' to get 'cd ../..'
562 # rationalise-dot() {
563 # if [[ $LBUFFER == *.. ]] ; then
569 # zle -N rationalise-dot
570 # bindkey . rationalise-dot
572 # bindkey '\eq' push-line-or-edit
574 ## toggle the ,. abbreviation feature on/off
575 # NOABBREVIATION: default abbreviation-state
576 # 0 - enabled (default)
578 NOABBREVIATION=${NOABBREVIATION:-0}
580 grml_toggle_abbrev() {
581 if (( ${NOABBREVIATION} > 0 )) ; then
588 zle -N grml_toggle_abbrev
589 bindkey '^xA' grml_toggle_abbrev
593 # a generic accept-line wrapper {{{
595 # This widget can prevent unwanted autocorrections from command-name
596 # to _command-name, rehash automatically on enter and call any number
597 # of builtin and user-defined widgets in different contexts.
599 # For a broader description, see:
600 # <http://bewatermyfriend.org/posts/2007/12-26.11-50-38-tooltime.html>
602 # The code is imported from the file 'zsh/functions/accept-line' from
603 # <http://ft.bewatermyfriend.org/comp/zsh/zsh-dotfiles.tar.bz2>, which
604 # distributed under the same terms as zsh itself.
606 # A newly added command will may not be found or will cause false
607 # correction attempts, if you got auto-correction set. By setting the
608 # following style, we force accept-line() to rehash, if it cannot
609 # find the first word on the command line in the $command[] hash.
610 zstyle ':acceptline:*' rehash true
612 function Accept-Line() {
613 setopt localoptions noksharrays
618 zstyle -a ":acceptline:${alcontext}" actions subs
620 (( ${#subs} < 1 )) && return 0
623 for sub in ${subs} ; do
624 [[ ${sub} == 'accept-line' ]] && sub='.accept-line'
627 (( aldone > 0 )) && break
631 function Accept-Line-getdefault() {
634 zstyle -s ":acceptline:${alcontext}" default_action default_action
635 case ${default_action} in
637 printf ".accept-line"
640 printf ${default_action}
645 function accept-line() {
646 setopt localoptions noksharrays
649 local buf com fname format msg default_action
653 cmdline=(${(z)BUFFER})
657 zstyle -t ":acceptline:${alcontext}" rehash \
658 && [[ -z ${commands[$com]} ]] \
661 if [[ -n ${reswords[(r)$com]} ]] \
662 || [[ -n ${aliases[$com]} ]] \
663 || [[ -n ${functions[$com]} ]] \
664 || [[ -n ${builtins[$com]} ]] \
665 || [[ -n ${commands[$com]} ]] ; then
667 # there is something sensible to execute, just do it.
671 default_action=$(Accept-Line-getdefault)
672 zstyle -T ":acceptline:${alcontext}" call_default \
673 && zle ${default_action}
677 if [[ -o correct ]] \
678 || [[ -o correctall ]] \
679 && [[ -n ${functions[$fname]} ]] ; then
681 # nothing there to execute but there is a function called
682 # _command_name; a completion widget. Makes no sense to
683 # call it on the commandline, but the correct{,all} options
684 # will ask for it nevertheless, so warn the user.
685 if [[ ${LASTWIDGET} == 'accept-line' ]] ; then
686 # Okay, we warned the user before, he called us again,
687 # so have it his way.
691 default_action=$(Accept-Line-getdefault)
692 zstyle -T ":acceptline:${alcontext}" call_default \
693 && zle ${default_action}
697 # prepare warning message for the user, configurable via zstyle.
698 zstyle -s ":acceptline:${alcontext}" compwarnfmt msg
700 if [[ -z ${msg} ]] ; then
701 msg="%c will not execute and completion %f exists."
704 zformat -f msg "${msg}" "c:${com}" "f:${fname}"
708 elif [[ -n ${buf//[$' \t\n']##/} ]] ; then
709 # If we are here, the commandline contains something that is not
710 # executable, which is neither subject to _command_name correction
711 # and is not empty. might be a variable assignment
715 default_action=$(Accept-Line-getdefault)
716 zstyle -T ":acceptline:${alcontext}" call_default \
717 && zle ${default_action}
721 # If we got this far, the commandline only contains whitespace, or is empty.
725 default_action=$(Accept-Line-getdefault)
726 zstyle -T ":acceptline:${alcontext}" call_default \
727 && zle ${default_action}
735 # power completion - abbreviation expansion {{{
736 # power completion / abbreviation expansion / buffer expansion
737 # see http://zshwiki.org/home/examples/zleiab for details
738 # less risky than the global aliases but powerful as well
739 # just type the abbreviation key and afterwards ',.' to expand it
742 setopt interactivecomments
744 # key # value (#d additional doc string)
750 'G' '|& grep --color=auto'
752 'Hl' ' --help |& less -r' #d (Display help in pager)
756 'N' '&>/dev/null' #d (No Output)
757 'R' '| tr A-z N-za-m' #d (ROT13)
763 'hide' "echo -en '\033]50;nil2\007'"
764 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
765 'small' 'echo -en "\033]50;6x10\007"'
766 'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
767 'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
768 'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
769 'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
770 'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
771 'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
775 'co' "./configure && make && sudo make install"
776 'CH' "./configure --help"
777 'conkeror' 'firefox -chrome chrome://conkeror/content'
779 'lad' $'ls -d .*(/)\n# only show dot-directories'
780 'lsa' $'ls -a .*(.)\n# only show dot-files'
781 'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
782 'lsl' $'ls -l *(@[1,10])\n# only symlinks'
783 'lsx' $'ls -l *(*[1,10])\n# only executables'
784 'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
785 'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
786 'lsd' $'ls -d *(/)\n# only show directories'
787 'lse' $'ls -d *(/^F)\n# only show empty directories'
788 'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
789 'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
790 'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
792 '600' 'chmod u+rw-x,g-rwx,o-rwx'
794 '700' 'chmod u+rwx,g-rwx,o-rwx'
795 'r--' 'chmod u+r-wx,g-rwx,o-rwx'
796 '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
797 '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
799 'cmplayer' 'mplayer -vo -fs -zoom fbdev'
800 'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
801 'fblinks' 'links2 -driver fb'
802 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
803 'insecscp' 'scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
804 'fori' 'for i ({..}) { }'
807 'se' 'setopt interactivecomments'
808 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
809 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
810 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3'
812 'D' 'export DISPLAY=:0.0'
813 'mp' 'mplayer -vo xv -fs -zoom'
819 if (( NOABBREVIATION > 0 )) ; then
820 LBUFFER="${LBUFFER},."
824 matched_chars='[.-|_a-zA-Z0-9]#'
825 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
826 LBUFFER+=${abk[$MATCH]:-$MATCH}
830 bindkey ",." globalias
834 zrcautoload zmv # who needs mmv or rename?
835 zrcautoload history-search-end
837 # we don't want to quote/espace URLs on our own...
838 # if autoload -U url-quote-magic ; then
839 # zle -N self-insert url-quote-magic
840 # zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
842 # print 'Notice: no url-quote-magic available :('
844 alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
846 #m# k ESC-h Call \kbd{run-help} for the 1st word on the command line
847 alias run-help >&/dev/null && unalias run-help
848 zrcautoload run-help # use via 'esc-h'
851 if zrcautoload compinit && compinit 2>/dev/null ; then
852 compinit 2>/dev/null || print 'Notice: no compinit available :('
854 print 'Notice: no compinit available :('
859 is4 && zrcautoload zed # use ZLE editor to edit a file or function
862 for mod in complist deltochar mathfunc ; do
863 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
866 # autoload zsh modules when they are referenced
874 while (( ${#tmpargs} > 0 )) ; do
875 zmodload -${tmpargs[1]} zsh/${tmpargs[2]} ${tmpargs[2]}
881 if is4 && zrcautoload insert-files && zle -N insert-files ; then
883 bindkey "^Xf" insert-files # C-x-f
886 bindkey ' ' magic-space # also do history expansion on space
887 #k# Trigger menu-complete
888 bindkey '\ei' menu-complete # menu completion via esc-i
890 # press esc-e for editing command line in $EDITOR or $VISUAL
891 if is4 && zrcautoload edit-command-line && zle -N edit-command-line ; then
892 #k# Edit the current line in \kbd{\$EDITOR}
893 bindkey '\ee' edit-command-line
896 if is4 && [[ -n ${(k)modules[zsh/complist]} ]] ; then
897 #k# menu selection: pick item but stay in the menu
898 bindkey -M menuselect '\e^M' accept-and-menu-complete
900 # accept a completion and try to complete again by using menu
901 # completion; very useful with completing directories
902 # by using 'undo' one's got a simple file browser
903 bindkey -M menuselect '^o' accept-and-infer-next-history
906 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
907 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
910 #k# Insert a timestamp on the command line (yyyy-mm-dd)
911 bindkey '^Ed' _bkdate
913 # press esc-m for inserting last typed word again (thanks to caphuso!)
914 insert-last-typed-word() { zle insert-last-word -- 0 -1 };
915 zle -N insert-last-typed-word;
917 #k# Insert last typed word
918 bindkey "\em" insert-last-typed-word
920 #k# Shortcut for \kbd{fg<enter>}
921 bindkey -s '^z' "fg\n"
923 # run command line as user root via sudo:
924 sudo-command-line() {
925 [[ -z $BUFFER ]] && zle up-history
926 [[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER"
928 zle -N sudo-command-line
930 #k# Put the current command line into a \kbd{sudo} call
931 bindkey "^Os" sudo-command-line
933 ### jump behind the first word on the cmdline.
934 ### useful to add options.
935 function jump_after_first_word() {
939 if (( ${#words} <= 1 )) ; then
942 CURSOR=${#${words[1]}}
945 zle -N jump_after_first_word
947 bindkey '^x1' jump_after_first_word
951 # {{{ set some important options
952 # Please update these tags, if you change the umask settings below.
954 #o# r_umaskstr rwxrwxr-x
956 #o# umaskstr rwxr-xr-x
957 (( EUID != 0 )) && umask 002 || umask 022
960 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
961 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
962 setopt extended_history # save each command's beginning timestamp and the duration to the history file
963 is4 && setopt histignorealldups # If a new command line being added to the history
964 # list duplicates an older one, the older command is removed from the list
965 setopt histignorespace # remove command lines from the history list when
966 # the first character on the line is a space
967 setopt auto_cd # if a command is issued that can't be executed as a normal command,
968 # and the command is the name of a directory, perform the cd command to that directory
969 setopt extended_glob # in order to use #, ~ and ^ for filename generation
970 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
971 # -> searches for word not in compressed files
972 # don't forget to quote '^', '~' and '#'!
973 setopt longlistjobs # display PID when suspending processes as well
974 setopt notify # report the status of backgrounds jobs immediately
975 setopt hash_list_all # Whenever a command completion is attempted, make sure \
976 # the entire command path is hashed first.
977 setopt completeinword # not just at the end
978 setopt nohup # and don't kill them, either
979 setopt auto_pushd # make cd push the old directory onto the directory stack.
980 setopt nonomatch # try to avoid the 'zsh: no matches found...'
981 setopt nobeep # avoid "beep"ing
982 setopt pushd_ignore_dups # don't push the same dir twice.
984 MAILCHECK=30 # mailchecks
985 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 seconds
986 watch=(notme root) # watch for everyone but me and root
988 # only slash should be considered as a word separator:
989 slash-backward-kill-word() {
990 local WORDCHARS="${WORDCHARS:s@/@}"
992 zle backward-kill-word
994 zle -N slash-backward-kill-word
996 #k# Kill everything in a word up to its last \kbd{/}
997 bindkey '\ev' slash-backward-kill-word
1006 HISTFILE=$HOME/.zsh_history
1007 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
1008 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
1012 # dirstack handling {{{
1014 DIRSTACKSIZE=${DIRSTACKSIZE:-20}
1015 DIRSTACKFILE=${DIRSTACKFILE:-${HOME}/.zdirs}
1017 if [[ -f ${DIRSTACKFILE} ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then
1018 dirstack=( ${(f)"$(< $DIRSTACKFILE)"} )
1019 # "cd -" won't work after login by just setting $OLDPWD, so
1020 [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD
1025 builtin print -l ${(u)dirstack} >! ${DIRSTACKFILE}
1027 uprint dirstack >! ${DIRSTACKFILE}
1033 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
1034 if [[ $BATTERY -gt 0 ]] ; then
1035 if ! check_com -c acpi ; then
1041 if [[ $BATTERY -gt 0 ]] ; then
1042 PERCENT="${${"$(acpi 2>/dev/null)"}/(#b)[[:space:]]##Battery <->: [^0-9]##, (<->)%*/${match[1]}}"
1043 if [[ -z "$PERCENT" ]] ; then
1044 PERCENT='acpi not present'
1046 if [[ "$PERCENT" -lt 20 ]] ; then
1047 PERCENT="warning: ${PERCENT}%%"
1049 PERCENT="${PERCENT}%%"
1056 # set colors for use in prompts {{{
1057 if zrcautoload colors && colors 2>/dev/null ; then
1058 BLUE="%{${fg[blue]}%}"
1059 RED="%{${fg_bold[red]}%}"
1060 GREEN="%{${fg[green]}%}"
1061 CYAN="%{${fg[cyan]}%}"
1062 MAGENTA="%{${fg[magenta]}%}"
1063 YELLOW="%{${fg[yellow]}%}"
1064 WHITE="%{${fg[white]}%}"
1065 NO_COLOUR="%{${reset_color}%}"
1067 BLUE=$'%{\e[1;34m%}'
1069 GREEN=$'%{\e[1;32m%}'
1070 CYAN=$'%{\e[1;36m%}'
1071 WHITE=$'%{\e[1;37m%}'
1072 MAGENTA=$'%{\e[1;35m%}'
1073 YELLOW=$'%{\e[1;33m%}'
1074 NO_COLOUR=$'%{\e[0m%}'
1079 # gather version control information for inclusion in a prompt {{{
1082 # Be quiet about version problems in grml's zshrc as the user cannot disable
1083 # loading vcs_info() as it is *in* the zshrc - as you can see. :-)
1084 # Just unset most probable variables and disable vcs_info altogether.
1086 for i in {0..9} ; do
1087 unset VCS_INFO_message_${i}_
1089 zstyle ':vcs_info:*' enable false
1092 # The following code is imported from the file 'zsh/functions/vcs_info'
1093 # from <http://ft.bewatermyfriend.org/comp/zsh/zsh-dotfiles.tar.bz2>,
1094 # which distributed under the same terms as zsh itself.
1096 # we will only be using one variable, so let the code know now.
1097 zstyle ':vcs_info:*' max-exports 1
1099 # vcs_info() documentation:
1103 # This functionality requires zsh version >= 4.1.*.
1108 # To load vcs_info(), copy this file to your $fpath[] and do:
1109 # % autoload -Uz vcs_info && vcs_info
1111 # To work, vcs_info() needs 'setopt prompt_subst' in your setup.
1116 # To get vcs_info() working quickly (including colors), you can do the
1117 # following (assuming, you loaded vcs_info() properly - see above):
1119 # % RED=$'%{\e[31m%}'
1120 # % GR=$'%{\e[32m%}'
1121 # % MA=$'%{\e[35m%}'
1122 # % YE=$'%{\e[33m%}'
1125 # % zstyle ':vcs_info:*' actionformats \
1126 # "${MA}(${NC}%s${MA})${YE}-${MA}[${GR}%b${YE}|${RED}%a${MA}]${NC} "
1128 # % zstyle ':vcs_info:*' formats \
1129 # "${MA}(${NC}%s${MA})${Y}-${MA}[${GR}%b${MA}]${NC}%} "
1131 # % zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "%b${RED}:${YE}%r"
1133 # % precmd () { vcs_info }
1134 # % PS1='${MA}[${GR}%n${MA}] ${MA}(${RED}%!${MA}) ${YE}%3~ ${VCS_INFO_message_0_}${NC}%# '
1136 # Obviously, the las two lines are there for demonstration: You need to
1137 # call vcs_info() from your precmd() function (see 'SPECIAL FUNCTIONS' in
1138 # 'man zshmisc'). Once that is done you need a *single* quoted
1139 # '${VCS_INFO_message_0_}' in your prompt.
1141 # Now call the 'vcs_info_printsys' utility from the command line:
1143 # % vcs_info_printsys
1144 # # list of supported version control backends:
1145 # # disabled systems are prefixed by a hash sign (#)
1156 # # flavours (cannot be used in the disable style; they
1157 # # are disabled with their master [git-svn -> git]):
1161 # Ten version control backends as you can see. You may not want all
1162 # of these. Because there is no point in running the code to detect
1163 # systems you do not use. ever. So, there is a way to disable some
1164 # backends altogether:
1166 # % zstyle ':vcs_info:*' disable bzr cdv darcs mtn svk tla
1168 # If you rerun 'vcs_info_printsys' now, you will see the backends listed
1169 # in the 'disable' style marked as diabled by a hash sign. That means the
1170 # detection of these systems is skipped *completely*. No wasted time there.
1172 # For more control, read the reference below.
1177 # The vcs_info() feature can be configured via zstyle.
1179 # First, the context in which we are working:
1180 # :vcs_info:<vcs-string>:<user-context>
1182 # ...where <vcs-string> is one of:
1183 # - git, git-svn, git-p4, hg, darcs, bzr, cdv, mtn, svn, cvs, svk or tla.
1185 # ...and <user-context> is a freely configurable string, assignable by the
1186 # user as the first argument to vcs_info() (see its description below).
1188 # There is are three special values for <vcs-string>: The first is named
1189 # 'init', that is in effect as long as there was no decision what vcs
1190 # backend to use. The second is 'preinit; it is used *before* vcs_info()
1191 # is run, when initializing the data exporting variables. The third
1192 # special value is 'formats' and is used by the 'vcs_info_lastmsg' for
1193 # looking up its styles.
1195 # There are two pre-defined values for <user-context>:
1196 # default - the one used if none is specified
1197 # command - used by vcs_info_lastmsg to lookup its styles.
1199 # You may *not* use 'print_systems_' as a user-context string, because it
1200 # is used internally.
1202 # You can of course use ':vcs_info:*' to match all VCSs in all
1203 # user-contexts at once.
1205 # Another special context is 'formats', which is used by the
1206 # vcs_info_lastmsg() utility function (see below).
1209 # This is a description of all styles, that are looked up:
1210 # formats - A list of formats, used when actionformats is not
1211 # used (which is most of the time).
1212 # actionformats - A list of formats, used if a there is a special
1213 # action going on in your current repository;
1214 # (like an interactive rebase or a merge conflict)
1215 # branchformat - Some backends replace %b in the formats and
1216 # actionformats styles above, not only by a branch
1217 # name but also by a revision number. This style
1218 # let's you modify how that string should look like.
1219 # nvcsformats - These "formats" are exported, when we didn't detect
1220 # a version control system for the current directory.
1221 # This is useful, if you want vcs_info() to completely
1222 # take over the generation of your prompt.
1223 # You would do something like
1224 # PS1='${VCS_INFO_message_0_}'
1225 # to accomplish that.
1226 # max-exports - Defines the maximum number if VCS_INFO_message_*_
1227 # variables vcs_info() will export.
1228 # enable - Checked in the 'init' context. If set to false,
1229 # vcs_info() will do nothing.
1230 # disable - Provide a list of systems, you don't want
1231 # the vcs_info() to check for repositories
1232 # (checked in the 'init' context, too).
1233 # disable-patterns - A list of patterns that are checked against $PWD.
1234 # If the pattern matches, vcs_info will be disabled.
1235 # Say, ~/.zsh is a directory under version control,
1236 # in which you do not want vcs_info to be active, do:
1237 # zstyle ':vcs_info:*' disable-patterns "$HOME/.zsh+(|/*)"
1238 # use-simple - If there are two different ways of gathering
1239 # information, you can select the simpler one
1240 # by setting this style to true; the default
1241 # is to use the not-that-simple code, which is
1242 # potentially a lot slower but might be more
1243 # accurate in all possible cases.
1244 # use-prompt-escapes - determines if we assume that the assembled
1245 # string from vcs_info() includes prompt escapes.
1246 # (Used by vcs_info_lastmsg().
1248 # The use-simple style is only available for the bzr backend.
1250 # The default values for these in all contexts are:
1251 # formats " (%s)-[%b|%a]-"
1252 # actionformats " (%s)-[%b]-"
1253 # branchformat "%b:%r" (for bzr, svn and svk)
1257 # disable (empty list)
1258 # disable-patterns (empty list)
1260 # use-prompt-escapes true
1263 # In normal formats and actionformats, the following replacements
1265 # %s - The vcs in use (git, hg, svn etc.)
1266 # %b - Information about the current branch.
1267 # %a - An identifier, that describes the action.
1268 # Only makes sense in actionformats.
1269 # %R - base directory of the repository.
1270 # %r - repository name
1271 # If %R is '/foo/bar/repoXY', %r is 'repoXY'.
1272 # %S - subdirectory within a repository. if $PWD is
1273 # '/foo/bar/reposXY/beer/tasty', %S is 'beer/tasty'.
1276 # In branchformat these replacements are done:
1277 # %b - the branch name
1278 # %r - the current revision number
1280 # Not all vcs backends have to support all replacements.
1281 # nvcsformat does not perform *any* replacements. It is just a string.
1286 # If you want to use the %b (bold off) prompt expansion in 'formats', which
1287 # expands %b itself, use %%b. That will cause the vcs_info() expansion to
1288 # replace %%b with %b. So zsh's prompt expansion mechanism can handle it.
1289 # Similarly, to hand down %b from branchformat, use %%%%b. Sorry for this
1290 # inconvenience, but it cannot be easily avoided. Luckily we do not clash
1291 # with a lot of prompt expansions and this only needs to be done for those.
1292 # See 'man zshmisc' for details about EXPANSION OF PROMPT SEQUENCES.
1295 # FUNCTION DESCRIPTIONS (public API):
1298 # The main function, that runs all backends and assembles
1299 # all data into ${VCS_INFO_message_*_}. This is the function
1300 # you want to call from precmd() if you want to include
1301 # up-to-date information in your prompt (see VARIABLE
1302 # DESCRIPTION below).
1304 # vcs_info_printsys()
1305 # Prints a list of all supported version control systems.
1306 # Useful to find out possible contexts (and which of them are enabled)
1307 # or values for the 'disable' style.
1309 # vcs_info_lastmsg()
1310 # Outputs the last ${VCS_INFO_message_*_} value. Takes into account
1311 # the value of the use-prompt-escapes style in ':vcs_info:formats'.
1312 # It also only prints max-exports values.
1314 # All functions named VCS_INFO_* are for internal use only.
1317 # VARIABLE DESCRIPTION:
1319 # ${VCS_INFO_message_N_} (Note the trailing underscore)
1320 # Where 'N' is an integer, eg: VCS_INFO_message_0_
1321 # These variables are the storage for the informational message the
1322 # last vcs_info() call has assembled. These are strongly connected
1323 # to the formats, actionformats and nvcsformats styles described
1324 # above. Those styles are lists. the first member of that list gets
1325 # expanded into ${VCS_INFO_message_0_}, the second into
1326 # ${VCS_INFO_message_1_} and the Nth into ${VCS_INFO_message_N-1_}.
1327 # These parameters are exported into the environment.
1328 # (See the max-exports style above.)
1333 # Don't use vcs_info at all (even though it's in your prompt):
1334 # % zstyle ':vcs_info:*' enable false
1336 # Disable the backends for bzr and svk:
1337 # % zstyle ':vcs_info:*' disable bzr svk
1339 # Provide a special formats for git:
1340 # % zstyle ':vcs_info:git:*' formats ' GIT, BABY! [%b]'
1341 # % zstyle ':vcs_info:git:*' actionformats ' GIT ACTION! [%b|%a]'
1343 # Use the quicker bzr backend (if you do, please report if it does
1344 # the-right-thing[tm] - thanks):
1345 # % zstyle ':vcs_info:bzr:*' use-simple true
1347 # Display the revision number in yellow for bzr and svn:
1348 # % zstyle ':vcs_info:(svn|bzr):*' branchformat '%b%{'${fg[yellow]}'%}:%r'
1350 # If you want colors, make sure you enclose the color codes in %{...%},
1351 # if you want to use the string provided by vcs_info() in prompts.
1353 # Here is how to print the vcs infomation as a command:
1354 # % alias vcsi='vcs_info command; vcs_info_lastmsg'
1356 # This way, you can even define different formats for output via
1357 # vcs_info_lastmsg() in the ':vcs_info:command:*' namespace.
1361 VCS_INFO_adjust () { #{{{
1362 [[ -n ${vcs_comm[overwrite_name]} ]] && vcs=${vcs_comm[overwrite_name]}
1366 VCS_INFO_check_com () { #{{{
1367 (( ${+commands[$1]} )) && [[ -x ${commands[$1]} ]] && return 0
1371 VCS_INFO_formats () { # {{{
1372 setopt localoptions noksharrays
1373 local action=$1 branch=$2 base=$3
1377 if [[ -n ${action} ]] ; then
1378 zstyle -a ":vcs_info:${vcs}:${usercontext}" actionformats msgs
1379 (( ${#msgs} < 1 )) && msgs[1]=' (%s)-[%b|%a]-'
1381 zstyle -a ":vcs_info:${vcs}:${usercontext}" formats msgs
1382 (( ${#msgs} < 1 )) && msgs[1]=' (%s)-[%b]-'
1385 (( ${#msgs} > maxexports )) && msgs[${maxexports},-1]=()
1386 for i in {1..${#msgs}} ; do
1387 zformat -f msg ${msgs[$i]} a:${action} b:${branch} s:${vcs} r:${base:t} R:${base} S:"$(VCS_INFO_reposub ${base})"
1393 VCS_INFO_maxexports () { #{{{
1394 local -ix maxexports
1396 zstyle -s ":vcs_info:${vcs}:${usercontext}" "max-exports" maxexports || maxexports=2
1397 if [[ ${maxexports} != <-> ]] || (( maxexports < 1 )); then
1398 printf 'vcs_info(): expecting numeric arg >= 1 for max-exports (got %s).\n' ${maxexports}
1399 printf 'Defaulting to 2.\n'
1404 VCS_INFO_nvcsformats () { #{{{
1405 setopt localoptions noksharrays
1408 if [[ $1 == 'preinit' ]] ; then
1412 zstyle -a ":vcs_info:${v:-$vcs}:${c:-$usercontext}" nvcsformats msgs
1413 (( ${#msgs} > maxexports )) && msgs[${maxexports},-1]=()
1416 VCS_INFO_realpath () { #{{{
1417 # a portable 'readlink -f'
1418 # forcing a subshell, to ensure chpwd() is not removed
1419 # from the calling shell (if VCS_INFO_realpath() is called
1422 (( ${+functions[chpwd]} )) && unfunction chpwd
1424 cd $1 2>/dev/null && pwd
1428 VCS_INFO_reposub () { #{{{
1429 setopt localoptions extendedglob
1430 local base=${1%%/##}
1432 [[ ${PWD} == ${base}/* ]] || {
1436 printf '%s' ${PWD#$base/}
1440 VCS_INFO_set () { #{{{
1441 setopt localoptions noksharrays
1444 if [[ $1 == '--clear' ]] ; then
1445 for i in {0..9} ; do
1446 unset VCS_INFO_message_${i}_
1449 if [[ $1 == '--nvcs' ]] ; then
1450 [[ $2 == 'preinit' ]] && (( maxexports == 0 )) && (( maxexports = 1 ))
1451 for i in {0..$((maxexports - 1))} ; do
1452 typeset -gx VCS_INFO_message_${i}_=
1454 VCS_INFO_nvcsformats $2
1457 (( ${#msgs} - 1 < 0 )) && return 0
1458 for i in {0..$(( ${#msgs} - 1 ))} ; do
1460 typeset -gx VCS_INFO_message_${i}_=${msgs[$j]}
1465 # information gathering
1466 VCS_INFO_bzr_get_data () { # {{{
1467 setopt localoptions noksharrays
1471 if zstyle -t ":vcs_info:${vcs}:${usercontext}" "use-simple" ; then
1472 bzrbase=${vcs_comm[basedir]}
1473 bzrinfo[2]=${bzrbase:t}
1474 if [[ -f ${bzrbase}/.bzr/branch/last-revision ]] ; then
1475 bzrinfo[1]=$(< ${bzrbase}/.bzr/branch/last-revision)
1476 bzrinfo[1]=${${bzrinfo[1]}%% *}
1479 bzrbase=${${(M)${(f)"$( bzr info )"}:# ##branch\ root:*}/*: ##/}
1480 bzrinfo=( ${${${(M)${(f)"$( bzr version-info )"}:#(#s)(revno|branch-nick)*}/*: /}/*\//} )
1481 bzrbase="$(VCS_INFO_realpath ${bzrbase})"
1484 zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat bzrbr || bzrbr="%b:%r"
1485 zformat -f bzrbr "${bzrbr}" "b:${bzrinfo[2]}" "r:${bzrinfo[1]}"
1486 VCS_INFO_formats '' "${bzrbr}" "${bzrbase}"
1490 VCS_INFO_cdv_get_data () { # {{{
1493 cdvbase=${vcs_comm[basedir]}
1494 VCS_INFO_formats '' "${cdvbase:t}" "${cdvbase}"
1498 VCS_INFO_cvs_get_data () { # {{{
1499 local cvsbranch cvsbase basename
1502 while [[ -d "${cvsbase}/../CVS" ]]; do
1503 cvsbase="${cvsbase}/.."
1505 cvsbase="$(VCS_INFO_realpath ${cvsbase})"
1506 cvsbranch=$(< ./CVS/Repository)
1507 basename=${cvsbase:t}
1508 cvsbranch=${cvsbranch##${basename}/}
1509 [[ -z ${cvsbranch} ]] && cvsbranch=${basename}
1510 VCS_INFO_formats '' "${cvsbranch}" "${cvsbase}"
1514 VCS_INFO_darcs_get_data () { # {{{
1517 darcsbase=${vcs_comm[basedir]}
1518 VCS_INFO_formats '' "${darcsbase:t}" "${darcsbase}"
1522 VCS_INFO_git_getaction () { #{{{
1523 local gitaction='' gitdir=$1
1526 for tmp in "${gitdir}/rebase-apply" \
1527 "${gitdir}/rebase" \
1528 "${gitdir}/../.dotest" ; do
1529 if [[ -d ${tmp} ]] ; then
1530 if [[ -f "${tmp}/rebasing" ]] ; then
1532 elif [[ -f "${tmp}/applying" ]] ; then
1535 gitaction="am/rebase"
1537 printf '%s' ${gitaction}
1542 for tmp in "${gitdir}/rebase-merge/interactive" \
1543 "${gitdir}/.dotest-merge/interactive" ; do
1544 if [[ -f "${tmp}" ]] ; then
1545 printf '%s' "rebase-i"
1550 for tmp in "${gitdir}/rebase-merge" \
1551 "${gitdir}/.dotest-merge" ; do
1552 if [[ -d "${tmp}" ]] ; then
1553 printf '%s' "rebase-m"
1558 if [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
1563 if [[ -f "${gitdir}/BISECT_LOG" ]] ; then
1564 printf '%s' "bisect"
1570 VCS_INFO_git_getbranch () { #{{{
1571 local gitbranch gitdir=$1
1572 local gitsymref='git symbolic-ref HEAD'
1574 if [[ -d "${gitdir}/rebase-apply" ]] \
1575 || [[ -d "${gitdir}/rebase" ]] \
1576 || [[ -d "${gitdir}/../.dotest" ]] \
1577 || [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
1578 gitbranch="$(${(z)gitsymref} 2> /dev/null)"
1579 [[ -z ${gitbranch} ]] && [[ -r ${gitdir}/rebase-apply/head-name ]] \
1580 && gitbranch="$(< ${gitdir}/rebase-apply/head-name)"
1582 elif [[ -f "${gitdir}/rebase-merge/interactive" ]] \
1583 || [[ -d "${gitdir}/rebase-merge" ]] ; then
1584 gitbranch="$(< ${gitdir}/rebase-merge/head-name)"
1586 elif [[ -f "${gitdir}/.dotest-merge/interactive" ]] \
1587 || [[ -d "${gitdir}/.dotest-merge" ]] ; then
1588 gitbranch="$(< ${gitdir}/.dotest-merge/head-name)"
1591 gitbranch="$(${(z)gitsymref} 2> /dev/null)"
1593 if [[ $? -ne 0 ]] ; then
1594 gitbranch="$(git describe --exact-match HEAD 2>/dev/null)"
1596 if [[ $? -ne 0 ]] ; then
1597 gitbranch="${${"$(< $gitdir/HEAD)"}[1,7]}..."
1602 printf '%s' "${gitbranch##refs/heads/}"
1606 VCS_INFO_git_get_data () { # {{{
1607 setopt localoptions extendedglob
1608 local gitdir gitbase gitbranch gitaction
1610 gitdir=${vcs_comm[gitdir]}
1611 gitbranch="$(VCS_INFO_git_getbranch ${gitdir})"
1613 if [[ -z ${gitdir} ]] || [[ -z ${gitbranch} ]] ; then
1618 gitaction="$(VCS_INFO_git_getaction ${gitdir})"
1619 gitbase=${PWD%/${$( git rev-parse --show-prefix )%/##}}
1620 VCS_INFO_formats "${gitaction}" "${gitbranch}" "${gitbase}"
1624 VCS_INFO_hg_get_data () { # {{{
1625 local hgbranch hgbase
1627 hgbase=${vcs_comm[basedir]}
1628 hgbranch=$(< ${hgbase}/.hg/branch)
1629 VCS_INFO_formats '' "${hgbranch}" "${hgbase}"
1633 VCS_INFO_mtn_get_data () { # {{{
1634 local mtnbranch mtnbase
1636 mtnbase=${vcs_comm[basedir]}
1637 mtnbranch=${${(M)${(f)"$( mtn status )"}:#(#s)Current branch:*}/*: /}
1638 VCS_INFO_formats '' "${mtnbranch}" "${mtnbase}"
1642 VCS_INFO_svk_get_data () { # {{{
1643 local svkbranch svkbase
1645 svkbase=${vcs_comm[basedir]}
1646 zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat svkbranch || svkbranch="%b:%r"
1647 zformat -f svkbranch "${svkbranch}" "b:${vcs_comm[branch]}" "r:${vcs_comm[revision]}"
1648 VCS_INFO_formats '' "${svkbranch}" "${svkbase}"
1652 VCS_INFO_svn_get_data () { # {{{
1653 setopt localoptions noksharrays
1654 local svnbase svnbranch
1658 while [[ -d "${svnbase}/../.svn" ]]; do
1659 svnbase="${svnbase}/.."
1661 svnbase="$(VCS_INFO_realpath ${svnbase})"
1662 svninfo=( ${${${(M)${(f)"$( svn info )"}:#(#s)(URL|Revision)*}/*: /}/*\//} )
1664 zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat svnbranch || svnbranch="%b:%r"
1665 zformat -f svnbranch "${svnbranch}" "b:${svninfo[1]}" "r:${svninfo[2]}"
1666 VCS_INFO_formats '' "${svnbranch}" "${svnbase}"
1670 VCS_INFO_tla_get_data () { # {{{
1671 local tlabase tlabranch
1673 tlabase="$(VCS_INFO_realpath ${vcs_comm[basedir]})"
1674 # tree-id gives us something like 'foo@example.com/demo--1.0--patch-4', so:
1675 tlabranch=${${"$( tla tree-id )"}/*\//}
1676 VCS_INFO_formats '' "${tlabranch}" "${tlabase}"
1681 VCS_INFO_detect_by_dir() { #{{{
1683 local basedir="." realbasedir
1685 realbasedir="$(VCS_INFO_realpath ${basedir})"
1686 while [[ ${realbasedir} != '/' ]]; do
1687 if [[ -n ${vcs_comm[detect_need_file]} ]] ; then
1688 [[ -d ${basedir}/${dirname} ]] && \
1689 [[ -f ${basedir}/${dirname}/${vcs_comm[detect_need_file]} ]] && \
1692 [[ -d ${basedir}/${dirname} ]] && break
1695 basedir=${basedir}/..
1696 realbasedir="$(VCS_INFO_realpath ${basedir})"
1699 [[ ${realbasedir} == "/" ]] && return 1
1700 vcs_comm[basedir]=${realbasedir}
1704 VCS_INFO_bzr_detect() { #{{{
1705 VCS_INFO_check_com bzr || return 1
1706 vcs_comm[detect_need_file]=branch/format
1707 VCS_INFO_detect_by_dir '.bzr'
1711 VCS_INFO_cdv_detect() { #{{{
1712 VCS_INFO_check_com cdv || return 1
1713 vcs_comm[detect_need_file]=format
1714 VCS_INFO_detect_by_dir '.cdv'
1718 VCS_INFO_cvs_detect() { #{{{
1719 VCS_INFO_check_com svn || return 1
1720 [[ -d "./CVS" ]] && [[ -r "./CVS/Repository" ]] && return 0
1724 VCS_INFO_darcs_detect() { #{{{
1725 VCS_INFO_check_com darcs || return 1
1726 vcs_comm[detect_need_file]=format
1727 VCS_INFO_detect_by_dir '_darcs'
1731 VCS_INFO_git_detect() { #{{{
1732 if VCS_INFO_check_com git && git rev-parse --is-inside-work-tree &> /dev/null ; then
1733 vcs_comm[gitdir]="$(git rev-parse --git-dir 2> /dev/null)" || return 1
1734 if [[ -d ${vcs_comm[gitdir]}/svn ]] ; then vcs_comm[overwrite_name]='git-svn'
1735 elif [[ -d ${vcs_comm[gitdir]}/refs/remotes/p4 ]] ; then vcs_comm[overwrite_name]='git-p4' ; fi
1741 VCS_INFO_hg_detect() { #{{{
1742 VCS_INFO_check_com hg || return 1
1743 vcs_comm[detect_need_file]=branch
1744 VCS_INFO_detect_by_dir '.hg'
1748 VCS_INFO_mtn_detect() { #{{{
1749 VCS_INFO_check_com mtn || return 1
1750 vcs_comm[detect_need_file]=revision
1751 VCS_INFO_detect_by_dir '_MTN'
1755 VCS_INFO_svk_detect() { #{{{
1756 setopt localoptions noksharrays extendedglob
1761 VCS_INFO_check_com svk || return 1
1762 [[ -f ~/.svk/config ]] || return 1
1764 # This detection function is a bit different from the others.
1765 # We need to read svk's config file to detect a svk repository
1766 # in the first place. Therefore, we'll just proceed and read
1767 # the other information, too. This is more then any of the
1768 # other detections do but this takes only one file open for
1769 # svk at most. VCS_INFO_svk_get_data() get simpler, too. :-)
1770 while IFS= read -r line ; do
1771 if [[ -n ${vcs_comm[basedir]} ]] ; then
1773 [[ ${line} == depotpath:* ]] && vcs_comm[branch]=${line##*/}
1774 [[ ${line} == revision:* ]] && vcs_comm[revision]=${line##*[[:space:]]##}
1775 [[ -n ${vcs_comm[branch]} ]] && [[ -n ${vcs_comm[revision]} ]] && break
1778 (( fhash > 0 )) && [[ ${line} == ' '[^[:space:]]*:* ]] && break
1779 [[ ${line} == ' hash:'* ]] && fhash=1 && continue
1780 (( fhash == 0 )) && continue
1781 [[ ${PWD}/ == ${${line## ##}%:*}/* ]] && vcs_comm[basedir]=${${line## ##}%:*}
1782 done < ~/.svk/config
1784 [[ -n ${vcs_comm[basedir]} ]] && \
1785 [[ -n ${vcs_comm[branch]} ]] && \
1786 [[ -n ${vcs_comm[revision]} ]] && return 0
1790 VCS_INFO_svn_detect() { #{{{
1791 VCS_INFO_check_com svn || return 1
1792 [[ -d ".svn" ]] && return 0
1796 VCS_INFO_tla_detect() { #{{{
1797 VCS_INFO_check_com tla || return 1
1798 vcs_comm[basedir]="$(tla tree-root 2> /dev/null)" && return 0
1803 vcs_info_printsys () { # {{{
1804 vcs_info print_systems_
1807 vcs_info_lastmsg () { # {{{
1811 for i in {0..$((maxexports - 1))} ; do
1812 printf '$VCS_INFO_message_%d_: "' $i
1813 if zstyle -T ':vcs_info:formats:command' use-prompt-escapes ; then
1814 print -nP ${(P)${:-VCS_INFO_message_${i}_}}
1816 print -n ${(P)${:-VCS_INFO_message_${i}_}}
1825 local -a VCSs disabled dps
1826 local -x vcs usercontext
1831 VCSs=(git hg bzr darcs svk mtn svn cvs cdv tla)
1834 zstyle -a ":vcs_info:${vcs}:${usercontext}" "disable" disabled
1835 print -l '# list of supported version control backends:' \
1836 '# disabled systems are prefixed by a hash sign (#)'
1837 for vcs in ${VCSs} ; do
1838 [[ -n ${(M)disabled:#${vcs}} ]] && printf '#'
1839 printf '%s\n' ${vcs}
1841 print -l '# flavours (cannot be used in the disable style; they' \
1842 '# are disabled with their master [git-svn -> git]):' \
1847 [[ -z ${usercontext} ]] && usercontext=default
1849 (*) [[ -z ${usercontext} ]] && usercontext=$1
1853 zstyle -T ":vcs_info:${vcs}:${usercontext}" "enable" || {
1854 [[ -n ${VCS_INFO_message_0_} ]] && VCS_INFO_set --clear
1857 zstyle -a ":vcs_info:${vcs}:${usercontext}" "disable" disabled
1859 zstyle -a ":vcs_info:${vcs}:${usercontext}" "disable-patterns" dps
1860 for pat in ${dps} ; do
1861 if [[ ${PWD} == ${~pat} ]] ; then
1862 [[ -n ${vcs_info_msg_0_} ]] && VCS_INFO_set --clear
1870 for vcs in ${VCSs} ; do
1871 [[ -n ${(M)disabled:#${vcs}} ]] && continue
1873 VCS_INFO_${vcs}_detect && (( found = 1 )) && break
1876 (( found == 0 )) && {
1881 VCS_INFO_${vcs}_get_data || {
1890 VCS_INFO_set --nvcs preinit
1893 # change vcs_info formats for the grml prompt
1894 if [[ "$TERM" == dumb ]] ; then
1895 zstyle ':vcs_info:*' actionformats "(%s%)-[%b|%a] "
1896 zstyle ':vcs_info:*' formats "(%s%)-[%b] "
1898 # these are the same, just with a lot of colours:
1899 zstyle ':vcs_info:*' actionformats "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${YELLOW}|${RED}%a${MAGENTA}]${NO_COLOUR} "
1900 zstyle ':vcs_info:*' formats "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${MAGENTA}]${NO_COLOUR}%} "
1901 zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "%b${RED}:${YELLOW}%r"
1907 if zrcautoload promptinit && promptinit 2>/dev/null ; then
1908 promptinit # people should be able to use their favourite prompt
1910 print 'Notice: no promptinit available :('
1915 # make sure to use right prompt only when not running a command
1916 is41 && setopt transient_rprompt
1918 is4 && [[ $NOPRECMD -eq 0 ]] && precmd () {
1919 [[ $NOPRECMD -gt 0 ]] && return 0
1920 # update VCS information
1923 # allow manual overwriting of RPROMPT
1924 if [[ -n $RPROMPT ]] ; then
1925 [[ $TERM == screen* ]] && print -nP "\ekzsh\e\\"
1928 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
1929 if [[ $DONTSETRPROMPT -eq 0 ]] ; then
1930 if [[ $BATTERY -gt 0 ]] ; then
1931 # update BATTERY information
1933 RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
1934 # RPROMPT="${PERCENT}${SCREENTITLE}"
1936 RPROMPT="%(?..:()% ${SCREENTITLE}"
1937 # RPROMPT="${SCREENTITLE}"
1940 # adjust title of xterm
1941 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
1944 print -Pn "\e]0;%n@%m: %~\a"
1949 # preexec() => a function running before every command
1950 is4 && [[ $NOPRECMD -eq 0 ]] && \
1952 [[ $NOPRECMD -gt 0 ]] && return 0
1953 # set hostname if not running on host with name 'grml'
1954 if [[ -n "$HOSTNAME" ]] && [[ "$HOSTNAME" != $(hostname) ]] ; then
1957 # get the name of the program currently running and hostname of local machine
1958 # set screen window title if running in a screen
1959 if [[ "$TERM" == screen* ]] ; then
1960 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # don't use hostname
1961 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
1962 echo -ne "\ek$CMD\e\\"
1964 # set the screen title to "zsh" when sitting at the command prompt:
1965 if [[ "$TERM" == screen* ]] ; then
1966 SCREENTITLE=$'%{\ekzsh\e\\%}'
1970 # adjust title of xterm
1973 print -Pn "\e]0;%n@%m: $1\a"
1978 EXITCODE="%(?..%?%1v )"
1979 PS2='\`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
1980 PS3='?# ' # selection prompt used within a select loop.
1981 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
1983 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
1984 if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then
1985 debian_chroot=$(cat /etc/debian_chroot)
1988 # don't use colors on dumb terminals (like emacs):
1989 if [[ "$TERM" == dumb ]] ; then
1990 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< "'${VCS_INFO_message_0_}'"%# "
1992 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
1993 # set variable identifying the chroot you work in (used in the prompt below)
1994 if [[ $GRMLPROMPT -gt 0 ]] ; then
1995 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
1996 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
1998 # This assembles the primary prompt string
1999 if (( EUID != 0 )); then
2000 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< "'${VCS_INFO_message_0_}'"%# "
2002 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< "'${VCS_INFO_message_0_}'"%# "
2007 # if we are inside a grml-chroot set a specific prompt theme
2008 if [[ -n "$GRML_CHROOT" ]] ; then
2009 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
2013 # {{{ 'hash' some often used directories
2015 hash -d deb=/var/cache/apt/archives
2016 hash -d doc=/usr/share/doc
2017 hash -d linux=/lib/modules/$(command uname -r)/build/
2018 hash -d log=/var/log
2019 hash -d slog=/var/log/syslog
2020 hash -d src=/usr/src
2021 hash -d templ=/usr/share/doc/grml-templates
2022 hash -d tt=/usr/share/doc/texttools-doc
2023 hash -d www=/var/www
2028 if [[ $UID -eq 0 ]] ; then
2029 [[ -r /etc/grml/screenrc ]] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
2030 elif [[ -r $HOME/.screenrc ]] ; then
2031 alias screen="/usr/bin/screen -c $HOME/.screenrc"
2033 [[ -r /etc/grml/screenrc_grml ]] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
2036 # do we have GNU ls with color-support?
2037 if ls --help 2>/dev/null | grep -- --color= >/dev/null && [[ "$TERM" != dumb ]] ; then
2038 #a1# execute \kbd{@a@}:\quad ls with colors
2039 alias ls='ls -b -CF --color=auto'
2040 #a1# execute \kbd{@a@}:\quad list all files, with colors
2041 alias la='ls -la --color=auto'
2042 #a1# long colored list, without dotfiles (@a@)
2043 alias ll='ls -l --color=auto'
2044 #a1# long colored list, human readable sizes (@a@)
2045 alias lh='ls -hAl --color=auto'
2046 #a1# List files, append qualifier to filenames \\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...)
2047 alias l='ls -lF --color=auto'
2049 alias ls='ls -b -CF'
2056 alias mdstat='cat /proc/mdstat'
2057 alias ...='cd ../../'
2059 # generate alias named "$KERNELVERSION-reboot" so you can use boot with kexec:
2060 if [[ -x /sbin/kexec ]] && [[ -r /proc/cmdline ]] ; then
2061 alias "$(uname -r)-reboot"="kexec -l --initrd=/boot/initrd.img-"$(uname -r)" --command-line=\"$(cat /proc/cmdline)\" /boot/vmlinuz-"$(uname -r)""
2064 alias cp='nocorrect cp' # no spelling correction on cp
2065 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
2066 alias mv='nocorrect mv' # no spelling correction on mv
2067 alias rm='nocorrect rm' # no spelling correction on rm
2069 #a1# Execute \kbd{rmdir}
2071 #a1# Execute \kbd{rmdir}
2074 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
2075 alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
2076 alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
2078 # make sure it is not assigned yet
2079 [[ $(whence -w utf2iso &>/dev/null) == 'utf2iso: alias' ]] && unalias utf2iso
2083 for ENV in $(env | command grep -i '.utf') ; do
2084 eval export "$(echo $ENV | sed 's/UTF-8/iso885915/ ; s/utf8/iso885915/')"
2089 # make sure it is not assigned yet
2090 [[ $(whence -w iso2utf &>/dev/null) == 'iso2utf: alias' ]] && unalias iso2utf
2092 if ! isutfenv ; then
2093 for ENV in $(env | command grep -i '\.iso') ; do
2094 eval export "$(echo $ENV | sed 's/iso.*/UTF-8/ ; s/ISO.*/UTF-8/')"
2099 # set up software synthesizer via speakup
2101 if [ -x /usr/sbin/swspeak-setup ] ; then
2102 setopt singlelinezle
2105 /usr/sbin/swspeak-setup $@
2107 aumix -w 90 -v 90 -p 90 -m 90
2108 if ! [[ -r /dev/softsynth ]] ; then
2109 flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
2112 setopt singlelinezle
2115 nice -n -20 speechd-up
2117 flite -o play -t "Finished setting up software synthesizer"
2122 # I like clean prompt, so provide simple way to get that
2123 check_com 0 || alias 0='return 0'
2125 # for really lazy people like mika:
2126 check_com S &>/dev/null || alias S='screen'
2127 check_com s &>/dev/null || alias s='ssh'
2129 # get top 10 shell commands:
2130 alias top10='print -l ? ${(o)history%% *} | uniq -c | sort -nr | head -n 10'
2132 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
2133 if check_com -c truecrypt ; then
2135 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
2137 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
2141 #f1# Hints for the use of zsh on grml
2143 print "$bg[white]$fg[black]
2144 zsh-help - hints for use of zsh on grml
2145 =======================================$reset_color"
2148 Main configuration of zsh happens in /etc/zsh/zshrc.
2149 That file is part of the package grml-etc-core, if you want to
2150 use them on a non-grml-system just get the tar.gz from
2151 http://deb.grml.org/ or (preferably) get it from the git repository:
2153 http://git.grml.org/f/grml-etc-core/etc/zsh/zshrc
2155 This version of grml'\''s zsh setup does not use skel/.zshrc anymore.
2156 The file is still there, but it is empty for backwards compatibility.
2158 For your own changes use these two files:
2162 The former is sourced very early in our zshrc, the latter is sourced
2165 System wide configuration without touching configuration files of grml
2166 can take place in /etc/zsh/zshrc.local.
2168 Normally, the root user (EUID == 0) does not get the whole grml setup.
2169 If you want to force the whole setup for that user, too, set
2170 GRML_ALWAYS_LOAD_ALL=1 in .zshrc.pre in root'\''s home directory.
2172 For information regarding zsh start at http://grml.org/zsh/
2174 Take a look at grml'\''s zsh refcard:
2175 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
2177 Check out the main zsh refcard:
2178 % '$BROWSER' http://www.bash2zsh.com/zsh_refcard/refcard.pdf
2180 And of course visit the zsh-lovers:
2183 You can adjust some options through environment variables when
2184 invoking zsh without having to edit configuration files.
2185 Basically meant for bash users who are not used to the power of
2188 "NOCOR=1 zsh" => deactivate automatic correction
2189 "NOMENU=1 zsh" => do not use auto menu completion (note: use ctrl-d for completion instead!)
2190 "NOPRECMD=1 zsh" => disable the precmd + preexec commands (set GNU screen title)
2191 "BATTERY=1 zsh" => activate battery status (via acpi) on right side of prompt
2193 A value greater than 0 is enables a feature; a value equal to zero
2194 disables it. If you like one or the other of these settings, you can
2195 add them to ~/.zshrc.pre to ensure they are set when sourcing grml'\''s
2199 $bg[white]$fg[black]
2200 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
2201 Enjoy your grml system with the zsh!$reset_color"
2205 if [[ -r /etc/debian_version ]] ; then
2206 #a3# Execute \kbd{apt-cache search}
2207 alias acs='apt-cache search'
2208 #a3# Execute \kbd{apt-cache show}
2209 alias acsh='apt-cache show'
2210 #a3# Execute \kbd{apt-cache policy}
2211 alias acp='apt-cache policy'
2212 #a3# Execute \kbd{apt-get dist-upgrade}
2213 salias adg="apt-get dist-upgrade"
2214 #a3# Execute \kbd{apt-get install}
2215 salias agi="apt-get install"
2216 #a3# Execute \kbd{aptitude install}
2217 salias ati="aptitude install"
2218 #a3# Execute \kbd{apt-get upgrade}
2219 salias ag="apt-get upgrade"
2220 #a3# Execute \kbd{apt-get update}
2221 salias au="apt-get update"
2222 #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade}
2223 salias -a up="aptitude update ; aptitude safe-upgrade"
2224 #a3# Execute \kbd{dpkg-buildpackage}
2225 alias dbp='dpkg-buildpackage'
2226 #a3# Execute \kbd{grep-excuses}
2227 alias ge='grep-excuses'
2230 #f3# Execute \kbd{apt-get update \&\& }\\&\quad \kbd{apt-get dist-upgrade}
2232 if [[ -z "$1" ]] ; then
2233 $SUDO apt-get update
2234 $SUDO apt-get -u upgrade
2236 ssh $1 $SUDO apt-get update
2237 # ask before the upgrade
2239 ssh $1 $SUDO apt-get --no-act upgrade
2240 echo -n 'Process the upgrade?'
2242 if [[ $dummy == "y" ]] ; then
2243 ssh $1 $SUDO apt-get -u upgrade --yes
2248 # get a root shell as normal user in live-cd mode:
2249 if isgrmlcd && [[ $UID -ne 0 ]] ; then
2253 #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog}
2254 alias llog="$PAGER /var/log/syslog" # take a look at the syslog
2255 #a1# Take a look at the syslog: \kbd{tail -f /var/log/syslog}
2256 alias tlog="tail -f /var/log/syslog" # follow the syslog
2259 # sort installed Debian-packages by size
2260 if check_com -c grep-status ; then
2261 #a3# List installed Debian-packages sorted by size
2262 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package -n "install ok installed" | paste -sd " \n" | sort -rn'
2265 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
2266 if [[ -L /usr/bin/cdrecord ]] || ! check_com -c cdrecord ; then
2267 if check_com -c wodim ; then
2268 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
2269 See #377109 in the BTS of Debian for more details.
2271 Please use the wodim binary instead' ; return 1"
2275 # get_tw_cli has been renamed into get_3ware
2276 if check_com -c get_3ware ; then
2278 echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
2283 # I hate lacking backward compatibility, so provide an alternative therefore
2284 if ! check_com -c apache2-ssl-certificate ; then
2286 apache2-ssl-certificate() {
2288 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
2289 print 'You might want to take a look at Debian the package ssl-cert as well.'
2290 print 'To generate a certificate for use with apache2 follow the instructions:'
2294 export RANDFILE=/dev/random
2295 mkdir /etc/apache2/ssl/
2296 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
2297 chmod 600 /etc/apache2/ssl/apache.pem
2299 Run "grml-tips ssl-certificate" if you need further instructions.
2305 # {{{ Use hard limits, except for a smaller stack and no core dumps
2307 is425 && limit stack 8192
2308 isgrmlcd && limit core 0 # important for a live-cd-system
2312 # {{{ completion system
2314 # called later (via is4 && grmlcomp)
2315 # notice: use 'zstyle' for getting current settings
2316 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
2318 # TODO: This could use some additional information
2320 # allow one error for every three characters typed in approximate completer
2321 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )'
2323 # don't complete backup files as executables
2324 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '(aptitude-*|*\~)'
2326 # start menu completion only if it could find no unambiguous initial string
2327 zstyle ':completion:*:correct:*' insert-unambiguous true
2328 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}'
2329 zstyle ':completion:*:correct:*' original true
2331 # activate color-completion
2332 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
2334 # format on completion
2335 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}'
2337 # complete 'cd -<tab>' with menu
2338 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select
2340 # insert all expansions for expand completer
2341 zstyle ':completion:*:expand:*' tag-order all-expansions
2342 zstyle ':completion:*:history-words' list false
2345 zstyle ':completion:*:history-words' menu yes
2347 # ignore duplicate entries
2348 zstyle ':completion:*:history-words' remove-all-dups yes
2349 zstyle ':completion:*:history-words' stop yes
2351 # match uppercase from lowercase
2352 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
2354 # separate matches into groups
2355 zstyle ':completion:*:matches' group 'yes'
2356 zstyle ':completion:*' group-name ''
2358 if [[ "$NOMENU" -eq 0 ]] ; then
2359 # if there are more than 5 options allow selecting from a menu
2360 zstyle ':completion:*' menu select=5
2362 # don't use any menus at all
2366 zstyle ':completion:*:messages' format '%d'
2367 zstyle ':completion:*:options' auto-description '%d'
2369 # describe options in full
2370 zstyle ':completion:*:options' description 'yes'
2372 # on processes completion complete all user processes
2373 zstyle ':completion:*:processes' command 'ps -au$USER'
2375 # offer indexes before parameters in subscripts
2376 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
2378 # provide verbose completion information
2379 zstyle ':completion:*' verbose true
2381 # recent (as of Dec 2007) zsh versions are able to provide descriptions
2382 # for commands (read: 1st word in the line) that it will list for the user
2383 # to choose from. The following disables that, because it's not exactly fast.
2384 zstyle ':completion:*:-command-:*:' verbose false
2386 # set format for warnings
2387 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d'
2389 # define files to ignore for zcompile
2390 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)'
2391 zstyle ':completion:correct:' prompt 'correct to: %e'
2393 # Ignore completion functions for commands you don't have:
2394 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*'
2396 # Provide more processes in completion of programs like killall:
2397 zstyle ':completion:*:processes-names' command 'ps c -u ${USER} -o command | uniq'
2399 # complete manual by their section
2400 zstyle ':completion:*:manuals' separate-sections true
2401 zstyle ':completion:*:manuals.*' insert-sections true
2402 zstyle ':completion:*:man:*' menu yes select
2404 # run rehash on completion so new installed program are found automatically:
2406 (( CURRENT == 1 )) && rehash
2411 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
2412 if [[ "$NOCOR" -gt 0 ]] ; then
2413 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored
2416 # try to be smart about when to use what completer...
2418 zstyle -e ':completion:*' completer '
2419 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]] ; then
2420 _last_try="$HISTNO$BUFFER$CURSOR"
2421 reply=(_complete _match _ignored _prefix _files)
2423 if [[ $words[1] == (rm|mv) ]] ; then
2424 reply=(_complete _files)
2426 reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files)
2431 # command for process lists, the local web server details and host completion
2432 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
2435 [[ -d $ZSHDIR/cache ]] && zstyle ':completion:*' use-cache yes && \
2436 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
2438 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
2440 [[ -r ~/.ssh/known_hosts ]] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
2441 [[ -r /etc/hosts ]] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
2453 zstyle ':completion:*:hosts' hosts $hosts
2454 # TODO: so, why is this here?
2455 # zstyle '*' hosts $hosts
2457 # use generic completion system for programs not yet defined; (_gnu_generic works
2458 # with commands that provide a --help option with "standard" gnu-like output.)
2459 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
2461 # see upgrade function in this file
2462 compdef _hosts upgrade
2468 # people should use 'grml-x'!
2470 if [[ -e /etc/X11/xorg.conf ]] ; then
2471 [[ -x /usr/bin/startx ]] && /usr/bin/startx "$@" || /usr/X11R6/bin/startx "$@"
2473 echo "Please use the script \"grml-x\" for starting the X Window System
2474 because there does not exist /etc/X11/xorg.conf yet.
2475 If you want to use startx anyway please call \"/usr/bin/startx\"."
2481 if [[ -e /etc/X11/xorg.conf ]] ; then
2482 [[ -x /usr/bin/xinit ]] && /usr/bin/xinit || /usr/X11R6/bin/xinit
2484 echo "Please use the script \"grml-x\" for starting the X Window System.
2485 because there does not exist /etc/X11/xorg.conf yet.
2486 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
2491 if check_com -c 915resolution ; then
2492 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
2495 #a1# Output version of running grml
2496 alias grml-version='cat /etc/grml_version'
2498 if check_com -c rebuildfstab ; then
2499 #a1# Rebuild /etc/fstab
2500 alias grml-rebuildfstab='rebuildfstab -v -r -config'
2503 if check_com -c grml-debootstrap ; then
2504 alias debian2hd='print "Installing debian to harddisk is possible via using grml-debootstrap." ; return 1'
2509 # {{{ now run the functions
2511 is4 && isgrml && grmlstuff
2516 is4 && xsource "/etc/zsh/keephack"
2519 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
2520 # You use it as follows:
2521 # $ NTREF=/reference/file
2523 # This lists all the files in the current directory newer than the reference file.
2524 # You can also specify the reference file inline; note quotes:
2525 # $ ls -l *(e:'nt ~/.zshenv':)
2527 if [[ -n $1 ]] ; then
2530 [[ $REPLY -nt $NTREF ]]
2534 # shell functions {{{
2536 #f1# Provide csh compatibility
2537 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
2539 #f1# Reload an autoloadable function
2540 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
2542 #f1# Reload zsh setup
2544 if [[ "$#*" -eq 0 ]] ; then
2545 [[ -r ~/.zshrc ]] && . ~/.zshrc
2554 compdef _functions reload freload
2556 #f1# List symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
2558 [[ -z "$1" ]] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
2561 while [[ -h "$file" ]] ; do
2563 file=$(readlink "$file")
2568 # fast manual access
2569 if check_com qma ; then
2570 #f1# View the zsh manual
2571 manzsh() { qma zshall "$1" }
2574 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
2577 if check_com -c $PAGER ; then
2578 #f1# View Debian's changelog of a given package
2580 if [[ -r /usr/share/doc/${1}/changelog.Debian.gz ]] ; then
2581 $PAGER /usr/share/doc/${1}/changelog.Debian.gz
2582 elif [[ -r /usr/share/doc/${1}/changelog.gz ]] ; then
2583 $PAGER /usr/share/doc/${1}/changelog.gz
2585 if check_com -c aptitude ; then
2586 echo "No changelog for package $1 found, using aptitude to retrieve it."
2588 aptitude -t unstable changelog ${1}
2590 aptitude changelog ${1}
2593 echo "No changelog for package $1 found, sorry."
2598 _dchange() { _files -W /usr/share/doc -/ }
2599 compdef _dchange dchange
2601 #f1# View Debian's NEWS of a given package
2603 if [[ -r /usr/share/doc/${1}/NEWS.Debian.gz ]] ; then
2604 $PAGER /usr/share/doc/${1}/NEWS.Debian.gz
2606 if [[ -r /usr/share/doc/${1}/NEWS.gz ]] ; then
2607 $PAGER /usr/share/doc/${1}/NEWS.gz
2609 echo "No NEWS file for package $1 found, sorry."
2614 _dnews() { _files -W /usr/share/doc -/ }
2615 compdef _dnews dnews
2617 #f1# View upstream's changelog of a given package
2619 if [[ -r /usr/share/doc/${1}/changelog.gz ]] ; then
2620 $PAGER /usr/share/doc/${1}/changelog.gz
2622 echo "No changelog for package $1 found, sorry."
2626 _uchange() { _files -W /usr/share/doc -/ }
2627 compdef _uchange uchange
2632 ZSH_PROFILE_RC=1 $SHELL "$@"
2635 #f1# Edit an alias via zle
2637 [[ -z "$1" ]] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
2639 compdef _aliases edalias
2641 #f1# Edit a function via zle
2643 [[ -z "$1" ]] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
2645 compdef _functions edfunc
2647 # use it e.g. via 'Restart apache2'
2648 #m# f6 Start() \kbd{/etc/init.d/\em{process}}\quad\kbd{start}
2649 #m# f6 Restart() \kbd{/etc/init.d/\em{process}}\quad\kbd{restart}
2650 #m# f6 Stop() \kbd{/etc/init.d/\em{process}}\quad\kbd{stop}
2651 #m# f6 Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{reload}
2652 #m# f6 Force-Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{force-reload}
2653 if [[ -d /etc/init.d || -d /etc/service ]] ; then
2655 local action_="${1:l}" # e.g Start/Stop/Restart
2659 local service_target_="$(readlink /etc/init.d/$service_)"
2660 if [[ $service_target_ == "/usr/bin/sv" ]]; then
2662 case "${action_}" in
2663 start) if [[ ! -e /etc/service/$service_ ]]; then
2664 $SUDO ln -s "/etc/sv/$service_" "/etc/service/"
2666 $SUDO "/etc/init.d/$service_" "${action_}" "$param_"
2668 # there is no reload in runits sysv emulation
2669 reload) $SUDO "/etc/init.d/$service_" "force-reload" "$param_" ;;
2670 *) $SUDO "/etc/init.d/$service_" "${action_}" "$param_" ;;
2674 $SUDO "/etc/init.d/$service_" "${action_}" "$param_"
2678 for i in Start Restart Stop Force-Reload Reload ; do
2679 eval "$i() { __start_stop $i \"\$1\" \"\$2\" ; }"
2683 #f1# Provides useful information on globbing
2690 p named pipes (FIFOs)
2691 * executable plain files (0100)
2692 % device files (character or block special)
2693 %b block special files
2694 %c character special files
2695 r owner-readable files (0400)
2696 w owner-writable files (0200)
2697 x owner-executable files (0100)
2698 A group-readable files (0040)
2699 I group-writable files (0020)
2700 E group-executable files (0010)
2701 R world-readable files (0004)
2702 W world-writable files (0002)
2703 X world-executable files (0001)
2704 s setuid files (04000)
2705 S setgid files (02000)
2706 t files with the sticky bit (01000)
2708 print *(m-1) # Files modified up to a day ago
2709 print *(a1) # Files accessed a day ago
2710 print *(@) # Just symlinks
2711 print *(Lk+50) # Files bigger than 50 kilobytes
2712 print *(Lk-50) # Files smaller than 50 kilobytes
2713 print **/*.c # All *.c files recursively starting in \$PWD
2714 print **/*.c~file.c # Same as above, but excluding 'file.c'
2715 print (foo|bar).* # Files starting with 'foo' or 'bar'
2716 print *~*.* # All Files that do not contain a dot
2717 chmod 644 *(.^x) # make all plain non-executable files publically readable
2718 print -l *(.c|.h) # Lists *.c and *.h
2719 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
2720 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
2722 alias help-zshglob=H-Glob
2724 check_com -c qma && alias ?='qma zshall'
2726 # grep for running process, like: 'any vim'
2728 if [[ -z "$1" ]] ; then
2729 echo "any - grep for process(es) by keyword" >&2
2730 echo "Usage: any <keyword>" >&2 ; return 1
2733 local LENGTH=$(expr length $STRING)
2734 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
2735 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
2736 ps xauwww| grep "[$FIRSCHAR]$REST"
2740 # After resuming from suspend, system is paging heavily, leading to very bad interactivity.
2741 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
2742 [[ -r /proc/1/maps ]] && \
2744 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
2745 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
2746 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
2749 # print hex value of a number
2751 [[ -n "$1" ]] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
2754 # calculate (or eval at all ;-)) with perl => p[erl-]eval
2755 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
2757 [[ -n "$1" ]] && CALC="$*" || print "Usage: calc [expression]"
2758 perl -e "print eval($CALC),\"\n\";"
2760 functions peval &>/dev/null && alias calc=peval
2762 # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
2763 # certain circumstances, so work around it, no matter which environment we have
2765 if [[ -z "$DISPLAY" ]] ; then
2766 consolechars -f /usr/share/consolefonts/default8x16.psf.gz
2773 # just press 'asdf' keys to toggle between dvorak and us keyboard layout
2775 echo -n 'Switching to us keyboard layout: '
2776 [[ -z "$DISPLAY" ]] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null
2780 echo -n 'Switching to dvorak keyboard layout: '
2781 [[ -z "$DISPLAY" ]] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null
2784 # just press 'asdf' key to toggle from neon layout to us keyboard layout
2786 echo -n 'Switching to us keyboard layout: '
2787 setxkbmap us && echo 'Done' || echo 'Failed'
2790 # set up an ipv6 tunnel
2794 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
2795 print 'ipv6 tunnel already set up, nothing to be done.'
2796 print 'execute: "ifconfig sit1 down ; ifconfig sit0 down" to remove ipv6-tunnel.' ; return 1
2798 [[ -n "$PUBLIC_IP" ]] || \
2799 local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \
2800 awk '/inet addr:/ {print $2}' | tr -d 'addr:')
2802 [[ -n "$PUBLIC_IP" ]] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 }
2803 local IPV6ADDR=$(printf "2002:%02x%02x:%02x%02x:1::1" $(print ${PUBLIC_IP//./ }))
2804 print -n "Setting up ipv6 tunnel $IPV6ADDR via ${PUBLIC_IP}: "
2805 ifconfig sit0 tunnel ::192.88.99.1 up
2806 ifconfig sit1 add "$IPV6ADDR" && print done || print failed
2810 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
2811 print 'ipv6 tunnel available' ; return 0
2813 print 'ipv6 tunnel not available' ; return 1
2817 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
2818 print -n 'Stopping ipv6 tunnel (sit0 + sit1): '
2819 ifconfig sit1 down ; ifconfig sit0 down && print done || print failed
2821 print 'No ipv6 tunnel found, nothing to be done.' ; return 1
2825 print "Usage: ipv6-tunnel [start|stop|status]">&2 ; return 1
2830 # run dhclient for wireless device
2832 salias dhclient "$(wavemon -d | awk '/device/{print $2}')"
2835 # spawn a minimally set up ksh - useful if you want to umount /usr/.
2837 exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh
2840 # make a backup of a file
2842 cp -a "$1" "${1}_$(date --iso-8601=seconds)"
2845 #f1# grep for patterns in grml's zsh setup
2851 print "usage: zg -[anr] <pattern>\n";
2852 print " Search for patterns in grml'\''s zshrc.\n";
2853 print " zg takes no or exactly one option plus a non empty pattern.\n\n";
2854 print " options:\n";
2855 print " -- no options (use if your pattern starts in with a dash.\n";
2856 print " -a search for the pattern in all code regions\n";
2857 print " -n search for the pattern in non-root code only\n";
2858 print " -r search in code for everyone (also root) only\n\n";
2859 print " The default is -a for non-root users and -r for root.\n\n";
2860 print " If you installed the zshrc to a non-default locations (ie *NOT*\n";
2861 print " in /etc/zsh/zshrc) do: export GRML_ZSHRC=\$HOME/.zshrc\n";
2862 print " ...in case you copied the file to that location.\n\n";
2866 if ($ENV{GRML_ZSHRC} ne "") {
2867 $RC = $ENV{GRML_ZSHRC};
2869 $RC = "/etc/zsh/zshrc";
2872 usage if ($#ARGV < 0 || $#ARGV > 1);
2873 if ($> == 0) { $mode = "allonly"; }
2874 else { $mode = "all"; }
2877 if ($opt eq "--") { shift; }
2878 elsif ($opt eq "-a") { $mode = "all"; shift; }
2879 elsif ($opt eq "-n") { $mode = "nonroot"; shift; }
2880 elsif ($opt eq "-r" ) { $mode = "allonly"; shift; }
2881 elsif ($opt =~ m/^-/ || $#ARGV > 0) { usage(); }
2883 $pattern = $ARGV[0];
2884 usage() if ($pattern eq "");
2886 open FH, "<$RC" or die "zg: Could not open $RC: $!\n";
2887 while ($line = <FH>) {
2889 if ($line =~ m/^#:grep:marker:for:mika:/) { $markerfound = 1; next; }
2890 next if ($mode eq "nonroot" && markerfound == 0);
2891 break if ($mode eq "allonly" && markerfound == 1);
2892 print $line, "\n" if ($line =~ /$pattern/);
2904 # {{{ make sure our environment is clean regarding colors
2905 for color in BLUE RED GREEN CYAN YELLOW MAGENTA WHITE ; unset $color
2908 # source another config file if present {{{
2909 xsource "/etc/zsh/zshrc.local"
2912 # "persistent history" {{{
2913 # just write important commands you always need to ~/.important_commands
2914 if [[ -r ~/.important_commands ]] ; then
2915 fc -R ~/.important_commands
2919 #:grep:marker:for:mika: :-)
2920 ### non-root (EUID != 0) code below
2923 (( GRML_ALWAYS_LOAD_ALL == 0 )) && (( $EUID == 0 )) && return 0
2927 # set terminal property (used e.g. by msgid-chooser)
2928 export COLORTERM="yes"
2930 # set default browser
2931 if [[ -z "$BROWSER" ]] ; then
2932 if [[ -n "$DISPLAY" ]] ; then
2933 #v# If X11 is running
2934 check_com -c firefox && export BROWSER=firefox
2936 #v# If no X11 is running
2937 check_com -c w3m && export BROWSER=w3m
2941 #m# v QTDIR \kbd{/usr/share/qt[34]}\quad [for non-root only]
2942 [[ -d /usr/share/qt3 ]] && export QTDIR=/usr/share/qt3
2943 [[ -d /usr/share/qt4 ]] && export QTDIR=/usr/share/qt4
2945 # support running 'jikes *.java && jamvm HelloWorld' OOTB:
2946 #v# [for non-root only]
2947 [[ -f /usr/share/classpath/glibj.zip ]] && export JIKESPATH=/usr/share/classpath/glibj.zip
2952 # Xterm resizing-fu.
2953 # Based on http://svn.kitenet.net/trunk/home-full/.zshrc?rev=11710&view=log (by Joey Hess)
2954 alias hide='echo -en "\033]50;nil2\007"'
2955 alias tiny='echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
2956 alias small='echo -en "\033]50;6x10\007"'
2957 alias medium='echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
2958 alias default='echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
2959 alias large='echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
2960 alias huge='echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
2961 alias smartfont='echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
2962 alias semifont='echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
2965 #a2# Execute \kbd{du -sch}
2967 #a2# Execute \kbd{jobs -l}
2971 #a2# Execute \kbd{./configure}
2972 alias CO="./configure"
2973 #a2# Execute \kbd{./configure --help}
2974 alias CH="./configure --help"
2976 # http://conkeror.mozdev.org/
2977 # TODO: I think this should be removed, as conkeror is not a simple extension anymore
2978 #a2# Run a keyboard driven firefox
2979 alias conkeror='firefox -chrome chrome://conkeror/content'
2982 if check_com -c tla ; then
2983 #a2# Execute \kbd{tla what-changed --diffs | less}
2984 alias tdi='tla what-changed --diffs | less'
2985 #a2# Execute \kbd{tla-buildpackage}
2986 alias tbp='tla-buildpackage'
2987 #a2# Execute \kbd{tla archive-mirror}
2988 alias tmi='tla archive-mirror'
2989 #a2# Execute \kbd{tla commit}
2990 alias tco='tla commit'
2991 #a2# Execute \kbd{tla star-merge}
2992 alias tme='tla star-merge'
2996 #a2# Execute \kbd{ls -lSrah}
2997 alias dir="ls -lSrah"
2998 #a2# Only show dot-directories
2999 alias lad='ls -d .*(/)' # only show dot-directories
3000 #a2# Only show dot-files
3001 alias lsa='ls -a .*(.)' # only show dot-files
3002 #a2# Only files with setgid/setuid/sticky flag
3003 alias lss='ls -l *(s,S,t)' # only files with setgid/setuid/sticky flag
3004 #a2# Only show 1st ten symlinks
3005 alias lsl='ls -l *(@[1,10])' # only symlinks
3006 #a2# Display only executables
3007 alias lsx='ls -l *(*[1,10])' # only executables
3008 #a2# Display world-{readable,writable,executable} files
3009 alias lsw='ls -ld *(R,W,X.^ND/)' # world-{readable,writable,executable} files
3010 #a2# Display the ten biggest files
3011 alias lsbig="ls -flh *(.OL[1,10])" # display the biggest files
3012 #a2# Only show directories
3013 alias lsd='ls -d *(/)' # only show directories
3014 #a2# Only show empty directories
3015 alias lse='ls -d *(/^F)' # only show empty directories
3016 #a2# Display the ten newest files
3017 alias lsnew="ls -rl *(D.om[1,10])" # display the newest files
3018 #a2# Display the ten oldest files
3019 alias lsold="ls -rtlh *(D.om[1,10])" # display the oldest files
3020 #a2# Display the ten smallest files
3021 alias lssmall="ls -Srl *(.oL[1,10])" # display the smallest files
3024 #a2# Execute \kbd{chmod 600}
3025 alias rw-='chmod 600'
3026 #a2# Execute \kbd{chmod 700}
3027 alias rwx='chmod 700'
3028 #m# a2 r-{}- Execute \kbd{chmod 644}
3029 alias r--='chmod 644'
3030 #a2# Execute \kbd{chmod 755}
3031 alias r-x='chmod 755'
3033 # some useful aliases
3034 #a2# Execute \kbd{mkdir -o}
3037 check_com -c ipython && alias ips='ipython -p sh'
3040 #a2# Execute \kbd{mplayer -vo fbdev}
3041 alias cmplayer='mplayer -vo fbdev'
3042 #a2# Execute \kbd{mplayer -vo fbdev -fs -zoom}
3043 alias fbmplayer='mplayer -vo fbdev -fs -zoom'
3044 #a2# Execute \kbd{links2 -driver fb}
3045 alias fblinks='links2 -driver fb'
3047 #a2# ssh with StrictHostKeyChecking=no \\&\quad and UserKnownHostsFile unset
3048 alias insecssh='ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
3049 alias insecscp='scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
3052 check_com -c python && alias http="python -m SimpleHTTPServer"
3054 # Use 'g' instead of 'git':
3055 check_com g || alias g='git'
3057 # use colors when browsing man pages, but only if not using LESS_TERMCAP_* from /etc/zsh/zshenv:
3058 if [[ -z "$LESS_TERMCAP_md" ]] ; then
3059 [[ -d ~/.terminfo/ ]] && alias man='TERMINFO=~/.terminfo/ LESS=C TERM=mostlike PAGER=less man'
3062 # check whether Debian's package management (dpkg) is running
3063 if check_com salias ; then
3064 #a2# Check whether a dpkg instance is currently running
3065 salias check_dpkg_running="dpkg_running"
3068 # work around non utf8 capable software in utf environment via $LANG and luit
3069 if check_com isutfenv && check_com luit ; then
3070 if check_com -c mrxvt ; then
3071 isutfenv && [[ -n "$LANG" ]] && \
3072 alias mrxvt="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit mrxvt"
3075 if check_com -c aterm ; then
3076 isutfenv && [[ -n "$LANG" ]] && \
3077 alias aterm="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit aterm"
3080 if check_com -c centericq ; then
3081 isutfenv && [[ -n "$LANG" ]] && \
3082 alias centericq="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit centericq"
3087 # useful functions {{{
3090 #f4# Search for newspostings from authors
3091 agoogle() { ${=BROWSER} "http://groups.google.com/groups?as_uauthors=$*" ; }
3092 #f4# Search Debian Bug Tracking System
3094 setopt localoptions extendedglob
3095 if [[ $# -eq 1 ]]; then
3098 ${=BROWSER} "http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=$1"
3101 ${=BROWSER} "http://bugs.debian.org/cgi-bin/pkgreport.cgi?submitter=$1"
3104 ${=BROWSER} "http://bugs.debian.org/$*"
3108 print "$0 needs one argument"
3112 #f4# Search Debian Bug Tracking System in mbox format
3113 debbugm() { bts show --mbox $1 } # provide bugnummer as "$1"
3115 dmoz() { ${=BROWSER} http://search.dmoz.org/cgi-bin/search\?search=${1// /_} }
3116 #f4# Search German Wiktionary
3117 dwicti() { ${=BROWSER} http://de.wiktionary.org/wiki/${(C)1// /_} }
3118 #f4# Search English Wiktionary
3119 ewicti() { ${=BROWSER} http://en.wiktionary.org/wiki/${(C)1// /_} }
3120 #f4# Search Google Groups
3121 ggogle() { ${=BROWSER} "http://groups.google.com/groups?q=$*" }
3123 google() { ${=BROWSER} "http://www.google.com/search?&num=100&q=$*" }
3124 #f4# Search Google Groups for MsgID
3125 mggogle() { ${=BROWSER} "http://groups.google.com/groups?selm=$*" }
3126 #f4# Search Netcraft
3127 netcraft(){ ${=BROWSER} "http://toolbar.netcraft.com/site_report?url=$1" }
3128 #f4# Use German Wikipedia's full text search
3129 swiki() { ${=BROWSER} http://de.wikipedia.org/wiki/Spezial:Search/${(C)1} }
3130 #f4# search \kbd{dict.leo.org}
3131 oleo() { ${=BROWSER} "http://dict.leo.org/?search=$*" }
3132 #f4# Search German Wikipedia
3133 wikide() { ${=BROWSER} http://de.wikipedia.org/wiki/"${(C)*}" }
3134 #f4# Search English Wikipedia
3135 wikien() { ${=BROWSER} http://en.wikipedia.org/wiki/"${(C)*}" }
3136 #f4# Search official debs
3137 wodeb() { ${=BROWSER} "http://packages.debian.org/search?keywords=$1&searchon=contents&suite=${2:=unstable}§ion=all" }
3139 #m# f4 gex() Exact search via Google
3140 check_com google && gex () { google "\"[ $1]\" $*" } # exact search at google
3143 #f5# Backup \kbd{file {\rm to} file\_timestamp}
3144 bk() { cp -b ${1} ${1}_`date --iso-8601=m` }
3146 cdiff() { diff -crd "$*" | egrep -v "^Only in |^Binary files " }
3147 #f5# cd to directoy and list files
3148 cl() { cd $1 && ls -a } # cd && ls
3150 cvsa() { cvs add $* && cvs com -m 'initial checkin' $* }
3152 cvsd() { cvs diff -N $* |& $PAGER }
3154 cvsl() { cvs log $* |& $PAGER }
3156 cvsq() { cvs -nq update }
3158 cvsr() { rcs2log $* | $PAGER }
3160 cvss() { cvs status -v $* }
3161 #f5# Disassemble source files using gcc and as
3162 disassemble(){ gcc -pipe -S -o - -O -g $* | as -aldh -o /dev/null }
3163 #f5# Firefox remote control - open given URL
3164 fir() { firefox -a firefox -remote "openURL($1)" }
3165 #f5# Create Directoy and \kbd{cd} to it
3166 mcd() { mkdir -p "$@"; cd "$@" } # mkdir && cd
3167 #f5# Unified diff to timestamped outputfile
3168 mdiff() { diff -udrP "$1" "$2" > diff.`date "+%Y-%m-%d"`."$1" }
3169 #f5# Memory overview
3170 memusage(){ ps aux | awk '{if (NR > 1) print $5; if (NR > 2) print "+"} END { print "p" }' | dc }
3171 #f5# Show contents of tar file
3172 shtar() { gunzip -c $1 | tar -tf - -- | $PAGER }
3173 #f5# Show contents of tgz file
3174 shtgz() { tar -ztf $1 | $PAGER }
3175 #f5# Show contents of zip file
3176 shzip() { unzip -l $1 | $PAGER }
3177 #f5# Greps signature from file
3178 sig() { agrep -d '^-- $' "$*" ~/.Signature }
3180 udiff() { diff -urd $* | egrep -v "^Only in |^Binary files " }
3181 #f5# (Mis)use \kbd{vim} as \kbd{less}
3182 viless() { vim --cmd 'let no_plugin_maps = 1' -c "so \$VIMRUNTIME/macros/less.vim" "${@:--}" }
3184 # download video from youtube
3186 if ! [[ -n "$2" ]] ; then
3187 print "Usage: ydtl http://youtube.com/watch?v=.... outputfile.flv">&2
3190 wget -O${2} "http://youtube.com/get_video?"${${${"$(wget -o/dev/null -O- "${1}" | grep -e watch_fullscreen)"}##*watch_fullscreen\?}%%\&fs=*}
3194 # Function Usage: uopen $URL/$file
3195 #f5# Download a file and display it locally
3197 if ! [[ -n "$1" ]] ; then
3198 print "Usage: uopen \$URL/\$file">&2
3202 MIME=$(curl --head $FILE | grep Content-Type | cut -d ' ' -f 2 | cut -d\; -f 1)
3204 curl $FILE | see ${MIME}:-
3208 # Function Usage: doc packagename
3209 #f5# \kbd{cd} to /usr/share/doc/\textit{package}
3210 doc() { cd /usr/share/doc/$1 && ls }
3211 _doc() { _files -W /usr/share/doc -/ }
3212 check_com compdef && compdef _doc doc
3214 #f5# Make screenshot
3216 [[ ! -d ~/shots ]] && mkdir ~/shots
3217 #cd ~/shots ; sleep 5 ; import -window root -depth 8 -quality 80 `date "+%Y-%m-%d--%H:%M:%S"`.png
3218 cd ~/shots ; sleep 5; import -window root shot_`date --iso-8601=m`.jpg
3224 images=( *.{jpg,gif,png}(.N) )
3226 if [[ $#images -eq 0 ]] ; then
3227 print "No image files found"
3229 ls "$@" "$images[@]"
3233 #f5# Create PDF file from source code
3237 a2ps --medium A4dj -E -o $output $*
3241 # zsh with perl-regex - use it e.g. via:
3242 # regcheck '\s\d\.\d{3}\.\d{3} Euro' ' 1.000.000 Euro'
3243 #f5# Checks whether a regex matches or not.\\&\quad Example: \kbd{regcheck '.\{3\} EUR' '500 EUR'}
3245 zmodload -i zsh/pcre
3246 pcre_compile $1 && \
3247 pcre_match $2 && echo "regex matches" || echo "regex does not match"
3250 #f5# List files which have been modified within the last {\it n} days
3251 new() { print -l *(m-$1) }
3253 #f5# Grep in history
3254 greph() { history 0 | grep $1 }
3255 # use colors when GNU grep with color-support
3256 #a2# Execute \kbd{grep -{}-color=auto}
3257 (grep --help 2>/dev/null |grep -- --color) >/dev/null && alias grep='grep --color=auto'
3258 #a2# Execute \kbd{grep -i -{}-color=auto}
3259 alias GREP='grep -i --color=auto'
3261 # one blank line between each line
3262 if [[ -r ~/.terminfo/m/mostlike ]] ; then
3263 #f5# Watch manpages in a stretched style
3264 man2() { PAGER='dash -c "sed G | /usr/bin/less"' TERM=mostlike /usr/bin/man "$@" ; }
3267 # d():Copyright 2005 Nikolai Weibull <nikolai@bitwi.se>
3268 # notice: option AUTO_PUSHD has to be set
3269 #f5# Jump between directories
3273 local color=$fg_bold[blue]
3275 dirs -p | while read dir; do
3276 local num="${$(printf "%-4d " $i)/ /.}"
3277 printf " %s $color%s$reset_color\n" $num $dir
3281 read -r 'dir?Jump to directory: ' || return
3282 (( dir == -1 )) && return
3283 if (( dir < 0 || dir >= i )); then
3284 echo d: no such directory stack entry: $dir
3290 # usage example: 'lcheck strcpy'
3291 #f5# Find out which libs define a symbol
3293 if [[ -n "$1" ]] ; then
3294 nm -go /usr/lib/lib*.a 2>/dev/null | grep ":[[:xdigit:]]\{8\} . .*$1"
3296 echo "Usage: lcheck <function>" >&2
3300 #f5# Clean up directory - remove well known tempfiles
3302 FILES=(*~(N) .*~(N) \#*\#(N) *.o(N) a.out(N) *.core(N) *.cmo(N) *.cmi(N) .*.swp(N))
3304 if [[ $NBFILES > 0 ]] ; then
3307 echo -n "Remove these files? [y/n] "
3309 if [[ $ans == "y" ]] ; then
3311 echo ">> $PWD purged, $NBFILES files removed"
3313 echo "Ok. .. than not.."
3319 # 'translate' looks up fot a word in a file with language-to-language
3320 # translations (field separator should be " : "). A typical wordlist looks
3322 # | english-word : german-transmission
3323 # It's also only possible to translate english to german but not reciprocal.
3324 # Use the following oneliner to turn back the sort order:
3325 # $ awk -F ':' '{ print $2" : "$1" "$3 }' \
3326 # /usr/local/lib/words/en-de.ISO-8859-1.vok > ~/.translate/de-en.ISO-8859-1.vok
3327 #f5# Translates a word
3331 translate -l de-en $2
3334 translate -l en-de $2
3337 echo "Usage: $0 { -D | -E }"
3338 echo " -D == German to English"
3339 echo " -E == English to German"
3343 #f5# List all occurrences of programm in current PATH
3345 if [[ $# = 0 ]] ; then
3346 echo "Usage: $0 program"
3347 echo "Example: $0 zsh"
3348 echo "Lists all occurrences of program in the current PATH."
3350 ls -l ${^path}/*$1*(*N)
3354 # Found in the mailinglistarchive from Zsh (IIRC ~1996)
3355 #f5# Select items for specific command(s) from history
3360 echo "Usage: $0 command"
3363 cmd=(${(f)"$(grep -w $1 $HISTFILE | sort | uniq | pr -tn)"})
3364 print -l $cmd | less -F
3365 echo -n "enter number of desired command [1 - $(( ${#cmd[@]} - 1 ))]: "
3368 print -z "${cmd[$answer]#*$TAB}"
3371 # Use vim to convert plaintext to HTML
3372 #f5# Transform files to html with highlighting
3373 2html() { vim -u NONE -n -c ':syntax on' -c ':so $VIMRUNTIME/syntax/2html.vim' -c ':wqa' $1 &>/dev/null }
3375 # Usage: simple-extract <file>
3376 #f5# Smart archive extractor
3378 if [[ -f $1 ]] ; then
3380 *.tar.bz2) bzip2 -v -d $1 ;;
3381 *.tar.gz) tar -xvzf $1 ;;
3384 *.bz2) bzip2 -d $1 ;;
3386 *.gz) gunzip -d $1 ;;
3387 *.tar) tar -xvf $1 ;;
3388 *.tgz) gunzip -d $1 ;;
3389 *.tbz2) tar -jxvf $1 ;;
3391 *.Z) uncompress $1 ;;
3392 *) echo "'$1' Error. Please go away" ;;
3395 echo "'$1' is not a valid file"
3399 # Usage: smartcompress <file> (<type>)
3400 #f5# Smart archive creator
3402 if [[ -n $2 ]] ; then
3404 tgz | tar.gz) tar -zcvf$1.$2 $1 ;;
3405 tbz2 | tar.bz2) tar -jcvf$1.$2 $1 ;;
3406 tar.Z) tar -Zcvf$1.$2 $1 ;;
3407 tar) tar -cvf$1.$2 $1 ;;
3408 gz | gzip) gzip $1 ;;
3409 bz2 | bzip2) bzip2 $1 ;;
3411 echo "Error: $2 is not a valid compression type"
3415 smartcompress $1 tar.gz
3419 # Usage: show-archive <archive>
3420 #f5# List an archive's content
3422 if [[ -f $1 ]] ; then
3424 *.tar.gz) gunzip -c $1 | tar -tf - -- ;;
3425 *.tar) tar -tf $1 ;;
3426 *.tgz) tar -ztf $1 ;;
3427 *.zip) unzip -l $1 ;;
3429 *.deb) dpkg-deb --fsys-tarfile $1 | tar -tf - -- ;;
3430 *) echo "'$1' Error. Please go away" ;;
3433 echo "'$1' is not a valid archive"
3437 # It's shameless stolen from <http://www.vim.org/tips/tip.php?tip_id=167>
3438 #f5# Use \kbd{vim} as your manpage reader
3439 vman() { man $* | col -b | view -c 'set ft=man nomod nolist' - }
3441 # function readme() { $PAGER -- (#ia3)readme* }
3442 #f5# View all README-like files in current directory in pager
3445 files=(./(#i)*(read*me|lue*m(in|)ut)*(ND))
3446 if (($#files)) ; then
3449 print 'No README files.'
3453 # function ansi-colors()
3454 #f5# Display ANSI colors
3456 typeset esc="\033[" line1 line2
3457 echo " _ _ _40 _ _ _41_ _ _ _42 _ _ 43_ _ _ 44_ _ _45 _ _ _ 46_ _ _ 47_ _ _ 49_ _"
3458 for fore in 30 31 32 33 34 35 36 37; do
3461 for back in 40 41 42 43 44 45 46 47 49; do
3462 line1="${line1}${esc}${back};${fore}m Normal ${esc}0m"
3463 line2="${line2}${esc}${back};${fore};1m Bold ${esc}0m"
3465 echo -e "$line1\n$line2"
3469 # suidfind() { ls -latg $path | grep '^...s' }
3470 #f5# Find all files in \$PATH with setuid bit set
3471 suidfind() { ls -latg $path/*(sN) }
3473 # See above but this is /better/ ... anywise ..
3475 print 'Output will be written to ~/suid_* ...'
3476 $SUDO find / -type f \( -perm -4000 -o -perm -2000 \) -ls > ~/suid_suidfiles.`date "+%Y-%m-%d"`.out 2>&1
3477 $SUDO find / -type d \( -perm -4000 -o -perm -2000 \) -ls > ~/suid_suiddirs.`date "+%Y-%m-%d"`.out 2>&1
3478 $SUDO find / -type f \( -perm -2 -o -perm -20 \) -ls > ~/suid_writefiles.`date "+%Y-%m-%d"`.out 2>&1
3479 $SUDO find / -type d \( -perm -2 -o -perm -20 \) -ls > ~/suid_writedirs.`date "+%Y-%m-%d"`.out 2>&1
3483 #f5# Reload given functions
3485 for func in $argv ; do
3491 # a small check to see which DIR is located on which server/partition.
3492 # stolen and modified from Sven's zshrc.forall
3493 #f5# Report diskusage of a directory
3495 if [[ -n "$1" ]] ; then
3497 if [[ -d "$dir" ]] ; then
3498 ( cd $dir; echo "-<$dir>"; du -shx .; echo);
3500 echo "warning: $dir does not exist" >&2
3504 for dir in $path; do
3505 if [[ -d "$dir" ]] ; then
3506 ( cd $dir; echo "-<$dir>"; du -shx .; echo);
3508 echo "warning: $dir does not exist" >&2
3514 # % slow_print `cat /etc/passwd`
3515 #f5# Slowly print out parameters
3517 for argument in "${@}" ; do
3518 for ((i = 1; i <= ${#1} ;i++)) ; do
3519 print -n "${argument[i]}"
3527 #f5# Show some status info
3530 print "Date..: "$(date "+%Y-%m-%d %H:%M:%S")""
3531 print "Shell.: Zsh $ZSH_VERSION (PID = $$, $SHLVL nests)"
3532 print "Term..: $TTY ($TERM), $BAUD bauds, $COLUMNS x $LINES cars"
3533 print "Login.: $LOGNAME (UID = $EUID) on $HOST"
3534 print "System: $(cat /etc/[A-Za-z]*[_-][rv]e[lr]*)"
3535 print "Uptime:$(uptime)"
3540 #f5# Rip an audio CD
3544 cdrdao read-cd --device $DEVICE --driver generic-mmc audiocd.toc
3545 cdrdao read-cddb --device $DEVICE --driver generic-mmc audiocd.toc
3546 echo " * Would you like to burn the cd now? (yes/no)"
3548 if [[ "$input" = "yes" ]] ; then
3549 echo " ! Burning Audio CD"
3553 echo " ! Invalid response."
3558 #f5# Burn an audio CD (in combination with audiorip)
3561 cdrdao write --device $DEVICE --driver generic-mmc audiocd.toc
3562 echo " * Should I remove the temporary files? (yes/no)"
3564 if [[ "$input" = "yes" ]] ; then
3565 echo " ! Removing Temporary Files."
3570 echo " ! Invalid response."
3574 #f5# Make an audio CD from all mp3 files
3576 # TODO: do the renaming more zshish, possibly with zmv()
3578 for i in *.[Mm][Pp]3; do mv "$i" `echo $i | tr '[A-Z]' '[a-z]'`; done
3579 for i in *.mp3; do mv "$i" `echo $i | tr ' ' '_'`; done
3580 for i in *.mp3; do mpg123 -w `basename $i .mp3`.wav $i; done
3582 for i in *.wav; do sox $i.wav -r 44100 $i.wav resample; done
3585 #f5# Create an ISO image. You are prompted for\\&\quad volume name, filename and directory
3587 echo " * Volume name "
3589 echo " * ISO Name (ie. tmp.iso)"
3591 echo " * Directory or File"
3593 mkisofs -o ~/$iso -A $volume -allow-multidot -J -R -iso-level 3 -V $volume -R $files
3596 #f5# Simple thumbnails generator
3598 rm -rf thumb-* index.html
3602 <title>Images</title>
3604 <body>" > index.html
3605 for f in *.(gif|jpeg|jpg|png) ; do
3606 convert -size 100x200 "$f" -resize 100x200 thumb-"$f"
3607 echo " <a href=\"$f\"><img src=\"thumb-$f\"></a>" >> index.html
3611 </html>" >> index.html
3614 #f5# Set all ulimit parameters to \kbd{unlimited}
3625 # ogg2mp3 with bitrate of 192
3627 oggdec -o - ${1} | lame -b 192 - ${1:r}.mp3
3630 #f5# RFC 2396 URL encoding in Z-Shell
3632 setopt localoptions extendedglob
3634 print ${(j::)input/(#b)([^A-Za-z0-9_.!~*\'\(\)-])/%${(l:2::0:)$(([##16]#match))}}
3637 #f5# Install x-lite (VoIP software)
3639 setopt local_options
3641 [[ -d ~/tmp ]] || mkdir ~/tmp
3644 echo "Downloading http://www.counterpath.com/download/X-Lite_Install.tar.gz and storing it in ~/tmp:"
3645 if wget http://www.counterpath.com/download/X-Lite_Install.tar.gz ; then
3646 unp X-Lite_Install.tar.gz && echo done || echo failed
3648 echo "Error while downloading." ; return 1
3651 if [[ -x xten-xlite/xtensoftphone ]] ; then
3652 echo "Execute xten-xlite/xtensoftphone to start xlite."
3658 setopt local_options
3660 echo "Downloading debian package of skype."
3661 echo "Notice: If you want to use a more recent skype version run 'getskypebeta'."
3662 wget http://www.skype.com/go/getskype-linux-deb
3663 $SUDO dpkg -i skype*.deb && echo "skype installed."
3666 #f5# Install beta-version of skype
3668 setopt local_options
3670 echo "Downloading debian package of skype (beta version)."
3671 wget http://www.skype.com/go/getskype-linux-beta-deb
3672 $SUDO dpkg -i skype-beta*.deb && echo "skype installed."
3675 #f5# Install gizmo (VoIP software)
3677 setopt local_options
3679 echo "libgtk2.0-0, gconf2, libstdc++6, libasound2 and zlib1g have to be available. Installing."
3680 $SUDO apt-get update
3681 $SUDO apt-get install libgtk2.0-0 gconf2 libstdc++6 libasound2 zlib1g
3682 wget "$(lynx --dump http://gizmo5.com/pc/download/linux/ | awk '/libstdc\+\+6.*\.deb/ {print $2}')"
3683 $SUDO dpkg -i gizmo-project*.deb && echo "gizmo installed."
3686 #f5# Get and run AIR (Automated Image and Restore)
3688 setopt local_options
3690 [[ -w . ]] || { echo 'Error: you do not have write permissions in this directory. Exiting.' ; return 1 }
3692 wget http://puzzle.dl.sourceforge.net/sourceforge/air-imager/air-$VER.tar.gz
3693 tar zxf air-$VER.tar.gz
3695 INTERACTIVE=no $SUDO ./install-air-1.2.8
3696 [[ -x /usr/local/bin/air ]] && [[ -n "$DISPLAY" ]] && $SUDO air
3699 #f5# Get specific git commitdiff
3701 if [[ -z $GITTREE ]] ; then
3702 GITTREE='linux/kernel/git/torvalds/linux-2.6.git'
3704 if ! [[ -z $1 ]] ; then
3705 ${=BROWSER} "http://kernel.org/git/?p=$GITTREE;a=commitdiff;h=$1"
3707 echo "Usage: git-get-diff <commit>"
3711 #f5# Get specific git commit
3713 if [[ -z $GITTREE ]] ; then
3714 GITTREE='linux/kernel/git/torvalds/linux-2.6.git'
3716 if ! [[ -z $1 ]] ; then
3717 ${=BROWSER} "http://kernel.org/git/?p=$GITTREE;a=commit;h=$1"
3719 echo "Usage: git-get-commit <commit>"
3723 #f5# Get specific git diff
3724 git-get-plaindiff () {
3725 if [[ -z $GITTREE ]] ; then
3726 GITTREE='linux/kernel/git/torvalds/linux-2.6.git'
3728 if [[ -z $1 ]] ; then
3729 echo 'Usage: git-get-plaindiff '
3731 echo -n "Downloading $1.diff ... "
3732 # avoid "generating ..." stuff from kernel.org server:
3733 wget --quiet "http://kernel.org/git/?p=$GITTREE;a=commitdiff_plain;h=$1" -O /dev/null
3734 wget --quiet "http://kernel.org/git/?p=$GITTREE;a=commitdiff_plain;h=$1" -O $1.diff \
3735 && echo done || echo failed
3740 # http://strcat.de/blog/index.php?/archives/335-Software-sauber-deinstallieren...html
3741 #f5# Log 'make install' output
3743 [[ ! -d ~/.errorlogs ]] && mkdir ~/.errorlogs
3744 make -n install > ~/.errorlogs/${PWD##*/}-makelog
3747 #f5# Indent source code
3749 indent -npro -kr -i8 -ts8 -sob -l80 -ss -ncs $*
3752 # highlight important stuff in diff output, usage example: hg diff | hidiff
3753 #m# a2 hidiff \kbd{histring} oneliner for diffs
3754 check_com -c histring && \
3755 alias hidiff="histring -fE '^Comparing files .*|^diff .*' | histring -c yellow -fE '^\-.*' | histring -c green -fE '^\+.*'"
3757 # rename pictures based on information found in exif headers
3758 #f5# Rename pictures based on information found in exif headers
3760 if [[ $# -lt 1 ]] ; then
3761 echo 'Usage: jpgrename $FILES' >& 2
3764 echo -n 'Checking for jhead with version newer than 1.9: '
3765 jhead_version=`jhead -h | grep 'used by most Digital Cameras. v.*' | awk '{print $6}' | tr -d v`
3766 if [[ $jhead_version > '1.9' ]]; then
3767 echo 'success - now running jhead.'
3768 jhead -n%Y-%m-%d_%Hh%M_%f $*
3770 echo 'failed - exiting.'
3775 # open file in vim and jump to line
3776 # http://www.downgra.de/archives/2007/05/08/T19_21_11/
3779 params=(${*//(#m):[0-9]*:/\\n+${MATCH//:/}}) # replace ':23:' to '\n+23'
3780 params=(${(s|\n|)${(j|\n|)params}}) # join array using '\n', then split on all '\n'
3784 # get_ic() - queries imap servers for capabilities; real simple. no imaps
3787 if [[ ! -z $1 ]] ; then
3789 print "querying imap server on $1:${port}...\n";
3790 print "a1 capability\na2 logout\n" | nc $1 ${port}
3792 print "usage:\n $0 <imap-server> [port]"
3796 # creates a Maildir/ with its {new,cur,tmp} subdirs
3799 root=${MAILDIR_ROOT:-${HOME}/Mail}
3800 if [[ -z ${1} ]] ; then print "Usage:\n $0 <dirname>" ; return 1 ; fi
3802 mkdir -p ${root}/${subdir}/{cur,new,tmp}
3805 # xtrename() rename xterm from within GNU-screen
3807 if [[ -z ${DISPLAY} ]] ; then
3808 printf 'xtrename only makes sense in X11.\n'
3811 if [[ -z ${1} ]] ; then
3812 printf 'usage: xtrename() "title for xterm"\n'
3813 printf ' renames the title of xterm from _within_ screen.\n'
3814 printf ' Also works without screen.\n'
3817 print -n "\eP\e]0;${1}\C-G\e\\"
3821 # hl() highlighted less
3822 # http://ft.bewatermyfriend.org/comp/data/zsh/zfunct.html
3823 if check_com -c highlight ; then
3826 theme=${HL_THEME:-""}
3829 ( printf 'available languages (syntax parameter):\n\n' ;
3830 highlight --list-langs ; ) | less -SMr
3833 ( printf 'available themes (style parameter):\n\n' ;
3834 highlight --list-themes ; ) | less -SMr
3837 printf 'usage: hl <syntax[:theme]> <file>\n'
3838 printf ' available options: --list (-l), --themes (-t), --help (-h)\n\n'
3839 printf ' Example: hl c main.c\n'
3842 if [[ -z ${2} ]] || (( ${#argv} > 2 )) ; then
3843 printf 'usage: hl <syntax[:theme]> <file>\n'
3844 printf ' available options: --list (-l), --themes (-t), --help (-h)\n'
3845 (( ${#argv} > 2 )) && printf ' Too many arguments.\n'
3849 [[ ${1} == *:* ]] && [[ -n ${1#*:} ]] && theme=${1#*:}
3850 if [[ -n ${theme} ]] ; then
3851 highlight --xterm256 --syntax ${lang} --style ${theme} ${2} | less -SMr
3853 highlight --ansi --syntax ${lang} ${2} | less -SMr
3859 # ... and a proper completion for hl()
3860 # needs 'highlight' as well, so it fits fine in here.
3861 function _hl_genarg() {
3863 if [[ -prefix 1 *: ]] ; then
3865 themes=(${${${(f)"$(LC_ALL=C highlight --list-themes)"}/ #/}:#*(Installed|Use name)*})
3867 _wanted -C list themes expl theme compadd ${themes}
3870 langs=(${${${(f)"$(LC_ALL=C highlight --list-langs)"}/ #/}:#*(Installed|Use name)*})
3871 _wanted -C list languages expl languages compadd -S ':' -q ${langs}
3874 function _hl_complete() {
3875 _arguments -s '1: :_hl_genarg' '2:files:_path_files'
3877 compdef _hl_complete hl
3880 # create small urls via tinyurl.com using wget, grep and sed
3882 [[ -z ${1} ]] && print "please give an url to shrink." && return 1
3884 local tiny="http://tinyurl.com/create.php?url="
3885 #print "${tiny}${url}" ; return
3889 | grep -Eio 'value="(http://tinyurl.com/.*)"' \
3890 | sed 's/value=//;s/"//g'
3893 #f2# Print a specific line of file(s).
3896 if [ $# -lt 2 ] ; then
3897 print "Usage: linenr <number>[,<number>] <file>" ; return 1
3898 elif [ $# -eq 2 ] ; then
3901 command ed -s $file <<< "${number}n"
3905 for file in "$@" ; do
3906 if [ ! -d $file ] ; then
3908 command ed -s $file <<< "${number}n" 2> /dev/null
3917 #f2# Find history events by search pattern and list them by date.
3920 local usage help ident format_l format_s first_char remain first last
3921 usage='USAGE: whatwhen [options] <searchstring> <search range>'
3922 help='Use' \`'whatwhen -h'\'' for further explanations.'
3923 ident=${(l,${#${:-Usage: }},, ,)}
3924 format_l="${ident}%s\t\t\t%s\n"
3925 format_s="${format_l//(\\t)##/\\t}"
3926 # Make the first char of the word to search for case
3927 # insensitive; e.g. [aA]
3928 first_char=[${(L)1[1]}${(U)1[1]}]
3930 # Default search range is `-100'.
3932 # Optional, just used for `<first> <last>' given.
3936 printf '%s\n\n' 'ERROR: No search string specified. Aborting.'
3937 printf '%s\n%s\n\n' ${usage} ${help} && return 1
3940 printf '%s\n\n' ${usage}
3942 printf $format_l '-h' 'show help text'
3944 print 'SEARCH RANGE:'
3945 printf $format_l "'0'" 'the whole history,'
3946 printf $format_l '-<n>' 'offset to the current history number; (default: -100)'
3947 printf $format_s '<[-]first> [<last>]' 'just searching within a give range'
3948 printf '\n%s\n' 'EXAMPLES:'
3949 printf ${format_l/(\\t)/} 'whatwhen grml' '# Range is set to -100 by default.'
3950 printf $format_l 'whatwhen zsh -250'
3951 printf $format_l 'whatwhen foo 1 99'
3954 printf '%s\n%s\n\n' ${usage} ${help} && return 1
3957 # -l list results on stout rather than invoking $EDITOR.
3958 # -i Print dates as in YYYY-MM-DD.
3959 # -m Search for a - quoted - pattern within the history.
3960 fc -li -m "*${first_char}${remain}*" $first $last
3966 # change fluxbox keys from 'Alt-#' to 'Alt-F#' and vice versa
3968 [[ -n "$FLUXKEYS" ]] || local FLUXKEYS="$HOME/.fluxbox/keys"
3969 if ! [[ -r "$FLUXKEYS" ]] ; then
3970 echo "Sorry, \$FLUXKEYS file $FLUXKEYS could not be read - nothing to be done."
3973 if grep -q 'Mod1 F[0-9] :Workspace [0-9]' $FLUXKEYS ; then
3974 echo -n 'Switching to Alt-# mode in ~/.fluxbox/keys: '
3975 sed -i -e 's|^\(Mod[0-9]\+[: space :]\+\)F\([0-9]\+[: space :]\+:Workspace.*\)|\1\2|' $FLUXKEYS && echo done || echo failed
3976 elif grep -q 'Mod1 [0-9] :Workspace [0-9]' $FLUXKEYS ; then
3977 echo -n 'Switching to Alt-F# mode in ~/.fluxbox/keys: '
3978 sed -i -e 's|^\(Mod[0-9]\+[: space :]\+\)\([0-9]\+[: space :]\+:Workspace.*\)|\1F\2|' $FLUXKEYS && echo done || echo failed
3980 echo 'Sorry, do not know what to do.'
3986 # retrieve weather information on the console
3987 # Usage example: 'weather LOWG'
3990 print 'Usage: weather <station_id>' >&2
3991 print 'List of stations: http://en.wikipedia.org/wiki/List_of_airports_by_ICAO_code'>&2
3995 local PLACE="${1:u}"
3996 local FILE="$HOME/.weather/$PLACE"
3997 local LOG="$HOME/.weather/log"
3999 [[ -d $HOME/.weather ]] || {
4000 print -n "Creating $HOME/.weather: "
4001 mkdir $HOME/.weather
4005 print "Retrieving information for ${PLACE}:"
4007 wget -T 10 --no-verbose --output-file=$LOG --output-document=$FILE --timestamping http://weather.noaa.gov/pub/data/observations/metar/decoded/$PLACE.TXT
4009 if [[ $? -eq 0 ]] ; then
4010 if [[ -n "$VERBOSE" ]] ; then
4013 DATE=$(grep 'UTC' $FILE | sed 's#.* /##')
4014 TEMPERATURE=$(awk '/Temperature/ { print $4" degree Celcius / " $2" degree Fahrenheit" }' $FILE| tr -d '(')
4016 echo "temp: $TEMPERATURE"
4019 print "There was an error retrieving the weather information for $PLACE" >&2
4026 # mercurial related stuff {{{
4027 if check_com -c hg ; then
4028 # gnu like diff for mercurial
4029 # http://www.selenic.com/mercurial/wiki/index.cgi/TipsAndTricks
4030 #f5# GNU like diff for mercurial
4032 for i in $(hg status -marn "$@") ; diff -ubwd <(hg cat "$i") "$i"
4035 # build debian package
4036 #a2# Alias for \kbd{hg-buildpackage}
4037 alias hbp='hg-buildpackage'
4039 # execute commands on the versioned patch-queue from the current repos
4040 alias mq='hg -R $(readlink -f $(hg root)/.hg/patches)'
4042 # diffstat for specific version of a mercurial repository
4043 # hgstat => display diffstat between last revision and tip
4044 # hgstat 1234 => display diffstat between revision 1234 and tip
4045 #f5# Diffstat for specific version of a mercurial repos
4047 [[ -n "$1" ]] && hg diff -r $1 -r tip | diffstat || hg export tip | diffstat
4050 #f5# Get current mercurial tip via hg itself
4052 setopt local_options
4054 if [[ -f mercurial-tree/.hg ]] ; then
4056 echo "Running hg pull for retreiving latest version..."
4058 echo "Finished update. Building mercurial"
4060 echo "Setting \$PATH to $PWD:\$PATH..."
4061 export PATH="$PWD:$PATH"
4063 echo "Downloading mercurial via hg"
4064 hg clone http://selenic.com/repo/hg mercurial-tree
4066 echo "Building mercurial"
4068 echo "Setting \$PATH to $PWD:\$PATH..."
4069 export PATH="$PWD:$PATH"
4070 echo "make sure you set it permanent via ~/.zshrc if you plan to use it permanently."
4071 # echo "Setting \$PYTHONPATH to PYTHONPATH=\${HOME}/lib/python,"
4072 # export PYTHONPATH=${HOME}/lib/python
4076 fi # end of check whether we have the 'hg'-executable
4078 # get current mercurial snapshot
4079 #f5# Get current mercurial snapshot
4081 setopt local_options
4083 if [[ -f mercurial-snapshot.tar.gz ]] ; then
4084 echo "mercurial-snapshot.tar.gz exists already, skipping download."
4086 echo "Downloading mercurial snapshot"
4087 wget http://www.selenic.com/mercurial/mercurial-snapshot.tar.gz
4089 echo "Unpacking mercurial-snapshot.tar.gz"
4090 tar zxf mercurial-snapshot.tar.gz
4091 cd mercurial-snapshot/
4092 echo "Installing required build-dependencies"
4093 $SUDO apt-get update
4094 $SUDO apt-get install python2.4-dev
4095 echo "Building mercurial"
4097 echo "Setting \$PATH to $PWD:\$PATH..."
4098 export PATH="$PWD:$PATH"
4099 echo "make sure you set it permanent via ~/.zshrc if you plan to use it permanently."
4103 # some useful commands often hard to remember - let's grep for them {{{
4104 # actually use our zg() function now. :)
4106 # Work around ion/xterm resize bug.
4107 #if [[ "$SHLVL" -eq 1 ]]; then
4108 # if check_com -c resize ; then
4109 # eval `resize </dev/null`
4114 # /usr/bin/jackd -dalsa -dhw:0 -r48000 -p1024 -n2
4115 # now play audio file:
4116 # alsaplayer -o jack foobar.mp3
4118 # send files via netcat
4120 # send() {j=$*; tar cpz ${j/%${!#}/}|nc -w 1 ${!#} 51330;}
4122 # alias receive='nc -vlp 51330 | tar xzvp'
4125 # dh_make -e foo@localhost -f $1
4126 # dpkg-buildpackage -rfakeroot
4128 # dpkg-scanpackages ./ /dev/null | gzip > Packages.gz
4129 # dpkg-scansources . | gzip > Sources.gz
4130 # grep-dctrl --field Maintainer $* /var/lib/apt/lists/*
4133 # convert -geometry 200x200 -interlace LINE -verbose
4134 # ldapsearch -x -b "OU=Bedienstete,O=tug" -h ldap.tugraz.at sn=$1
4135 # ps -ao user,pcpu,start,command
4136 # gpg --keyserver blackhole.pca.dfn.de --recv-keys
4137 # xterm -bg black -fg yellow -fn -misc-fixed-medium-r-normal--14-140-75-75-c-90-iso8859-15 -ah
4138 # nc -vz $1 1-1024 # portscan via netcat
4139 # wget --mirror --no-parent --convert-links
4141 # autoload -U tetris; zle -N tetris; bindkey '...' ; echo "press ... for playing tennis"
4143 # modify console cursor
4144 # see http://www.tldp.org/HOWTO/Framebuffer-HOWTO-5.html
4145 # print $'\e[?96;0;64c'
4148 # grml-small cleanups {{{
4150 # The following is used to remove zsh-config-items that do not work
4151 # in grml-small by default.
4152 # If you do not want these adjustments (for whatever reason), set
4153 # $GRMLSMALL_SPECIFIC to 0 in your .zshrc.pre file (which this configuration
4154 # sources if it is there).
4156 if (( GRMLSMALL_SPECIFIC > 0 )) && isgrmlsmall ; then
4159 unalias 'V' &> /dev/null
4160 unfunction vman &> /dev/null
4161 unfunction vimpm &> /dev/null
4162 unfunction vimhelp &> /dev/null
4163 unfunction viless &> /dev/null
4164 unfunction 2html &> /dev/null
4166 # manpages are not in grmlsmall
4167 unfunction manzsh &> /dev/null
4168 unalias man2 &> /dev/null
4169 unalias man &> /dev/null
4170 unfunction man2 &> /dev/null
4176 # finally source a local zshrc {{{
4178 # this allows us to stay in sync with grml's zshrc and put own
4179 # modifications in ~/.zshrc.local
4181 xsource "${HOME}/.zshrc.local"
4185 ## genrefcard.pl settings {{{
4187 ### doc strings for external functions from files
4188 #m# f5 grml-wallpaper() Sets a wallpaper (try completion for possible values)
4190 ### example: split functions-search 8,16,24,32
4191 #@# split functions-search 8
4195 ## END OF FILE #################################################################
4196 # vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4