1 # Filename: /etc/zsh/zshrc
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 ################################################################################
15 # If you want to help to improve grml's zsh setup, clone the grml-etc-core
16 # repository from git.grml.org:
17 # git clone git://git.grml.org/grml-etc-core.git
19 # Make your changes, commit them; use 'git format-patch' to create a series
20 # of patches and send those to the following address via 'git send-email':
21 # grml-etc-core@grml.org
23 # Doing so makes sure the right people get your patches for review and
26 # zsh-refcard-tag documentation: {{{
27 # You may notice strange looking comments in this file.
28 # These are there for a purpose. grml's zsh-refcard can now be
29 # automatically generated from the contents of the actual configuration
30 # file. However, we need a little extra information on which comments
31 # and what lines of code to take into account (and for what purpose).
33 # Here is what they mean:
35 # List of tags (comment types) used:
36 # #a# Next line contains an important alias, that should
37 # be included in the grml-zsh-refcard.
38 # (placement tag: @@INSERT-aliases@@)
39 # #f# Next line contains the beginning of an important function.
40 # (placement tag: @@INSERT-functions@@)
41 # #v# Next line contains an important variable.
42 # (placement tag: @@INSERT-variables@@)
43 # #k# Next line contains an important keybinding.
44 # (placement tag: @@INSERT-keybindings@@)
45 # #d# Hashed directories list generation:
46 # start denotes the start of a list of 'hash -d'
48 # end denotes its end.
49 # (placement tag: @@INSERT-hasheddirs@@)
50 # #A# Abbreviation expansion list generation:
51 # start denotes the beginning of abbreviations.
52 # end denotes their end.
53 # Lines within this section that end in '#d .*' provide
54 # extra documentation to be included in the refcard.
55 # (placement tag: @@INSERT-abbrev@@)
56 # #m# This tag allows you to manually generate refcard entries
57 # for code lines that are hard/impossible to parse.
59 # #m# k ESC-h Call the run-help function
60 # That would add a refcard entry in the keybindings table
61 # for 'ESC-h' with the given comment.
62 # So the syntax is: #m# <section> <argument> <comment>
63 # #o# This tag lets you insert entries to the 'other' hash.
64 # Generally, this should not be used. It is there for
65 # things that cannot be done easily in another way.
66 # (placement tag: @@INSERT-other-foobar@@)
68 # All of these tags (except for m and o) take two arguments, the first
69 # within the tag, the other after the tag:
71 # #<tag><section># <comment>
73 # Where <section> is really just a number, which are defined by the
74 # @secmap array on top of 'genrefcard.pl'. The reason for numbers
75 # instead of names is, that for the reader, the tag should not differ
76 # much from a regular comment. For zsh, it is a regular comment indeed.
77 # The numbers have got the following meanings:
86 # So, the following will add an entry to the 'functions' table in the
87 # 'system' section, with a (hopefully) descriptive comment:
88 # #f1# Edit an alias via zle
91 # It will then show up in the @@INSERT-aliases-system@@ replacement tag
92 # that can be found in 'grml-zsh-refcard.tex.in'.
93 # If the section number is omitted, the 'default' section is assumed.
94 # Furthermore, in 'grml-zsh-refcard.tex.in' @@INSERT-aliases@@ is
95 # exactly the same as @@INSERT-aliases-default@@. If you want a list of
96 # *all* aliases, for example, use @@INSERT-aliases-all@@.
100 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
101 if [[ $ZSH_PROFILE_RC -gt 0 ]] ; then
106 # load .zshrc.pre to give the user the chance to overwrite the defaults
107 [[ -r ${HOME}/.zshrc.pre ]] && source ${HOME}/.zshrc.pre
109 # {{{ check for version/system
110 # check for versions (compatibility reasons)
112 [[ $ZSH_VERSION == <4->* ]] && return 0
117 [[ $ZSH_VERSION == 4.<1->* || $ZSH_VERSION == <5->* ]] && return 0
122 [[ $ZSH_VERSION == 4.<2->* || $ZSH_VERSION == <5->* ]] && return 0
127 [[ $ZSH_VERSION == 4.2.<5->* || $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0
132 [[ $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0
137 [[ $ZSH_VERSION == 4.3.<3->* || $ZSH_VERSION == <5->* ]] && return 0
141 #f1# Checks whether or not you're running grml
143 [[ -f /etc/grml_version ]] && return 0
147 #f1# Checks whether or not you're running a grml cd
149 [[ -f /etc/grml_cd ]] && return 0
154 #f1# Checks whether or not you're running grml-small
156 [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
159 isgrmlsmall() { return 1 }
163 [[ $OSTYPE == darwin* ]] && return 0
167 #f1# are we running within an utf environment?
169 case "$LANG $CHARSET $LANGUAGE" in
176 # check for user, if not running as root set $SUDO to sudo
177 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
179 # change directory to home on first invocation of zsh
180 # important for rungetty -> autologin
181 # Thanks go to Bart Schaefer!
182 isgrml && checkhome() {
183 if [[ -z "$ALREADY_DID_CD_HOME" ]] ; then
184 export ALREADY_DID_CD_HOME=$HOME
189 # check for zsh v3.1.7+
191 if ! [[ ${ZSH_VERSION} == 3.1.<7->* \
192 || ${ZSH_VERSION} == 3.<2->.<->* \
193 || ${ZSH_VERSION} == <4->.<->* ]] ; then
196 printf '-!- In this configuration we try to make use of features, that only\n'
197 printf '-!- require version 3.1.7 of the shell; That way this setup can be\n'
198 printf '-!- used with a wide range of zsh versions, while using fairly\n'
199 printf '-!- advanced features in all supported versions.\n'
201 printf '-!- However, you are running zsh version %s.\n' "$ZSH_VERSION"
203 printf '-!- While this *may* work, it might as well fail.\n'
204 printf '-!- Please consider updating to at least version 3.1.7 of zsh.\n'
206 printf '-!- DO NOT EXPECT THIS TO WORK FLAWLESSLY!\n'
207 printf '-!- If it does today, you'\''ve been lucky.\n'
209 printf '-!- Ye been warned!\n'
212 function zstyle() { : }
215 # autoload wrapper - use this one instead of autoload directly
216 # We need to define this function as early as this, because autoloading
217 # 'is-at-least()' needs it.
218 function zrcautoload() {
226 for fdir in ${fpath} ; do
227 [[ -e ${fdir}/${ffile} ]] && (( ffound = 1 ))
230 (( ffound == 0 )) && return 1
231 if [[ $ZSH_VERSION == 3.1.<6-> || $ZSH_VERSION == <4->* ]] ; then
232 autoload -U ${ffile} || return 1
234 autoload ${ffile} || return 1
239 # Load is-at-least() for more precise version checks
240 # Note that this test will *always* fail, if the is-at-least
241 # function could not be marked for autoloading.
242 zrcautoload is-at-least || is-at-least() { return 1 }
246 # {{{ set some important options (as early as possible)
247 # Please update these tags, if you change the umask settings below.
249 #o# r_umaskstr rwxrwxr-x
251 #o# umaskstr rwxr-xr-x
252 (( EUID != 0 )) && umask 002 || umask 022
254 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
255 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
256 setopt extended_history # save each command's beginning timestamp and the duration to the history file
257 is4 && setopt histignorealldups # If a new command line being added to the history
258 # list duplicates an older one, the older command is removed from the list
259 setopt histignorespace # remove command lines from the history list when
260 # the first character on the line is a space
261 setopt auto_cd # if a command is issued that can't be executed as a normal command,
262 # and the command is the name of a directory, perform the cd command to that directory
263 setopt extended_glob # in order to use #, ~ and ^ for filename generation
264 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
265 # -> searches for word not in compressed files
266 # don't forget to quote '^', '~' and '#'!
267 setopt longlistjobs # display PID when suspending processes as well
268 setopt notify # report the status of backgrounds jobs immediately
269 setopt hash_list_all # Whenever a command completion is attempted, make sure \
270 # the entire command path is hashed first.
271 setopt completeinword # not just at the end
272 setopt nohup # and don't kill them, either
273 setopt auto_pushd # make cd push the old directory onto the directory stack.
274 setopt nonomatch # try to avoid the 'zsh: no matches found...'
275 setopt nobeep # avoid "beep"ing
276 setopt pushd_ignore_dups # don't push the same dir twice.
277 setopt noglobdots # * shouldn't match dotfiles. ever.
278 setopt noshwordsplit # use zsh style word splitting
282 # setting some default values {{{
286 NOPRECMD=${NOPRECMD:-0}
287 COMMAND_NOT_FOUND=${COMMAND_NOT_FOUND:-0}
288 GRML_ZSH_CNF_HANDLER=${GRML_ZSH_CNF_HANDLER:-/usr/share/command-not-found/command-not-found}
289 BATTERY=${BATTERY:-0}
290 GRMLSMALL_SPECIFIC=${GRMLSMALL_SPECIFIC:-1}
291 GRML_ALWAYS_LOAD_ALL=${GRML_ALWAYS_LOAD_ALL:-0}
292 ZSH_NO_DEFAULT_LOCALE=${ZSH_NO_DEFAULT_LOCALE:-0}
295 GRML_WARN_SKEL=${GRML_WARN_SKEL:-0}
297 GRML_WARN_SKEL=${GRML_WARN_SKEL:-1}
300 if (( GRML_WARN_SKEL != 0 )) ; then
302 function grml_warn_skel_main() {
306 You updated grml'\''s zshrc which brings a major change.
307 The configuration is kept only in one file, being the global zshrc.
308 In the past, the configuration was split in two files, with the
309 second file being the .zshrc file from /etc/skel.
311 If you have a .zshrc file in your home directory that originally
312 came from the skel directory, please remove it. This is also the case
313 if you followed earlier instructions from the grml-zsh-refcard or
314 from <http://grml.org/console/> on non-grml systems.
316 Please see the current grml-zsh-refcard (available at
317 <http://grml.org/zsh/>) for updated installation information. In short,
318 you don'\''t want a .zshrc.global file. Install the global zshrc to
319 ~/.zshrc and be done.
321 If you need changes to the configuration, use ~/.zshrc.pre and
327 function grml_warn_skel_remove() {
328 printf 'To remove this warning execute '\''grml_do_not_warn_skel'\''.\n\n'
331 function grml_do_not_warn_skel() {
332 printf '# Do not warn about old skel dot-files anymore\n' >>! ~/.zshrc.pre
333 printf 'GRML_WARN_SKEL=0\n' >>! ~/.zshrc.pre
336 # let's try to guess how the user uses us.
337 if is-at-least 4.3.7 ; then
338 # funcsourcetrace requires at least version 4.3.7 of zsh.
339 GRML_SRC_FILE="${${funcsourcetrace[1]}%:*}"
342 case ${GRML_SRC_FILE} in
343 (${HOME}/.zshrc.global)
344 grml_warn_skel_remove
345 printf '\nIt looks like you copied the grml zshrc to '\''~/.zshrc.global'\''.\n'
346 printf 'Nowadays you just copy the global zshrc to '\''~/.zshrc'\'' to use\n'
347 printf 'it on a non-grml-system.\n'
350 printf '\nIt looks like you copied the grml zshrc to '\''~/.zshrc'\''.\n'
351 printf 'We'\''ll disable this warning automatically for later sessions.\n'
352 grml_do_not_warn_skel
355 grml_do_not_warn_skel
360 grml_warn_skel_remove
363 unfunction grml_warn_skel_remove grml_warn_skel_main
369 # utility functions {{{
370 # this function checks if a command exists and returns either true
371 # or false. This avoids using 'which' and 'whence', which will
372 # avoid problems with aliases for which on certain weird systems. :-)
373 # Usage: check_com [-c|-g] word
374 # -c only checks for external commands
375 # -g does the usual tests and also checks for global aliases
378 local -i comonly gatoo
380 if [[ $1 == '-c' ]] ; then
383 elif [[ $1 == '-g' ]] ; then
390 if (( ${#argv} != 1 )) ; then
391 printf 'usage: check_com [-c] <command>\n' >&2
395 if (( comonly > 0 )) ; then
396 [[ -n ${commands[$1]} ]] && return 0
400 if [[ -n ${commands[$1]} ]] \
401 || [[ -n ${functions[$1]} ]] \
402 || [[ -n ${aliases[$1]} ]] \
403 || [[ -n ${reswords[(r)$1]} ]] ; then
408 if (( gatoo > 0 )) && [[ -n ${galiases[$1]} ]] ; then
415 # creates an alias and precedes the command with
416 # sudo if $EUID is not zero.
419 local only=0 ; local multi=0
420 while [[ $1 == -* ]] ; do
424 (--) shift ; break ;;
426 printf 'usage: salias [-h|-o|-a] <alias-expression>\n'
427 printf ' -h shows this help text.\n'
428 printf ' -a replace '\'' ; '\'' sequences with '\'' ; sudo '\''.\n'
429 printf ' be careful using this option.\n'
430 printf ' -o only sets an alias if a preceding sudo would be needed.\n'
433 (*) printf "unkown option: '%s'\n" "$1" ; return 1 ;;
438 if (( ${#argv} > 1 )) ; then
439 printf 'Too many arguments %s\n' "${#argv}"
443 key="${1%%\=*}" ; val="${1#*\=}"
444 if (( EUID == 0 )) && (( only == 0 )); then
445 alias -- "${key}=${val}"
446 elif (( EUID > 0 )) ; then
447 (( multi > 0 )) && val="${val// ; / ; sudo }"
448 alias -- "${key}=sudo ${val}"
454 # a "print -l ${(u)foo}"-workaround for pre-4.2.0 shells
456 # Where foo is the *name* of the parameter you want printed.
457 # Note that foo is no typo; $foo would be wrong here!
465 if [[ -z ${parameter} ]] ; then
466 printf 'usage: uprint <parameter>\n'
470 for w in ${(P)parameter} ; do
471 [[ -z ${(M)u:#$w} ]] && u=( $u $w )
478 # Check if we can read given files and source those we can.
481 if (( ${#argv} < 1 )) ; then
482 printf 'usage: xsource FILE(s)...\n' >&2
486 while (( ${#argv} > 0 )) ; do
487 [[ -r $1 ]] && source $1
493 # Check if we can read a given file and 'cat(1)' it.
496 if (( ${#argv} != 1 )) ; then
497 printf 'usage: xcat FILE\n' >&2
501 [[ -r $1 ]] && cat $1
505 # Remove these functions again, they are of use only in these
506 # setup files. This should be called at the end of .zshrc.
510 funcs=(salias xcat xsource xunfunction zrcautoload)
512 for func in $funcs ; do
513 [[ -n ${functions[$func]} ]] \
519 # this allows us to stay in sync with grml's zshrc and put own
520 # modifications in ~/.zshrc.local
522 xsource "/etc/zsh/zshrc.local"
523 xsource "${HOME}/.zshrc.local"
530 if (( ZSH_NO_DEFAULT_LOCALE == 0 )); then
531 xsource "/etc/default/locale"
534 for var in LANG LC_ALL LC_MESSAGES ; do
535 [[ -n ${(P)var} ]] && export $var
538 xsource "/etc/sysconfig/keyboard"
540 TZ=$(xcat /etc/timezone)
543 # check for potentially old files in 'completion.d' {{{
545 xof=(/etc/zsh/completion.d/*~/etc/zsh/completion.d/_*(N))
546 if (( ${#xof} > 0 )) ; then
547 printf '\n -!- INFORMATION\n\n'
548 printf ' -!- %s file(s) not starting with an underscore (_) found in\n' ${#xof}
549 printf ' -!- /etc/zsh/completion.d/.\n\n'
550 printf ' -!- While this has been the case in old versions of grml-etc-core,\n'
551 printf ' -!- recent versions of the grml-zsh-setup have all these files rewritten\n'
552 printf ' -!- and renamed. Furthermore, the grml-zsh-setup will *only* add files\n'
553 printf ' -!- named _* to that directory.\n\n'
554 printf ' -!- If you added functions to completion.d yourself, please consider\n'
555 printf ' -!- moving them to /etc/zsh/functions.d/. Files in that directory, not\n'
556 printf ' -!- starting with an underscore are marked for automatic loading\n'
557 printf ' -!- by default (so that is quite convenient).\n\n'
558 printf ' -!- If there are files *not* starting with an underscore from an older\n'
559 printf ' -!- grml-etc-core in completion.d, you may safely remove them.\n\n'
560 printf ' -!- Delete the files for example via running:\n\n'
561 printf " rm ${xof}\n\n"
562 printf ' -!- Note, that this message will *not* go away, unless you yourself\n'
563 printf ' -!- resolve the situation manually.\n\n'
564 BROKEN_COMPLETION_DIR=1
569 # {{{ set some variables
570 if check_com -c vim ; then
572 export EDITOR=${EDITOR:-vim}
574 export EDITOR=${EDITOR:-vi}
578 export PAGER=${PAGER:-less}
581 export MAIL=${MAIL:-/var/mail/$USER}
583 # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
584 export SHELL='/bin/zsh'
586 # color setup for ls:
587 check_com -c dircolors && eval $(dircolors -b)
588 # color setup for ls on OS X:
589 isdarwin && export CLICOLOR=1
591 # do MacPorts setup on darwin
592 if isdarwin && [[ -d /opt/local ]]; then
593 # Note: PATH gets set in /etc/zprofile on Darwin, so this can't go into
595 PATH="/opt/local/bin:/opt/local/sbin:$PATH"
596 MANPATH="/opt/local/share/man:$MANPATH"
598 # do Fink setup on darwin
599 isdarwin && xsource /sw/bin/init.sh
601 # load our function and completion directories
602 for fdir in /usr/share/grml/zsh/completion /usr/share/grml/functions; do
603 fpath=( ${fdir} ${fdir}/**/*(/N) ${fpath} )
604 if [[ ${fpath} == '/usr/share/grml/zsh/functions' ]] ; then
605 for func in ${fdir}/**/[^_]*[^~](N.) ; do
606 zrcautoload ${func:t}
612 # support colors in less
613 export LESS_TERMCAP_mb=$'\E[01;31m'
614 export LESS_TERMCAP_md=$'\E[01;31m'
615 export LESS_TERMCAP_me=$'\E[0m'
616 export LESS_TERMCAP_se=$'\E[0m'
617 export LESS_TERMCAP_so=$'\E[01;44;33m'
618 export LESS_TERMCAP_ue=$'\E[0m'
619 export LESS_TERMCAP_us=$'\E[01;32m'
621 MAILCHECK=30 # mailchecks
622 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 seconds
623 watch=(notme root) # watch for everyone but me and root
625 # automatically remove duplicates from these arrays
626 typeset -U path cdpath fpath manpath
630 if [[ "$TERM" != emacs ]] ; then
631 [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
632 [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
633 [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
634 [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
635 [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
636 [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
637 [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
638 [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
639 [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
640 [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
641 [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
642 [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
644 [[ "$terminfo[kcuu1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
645 [[ "$terminfo[kcud1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
646 [[ "$terminfo[kcuf1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
647 [[ "$terminfo[kcub1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
648 [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
649 [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
650 [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
651 [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
654 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
655 # use emacs style per default:
660 #if [[ "$TERM" == screen ]] ; then
661 bindkey '\e[1~' beginning-of-line # home
662 bindkey '\e[4~' end-of-line # end
663 bindkey '\e[A' up-line-or-search # cursor up
664 bindkey '\e[B' down-line-or-search # <ESC>-
666 bindkey '^xp' history-beginning-search-backward
667 bindkey '^xP' history-beginning-search-forward
668 # bindkey -s '^L' "|less\n" # ctrl-L pipes to less
669 # bindkey -s '^B' " &\n" # ctrl-B runs it in the background
670 # if terminal type is set to 'rxvt':
671 bindkey '\e[7~' beginning-of-line # home
672 bindkey '\e[8~' end-of-line # end
675 # insert unicode character
676 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an §
677 # See for example http://unicode.org/charts/ for unicode characters code
678 zrcautoload insert-unicode-char
679 zle -N insert-unicode-char
680 #k# Insert Unicode character
681 bindkey '^Xi' insert-unicode-char
683 # just type 'cd ...' to get 'cd ../..'
684 # rationalise-dot() {
685 # if [[ $LBUFFER == *.. ]] ; then
691 # zle -N rationalise-dot
692 # bindkey . rationalise-dot
694 # bindkey '\eq' push-line-or-edit
696 ## toggle the ,. abbreviation feature on/off
697 # NOABBREVIATION: default abbreviation-state
698 # 0 - enabled (default)
700 NOABBREVIATION=${NOABBREVIATION:-0}
702 grml_toggle_abbrev() {
703 if (( ${NOABBREVIATION} > 0 )) ; then
710 zle -N grml_toggle_abbrev
711 bindkey '^xA' grml_toggle_abbrev
713 # add a command line to the shells history without executing it
714 commit-to-history() {
715 print -s ${(z)BUFFER}
718 zle -N commit-to-history
719 bindkey "^x^h" commit-to-history
721 # only slash should be considered as a word separator:
722 slash-backward-kill-word() {
723 local WORDCHARS="${WORDCHARS:s@/@}"
725 zle backward-kill-word
727 zle -N slash-backward-kill-word
729 #k# Kill everything in a word up to its last \kbd{/}
730 bindkey '\ev' slash-backward-kill-word
734 # a generic accept-line wrapper {{{
736 # This widget can prevent unwanted autocorrections from command-name
737 # to _command-name, rehash automatically on enter and call any number
738 # of builtin and user-defined widgets in different contexts.
740 # For a broader description, see:
741 # <http://bewatermyfriend.org/posts/2007/12-26.11-50-38-tooltime.html>
743 # The code is imported from the file 'zsh/functions/accept-line' from
744 # <http://ft.bewatermyfriend.org/comp/zsh/zsh-dotfiles.tar.bz2>, which
745 # distributed under the same terms as zsh itself.
747 # A newly added command will may not be found or will cause false
748 # correction attempts, if you got auto-correction set. By setting the
749 # following style, we force accept-line() to rehash, if it cannot
750 # find the first word on the command line in the $command[] hash.
751 zstyle ':acceptline:*' rehash true
753 function Accept-Line() {
754 setopt localoptions noksharrays
759 zstyle -a ":acceptline:${alcontext}" actions subs
761 (( ${#subs} < 1 )) && return 0
764 for sub in ${subs} ; do
765 [[ ${sub} == 'accept-line' ]] && sub='.accept-line'
768 (( aldone > 0 )) && break
772 function Accept-Line-getdefault() {
775 zstyle -s ":acceptline:${alcontext}" default_action default_action
776 case ${default_action} in
778 printf ".accept-line"
781 printf ${default_action}
786 function accept-line() {
787 setopt localoptions noksharrays
790 local buf com fname format msg default_action
794 cmdline=(${(z)BUFFER})
798 zstyle -t ":acceptline:${alcontext}" rehash \
799 && [[ -z ${commands[$com]} ]] \
802 if [[ -n ${reswords[(r)$com]} ]] \
803 || [[ -n ${aliases[$com]} ]] \
804 || [[ -n ${functions[$com]} ]] \
805 || [[ -n ${builtins[$com]} ]] \
806 || [[ -n ${commands[$com]} ]] ; then
808 # there is something sensible to execute, just do it.
812 default_action=$(Accept-Line-getdefault)
813 zstyle -T ":acceptline:${alcontext}" call_default \
814 && zle ${default_action}
818 if [[ -o correct ]] \
819 || [[ -o correctall ]] \
820 && [[ -n ${functions[$fname]} ]] ; then
822 # nothing there to execute but there is a function called
823 # _command_name; a completion widget. Makes no sense to
824 # call it on the commandline, but the correct{,all} options
825 # will ask for it nevertheless, so warn the user.
826 if [[ ${LASTWIDGET} == 'accept-line' ]] ; then
827 # Okay, we warned the user before, he called us again,
828 # so have it his way.
832 default_action=$(Accept-Line-getdefault)
833 zstyle -T ":acceptline:${alcontext}" call_default \
834 && zle ${default_action}
838 # prepare warning message for the user, configurable via zstyle.
839 zstyle -s ":acceptline:${alcontext}" compwarnfmt msg
841 if [[ -z ${msg} ]] ; then
842 msg="%c will not execute and completion %f exists."
845 zformat -f msg "${msg}" "c:${com}" "f:${fname}"
849 elif [[ -n ${buf//[$' \t\n']##/} ]] ; then
850 # If we are here, the commandline contains something that is not
851 # executable, which is neither subject to _command_name correction
852 # and is not empty. might be a variable assignment
856 default_action=$(Accept-Line-getdefault)
857 zstyle -T ":acceptline:${alcontext}" call_default \
858 && zle ${default_action}
862 # If we got this far, the commandline only contains whitespace, or is empty.
866 default_action=$(Accept-Line-getdefault)
867 zstyle -T ":acceptline:${alcontext}" call_default \
868 && zle ${default_action}
876 # power completion - abbreviation expansion {{{
877 # power completion / abbreviation expansion / buffer expansion
878 # see http://zshwiki.org/home/examples/zleiab for details
879 # less risky than the global aliases but powerful as well
880 # just type the abbreviation key and afterwards ',.' to expand it
883 setopt interactivecomments
885 # key # value (#d additional doc string)
891 'G' '|& grep --color=auto '
893 'Hl' ' --help |& less -r' #d (Display help in pager)
897 'N' '&>/dev/null' #d (No Output)
898 'R' '| tr A-z N-za-m' #d (ROT13)
904 'co' './configure && make && sudo make install'
912 if (( NOABBREVIATION > 0 )) ; then
913 LBUFFER="${LBUFFER},."
917 matched_chars='[.-|_a-zA-Z0-9]#'
918 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
919 LBUFFER+=${abk[$MATCH]:-$MATCH}
923 bindkey ",." globalias
927 zrcautoload zmv # who needs mmv or rename?
928 zrcautoload history-search-end
930 # we don't want to quote/espace URLs on our own...
931 # if autoload -U url-quote-magic ; then
932 # zle -N self-insert url-quote-magic
933 # zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
935 # print 'Notice: no url-quote-magic available :('
937 alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
939 #m# k ESC-h Call \kbd{run-help} for the 1st word on the command line
940 alias run-help >&/dev/null && unalias run-help
941 zrcautoload run-help # use via 'esc-h'
944 if zrcautoload compinit ; then
945 compinit || print 'Notice: no compinit available :('
947 print 'Notice: no compinit available :('
952 is4 && zrcautoload zed # use ZLE editor to edit a file or function
955 for mod in complist deltochar mathfunc ; do
956 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
959 # autoload zsh modules when they are referenced
967 while (( ${#tmpargs} > 0 )) ; do
968 zmodload -${tmpargs[1]} zsh/${tmpargs[2]} ${tmpargs[2]}
974 if is4 && zrcautoload insert-files && zle -N insert-files ; then
976 bindkey "^Xf" insert-files # C-x-f
979 bindkey ' ' magic-space # also do history expansion on space
980 #k# Trigger menu-complete
981 bindkey '\ei' menu-complete # menu completion via esc-i
983 # press esc-e for editing command line in $EDITOR or $VISUAL
984 if is4 && zrcautoload edit-command-line && zle -N edit-command-line ; then
985 #k# Edit the current line in \kbd{\$EDITOR}
986 bindkey '\ee' edit-command-line
989 if is4 && [[ -n ${(k)modules[zsh/complist]} ]] ; then
990 #k# menu selection: pick item but stay in the menu
991 bindkey -M menuselect '\e^M' accept-and-menu-complete
993 # accept a completion and try to complete again by using menu
994 # completion; very useful with completing directories
995 # by using 'undo' one's got a simple file browser
996 bindkey -M menuselect '^o' accept-and-infer-next-history
999 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
1000 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
1003 #k# Insert a timestamp on the command line (yyyy-mm-dd)
1004 bindkey '^Ed' _bkdate
1006 # press esc-m for inserting last typed word again (thanks to caphuso!)
1007 insert-last-typed-word() { zle insert-last-word -- 0 -1 };
1008 zle -N insert-last-typed-word;
1010 #k# Insert last typed word
1011 bindkey "\em" insert-last-typed-word
1013 #k# Shortcut for \kbd{fg<enter>}
1014 bindkey -s '^z' "fg\n"
1016 # run command line as user root via sudo:
1017 sudo-command-line() {
1018 [[ -z $BUFFER ]] && zle up-history
1019 [[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER"
1021 zle -N sudo-command-line
1023 #k# Put the current command line into a \kbd{sudo} call
1024 bindkey "^Os" sudo-command-line
1026 ### jump behind the first word on the cmdline.
1027 ### useful to add options.
1028 function jump_after_first_word() {
1030 words=(${(z)BUFFER})
1032 if (( ${#words} <= 1 )) ; then
1035 CURSOR=${#${words[1]}}
1038 zle -N jump_after_first_word
1040 bindkey '^x1' jump_after_first_word
1049 HISTFILE=$HOME/.zsh_history
1050 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
1051 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
1055 # dirstack handling {{{
1057 DIRSTACKSIZE=${DIRSTACKSIZE:-20}
1058 DIRSTACKFILE=${DIRSTACKFILE:-${HOME}/.zdirs}
1060 if [[ -f ${DIRSTACKFILE} ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then
1061 dirstack=( ${(f)"$(< $DIRSTACKFILE)"} )
1062 # "cd -" won't work after login by just setting $OLDPWD, so
1063 [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD
1068 my_stack=( ${PWD} ${dirstack} )
1070 builtin print -l ${(u)my_stack} >! ${DIRSTACKFILE}
1072 uprint my_stack >! ${DIRSTACKFILE}
1078 # directory based profiles {{{
1082 CHPWD_PROFILE='default'
1083 function chpwd_profiles() {
1084 # Say you want certain settings to be active in certain directories.
1085 # This is what you want.
1087 # zstyle ':chpwd:profiles:/usr/src/grml(|/|/*)' profile grml
1088 # zstyle ':chpwd:profiles:/usr/src/debian(|/|/*)' profile debian
1090 # When that's done and you enter a directory that matches the pattern
1091 # in the third part of the context, a function called chpwd_profile_grml,
1092 # for example, is called (if it exists).
1094 # If no pattern matches (read: no profile is detected) the profile is
1095 # set to 'default', which means chpwd_profile_default is attempted to
1098 # A word about the context (the ':chpwd:profiles:*' stuff in the zstyle
1099 # command) which is used: The third part in the context is matched against
1100 # ${PWD}. That's why using a pattern such as /foo/bar(|/|/*) makes sense.
1101 # Because that way the profile is detected for all these values of ${PWD}:
1105 # So, if you want to make double damn sure a profile works in /foo/bar
1106 # and everywhere deeper in that tree, just use (|/|/*) and be happy.
1108 # The name of the detected profile will be available in a variable called
1109 # 'profile' in your functions. You don't need to do anything, it'll just
1112 # Then there is the parameter $CHPWD_PROFILE is set to the profile, that
1113 # was is currently active. That way you can avoid running code for a
1114 # profile that is already active, by running code such as the following
1115 # at the start of your function:
1117 # function chpwd_profile_grml() {
1118 # [[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
1122 # The initial value for $CHPWD_PROFILE is 'default'.
1124 # Version requirement:
1125 # This feature requires zsh 4.3.3 or newer.
1126 # If you use this feature and need to know whether it is active in your
1127 # current shell, there are several ways to do that. Here are two simple
1130 # a) If knowing if the profiles feature is active when zsh starts is
1131 # good enough for you, you can put the following snippet into your
1134 # (( ${+functions[chpwd_profiles]} )) && print "directory profiles active"
1136 # b) If that is not good enough, and you would prefer to be notified
1137 # whenever a profile changes, you can solve that by making sure you
1138 # start *every* profile function you create like this:
1140 # function chpwd_profile_myprofilename() {
1141 # [[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
1142 # print "chpwd(): Switching to profile: $profile"
1146 # That makes sure you only get notified if a profile is *changed*,
1147 # not everytime you change directory, which would probably piss
1148 # you off fairly quickly. :-)
1150 # There you go. Now have fun with that.
1153 zstyle -s ":chpwd:profiles:${PWD}" profile profile || profile='default'
1154 if (( ${+functions[chpwd_profile_$profile]} )) ; then
1155 chpwd_profile_${profile}
1158 CHPWD_PROFILE="${profile}"
1161 chpwd_functions=( ${chpwd_functions} chpwd_profiles )
1167 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
1168 if [[ $BATTERY -gt 0 ]] ; then
1169 if ! check_com -c acpi ; then
1175 if [[ $BATTERY -gt 0 ]] ; then
1176 PERCENT="${${"$(acpi 2>/dev/null)"}/(#b)[[:space:]]#Battery <->: [^0-9]##, (<->)%*/${match[1]}}"
1177 if [[ -z "$PERCENT" ]] ; then
1178 PERCENT='acpi not present'
1180 if [[ "$PERCENT" -lt 20 ]] ; then
1181 PERCENT="warning: ${PERCENT}%%"
1183 PERCENT="${PERCENT}%%"
1190 # set colors for use in prompts {{{
1191 if zrcautoload colors && colors 2>/dev/null ; then
1192 BLUE="%{${fg[blue]}%}"
1193 RED="%{${fg_bold[red]}%}"
1194 GREEN="%{${fg[green]}%}"
1195 CYAN="%{${fg[cyan]}%}"
1196 MAGENTA="%{${fg[magenta]}%}"
1197 YELLOW="%{${fg[yellow]}%}"
1198 WHITE="%{${fg[white]}%}"
1199 NO_COLOUR="%{${reset_color}%}"
1201 BLUE=$'%{\e[1;34m%}'
1203 GREEN=$'%{\e[1;32m%}'
1204 CYAN=$'%{\e[1;36m%}'
1205 WHITE=$'%{\e[1;37m%}'
1206 MAGENTA=$'%{\e[1;35m%}'
1207 YELLOW=$'%{\e[1;33m%}'
1208 NO_COLOUR=$'%{\e[0m%}'
1213 # gather version control information for inclusion in a prompt {{{
1216 # Be quiet about version problems in grml's zshrc as the user cannot disable
1217 # loading vcs_info() as it is *in* the zshrc - as you can see. :-)
1218 # Just unset most probable variables and disable vcs_info altogether.
1220 for i in {0..9} ; do
1221 unset VCS_INFO_message_${i}_
1223 zstyle ':vcs_info:*' enable false
1226 # The following code is imported from the file 'zsh/functions/vcs_info'
1227 # from <http://ft.bewatermyfriend.org/comp/zsh/zsh-dotfiles.tar.bz2>,
1228 # which distributed under the same terms as zsh itself.
1230 # we will be using two variables, so let the code know now.
1231 zstyle ':vcs_info:*' max-exports 2
1233 # vcs_info() documentation:
1237 # This functionality requires zsh version >= 4.1.*.
1242 # To load vcs_info(), copy this file to your $fpath[] and do:
1243 # % autoload -Uz vcs_info && vcs_info
1245 # To work, vcs_info() needs 'setopt prompt_subst' in your setup.
1250 # To get vcs_info() working quickly (including colors), you can do the
1251 # following (assuming, you loaded vcs_info() properly - see above):
1253 # % RED=$'%{\e[31m%}'
1254 # % GR=$'%{\e[32m%}'
1255 # % MA=$'%{\e[35m%}'
1256 # % YE=$'%{\e[33m%}'
1259 # % zstyle ':vcs_info:*' actionformats \
1260 # "${MA}(${NC}%s${MA})${YE}-${MA}[${GR}%b${YE}|${RED}%a${MA}]${NC} "
1262 # % zstyle ':vcs_info:*' formats \
1263 # "${MA}(${NC}%s${MA})${Y}-${MA}[${GR}%b${MA}]${NC}%} "
1265 # % zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "%b${RED}:${YE}%r"
1267 # % precmd () { vcs_info }
1268 # % PS1='${MA}[${GR}%n${MA}] ${MA}(${RED}%!${MA}) ${YE}%3~ ${VCS_INFO_message_0_}${NC}%# '
1270 # Obviously, the las two lines are there for demonstration: You need to
1271 # call vcs_info() from your precmd() function (see 'SPECIAL FUNCTIONS' in
1272 # 'man zshmisc'). Once that is done you need a *single* quoted
1273 # '${VCS_INFO_message_0_}' in your prompt.
1275 # Now call the 'vcs_info_printsys' utility from the command line:
1277 # % vcs_info_printsys
1278 # # list of supported version control backends:
1279 # # disabled systems are prefixed by a hash sign (#)
1290 # # flavours (cannot be used in the disable style; they
1291 # # are disabled with their master [git-svn -> git]):
1295 # Ten version control backends as you can see. You may not want all
1296 # of these. Because there is no point in running the code to detect
1297 # systems you do not use. ever. So, there is a way to disable some
1298 # backends altogether:
1300 # % zstyle ':vcs_info:*' disable bzr cdv darcs mtn svk tla
1302 # If you rerun 'vcs_info_printsys' now, you will see the backends listed
1303 # in the 'disable' style marked as diabled by a hash sign. That means the
1304 # detection of these systems is skipped *completely*. No wasted time there.
1306 # For more control, read the reference below.
1311 # The vcs_info() feature can be configured via zstyle.
1313 # First, the context in which we are working:
1314 # :vcs_info:<vcs-string>:<user-context>
1316 # ...where <vcs-string> is one of:
1317 # - git, git-svn, git-p4, hg, darcs, bzr, cdv, mtn, svn, cvs, svk or tla.
1319 # ...and <user-context> is a freely configurable string, assignable by the
1320 # user as the first argument to vcs_info() (see its description below).
1322 # There is are three special values for <vcs-string>: The first is named
1323 # 'init', that is in effect as long as there was no decision what vcs
1324 # backend to use. The second is 'preinit; it is used *before* vcs_info()
1325 # is run, when initializing the data exporting variables. The third
1326 # special value is 'formats' and is used by the 'vcs_info_lastmsg' for
1327 # looking up its styles.
1329 # There are two pre-defined values for <user-context>:
1330 # default - the one used if none is specified
1331 # command - used by vcs_info_lastmsg to lookup its styles.
1333 # You may *not* use 'print_systems_' as a user-context string, because it
1334 # is used internally.
1336 # You can of course use ':vcs_info:*' to match all VCSs in all
1337 # user-contexts at once.
1339 # Another special context is 'formats', which is used by the
1340 # vcs_info_lastmsg() utility function (see below).
1343 # This is a description of all styles, that are looked up:
1344 # formats - A list of formats, used when actionformats is not
1345 # used (which is most of the time).
1346 # actionformats - A list of formats, used if a there is a special
1347 # action going on in your current repository;
1348 # (like an interactive rebase or a merge conflict)
1349 # branchformat - Some backends replace %b in the formats and
1350 # actionformats styles above, not only by a branch
1351 # name but also by a revision number. This style
1352 # let's you modify how that string should look like.
1353 # nvcsformats - These "formats" are exported, when we didn't detect
1354 # a version control system for the current directory.
1355 # This is useful, if you want vcs_info() to completely
1356 # take over the generation of your prompt.
1357 # You would do something like
1358 # PS1='${VCS_INFO_message_0_}'
1359 # to accomplish that.
1360 # max-exports - Defines the maximum number if VCS_INFO_message_*_
1361 # variables vcs_info() will export.
1362 # enable - Checked in the 'init' context. If set to false,
1363 # vcs_info() will do nothing.
1364 # disable - Provide a list of systems, you don't want
1365 # the vcs_info() to check for repositories
1366 # (checked in the 'init' context, too).
1367 # disable-patterns - A list of patterns that are checked against $PWD.
1368 # If the pattern matches, vcs_info will be disabled.
1369 # Say, ~/.zsh is a directory under version control,
1370 # in which you do not want vcs_info to be active, do:
1371 # zstyle ':vcs_info:*' disable-patterns "$HOME/.zsh+(|/*)"
1372 # use-simple - If there are two different ways of gathering
1373 # information, you can select the simpler one
1374 # by setting this style to true; the default
1375 # is to use the not-that-simple code, which is
1376 # potentially a lot slower but might be more
1377 # accurate in all possible cases.
1378 # use-prompt-escapes - determines if we assume that the assembled
1379 # string from vcs_info() includes prompt escapes.
1380 # (Used by vcs_info_lastmsg().
1382 # The use-simple style is only available for the bzr backend.
1384 # The default values for these in all contexts are:
1385 # formats " (%s)-[%b|%a]-"
1386 # actionformats " (%s)-[%b]-"
1387 # branchformat "%b:%r" (for bzr, svn and svk)
1391 # disable (empty list)
1392 # disable-patterns (empty list)
1394 # use-prompt-escapes true
1397 # In normal formats and actionformats, the following replacements
1399 # %s - The vcs in use (git, hg, svn etc.)
1400 # %b - Information about the current branch.
1401 # %a - An identifier, that describes the action.
1402 # Only makes sense in actionformats.
1403 # %R - base directory of the repository.
1404 # %r - repository name
1405 # If %R is '/foo/bar/repoXY', %r is 'repoXY'.
1406 # %S - subdirectory within a repository. if $PWD is
1407 # '/foo/bar/reposXY/beer/tasty', %S is 'beer/tasty'.
1410 # In branchformat these replacements are done:
1411 # %b - the branch name
1412 # %r - the current revision number
1414 # Not all vcs backends have to support all replacements.
1415 # nvcsformat does not perform *any* replacements. It is just a string.
1420 # If you want to use the %b (bold off) prompt expansion in 'formats', which
1421 # expands %b itself, use %%b. That will cause the vcs_info() expansion to
1422 # replace %%b with %b. So zsh's prompt expansion mechanism can handle it.
1423 # Similarly, to hand down %b from branchformat, use %%%%b. Sorry for this
1424 # inconvenience, but it cannot be easily avoided. Luckily we do not clash
1425 # with a lot of prompt expansions and this only needs to be done for those.
1426 # See 'man zshmisc' for details about EXPANSION OF PROMPT SEQUENCES.
1429 # FUNCTION DESCRIPTIONS (public API):
1432 # The main function, that runs all backends and assembles
1433 # all data into ${VCS_INFO_message_*_}. This is the function
1434 # you want to call from precmd() if you want to include
1435 # up-to-date information in your prompt (see VARIABLE
1436 # DESCRIPTION below).
1438 # vcs_info_printsys()
1439 # Prints a list of all supported version control systems.
1440 # Useful to find out possible contexts (and which of them are enabled)
1441 # or values for the 'disable' style.
1443 # vcs_info_lastmsg()
1444 # Outputs the last ${VCS_INFO_message_*_} value. Takes into account
1445 # the value of the use-prompt-escapes style in ':vcs_info:formats'.
1446 # It also only prints max-exports values.
1448 # All functions named VCS_INFO_* are for internal use only.
1451 # VARIABLE DESCRIPTION:
1453 # ${VCS_INFO_message_N_} (Note the trailing underscore)
1454 # Where 'N' is an integer, eg: VCS_INFO_message_0_
1455 # These variables are the storage for the informational message the
1456 # last vcs_info() call has assembled. These are strongly connected
1457 # to the formats, actionformats and nvcsformats styles described
1458 # above. Those styles are lists. the first member of that list gets
1459 # expanded into ${VCS_INFO_message_0_}, the second into
1460 # ${VCS_INFO_message_1_} and the Nth into ${VCS_INFO_message_N-1_}.
1461 # These parameters are exported into the environment.
1462 # (See the max-exports style above.)
1467 # Don't use vcs_info at all (even though it's in your prompt):
1468 # % zstyle ':vcs_info:*' enable false
1470 # Disable the backends for bzr and svk:
1471 # % zstyle ':vcs_info:*' disable bzr svk
1473 # Provide a special formats for git:
1474 # % zstyle ':vcs_info:git:*' formats ' GIT, BABY! [%b]'
1475 # % zstyle ':vcs_info:git:*' actionformats ' GIT ACTION! [%b|%a]'
1477 # Use the quicker bzr backend (if you do, please report if it does
1478 # the-right-thing[tm] - thanks):
1479 # % zstyle ':vcs_info:bzr:*' use-simple true
1481 # Display the revision number in yellow for bzr and svn:
1482 # % zstyle ':vcs_info:(svn|bzr):*' branchformat '%b%{'${fg[yellow]}'%}:%r'
1484 # If you want colors, make sure you enclose the color codes in %{...%},
1485 # if you want to use the string provided by vcs_info() in prompts.
1487 # Here is how to print the vcs infomation as a command:
1488 # % alias vcsi='vcs_info command; vcs_info_lastmsg'
1490 # This way, you can even define different formats for output via
1491 # vcs_info_lastmsg() in the ':vcs_info:command:*' namespace.
1495 VCS_INFO_adjust () { #{{{
1496 [[ -n ${vcs_comm[overwrite_name]} ]] && vcs=${vcs_comm[overwrite_name]}
1500 VCS_INFO_check_com () { #{{{
1501 (( ${+commands[$1]} )) && [[ -x ${commands[$1]} ]] && return 0
1505 VCS_INFO_formats () { # {{{
1506 setopt localoptions noksharrays
1507 local action=$1 branch=$2 base=$3
1511 if [[ -n ${action} ]] ; then
1512 zstyle -a ":vcs_info:${vcs}:${usercontext}" actionformats msgs
1513 (( ${#msgs} < 1 )) && msgs[1]=' (%s)-[%b|%a]-'
1515 zstyle -a ":vcs_info:${vcs}:${usercontext}" formats msgs
1516 (( ${#msgs} < 1 )) && msgs[1]=' (%s)-[%b]-'
1519 (( ${#msgs} > maxexports )) && msgs[$(( maxexports + 1 )),-1]=()
1520 for i in {1..${#msgs}} ; do
1521 zformat -f msg ${msgs[$i]} \
1527 S:"$(VCS_INFO_reposub ${base})"
1533 VCS_INFO_maxexports () { #{{{
1534 zstyle -s ":vcs_info:${vcs}:${usercontext}" "max-exports" maxexports || maxexports=2
1535 if [[ ${maxexports} != <-> ]] || (( maxexports < 1 )); then
1536 printf 'vcs_info(): expecting numeric arg >= 1 for max-exports (got %s).\n' ${maxexports}
1537 printf 'Defaulting to 2.\n'
1542 VCS_INFO_nvcsformats () { #{{{
1543 setopt localoptions noksharrays
1546 if [[ $1 == 'preinit' ]] ; then
1550 zstyle -a ":vcs_info:${v:-$vcs}:${c:-$usercontext}" nvcsformats msgs
1551 (( ${#msgs} > maxexports )) && msgs[${maxexports},-1]=()
1554 VCS_INFO_realpath () { #{{{
1555 # a portable 'readlink -f'
1556 # forcing a subshell, to ensure chpwd() is not removed
1557 # from the calling shell (if VCS_INFO_realpath() is called
1560 (( ${+functions[chpwd]} )) && unfunction chpwd
1562 cd $1 2>/dev/null && pwd
1566 VCS_INFO_reposub () { #{{{
1567 setopt localoptions extendedglob
1568 local base=${1%%/##}
1570 [[ ${PWD} == ${base}/* ]] || {
1574 printf '%s' ${PWD#$base/}
1578 VCS_INFO_set () { #{{{
1579 setopt localoptions noksharrays
1582 if [[ $1 == '--clear' ]] ; then
1583 for i in {0..9} ; do
1584 unset VCS_INFO_message_${i}_
1587 if [[ $1 == '--nvcs' ]] ; then
1588 [[ $2 == 'preinit' ]] && (( maxexports == 0 )) && (( maxexports = 1 ))
1589 for i in {0..$((maxexports - 1))} ; do
1590 typeset -gx VCS_INFO_message_${i}_=
1592 VCS_INFO_nvcsformats $2
1595 (( ${#msgs} - 1 < 0 )) && return 0
1596 for i in {0..$(( ${#msgs} - 1 ))} ; do
1598 typeset -gx VCS_INFO_message_${i}_=${msgs[$j]}
1603 # information gathering
1604 VCS_INFO_bzr_get_data () { # {{{
1605 setopt localoptions noksharrays
1609 if zstyle -t ":vcs_info:${vcs}:${usercontext}" "use-simple" ; then
1610 bzrbase=${vcs_comm[basedir]}
1611 bzrinfo[2]=${bzrbase:t}
1612 if [[ -f ${bzrbase}/.bzr/branch/last-revision ]] ; then
1613 bzrinfo[1]=$(< ${bzrbase}/.bzr/branch/last-revision)
1614 bzrinfo[1]=${${bzrinfo[1]}%% *}
1617 bzrbase=${${(M)${(f)"$( bzr info )"}:# ##branch\ root:*}/*: ##/}
1618 bzrinfo=( ${${${(M)${(f)"$( bzr version-info )"}:#(#s)(revno|branch-nick)*}/*: /}/*\//} )
1619 bzrbase="$(VCS_INFO_realpath ${bzrbase})"
1622 zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat bzrbr || bzrbr="%b:%r"
1623 zformat -f bzrbr "${bzrbr}" "b:${bzrinfo[2]}" "r:${bzrinfo[1]}"
1624 VCS_INFO_formats '' "${bzrbr}" "${bzrbase}"
1628 VCS_INFO_cdv_get_data () { # {{{
1631 cdvbase=${vcs_comm[basedir]}
1632 VCS_INFO_formats '' "${cdvbase:t}" "${cdvbase}"
1636 VCS_INFO_cvs_get_data () { # {{{
1637 local cvsbranch cvsbase basename
1640 while [[ -d "${cvsbase}/../CVS" ]]; do
1641 cvsbase="${cvsbase}/.."
1643 cvsbase="$(VCS_INFO_realpath ${cvsbase})"
1644 cvsbranch=$(< ./CVS/Repository)
1645 basename=${cvsbase:t}
1646 cvsbranch=${cvsbranch##${basename}/}
1647 [[ -z ${cvsbranch} ]] && cvsbranch=${basename}
1648 VCS_INFO_formats '' "${cvsbranch}" "${cvsbase}"
1652 VCS_INFO_darcs_get_data () { # {{{
1655 darcsbase=${vcs_comm[basedir]}
1656 VCS_INFO_formats '' "${darcsbase:t}" "${darcsbase}"
1660 VCS_INFO_git_getaction () { #{{{
1661 local gitaction='' gitdir=$1
1664 for tmp in "${gitdir}/rebase-apply" \
1665 "${gitdir}/rebase" \
1666 "${gitdir}/../.dotest" ; do
1667 if [[ -d ${tmp} ]] ; then
1668 if [[ -f "${tmp}/rebasing" ]] ; then
1670 elif [[ -f "${tmp}/applying" ]] ; then
1673 gitaction="am/rebase"
1675 printf '%s' ${gitaction}
1680 for tmp in "${gitdir}/rebase-merge/interactive" \
1681 "${gitdir}/.dotest-merge/interactive" ; do
1682 if [[ -f "${tmp}" ]] ; then
1683 printf '%s' "rebase-i"
1688 for tmp in "${gitdir}/rebase-merge" \
1689 "${gitdir}/.dotest-merge" ; do
1690 if [[ -d "${tmp}" ]] ; then
1691 printf '%s' "rebase-m"
1696 if [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
1701 if [[ -f "${gitdir}/BISECT_LOG" ]] ; then
1702 printf '%s' "bisect"
1708 VCS_INFO_git_getbranch () { #{{{
1709 local gitbranch gitdir=$1
1710 local gitsymref='git symbolic-ref HEAD'
1712 if [[ -d "${gitdir}/rebase-apply" ]] \
1713 || [[ -d "${gitdir}/rebase" ]] \
1714 || [[ -d "${gitdir}/../.dotest" ]] \
1715 || [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
1716 gitbranch="$(${(z)gitsymref} 2> /dev/null)"
1717 [[ -z ${gitbranch} ]] && [[ -r ${gitdir}/rebase-apply/head-name ]] \
1718 && gitbranch="$(< ${gitdir}/rebase-apply/head-name)"
1720 elif [[ -f "${gitdir}/rebase-merge/interactive" ]] \
1721 || [[ -d "${gitdir}/rebase-merge" ]] ; then
1722 gitbranch="$(< ${gitdir}/rebase-merge/head-name)"
1724 elif [[ -f "${gitdir}/.dotest-merge/interactive" ]] \
1725 || [[ -d "${gitdir}/.dotest-merge" ]] ; then
1726 gitbranch="$(< ${gitdir}/.dotest-merge/head-name)"
1729 gitbranch="$(${(z)gitsymref} 2> /dev/null)"
1731 if [[ $? -ne 0 ]] ; then
1732 gitbranch="$(git describe --exact-match HEAD 2>/dev/null)"
1734 if [[ $? -ne 0 ]] ; then
1735 gitbranch="${${"$(< $gitdir/HEAD)"}[1,7]}..."
1740 printf '%s' "${gitbranch##refs/heads/}"
1744 VCS_INFO_git_get_data () { # {{{
1745 setopt localoptions extendedglob
1746 local gitdir gitbase gitbranch gitaction
1748 gitdir=${vcs_comm[gitdir]}
1749 gitbranch="$(VCS_INFO_git_getbranch ${gitdir})"
1751 if [[ -z ${gitdir} ]] || [[ -z ${gitbranch} ]] ; then
1756 gitaction="$(VCS_INFO_git_getaction ${gitdir})"
1757 gitbase=${PWD%/${$( git rev-parse --show-prefix )%/##}}
1758 VCS_INFO_formats "${gitaction}" "${gitbranch}" "${gitbase}"
1762 VCS_INFO_hg_get_data () { # {{{
1763 local hgbranch hgbase file
1765 hgbase=${vcs_comm[basedir]}
1767 file="${hgbase}/.hg/branch"
1768 if [[ -r ${file} ]] ; then
1769 hgbranch=$(< ${file})
1774 VCS_INFO_formats '' "${hgbranch}" "${hgbase}"
1778 VCS_INFO_mtn_get_data () { # {{{
1779 local mtnbranch mtnbase
1781 mtnbase=${vcs_comm[basedir]}
1782 mtnbranch=${${(M)${(f)"$( mtn status )"}:#(#s)Current branch:*}/*: /}
1783 VCS_INFO_formats '' "${mtnbranch}" "${mtnbase}"
1787 VCS_INFO_svk_get_data () { # {{{
1788 local svkbranch svkbase
1790 svkbase=${vcs_comm[basedir]}
1791 zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat svkbranch || svkbranch="%b:%r"
1792 zformat -f svkbranch "${svkbranch}" "b:${vcs_comm[branch]}" "r:${vcs_comm[revision]}"
1793 VCS_INFO_formats '' "${svkbranch}" "${svkbase}"
1797 VCS_INFO_svn_get_data () { # {{{
1798 setopt localoptions noksharrays
1799 local svnbase svnbranch
1803 while [[ -d "${svnbase}/../.svn" ]]; do
1804 svnbase="${svnbase}/.."
1806 svnbase="$(VCS_INFO_realpath ${svnbase})"
1807 svninfo=( ${${${(M)${(f)"$( svn info )"}:#(#s)(URL|Revision)*}/*: /}/*\//} )
1809 zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat svnbranch || svnbranch="%b:%r"
1810 zformat -f svnbranch "${svnbranch}" "b:${svninfo[1]}" "r:${svninfo[2]}"
1811 VCS_INFO_formats '' "${svnbranch}" "${svnbase}"
1815 VCS_INFO_tla_get_data () { # {{{
1816 local tlabase tlabranch
1818 tlabase="$(VCS_INFO_realpath ${vcs_comm[basedir]})"
1819 # tree-id gives us something like 'foo@example.com/demo--1.0--patch-4', so:
1820 tlabranch=${${"$( tla tree-id )"}/*\//}
1821 VCS_INFO_formats '' "${tlabranch}" "${tlabase}"
1826 VCS_INFO_detect_by_dir() { #{{{
1828 local basedir="." realbasedir
1830 realbasedir="$(VCS_INFO_realpath ${basedir})"
1831 while [[ ${realbasedir} != '/' ]]; do
1832 if [[ -n ${vcs_comm[detect_need_file]} ]] ; then
1833 [[ -d ${basedir}/${dirname} ]] && \
1834 [[ -e ${basedir}/${dirname}/${vcs_comm[detect_need_file]} ]] && \
1837 [[ -d ${basedir}/${dirname} ]] && break
1840 basedir=${basedir}/..
1841 realbasedir="$(VCS_INFO_realpath ${basedir})"
1844 [[ ${realbasedir} == "/" ]] && return 1
1845 vcs_comm[basedir]=${realbasedir}
1849 VCS_INFO_bzr_detect() { #{{{
1850 VCS_INFO_check_com bzr || return 1
1851 vcs_comm[detect_need_file]=branch/format
1852 VCS_INFO_detect_by_dir '.bzr'
1856 VCS_INFO_cdv_detect() { #{{{
1857 VCS_INFO_check_com cdv || return 1
1858 vcs_comm[detect_need_file]=format
1859 VCS_INFO_detect_by_dir '.cdv'
1863 VCS_INFO_cvs_detect() { #{{{
1864 VCS_INFO_check_com svn || return 1
1865 [[ -d "./CVS" ]] && [[ -r "./CVS/Repository" ]] && return 0
1869 VCS_INFO_darcs_detect() { #{{{
1870 VCS_INFO_check_com darcs || return 1
1871 vcs_comm[detect_need_file]=format
1872 VCS_INFO_detect_by_dir '_darcs'
1876 VCS_INFO_git_detect() { #{{{
1877 if VCS_INFO_check_com git && git rev-parse --is-inside-work-tree &> /dev/null ; then
1878 vcs_comm[gitdir]="$(git rev-parse --git-dir 2> /dev/null)" || return 1
1879 if [[ -d ${vcs_comm[gitdir]}/svn ]] ; then vcs_comm[overwrite_name]='git-svn'
1880 elif [[ -d ${vcs_comm[gitdir]}/refs/remotes/p4 ]] ; then vcs_comm[overwrite_name]='git-p4' ; fi
1886 VCS_INFO_hg_detect() { #{{{
1887 VCS_INFO_check_com hg || return 1
1888 vcs_comm[detect_need_file]=store
1889 VCS_INFO_detect_by_dir '.hg'
1893 VCS_INFO_mtn_detect() { #{{{
1894 VCS_INFO_check_com mtn || return 1
1895 vcs_comm[detect_need_file]=revision
1896 VCS_INFO_detect_by_dir '_MTN'
1900 VCS_INFO_svk_detect() { #{{{
1901 setopt localoptions noksharrays extendedglob
1906 VCS_INFO_check_com svk || return 1
1907 [[ -f ~/.svk/config ]] || return 1
1909 # This detection function is a bit different from the others.
1910 # We need to read svk's config file to detect a svk repository
1911 # in the first place. Therefore, we'll just proceed and read
1912 # the other information, too. This is more then any of the
1913 # other detections do but this takes only one file open for
1914 # svk at most. VCS_INFO_svk_get_data() get simpler, too. :-)
1915 while IFS= read -r line ; do
1916 if [[ -n ${vcs_comm[basedir]} ]] ; then
1918 [[ ${line} == depotpath:* ]] && vcs_comm[branch]=${line##*/}
1919 [[ ${line} == revision:* ]] && vcs_comm[revision]=${line##*[[:space:]]##}
1920 [[ -n ${vcs_comm[branch]} ]] && [[ -n ${vcs_comm[revision]} ]] && break
1923 (( fhash > 0 )) && [[ ${line} == ' '[^[:space:]]*:* ]] && break
1924 [[ ${line} == ' hash:'* ]] && fhash=1 && continue
1925 (( fhash == 0 )) && continue
1926 [[ ${PWD}/ == ${${line## ##}%:*}/* ]] && vcs_comm[basedir]=${${line## ##}%:*}
1927 done < ~/.svk/config
1929 [[ -n ${vcs_comm[basedir]} ]] && \
1930 [[ -n ${vcs_comm[branch]} ]] && \
1931 [[ -n ${vcs_comm[revision]} ]] && return 0
1935 VCS_INFO_svn_detect() { #{{{
1936 VCS_INFO_check_com svn || return 1
1937 [[ -d ".svn" ]] && return 0
1941 VCS_INFO_tla_detect() { #{{{
1942 VCS_INFO_check_com tla || return 1
1943 vcs_comm[basedir]="$(tla tree-root 2> /dev/null)" && return 0
1948 vcs_info_printsys () { # {{{
1949 vcs_info print_systems_
1952 vcs_info_lastmsg () { # {{{
1956 for i in {0..$((maxexports - 1))} ; do
1957 printf '$VCS_INFO_message_%d_: "' $i
1958 if zstyle -T ':vcs_info:formats:command' use-prompt-escapes ; then
1959 print -nP ${(P)${:-VCS_INFO_message_${i}_}}
1961 print -n ${(P)${:-VCS_INFO_message_${i}_}}
1970 local -a VCSs disabled dps
1971 local -x vcs usercontext
1972 local -ix maxexports
1977 VCSs=(git hg bzr darcs svk mtn svn cvs cdv tla)
1980 zstyle -a ":vcs_info:${vcs}:${usercontext}" "disable" disabled
1981 print -l '# list of supported version control backends:' \
1982 '# disabled systems are prefixed by a hash sign (#)'
1983 for vcs in ${VCSs} ; do
1984 [[ -n ${(M)disabled:#${vcs}} ]] && printf '#'
1985 printf '%s\n' ${vcs}
1987 print -l '# flavours (cannot be used in the disable style; they' \
1988 '# are disabled with their master [git-svn -> git]):' \
1993 [[ -z ${usercontext} ]] && usercontext=default
1995 (*) [[ -z ${usercontext} ]] && usercontext=$1
1999 zstyle -T ":vcs_info:${vcs}:${usercontext}" "enable" || {
2000 [[ -n ${VCS_INFO_message_0_} ]] && VCS_INFO_set --clear
2003 zstyle -a ":vcs_info:${vcs}:${usercontext}" "disable" disabled
2005 zstyle -a ":vcs_info:${vcs}:${usercontext}" "disable-patterns" dps
2006 for pat in ${dps} ; do
2007 if [[ ${PWD} == ${~pat} ]] ; then
2008 [[ -n ${vcs_info_msg_0_} ]] && VCS_INFO_set --clear
2016 for vcs in ${VCSs} ; do
2017 [[ -n ${(M)disabled:#${vcs}} ]] && continue
2019 VCS_INFO_${vcs}_detect && (( found = 1 )) && break
2022 (( found == 0 )) && {
2027 VCS_INFO_${vcs}_get_data || {
2036 VCS_INFO_set --nvcs preinit
2039 # Change vcs_info formats for the grml prompt. The 2nd format sets up
2040 # $vcs_info_msg_1_ to contain "zsh: repo-name" used to set our screen title.
2041 # TODO: The included vcs_info() version still uses $VCS_INFO_message_N_.
2042 # That needs to be the use of $VCS_INFO_message_N_ needs to be changed
2043 # to $vcs_info_msg_N_ as soon as we use the included version.
2044 if [[ "$TERM" == dumb ]] ; then
2045 zstyle ':vcs_info:*' actionformats "(%s%)-[%b|%a] " "zsh: %r"
2046 zstyle ':vcs_info:*' formats "(%s%)-[%b] " "zsh: %r"
2048 # these are the same, just with a lot of colours:
2049 zstyle ':vcs_info:*' actionformats "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${YELLOW}|${RED}%a${MAGENTA}]${NO_COLOUR} " \
2051 zstyle ':vcs_info:*' formats "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${MAGENTA}]${NO_COLOUR}%} " \
2053 zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "%b${RED}:${YELLOW}%r"
2058 # command not found handling {{{
2060 (( ${COMMAND_NOT_FOUND} == 1 )) &&
2061 function command_not_found_handler() {
2063 if [[ -x ${GRML_ZSH_CNF_HANDLER} ]] ; then
2064 ${GRML_ZSH_CNF_HANDLER} $1
2072 if zrcautoload promptinit && promptinit 2>/dev/null ; then
2073 promptinit # people should be able to use their favourite prompt
2075 print 'Notice: no promptinit available :('
2080 # make sure to use right prompt only when not running a command
2081 is41 && setopt transient_rprompt
2083 # TODO: revise all these NO* variables and especially their documentation
2084 # in zsh-help() below.
2085 is4 && [[ $NOPRECMD -eq 0 ]] && precmd () {
2086 [[ $NOPRECMD -gt 0 ]] && return 0
2087 # update VCS information
2090 if [[ $TERM == screen* ]] ; then
2091 if [[ -n ${VCS_INFO_message_1_} ]] ; then
2092 print -nP "\ek${VCS_INFO_message_1_}\e\\"
2094 print -nP "\ekzsh\e\\"
2097 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
2098 if [[ $DONTSETRPROMPT -eq 0 ]] ; then
2099 if [[ $BATTERY -gt 0 ]] ; then
2100 # update battery (dropped into $PERCENT) information
2102 RPROMPT="%(?..:() ${PERCENT}"
2107 # adjust title of xterm
2108 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
2109 [[ ${NOTITLE} -gt 0 ]] && return 0
2112 print -Pn "\e]0;%n@%m: %~\a"
2117 # preexec() => a function running before every command
2118 is4 && [[ $NOPRECMD -eq 0 ]] && \
2120 [[ $NOPRECMD -gt 0 ]] && return 0
2121 # set hostname if not running on host with name 'grml'
2122 if [[ -n "$HOSTNAME" ]] && [[ "$HOSTNAME" != $(hostname) ]] ; then
2125 # get the name of the program currently running and hostname of local machine
2126 # set screen window title if running in a screen
2127 if [[ "$TERM" == screen* ]] ; then
2128 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # don't use hostname
2129 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
2130 echo -ne "\ek$CMD\e\\"
2132 # adjust title of xterm
2133 [[ ${NOTITLE} -gt 0 ]] && return 0
2136 print -Pn "\e]0;%n@%m: $1\a"
2141 EXITCODE="%(?..%?%1v )"
2142 PS2='\`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
2143 PS3='?# ' # selection prompt used within a select loop.
2144 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
2146 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
2147 if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then
2148 debian_chroot=$(cat /etc/debian_chroot)
2151 # don't use colors on dumb terminals (like emacs):
2152 if [[ "$TERM" == dumb ]] ; then
2153 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< "'${VCS_INFO_message_0_}'"%# "
2155 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
2156 # set variable identifying the chroot you work in (used in the prompt below)
2157 if [[ $GRMLPROMPT -gt 0 ]] ; then
2158 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
2159 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
2161 # This assembles the primary prompt string
2162 if (( EUID != 0 )); then
2163 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< "'${VCS_INFO_message_0_}'"%# "
2165 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< "'${VCS_INFO_message_0_}'"%# "
2170 # if we are inside a grml-chroot set a specific prompt theme
2171 if [[ -n "$GRML_CHROOT" ]] ; then
2172 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
2176 # {{{ 'hash' some often used directories
2178 hash -d deb=/var/cache/apt/archives
2179 hash -d doc=/usr/share/doc
2180 hash -d linux=/lib/modules/$(command uname -r)/build/
2181 hash -d log=/var/log
2182 hash -d slog=/var/log/syslog
2183 hash -d src=/usr/src
2184 hash -d templ=/usr/share/doc/grml-templates
2185 hash -d tt=/usr/share/doc/texttools-doc
2186 hash -d www=/var/www
2191 if check_com -c screen ; then
2192 if [[ $UID -eq 0 ]] ; then
2193 [[ -r /etc/grml/screenrc ]] && alias screen="${commands[screen]} -c /etc/grml/screenrc"
2194 elif [[ -r $HOME/.screenrc ]] ; then
2195 alias screen="${commands[screen]} -c $HOME/.screenrc"
2197 [[ -r /etc/grml/screenrc_grml ]] && alias screen="${commands[screen]} -c /etc/grml/screenrc_grml"
2201 # do we have GNU ls with color-support?
2202 if ls --help 2>/dev/null | grep -- --color= >/dev/null && [[ "$TERM" != dumb ]] ; then
2203 #a1# execute \kbd{@a@}:\quad ls with colors
2204 alias ls='ls -b -CF --color=auto'
2205 #a1# execute \kbd{@a@}:\quad list all files, with colors
2206 alias la='ls -la --color=auto'
2207 #a1# long colored list, without dotfiles (@a@)
2208 alias ll='ls -l --color=auto'
2209 #a1# long colored list, human readable sizes (@a@)
2210 alias lh='ls -hAl --color=auto'
2211 #a1# List files, append qualifier to filenames \\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...)
2212 alias l='ls -lF --color=auto'
2214 alias ls='ls -b -CF'
2221 alias mdstat='cat /proc/mdstat'
2222 alias ...='cd ../../'
2224 # generate alias named "$KERNELVERSION-reboot" so you can use boot with kexec:
2225 if [[ -x /sbin/kexec ]] && [[ -r /proc/cmdline ]] ; then
2226 alias "$(uname -r)-reboot"="kexec -l --initrd=/boot/initrd.img-"$(uname -r)" --command-line=\"$(cat /proc/cmdline)\" /boot/vmlinuz-"$(uname -r)""
2229 alias cp='nocorrect cp' # no spelling correction on cp
2230 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
2231 alias mv='nocorrect mv' # no spelling correction on mv
2232 alias rm='nocorrect rm' # no spelling correction on rm
2234 #a1# Execute \kbd{rmdir}
2236 #a1# Execute \kbd{rmdir}
2239 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
2240 alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
2241 alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
2243 # make sure it is not assigned yet
2244 [[ -n ${aliases[utf2iso]} ]] && unalias utf2iso
2247 for ENV in $(env | command grep -i '.utf') ; do
2248 eval export "$(echo $ENV | sed 's/UTF-8/iso885915/ ; s/utf8/iso885915/')"
2253 # make sure it is not assigned yet
2254 [[ -n ${aliases[iso2utf]} ]] && unalias iso2utf
2256 if ! isutfenv ; then
2257 for ENV in $(env | command grep -i '\.iso') ; do
2258 eval export "$(echo $ENV | sed 's/iso.*/UTF-8/ ; s/ISO.*/UTF-8/')"
2263 # set up software synthesizer via speakup
2265 if [ -x /usr/sbin/swspeak-setup ] ; then
2266 setopt singlelinezle
2269 /usr/sbin/swspeak-setup $@
2271 aumix -w 90 -v 90 -p 90 -m 90
2272 if ! [[ -r /dev/softsynth ]] ; then
2273 flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
2276 setopt singlelinezle
2279 nice -n -20 speechd-up
2281 flite -o play -t "Finished setting up software synthesizer"
2286 # I like clean prompt, so provide simple way to get that
2287 check_com 0 || alias 0='return 0'
2289 # for really lazy people like mika:
2290 check_com S &>/dev/null || alias S='screen'
2291 check_com s &>/dev/null || alias s='ssh'
2293 # get top 10 shell commands:
2294 alias top10='print -l ? ${(o)history%% *} | uniq -c | sort -nr | head -n 10'
2296 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
2297 if check_com -c truecrypt ; then
2299 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
2301 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
2305 #f1# Hints for the use of zsh on grml
2307 print "$bg[white]$fg[black]
2308 zsh-help - hints for use of zsh on grml
2309 =======================================$reset_color"
2312 Main configuration of zsh happens in /etc/zsh/zshrc.
2313 That file is part of the package grml-etc-core, if you want to
2314 use them on a non-grml-system just get the tar.gz from
2315 http://deb.grml.org/ or (preferably) get it from the git repository:
2317 http://git.grml.org/f/grml-etc-core/etc/zsh/zshrc
2319 This version of grml'\''s zsh setup does not use skel/.zshrc anymore.
2320 The file is still there, but it is empty for backwards compatibility.
2322 For your own changes use these two files:
2326 The former is sourced very early in our zshrc, the latter is sourced
2329 System wide configuration without touching configuration files of grml
2330 can take place in /etc/zsh/zshrc.local.
2332 Normally, the root user (EUID == 0) does not get the whole grml setup.
2333 If you want to force the whole setup for that user, too, set
2334 GRML_ALWAYS_LOAD_ALL=1 in .zshrc.pre in root'\''s home directory.
2336 For information regarding zsh start at http://grml.org/zsh/
2338 Take a look at grml'\''s zsh refcard:
2339 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
2341 Check out the main zsh refcard:
2342 % '$BROWSER' http://www.bash2zsh.com/zsh_refcard/refcard.pdf
2344 And of course visit the zsh-lovers:
2347 You can adjust some options through environment variables when
2348 invoking zsh without having to edit configuration files.
2349 Basically meant for bash users who are not used to the power of
2352 "NOCOR=1 zsh" => deactivate automatic correction
2353 "NOMENU=1 zsh" => do not use auto menu completion (note: use ctrl-d for completion instead!)
2354 "NOPRECMD=1 zsh" => disable the precmd + preexec commands (set GNU screen title)
2355 "NOTITLE=1 zsh" => disable setting the title of xterms without disabling
2356 preexec() and precmd() completely
2357 "BATTERY=1 zsh" => activate battery status (via acpi) on right side of prompt
2358 "COMMAND_NOT_FOUND=1 zsh"
2359 => Enable a handler if an external command was not found
2360 The command called in the handler can be altered by setting
2361 the GRML_ZSH_CNF_HANDLER variable, the default is:
2362 "/usr/share/command-not-found/command-not-found"
2364 A value greater than 0 is enables a feature; a value equal to zero
2365 disables it. If you like one or the other of these settings, you can
2366 add them to ~/.zshrc.pre to ensure they are set when sourcing grml'\''s
2370 $bg[white]$fg[black]
2371 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
2372 Enjoy your grml system with the zsh!$reset_color"
2376 if [[ -r /etc/debian_version ]] ; then
2377 #a3# Execute \kbd{apt-cache search}
2378 alias acs='apt-cache search'
2379 #a3# Execute \kbd{apt-cache show}
2380 alias acsh='apt-cache show'
2381 #a3# Execute \kbd{apt-cache policy}
2382 alias acp='apt-cache policy'
2383 #a3# Execute \kbd{apt-get dist-upgrade}
2384 salias adg="apt-get dist-upgrade"
2385 #a3# Execute \kbd{apt-get install}
2386 salias agi="apt-get install"
2387 #a3# Execute \kbd{aptitude install}
2388 salias ati="aptitude install"
2389 #a3# Execute \kbd{apt-get upgrade}
2390 salias ag="apt-get upgrade"
2391 #a3# Execute \kbd{apt-get update}
2392 salias au="apt-get update"
2393 #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade}
2394 salias -a up="aptitude update ; aptitude safe-upgrade"
2395 #a3# Execute \kbd{dpkg-buildpackage}
2396 alias dbp='dpkg-buildpackage'
2397 #a3# Execute \kbd{grep-excuses}
2398 alias ge='grep-excuses'
2401 #f3# Execute \kbd{apt-get update \&\& }\\&\quad \kbd{apt-get dist-upgrade}
2404 if [[ -z $1 ]] ; then
2405 $SUDO apt-get update
2406 $SUDO apt-get -u upgrade
2408 ssh $1 $SUDO apt-get update
2409 # ask before the upgrade
2411 ssh $1 $SUDO apt-get --no-act upgrade
2412 echo -n 'Process the upgrade?'
2414 if [[ $dummy == "y" ]] ; then
2415 ssh $1 $SUDO apt-get -u upgrade --yes
2420 # get a root shell as normal user in live-cd mode:
2421 if isgrmlcd && [[ $UID -ne 0 ]] ; then
2425 #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog}
2426 salias llog="$PAGER /var/log/syslog" # take a look at the syslog
2427 #a1# Take a look at the syslog: \kbd{tail -f /var/log/syslog}
2428 salias tlog="tail -f /var/log/syslog" # follow the syslog
2431 # sort installed Debian-packages by size
2432 if check_com -c grep-status ; then
2433 #a3# List installed Debian-packages sorted by size
2434 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package -n "install ok installed" | paste -sd " \n" | sort -rn'
2437 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
2438 if [[ -L /usr/bin/cdrecord ]] || ! check_com -c cdrecord ; then
2439 if check_com -c wodim ; then
2440 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
2441 See #377109 in the BTS of Debian for more details.
2443 Please use the wodim binary instead' ; return 1"
2447 # get_tw_cli has been renamed into get_3ware
2448 if check_com -c get_3ware ; then
2450 echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
2455 # I hate lacking backward compatibility, so provide an alternative therefore
2456 if ! check_com -c apache2-ssl-certificate ; then
2458 apache2-ssl-certificate() {
2460 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
2461 print 'You might want to take a look at Debian the package ssl-cert as well.'
2462 print 'To generate a certificate for use with apache2 follow the instructions:'
2466 export RANDFILE=/dev/random
2467 mkdir /etc/apache2/ssl/
2468 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
2469 chmod 600 /etc/apache2/ssl/apache.pem
2471 Run "grml-tips ssl-certificate" if you need further instructions.
2477 # {{{ Use hard limits, except for a smaller stack and no core dumps
2479 is425 && limit stack 8192
2480 isgrmlcd && limit core 0 # important for a live-cd-system
2484 # {{{ completion system
2486 # called later (via is4 && grmlcomp)
2487 # note: use 'zstyle' for getting current settings
2488 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
2490 # TODO: This could use some additional information
2492 # allow one error for every three characters typed in approximate completer
2493 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )'
2495 # don't complete backup files as executables
2496 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '(aptitude-*|*\~)'
2498 # start menu completion only if it could find no unambiguous initial string
2499 zstyle ':completion:*:correct:*' insert-unambiguous true
2500 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}'
2501 zstyle ':completion:*:correct:*' original true
2503 # activate color-completion
2504 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
2506 # format on completion
2507 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}'
2509 # complete 'cd -<tab>' with menu
2510 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select
2512 # insert all expansions for expand completer
2513 zstyle ':completion:*:expand:*' tag-order all-expansions
2514 zstyle ':completion:*:history-words' list false
2517 zstyle ':completion:*:history-words' menu yes
2519 # ignore duplicate entries
2520 zstyle ':completion:*:history-words' remove-all-dups yes
2521 zstyle ':completion:*:history-words' stop yes
2523 # match uppercase from lowercase
2524 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
2526 # separate matches into groups
2527 zstyle ':completion:*:matches' group 'yes'
2528 zstyle ':completion:*' group-name ''
2530 if [[ "$NOMENU" -eq 0 ]] ; then
2531 # if there are more than 5 options allow selecting from a menu
2532 zstyle ':completion:*' menu select=5
2534 # don't use any menus at all
2538 zstyle ':completion:*:messages' format '%d'
2539 zstyle ':completion:*:options' auto-description '%d'
2541 # describe options in full
2542 zstyle ':completion:*:options' description 'yes'
2544 # on processes completion complete all user processes
2545 zstyle ':completion:*:processes' command 'ps -au$USER'
2547 # offer indexes before parameters in subscripts
2548 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
2550 # provide verbose completion information
2551 zstyle ':completion:*' verbose true
2553 # recent (as of Dec 2007) zsh versions are able to provide descriptions
2554 # for commands (read: 1st word in the line) that it will list for the user
2555 # to choose from. The following disables that, because it's not exactly fast.
2556 zstyle ':completion:*:-command-:*:' verbose false
2558 # set format for warnings
2559 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d'
2561 # define files to ignore for zcompile
2562 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)'
2563 zstyle ':completion:correct:' prompt 'correct to: %e'
2565 # Ignore completion functions for commands you don't have:
2566 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*'
2568 # Provide more processes in completion of programs like killall:
2569 zstyle ':completion:*:processes-names' command 'ps c -u ${USER} -o command | uniq'
2571 # complete manual by their section
2572 zstyle ':completion:*:manuals' separate-sections true
2573 zstyle ':completion:*:manuals.*' insert-sections true
2574 zstyle ':completion:*:man:*' menu yes select
2576 # provide .. as a completion
2577 zstyle ':completion:*' special-dirs ..
2579 # run rehash on completion so new installed program are found automatically:
2581 (( CURRENT == 1 )) && rehash
2586 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
2587 if [[ "$NOCOR" -gt 0 ]] ; then
2588 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored
2591 # try to be smart about when to use what completer...
2593 zstyle -e ':completion:*' completer '
2594 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]] ; then
2595 _last_try="$HISTNO$BUFFER$CURSOR"
2596 reply=(_complete _match _ignored _prefix _files)
2598 if [[ $words[1] == (rm|mv) ]] ; then
2599 reply=(_complete _files)
2601 reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files)
2606 # command for process lists, the local web server details and host completion
2607 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
2610 [[ -d $ZSHDIR/cache ]] && zstyle ':completion:*' use-cache yes && \
2611 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
2613 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
2615 [[ -r ~/.ssh/known_hosts ]] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
2616 [[ -r /etc/hosts ]] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
2628 zstyle ':completion:*:hosts' hosts $hosts
2629 # TODO: so, why is this here?
2630 # zstyle '*' hosts $hosts
2632 # use generic completion system for programs not yet defined; (_gnu_generic works
2633 # with commands that provide a --help option with "standard" gnu-like output.)
2634 for compcom in cp deborphan df feh fetchipac head hnb ipacsum mv \
2635 pal stow tail uname ; do
2636 [[ -z ${_comps[$compcom]} ]] && compdef _gnu_generic ${compcom}
2639 # see upgrade function in this file
2640 compdef _hosts upgrade
2646 # people should use 'grml-x'!
2648 if [[ -e /etc/X11/xorg.conf ]] ; then
2649 [[ -x /usr/bin/startx ]] && /usr/bin/startx "$@" || /usr/X11R6/bin/startx "$@"
2651 echo "Please use the script \"grml-x\" for starting the X Window System
2652 because there does not exist /etc/X11/xorg.conf yet.
2653 If you want to use startx anyway please call \"/usr/bin/startx\"."
2659 if [[ -e /etc/X11/xorg.conf ]] ; then
2660 [[ -x /usr/bin/xinit ]] && /usr/bin/xinit || /usr/X11R6/bin/xinit
2662 echo "Please use the script \"grml-x\" for starting the X Window System.
2663 because there does not exist /etc/X11/xorg.conf yet.
2664 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
2669 if check_com -c 915resolution ; then
2670 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
2673 #a1# Output version of running grml
2674 alias grml-version='cat /etc/grml_version'
2676 if check_com -c rebuildfstab ; then
2677 #a1# Rebuild /etc/fstab
2678 alias grml-rebuildfstab='rebuildfstab -v -r -config'
2681 if check_com -c grml-debootstrap ; then
2682 alias debian2hd='print "Installing debian to harddisk is possible via using grml-debootstrap." ; return 1'
2687 # {{{ now run the functions
2689 is4 && isgrml && grmlstuff
2694 is4 && xsource "/etc/zsh/keephack"
2697 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
2698 # You use it as follows:
2699 # $ NTREF=/reference/file
2701 # This lists all the files in the current directory newer than the reference file.
2702 # You can also specify the reference file inline; note quotes:
2703 # $ ls -l *(e:'nt ~/.zshenv':)
2705 if [[ -n $1 ]] ; then
2708 [[ $REPLY -nt $NTREF ]]
2712 # shell functions {{{
2714 #f1# Provide csh compatibility
2715 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
2717 #f1# Reload an autoloadable function
2718 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
2720 # TODO: Who really uses reload()? The proper way to reload a zsh setup is to
2721 # actually restart the shell via 'exec zsh'. And reload with arguments is the
2722 # same as freload() above. -ft
2723 #f1# Reload zsh setup
2725 if [[ "$#*" -eq 0 ]] ; then
2726 [[ -r ~/.zshrc ]] && . ~/.zshrc
2735 compdef _functions reload freload
2737 #f1# List symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
2739 [[ -z "$1" ]] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
2740 for file in "$@" ; do
2741 while [[ -h "$file" ]] ; do
2743 file=$(readlink "$file")
2748 # fast manual access
2749 if check_com qma ; then
2750 #f1# View the zsh manual
2751 manzsh() { qma zshall "$1" }
2754 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
2757 # TODO: Is it supported to use pager settings like this?
2758 # PAGER='less -Mr' - If so, the use of $PAGER here needs fixing
2759 # with respect to wordsplitting. (ie. ${=PAGER})
2760 if check_com -c $PAGER ; then
2761 #f1# View Debian's changelog of a given package
2764 if [[ -r /usr/share/doc/$1/changelog.Debian.gz ]] ; then
2765 $PAGER /usr/share/doc/$1/changelog.Debian.gz
2766 elif [[ -r /usr/share/doc/$1/changelog.gz ]] ; then
2767 $PAGER /usr/share/doc/$1/changelog.gz
2769 if check_com -c aptitude ; then
2770 echo "No changelog for package $1 found, using aptitude to retrieve it."
2772 aptitude -t unstable changelog $1
2774 aptitude changelog $1
2777 echo "No changelog for package $1 found, sorry."
2782 _dchange() { _files -W /usr/share/doc -/ }
2783 compdef _dchange dchange
2785 #f1# View Debian's NEWS of a given package
2788 if [[ -r /usr/share/doc/$1/NEWS.Debian.gz ]] ; then
2789 $PAGER /usr/share/doc/$1/NEWS.Debian.gz
2791 if [[ -r /usr/share/doc/$1/NEWS.gz ]] ; then
2792 $PAGER /usr/share/doc/$1/NEWS.gz
2794 echo "No NEWS file for package $1 found, sorry."
2799 _dnews() { _files -W /usr/share/doc -/ }
2800 compdef _dnews dnews
2802 #f1# View upstream's changelog of a given package
2805 if [[ -r /usr/share/doc/$1/changelog.gz ]] ; then
2806 $PAGER /usr/share/doc/$1/changelog.gz
2808 echo "No changelog for package $1 found, sorry."
2812 _uchange() { _files -W /usr/share/doc -/ }
2813 compdef _uchange uchange
2818 ZSH_PROFILE_RC=1 $SHELL "$@"
2821 #f1# Edit an alias via zle
2823 [[ -z "$1" ]] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
2825 compdef _aliases edalias
2827 #f1# Edit a function via zle
2829 [[ -z "$1" ]] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
2831 compdef _functions edfunc
2833 # use it e.g. via 'Restart apache2'
2834 #m# f6 Start() \kbd{/etc/init.d/\em{process}}\quad\kbd{start}
2835 #m# f6 Restart() \kbd{/etc/init.d/\em{process}}\quad\kbd{restart}
2836 #m# f6 Stop() \kbd{/etc/init.d/\em{process}}\quad\kbd{stop}
2837 #m# f6 Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{reload}
2838 #m# f6 Force-Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{force-reload}
2839 if [[ -d /etc/init.d || -d /etc/service ]] ; then
2841 local action_="${1:l}" # e.g Start/Stop/Restart
2845 local service_target_="$(readlink /etc/init.d/$service_)"
2846 if [[ $service_target_ == "/usr/bin/sv" ]]; then
2848 case "${action_}" in
2849 start) if [[ ! -e /etc/service/$service_ ]]; then
2850 $SUDO ln -s "/etc/sv/$service_" "/etc/service/"
2852 $SUDO "/etc/init.d/$service_" "${action_}" "$param_"
2854 # there is no reload in runits sysv emulation
2855 reload) $SUDO "/etc/init.d/$service_" "force-reload" "$param_" ;;
2856 *) $SUDO "/etc/init.d/$service_" "${action_}" "$param_" ;;
2860 $SUDO "/etc/init.d/$service_" "${action_}" "$param_"
2864 for i in Start Restart Stop Force-Reload Reload ; do
2865 eval "$i() { __start_stop $i \"\$1\" \"\$2\" ; }"
2869 #f1# Provides useful information on globbing
2876 p named pipes (FIFOs)
2877 * executable plain files (0100)
2878 % device files (character or block special)
2879 %b block special files
2880 %c character special files
2881 r owner-readable files (0400)
2882 w owner-writable files (0200)
2883 x owner-executable files (0100)
2884 A group-readable files (0040)
2885 I group-writable files (0020)
2886 E group-executable files (0010)
2887 R world-readable files (0004)
2888 W world-writable files (0002)
2889 X world-executable files (0001)
2890 s setuid files (04000)
2891 S setgid files (02000)
2892 t files with the sticky bit (01000)
2894 print *(m-1) # Files modified up to a day ago
2895 print *(a1) # Files accessed a day ago
2896 print *(@) # Just symlinks
2897 print *(Lk+50) # Files bigger than 50 kilobytes
2898 print *(Lk-50) # Files smaller than 50 kilobytes
2899 print **/*.c # All *.c files recursively starting in \$PWD
2900 print **/*.c~file.c # Same as above, but excluding 'file.c'
2901 print (foo|bar).* # Files starting with 'foo' or 'bar'
2902 print *~*.* # All Files that do not contain a dot
2903 chmod 644 *(.^x) # make all plain non-executable files publically readable
2904 print -l *(.c|.h) # Lists *.c and *.h
2905 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
2906 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
2908 alias help-zshglob=H-Glob
2910 check_com -c qma && alias ?='qma zshall'
2912 # grep for running process, like: 'any vim'
2915 if [[ -z "$1" ]] ; then
2916 echo "any - grep for process(es) by keyword" >&2
2917 echo "Usage: any <keyword>" >&2 ; return 1
2920 local LENGTH=$(expr length $STRING)
2921 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
2922 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
2923 ps xauwww| grep "[$FIRSCHAR]$REST"
2927 # After resuming from suspend, system is paging heavily, leading to very bad interactivity.
2928 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
2929 [[ -r /proc/1/maps ]] && \
2931 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
2932 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
2933 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
2936 # print hex value of a number
2939 [[ -n "$1" ]] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
2942 # calculate (or eval at all ;-)) with perl => p[erl-]eval
2943 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
2945 [[ -n "$1" ]] && CALC="$*" || print "Usage: calc [expression]"
2946 perl -e "print eval($CALC),\"\n\";"
2948 functions peval &>/dev/null && alias calc=peval
2950 # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
2951 # certain circumstances, so work around it, no matter which environment we have
2953 if [[ -z "$DISPLAY" ]] ; then
2954 consolechars -f /usr/share/consolefonts/default8x16.psf.gz
2961 # just press 'asdf' keys to toggle between dvorak and us keyboard layout
2963 echo -n 'Switching to us keyboard layout: '
2964 [[ -z "$DISPLAY" ]] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null
2968 echo -n 'Switching to dvorak keyboard layout: '
2969 [[ -z "$DISPLAY" ]] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null
2972 # just press 'asdf' key to toggle from neon layout to us keyboard layout
2974 echo -n 'Switching to us keyboard layout: '
2975 setxkbmap us && echo 'Done' || echo 'Failed'
2978 # set up an ipv6 tunnel
2983 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
2984 print 'ipv6 tunnel already set up, nothing to be done.'
2985 print 'execute: "ifconfig sit1 down ; ifconfig sit0 down" to remove ipv6-tunnel.' ; return 1
2987 [[ -n "$PUBLIC_IP" ]] || \
2988 local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \
2989 awk '/inet addr:/ {print $2}' | tr -d 'addr:')
2991 [[ -n "$PUBLIC_IP" ]] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 }
2992 local IPV6ADDR=$(printf "2002:%02x%02x:%02x%02x:1::1" $(print ${PUBLIC_IP//./ }))
2993 print -n "Setting up ipv6 tunnel $IPV6ADDR via ${PUBLIC_IP}: "
2994 ifconfig sit0 tunnel ::192.88.99.1 up
2995 ifconfig sit1 add "$IPV6ADDR" && print done || print failed
2999 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
3000 print 'ipv6 tunnel available' ; return 0
3002 print 'ipv6 tunnel not available' ; return 1
3006 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
3007 print -n 'Stopping ipv6 tunnel (sit0 + sit1): '
3008 ifconfig sit1 down ; ifconfig sit0 down && print done || print failed
3010 print 'No ipv6 tunnel found, nothing to be done.' ; return 1
3014 print "Usage: ipv6-tunnel [start|stop|status]">&2 ; return 1
3019 # run dhclient for wireless device
3021 salias dhclient "$(wavemon -d | awk '/device/{print $2}')"
3024 # spawn a minimally set up ksh - useful if you want to umount /usr/.
3026 exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh
3029 # a wrapper for vim, that deals with title setting
3031 # set this array to a set of options to vim you always want
3032 # to have set when calling vim (in .zshrc.local), like:
3033 # VIM_OPTIONS=( -p )
3034 # This will cause vim to send every file given on the
3035 # commandline to be send to it's own tab (needs vim7).
3037 VIM_PLEASE_SET_TITLE='yes' command vim ${VIM_OPTIONS} "$@"
3040 # make a backup of a file
3042 cp -a "$1" "${1}_$(date --iso-8601=seconds)"
3045 #f1# grep for patterns in grml's zsh setup
3051 print "usage: zg -[anr] <pattern>\n";
3052 print " Search for patterns in grml'\''s zshrc.\n";
3053 print " zg takes no or exactly one option plus a non empty pattern.\n\n";
3054 print " options:\n";
3055 print " -- no options (use if your pattern starts in with a dash.\n";
3056 print " -a search for the pattern in all code regions\n";
3057 print " -n search for the pattern in non-root code only\n";
3058 print " -r search in code for everyone (also root) only\n\n";
3059 print " The default is -a for non-root users and -r for root.\n\n";
3060 print " If you installed the zshrc to a non-default locations (ie *NOT*\n";
3061 print " in /etc/zsh/zshrc) do: export GRML_ZSHRC=\$HOME/.zshrc\n";
3062 print " ...in case you copied the file to that location.\n\n";
3066 if ($ENV{GRML_ZSHRC} ne "") {
3067 $RC = $ENV{GRML_ZSHRC};
3069 $RC = "/etc/zsh/zshrc";
3072 usage if ($#ARGV < 0 || $#ARGV > 1);
3073 if ($> == 0) { $mode = "allonly"; }
3074 else { $mode = "all"; }
3077 if ($opt eq "--") { shift; }
3078 elsif ($opt eq "-a") { $mode = "all"; shift; }
3079 elsif ($opt eq "-n") { $mode = "nonroot"; shift; }
3080 elsif ($opt eq "-r" ) { $mode = "allonly"; shift; }
3081 elsif ($opt =~ m/^-/ || $#ARGV > 0) { usage(); }
3083 $pattern = $ARGV[0];
3084 usage() if ($pattern eq "");
3086 open FH, "<$RC" or die "zg: Could not open $RC: $!\n";
3087 while ($line = <FH>) {
3089 if ($line =~ m/^#:grep:marker:for:mika:/) { $markerfound = 1; next; }
3090 next if ($mode eq "nonroot" && markerfound == 0);
3091 break if ($mode eq "allonly" && markerfound == 1);
3092 print $line, "\n" if ($line =~ /$pattern/);
3104 # {{{ make sure our environment is clean regarding colors
3105 for color in BLUE RED GREEN CYAN YELLOW MAGENTA WHITE ; unset $color
3108 # "persistent history" {{{
3109 # just write important commands you always need to ~/.important_commands
3110 if [[ -r ~/.important_commands ]] ; then
3111 fc -R ~/.important_commands
3115 #:grep:marker:for:mika: :-)
3116 ### non-root (EUID != 0) code below
3119 if (( GRML_ALWAYS_LOAD_ALL == 0 )) && (( $EUID == 0 )) ; then
3127 # set terminal property (used e.g. by msgid-chooser)
3128 export COLORTERM="yes"
3130 # set default browser
3131 if [[ -z "$BROWSER" ]] ; then
3132 if [[ -n "$DISPLAY" ]] ; then
3133 #v# If X11 is running
3134 check_com -c firefox && export BROWSER=firefox
3136 #v# If no X11 is running
3137 check_com -c w3m && export BROWSER=w3m
3141 #m# v QTDIR \kbd{/usr/share/qt[34]}\quad [for non-root only]
3142 [[ -d /usr/share/qt3 ]] && export QTDIR=/usr/share/qt3
3143 [[ -d /usr/share/qt4 ]] && export QTDIR=/usr/share/qt4
3145 # support running 'jikes *.java && jamvm HelloWorld' OOTB:
3146 #v# [for non-root only]
3147 [[ -f /usr/share/classpath/glibj.zip ]] && export JIKESPATH=/usr/share/classpath/glibj.zip
3152 # Xterm resizing-fu.
3153 # Based on http://svn.kitenet.net/trunk/home-full/.zshrc?rev=11710&view=log (by Joey Hess)
3154 alias hide='echo -en "\033]50;nil2\007"'
3155 alias tiny='echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
3156 alias small='echo -en "\033]50;6x10\007"'
3157 alias medium='echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
3158 alias default='echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
3159 alias large='echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
3160 alias huge='echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
3161 alias smartfont='echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
3162 alias semifont='echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
3165 #a2# Execute \kbd{du -sch}
3167 #a2# Execute \kbd{jobs -l}
3171 #a2# Execute \kbd{./configure}
3172 alias CO="./configure"
3173 #a2# Execute \kbd{./configure --help}
3174 alias CH="./configure --help"
3177 if check_com -c tla ; then
3178 #a2# Execute \kbd{tla what-changed --diffs | less}
3179 alias tdi='tla what-changed --diffs | less'
3180 #a2# Execute \kbd{tla-buildpackage}
3181 alias tbp='tla-buildpackage'
3182 #a2# Execute \kbd{tla archive-mirror}
3183 alias tmi='tla archive-mirror'
3184 #a2# Execute \kbd{tla commit}
3185 alias tco='tla commit'
3186 #a2# Execute \kbd{tla star-merge}
3187 alias tme='tla star-merge'
3191 #a2# Execute \kbd{ls -lSrah}
3192 alias dir="ls -lSrah"
3193 #a2# Only show dot-directories
3194 alias lad='ls -d .*(/)' # only show dot-directories
3195 #a2# Only show dot-files
3196 alias lsa='ls -a .*(.)' # only show dot-files
3197 #a2# Only files with setgid/setuid/sticky flag
3198 alias lss='ls -l *(s,S,t)' # only files with setgid/setuid/sticky flag
3199 #a2# Only show 1st ten symlinks
3200 alias lsl='ls -l *(@[1,10])' # only symlinks
3201 #a2# Display only executables
3202 alias lsx='ls -l *(*[1,10])' # only executables
3203 #a2# Display world-{readable,writable,executable} files
3204 alias lsw='ls -ld *(R,W,X.^ND/)' # world-{readable,writable,executable} files
3205 #a2# Display the ten biggest files
3206 alias lsbig="ls -flh *(.OL[1,10])" # display the biggest files
3207 #a2# Only show directories
3208 alias lsd='ls -d *(/)' # only show directories
3209 #a2# Only show empty directories
3210 alias lse='ls -d *(/^F)' # only show empty directories
3211 #a2# Display the ten newest files
3212 alias lsnew="ls -rl *(D.om[1,10])" # display the newest files
3213 #a2# Display the ten oldest files
3214 alias lsold="ls -rtlh *(D.om[1,10])" # display the oldest files
3215 #a2# Display the ten smallest files
3216 alias lssmall="ls -Srl *(.oL[1,10])" # display the smallest files
3219 #a2# Execute \kbd{chmod 600}
3220 alias rw-='chmod 600'
3221 #a2# Execute \kbd{chmod 700}
3222 alias rwx='chmod 700'
3223 #m# a2 r-{}- Execute \kbd{chmod 644}
3224 alias r--='chmod 644'
3225 #a2# Execute \kbd{chmod 755}
3226 alias r-x='chmod 755'
3228 # some useful aliases
3229 #a2# Execute \kbd{mkdir -o}
3232 check_com -c ipython && alias ips='ipython -p sh'
3235 #a2# Execute \kbd{mplayer -vo fbdev}
3236 alias cmplayer='mplayer -vo fbdev'
3237 #a2# Execute \kbd{mplayer -vo fbdev -fs -zoom}
3238 alias fbmplayer='mplayer -vo fbdev -fs -zoom'
3239 #a2# Execute \kbd{links2 -driver fb}
3240 alias fblinks='links2 -driver fb'
3242 #a2# ssh with StrictHostKeyChecking=no \\&\quad and UserKnownHostsFile unset
3243 alias insecssh='ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
3244 alias insecscp='scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
3247 check_com -c python && alias http="python -m SimpleHTTPServer"
3249 # Use 'g' instead of 'git':
3250 check_com g || alias g='git'
3252 # check whether Debian's package management (dpkg) is running
3253 if check_com salias ; then
3254 #a2# Check whether a dpkg instance is currently running
3255 salias check_dpkg_running="dpkg_running"
3258 # work around non utf8 capable software in utf environment via $LANG and luit
3259 if check_com isutfenv && check_com luit ; then
3260 if check_com -c mrxvt ; then
3261 isutfenv && [[ -n "$LANG" ]] && \
3262 alias mrxvt="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit mrxvt"
3265 if check_com -c aterm ; then
3266 isutfenv && [[ -n "$LANG" ]] && \
3267 alias aterm="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit aterm"
3270 if check_com -c centericq ; then
3271 isutfenv && [[ -n "$LANG" ]] && \
3272 alias centericq="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit centericq"
3277 # useful functions {{{
3280 #f4# Search for newspostings from authors
3281 agoogle() { ${=BROWSER} "http://groups.google.com/groups?as_uauthors=$*" ; }
3282 #f4# Search Debian Bug Tracking System
3286 if [[ $# -eq 1 ]]; then
3289 ${=BROWSER} "http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=$1"
3292 ${=BROWSER} "http://bugs.debian.org/cgi-bin/pkgreport.cgi?submitter=$1"
3295 ${=BROWSER} "http://bugs.debian.org/$*"
3299 print "$0 needs one argument"
3303 #f4# Search Debian Bug Tracking System in mbox format
3311 ${=BROWSER} http://search.dmoz.org/cgi-bin/search\?search=${1// /_}
3313 #f4# Search German Wiktionary
3316 ${=BROWSER} http://de.wiktionary.org/wiki/${(C)1// /_}
3318 #f4# Search English Wiktionary
3321 ${=BROWSER} http://en.wiktionary.org/wiki/${(C)1// /_}
3323 #f4# Search Google Groups
3326 ${=BROWSER} "http://groups.google.com/groups?q=$*"
3331 ${=BROWSER} "http://www.google.com/search?&num=100&q=$*"
3333 #f4# Search Google Groups for MsgID
3336 ${=BROWSER} "http://groups.google.com/groups?selm=$*"
3338 #f4# Search Netcraft
3341 ${=BROWSER} "http://toolbar.netcraft.com/site_report?url=$1"
3343 #f4# Use German Wikipedia's full text search
3346 ${=BROWSER} http://de.wikipedia.org/wiki/Spezial:Search/${(C)1}
3348 #f4# search \kbd{dict.leo.org}
3351 ${=BROWSER} "http://dict.leo.org/?search=$*"
3353 #f4# Search German Wikipedia
3356 ${=BROWSER} http://de.wikipedia.org/wiki/"${(C)*}"
3358 #f4# Search English Wikipedia
3361 ${=BROWSER} http://en.wikipedia.org/wiki/"${(C)*}"
3363 #f4# Search official debs
3366 ${=BROWSER} "http://packages.debian.org/search?keywords=$1&searchon=contents&suite=${2:=unstable}§ion=all"
3369 #m# f4 gex() Exact search via Google
3370 check_com google && gex () {
3371 google "\"[ $1]\" $*"
3375 #f5# Backup \kbd{file {\rm to} file\_timestamp}
3378 cp -b $1 $1_`date --iso-8601=m`
3383 diff -crd "$*" | egrep -v "^Only in |^Binary files "
3385 #f5# cd to directoy and list files
3393 cvs add $* && cvs com -m 'initial checkin' $*
3398 cvs diff -N $* |& $PAGER
3403 cvs log $* |& $PAGER
3420 #f5# Disassemble source files using gcc and as
3423 gcc -pipe -S -o - -O -g $* | as -aldh -o /dev/null
3425 #f5# Firefox remote control - open given URL
3427 firefox -a firefox -remote "openURL($1)"
3429 #f5# Create Directoy and \kbd{cd} to it
3431 mkdir -p "$@" && cd "$@"
3433 #f5# Unified diff to timestamped outputfile
3435 diff -udrP "$1" "$2" > diff.`date "+%Y-%m-%d"`."$1"
3437 #f5# Memory overview
3439 ps aux | awk '{if (NR > 1) print $5; if (NR > 2) print "+"} END { print "p" }' | dc
3441 #f5# Show contents of tar file
3444 gunzip -c $1 | tar -tf - -- | $PAGER
3446 #f5# Show contents of tgz file
3449 tar -ztf $1 | $PAGER
3451 #f5# Show contents of zip file
3454 unzip -l $1 | $PAGER
3456 #f5# Greps signature from file
3459 agrep -d '^-- $' "$*" ~/.Signature
3464 diff -urd $* | egrep -v "^Only in |^Binary files "
3466 #f5# (Mis)use \kbd{vim} as \kbd{less}
3469 vim --cmd 'let no_plugin_maps = 1' -c "so \$VIMRUNTIME/macros/less.vim" "${@:--}"
3472 # download video from youtube
3475 if ! [[ -n "$2" ]] ; then
3476 print "Usage: ydtl http://youtube.com/watch?v=.... outputfile.flv">&2
3479 wget -O${2} "http://youtube.com/get_video?"${${${"$(wget -o/dev/null -O- "${1}" | grep -e watch_fullscreen)"}##*watch_fullscreen\?}%%\&fs=*}
3483 # Function Usage: uopen $URL/$file
3484 #f5# Download a file and display it locally
3487 if ! [[ -n "$1" ]] ; then
3488 print "Usage: uopen \$URL/\$file">&2
3492 MIME=$(curl --head $FILE | grep Content-Type | cut -d ' ' -f 2 | cut -d\; -f 1)
3494 curl $FILE | see ${MIME}:-
3498 # Function Usage: doc packagename
3499 #f5# \kbd{cd} to /usr/share/doc/\textit{package}
3502 cd /usr/share/doc/$1 && ls
3504 _doc() { _files -W /usr/share/doc -/ }
3505 check_com compdef && compdef _doc doc
3507 #f5# Make screenshot
3509 [[ ! -d ~/shots ]] && mkdir ~/shots
3510 #cd ~/shots ; sleep 5 ; import -window root -depth 8 -quality 80 `date "+%Y-%m-%d--%H:%M:%S"`.png
3511 cd ~/shots ; sleep 5; import -window root shot_`date --iso-8601=m`.jpg
3517 images=( *.{jpg,gif,png}(.N) )
3519 if [[ $#images -eq 0 ]] ; then
3520 print "No image files found"
3522 ls "$@" "$images[@]"
3526 #f5# Create PDF file from source code
3531 a2ps --medium A4dj -E -o $output $*
3535 # zsh with perl-regex - use it e.g. via:
3536 # regcheck '\s\d\.\d{3}\.\d{3} Euro' ' 1.000.000 Euro'
3537 #f5# Checks whether a regex matches or not.\\&\quad Example: \kbd{regcheck '.\{3\} EUR' '500 EUR'}
3540 zmodload -i zsh/pcre
3541 pcre_compile $1 && \
3542 pcre_match $2 && echo "regex matches" || echo "regex does not match"
3545 #f5# List files which have been modified within the last {\it n} days
3551 #f5# Grep in history
3556 # use colors when GNU grep with color-support
3557 #a2# Execute \kbd{grep -{}-color=auto}
3558 (grep --help 2>/dev/null |grep -- --color) >/dev/null && alias grep='grep --color=auto'
3559 #a2# Execute \kbd{grep -i -{}-color=auto}
3560 alias GREP='grep -i --color=auto'
3562 #f5# Watch manpages in a stretched style
3563 man2() { PAGER='dash -c "sed G | /usr/bin/less"' command man "$@" ; }
3565 # d():Copyright 2005 Nikolai Weibull <nikolai@bitwi.se>
3566 # note: option AUTO_PUSHD has to be set
3567 #f5# Jump between directories
3571 local color=$fg_bold[blue]
3573 dirs -p | while read dir; do
3574 local num="${$(printf "%-4d " $i)/ /.}"
3575 printf " %s $color%s$reset_color\n" $num $dir
3579 read -r 'dir?Jump to directory: ' || return
3580 (( dir == -1 )) && return
3581 if (( dir < 0 || dir >= i )); then
3582 echo d: no such directory stack entry: $dir
3588 # usage example: 'lcheck strcpy'
3589 #f5# Find out which libs define a symbol
3591 if [[ -n "$1" ]] ; then
3592 nm -go /usr/lib/lib*.a 2>/dev/null | grep ":[[:xdigit:]]\{8\} . .*$1"
3594 echo "Usage: lcheck <function>" >&2
3598 #f5# Clean up directory - remove well known tempfiles
3600 FILES=(*~(N) .*~(N) \#*\#(N) *.o(N) a.out(N) *.core(N) *.cmo(N) *.cmi(N) .*.swp(N))
3602 if [[ $NBFILES > 0 ]] ; then
3605 echo -n "Remove these files? [y/n] "
3607 if [[ $ans == "y" ]] ; then
3609 echo ">> $PWD purged, $NBFILES files removed"
3611 echo "Ok. .. than not.."
3617 # 'translate' looks up fot a word in a file with language-to-language
3618 # translations (field separator should be " : "). A typical wordlist looks
3620 # | english-word : german-transmission
3621 # It's also only possible to translate english to german but not reciprocal.
3622 # Use the following oneliner to turn back the sort order:
3623 # $ awk -F ':' '{ print $2" : "$1" "$3 }' \
3624 # /usr/local/lib/words/en-de.ISO-8859-1.vok > ~/.translate/de-en.ISO-8859-1.vok
3625 #f5# Translates a word
3630 translate -l de-en $2
3633 translate -l en-de $2
3636 echo "Usage: $0 { -D | -E }"
3637 echo " -D == German to English"
3638 echo " -E == English to German"
3642 #f5# List all occurrences of programm in current PATH
3645 if [[ $# = 0 ]] ; then
3646 echo "Usage: $0 program"
3647 echo "Example: $0 zsh"
3648 echo "Lists all occurrences of program in the current PATH."
3650 ls -l ${^path}/*$1*(*N)
3654 # Found in the mailinglistarchive from Zsh (IIRC ~1996)
3655 #f5# Select items for specific command(s) from history
3660 echo "Usage: $0 command"
3663 cmd=(${(f)"$(grep -w $1 $HISTFILE | sort | uniq | pr -tn)"})
3664 print -l $cmd | less -F
3665 echo -n "enter number of desired command [1 - $(( ${#cmd[@]} - 1 ))]: "
3668 print -z "${cmd[$answer]#*$TAB}"
3671 # Use vim to convert plaintext to HTML
3672 #f5# Transform files to html with highlighting
3675 vim -u NONE -n -c ':syntax on' -c ':so $VIMRUNTIME/syntax/2html.vim' -c ':wqa' $1 &>/dev/null
3678 # Usage: simple-extract <file>
3679 #f5# Smart archive extractor
3682 if [[ -f $1 ]] ; then
3684 *.tar.bz2) bzip2 -v -d $1 ;;
3685 *.tar.gz) tar -xvzf $1 ;;
3688 *.bz2) bzip2 -d $1 ;;
3690 *.gz) gunzip -d $1 ;;
3691 *.tar) tar -xvf $1 ;;
3692 *.tgz) gunzip -d $1 ;;
3693 *.tbz2) tar -jxvf $1 ;;
3695 *.Z) uncompress $1 ;;
3696 *) echo "'$1' Error. Please go away" ;;
3699 echo "'$1' is not a valid file"
3703 # Usage: smartcompress <file> (<type>)
3704 #f5# Smart archive creator
3707 if [[ -n $2 ]] ; then
3709 tgz | tar.gz) tar -zcvf$1.$2 $1 ;;
3710 tbz2 | tar.bz2) tar -jcvf$1.$2 $1 ;;
3711 tar.Z) tar -Zcvf$1.$2 $1 ;;
3712 tar) tar -cvf$1.$2 $1 ;;
3713 gz | gzip) gzip $1 ;;
3714 bz2 | bzip2) bzip2 $1 ;;
3716 echo "Error: $2 is not a valid compression type"
3720 smartcompress $1 tar.gz
3724 # Usage: show-archive <archive>
3725 #f5# List an archive's content
3728 if [[ -f $1 ]] ; then
3730 *.tar.gz) gunzip -c $1 | tar -tf - -- ;;
3731 *.tar) tar -tf $1 ;;
3732 *.tgz) tar -ztf $1 ;;
3733 *.zip) unzip -l $1 ;;
3735 *.deb) dpkg-deb --fsys-tarfile $1 | tar -tf - -- ;;
3736 *) echo "'$1' Error. Please go away" ;;
3739 echo "'$1' is not a valid archive"
3743 # It's shameless stolen from <http://www.vim.org/tips/tip.php?tip_id=167>
3744 #f5# Use \kbd{vim} as your manpage reader
3747 man $* | col -b | view -c 'set ft=man nomod nolist' -
3750 # function readme() { $PAGER -- (#ia3)readme* }
3751 #f5# View all README-like files in current directory in pager
3755 files=(./(#i)*(read*me|lue*m(in|)ut)*(ND))
3756 if (($#files)) ; then
3759 print 'No README files.'
3763 # function ansi-colors()
3764 #f5# Display ANSI colors
3766 typeset esc="\033[" line1 line2
3767 echo " _ _ _40 _ _ _41_ _ _ _42 _ _ 43_ _ _ 44_ _ _45 _ _ _ 46_ _ _ 47_ _ _ 49_ _"
3768 for fore in 30 31 32 33 34 35 36 37; do
3771 for back in 40 41 42 43 44 45 46 47 49; do
3772 line1="${line1}${esc}${back};${fore}m Normal ${esc}0m"
3773 line2="${line2}${esc}${back};${fore};1m Bold ${esc}0m"
3775 echo -e "$line1\n$line2"
3779 # suidfind() { ls -latg $path | grep '^...s' }
3780 #f5# Find all files in \$PATH with setuid bit set
3781 suidfind() { ls -latg $path/*(sN) }
3783 # See above but this is /better/ ... anywise ..
3785 print 'Output will be written to ~/suid_* ...'
3786 $SUDO find / -type f \( -perm -4000 -o -perm -2000 \) -ls > ~/suid_suidfiles.`date "+%Y-%m-%d"`.out 2>&1
3787 $SUDO find / -type d \( -perm -4000 -o -perm -2000 \) -ls > ~/suid_suiddirs.`date "+%Y-%m-%d"`.out 2>&1
3788 $SUDO find / -type f \( -perm -2 -o -perm -20 \) -ls > ~/suid_writefiles.`date "+%Y-%m-%d"`.out 2>&1
3789 $SUDO find / -type d \( -perm -2 -o -perm -20 \) -ls > ~/suid_writedirs.`date "+%Y-%m-%d"`.out 2>&1
3793 # TODO: So, this is the third incarnation of this function!?
3794 #f5# Reload given functions
3796 for func in $argv ; do
3802 # a small check to see which DIR is located on which server/partition.
3803 # stolen and modified from Sven's zshrc.forall
3804 #f5# Report diskusage of a directory
3807 if [[ -n "$1" ]] ; then
3808 for dir in "$@" ; do
3809 if [[ -d "$dir" ]] ; then
3810 ( cd $dir; echo "-<$dir>"; du -shx .; echo);
3812 echo "warning: $dir does not exist" >&2
3816 for dir in $path; do
3817 if [[ -d "$dir" ]] ; then
3818 ( cd $dir; echo "-<$dir>"; du -shx .; echo);
3820 echo "warning: $dir does not exist" >&2
3826 # % slow_print `cat /etc/passwd`
3827 #f5# Slowly print out parameters
3829 for argument in "$@" ; do
3830 for ((i = 1; i <= ${#1} ;i++)) ; do
3831 print -n "${argument[i]}"
3839 #f5# Show some status info
3842 print "Date..: "$(date "+%Y-%m-%d %H:%M:%S")
3843 print "Shell.: Zsh $ZSH_VERSION (PID = $$, $SHLVL nests)"
3844 print "Term..: $TTY ($TERM), ${BAUD:+$BAUD bauds, }$COLUMNS x $LINES chars"
3845 print "Login.: $LOGNAME (UID = $EUID) on $HOST"
3846 print "System: $(cat /etc/[A-Za-z]*[_-][rv]e[lr]*)"
3847 print "Uptime:$(uptime)"
3852 #f5# Rip an audio CD
3856 cdrdao read-cd --device $DEVICE --driver generic-mmc audiocd.toc
3857 cdrdao read-cddb --device $DEVICE --driver generic-mmc audiocd.toc
3858 echo " * Would you like to burn the cd now? (yes/no)"
3860 if [[ "$input" = "yes" ]] ; then
3861 echo " ! Burning Audio CD"
3865 echo " ! Invalid response."
3870 #f5# Burn an audio CD (in combination with audiorip)
3873 cdrdao write --device $DEVICE --driver generic-mmc audiocd.toc
3874 echo " * Should I remove the temporary files? (yes/no)"
3876 if [[ "$input" = "yes" ]] ; then
3877 echo " ! Removing Temporary Files."
3882 echo " ! Invalid response."
3886 #f5# Make an audio CD from all mp3 files
3888 # TODO: do the renaming more zshish, possibly with zmv()
3891 for i in *.[Mm][Pp]3; do mv "$i" `echo $i | tr '[A-Z]' '[a-z]'`; done
3892 for i in *.mp3; do mv "$i" `echo $i | tr ' ' '_'`; done
3893 for i in *.mp3; do mpg123 -w `basename $i .mp3`.wav $i; done
3895 for i in *.wav; do sox $i.wav -r 44100 $i.wav resample; done
3898 #f5# Create an ISO image. You are prompted for\\&\quad volume name, filename and directory
3901 echo " * Volume name "
3903 echo " * ISO Name (ie. tmp.iso)"
3905 echo " * Directory or File"
3907 mkisofs -o ~/$iso -A $volume -allow-multidot -J -R -iso-level 3 -V $volume -R $files
3910 #f5# Simple thumbnails generator
3912 rm -rf thumb-* index.html
3916 <title>Images</title>
3918 <body>" > index.html
3919 for f in *.(gif|jpeg|jpg|png) ; do
3920 convert -size 100x200 "$f" -resize 100x200 thumb-"$f"
3921 echo " <a href=\"$f\"><img src=\"thumb-$f\"></a>" >> index.html
3925 </html>" >> index.html
3928 #f5# Set all ulimit parameters to \kbd{unlimited}
3939 # ogg2mp3 with bitrate of 192
3942 oggdec -o - $1 | lame -b 192 - ${1:r}.mp3
3945 #f5# RFC 2396 URL encoding in Z-Shell
3950 print ${(j::)input/(#b)([^A-Za-z0-9_.!~*\'\(\)-])/%${(l:2::0:)$(([##16]#match))}}
3953 #f5# Install x-lite (VoIP software)
3957 [[ -d ~/tmp ]] || mkdir ~/tmp
3960 echo "Downloading http://www.counterpath.com/download/X-Lite_Install.tar.gz and storing it in ~/tmp:"
3961 if wget http://www.counterpath.com/download/X-Lite_Install.tar.gz ; then
3962 unp X-Lite_Install.tar.gz && echo done || echo failed
3964 echo "Error while downloading." ; return 1
3967 if [[ -x xten-xlite/xtensoftphone ]] ; then
3968 echo "Execute xten-xlite/xtensoftphone to start xlite."
3976 echo "Downloading debian package of skype."
3977 echo "Notice: If you want to use a more recent skype version run 'getskypebeta'."
3978 wget http://www.skype.com/go/getskype-linux-deb
3979 $SUDO dpkg -i skype*.deb && echo "skype installed."
3982 #f5# Install beta-version of skype
3986 echo "Downloading debian package of skype (beta version)."
3987 wget http://www.skype.com/go/getskype-linux-beta-deb
3988 $SUDO dpkg -i skype-beta*.deb && echo "skype installed."
3991 #f5# Install gizmo (VoIP software)
3995 echo "libgtk2.0-0, gconf2, libstdc++6, libasound2 and zlib1g have to be available. Installing."
3996 $SUDO apt-get update
3997 $SUDO apt-get install libgtk2.0-0 gconf2 libstdc++6 libasound2 zlib1g
3998 wget "$(lynx --dump http://gizmo5.com/pc/download/linux/ | awk '/libstdc\+\+6.*\.deb/ {print $2}')"
3999 $SUDO dpkg -i gizmo-project*.deb && echo "gizmo installed."
4002 #f5# Get and run AIR (Automated Image and Restore)
4006 [[ -w . ]] || { echo 'Error: you do not have write permissions in this directory. Exiting.' ; return 1 }
4008 wget http://puzzle.dl.sourceforge.net/sourceforge/air-imager/air-$VER.tar.gz
4009 tar zxf air-$VER.tar.gz
4011 INTERACTIVE=no $SUDO ./install-air-1.2.8
4012 [[ -x /usr/local/bin/air ]] && [[ -n "$DISPLAY" ]] && $SUDO air
4015 #f5# Get specific git commitdiff
4018 if [[ -z $GITTREE ]] ; then
4019 GITTREE='linux/kernel/git/torvalds/linux-2.6.git'
4021 if ! [[ -z $1 ]] ; then
4022 ${=BROWSER} "http://kernel.org/git/?p=$GITTREE;a=commitdiff;h=$1"
4024 echo "Usage: git-get-diff <commit>"
4028 #f5# Get specific git commit
4031 if [[ -z $GITTREE ]] ; then
4032 GITTREE='linux/kernel/git/torvalds/linux-2.6.git'
4034 if ! [[ -z $1 ]] ; then
4035 ${=BROWSER} "http://kernel.org/git/?p=$GITTREE;a=commit;h=$1"
4037 echo "Usage: git-get-commit <commit>"
4041 #f5# Get specific git diff
4042 git-get-plaindiff () {
4044 if [[ -z $GITTREE ]] ; then
4045 GITTREE='linux/kernel/git/torvalds/linux-2.6.git'
4047 if [[ -z $1 ]] ; then
4048 echo 'Usage: git-get-plaindiff '
4050 echo -n "Downloading $1.diff ... "
4051 # avoid "generating ..." stuff from kernel.org server:
4052 wget --quiet "http://kernel.org/git/?p=$GITTREE;a=commitdiff_plain;h=$1" -O /dev/null
4053 wget --quiet "http://kernel.org/git/?p=$GITTREE;a=commitdiff_plain;h=$1" -O $1.diff \
4054 && echo done || echo failed
4059 # http://strcat.de/blog/index.php?/archives/335-Software-sauber-deinstallieren...html
4060 #f5# Log 'make install' output
4063 [[ ! -d ~/.errorlogs ]] && mkdir ~/.errorlogs
4064 make -n install > ~/.errorlogs/${PWD##*/}-makelog
4067 #f5# Indent source code
4069 indent -npro -kr -i8 -ts8 -sob -l80 -ss -ncs "$@"
4072 # highlight important stuff in diff output, usage example: hg diff | hidiff
4073 #m# a2 hidiff \kbd{histring} oneliner for diffs
4074 check_com -c histring && \
4075 alias hidiff="histring -fE '^Comparing files .*|^diff .*' | histring -c yellow -fE '^\-.*' | histring -c green -fE '^\+.*'"
4077 # rename pictures based on information found in exif headers
4078 #f5# Rename pictures based on information found in exif headers
4081 if [[ $# -lt 1 ]] ; then
4082 echo 'Usage: jpgrename $FILES' >& 2
4085 echo -n 'Checking for jhead with version newer than 1.9: '
4086 jhead_version=`jhead -h | grep 'used by most Digital Cameras. v.*' | awk '{print $6}' | tr -d v`
4087 if [[ $jhead_version > '1.9' ]]; then
4088 echo 'success - now running jhead.'
4089 jhead -n%Y-%m-%d_%Hh%M_%f $*
4091 echo 'failed - exiting.'
4096 # open file in vim and jump to line
4097 # http://www.downgra.de/archives/2007/05/08/T19_21_11/
4101 params=(${*//(#m):[0-9]*:/\\n+${MATCH//:/}}) # replace ':23:' to '\n+23'
4102 params=(${(s|\n|)${(j|\n|)params}}) # join array using '\n', then split on all '\n'
4106 # get_ic() - queries imap servers for capabilities; real simple. no imaps
4110 if [[ ! -z $1 ]] ; then
4112 print "querying imap server on $1:${port}...\n";
4113 print "a1 capability\na2 logout\n" | nc $1 ${port}
4115 print "usage:\n $0 <imap-server> [port]"
4119 # creates a Maildir/ with its {new,cur,tmp} subdirs
4123 root=${MAILDIR_ROOT:-${HOME}/Mail}
4124 if [[ -z ${1} ]] ; then print "Usage:\n $0 <dirname>" ; return 1 ; fi
4126 mkdir -p ${root}/${subdir}/{cur,new,tmp}
4129 #f5# Change the xterm title from within GNU-screen
4132 if [[ $1 != "-f" ]] ; then
4133 if [[ -z ${DISPLAY} ]] ; then
4134 printf 'xtrename only makes sense in X11.\n'
4140 if [[ -z $1 ]] ; then
4141 printf 'usage: xtrename [-f] "title for xterm"\n'
4142 printf ' renames the title of xterm from _within_ screen.\n'
4143 printf ' also works without screen.\n'
4144 printf ' will not work if DISPLAY is unset, use -f to override.\n'
4147 print -n "\eP\e]0;${1}\C-G\e\\"
4151 # hl() highlighted less
4152 # http://ft.bewatermyfriend.org/comp/data/zsh/zfunct.html
4153 if check_com -c highlight ; then
4157 theme=${HL_THEME:-""}
4160 ( printf 'available languages (syntax parameter):\n\n' ;
4161 highlight --list-langs ; ) | less -SMr
4164 ( printf 'available themes (style parameter):\n\n' ;
4165 highlight --list-themes ; ) | less -SMr
4168 printf 'usage: hl <syntax[:theme]> <file>\n'
4169 printf ' available options: --list (-l), --themes (-t), --help (-h)\n\n'
4170 printf ' Example: hl c main.c\n'
4173 if [[ -z ${2} ]] || (( ${#argv} > 2 )) ; then
4174 printf 'usage: hl <syntax[:theme]> <file>\n'
4175 printf ' available options: --list (-l), --themes (-t), --help (-h)\n'
4176 (( ${#argv} > 2 )) && printf ' Too many arguments.\n'
4180 [[ ${1} == *:* ]] && [[ -n ${1#*:} ]] && theme=${1#*:}
4181 if [[ -n ${theme} ]] ; then
4182 highlight --xterm256 --syntax ${lang} --style ${theme} ${2} | less -SMr
4184 highlight --ansi --syntax ${lang} ${2} | less -SMr
4190 # ... and a proper completion for hl()
4191 # needs 'highlight' as well, so it fits fine in here.
4192 function _hl_genarg() {
4194 if [[ -prefix 1 *: ]] ; then
4196 themes=(${${${(f)"$(LC_ALL=C highlight --list-themes)"}/ #/}:#*(Installed|Use name)*})
4198 _wanted -C list themes expl theme compadd ${themes}
4201 langs=(${${${(f)"$(LC_ALL=C highlight --list-langs)"}/ #/}:#*(Installed|Use name)*})
4202 _wanted -C list languages expl languages compadd -S ':' -q ${langs}
4205 function _hl_complete() {
4206 _arguments -s '1: :_hl_genarg' '2:files:_path_files'
4208 compdef _hl_complete hl
4211 # Create small urls via http://tinyurl.com using wget(1).
4214 [[ -z $1 ]] && { print "USAGE: zurl <URL>" ; return 1 }
4216 local PN url tiny grabber search result preview
4219 # Check existence of given URL with the help of ping(1).
4220 # N.B. ping(1) only works without an eventual given protocol.
4221 ping -c 1 ${${url#(ftp|http)://}%%/*} >& /dev/null || \
4222 read -q "?Given host ${${url#http://*/}%/*} is not reachable by pinging. Proceed anyway? [y|n] "
4224 if (( $? == 0 )) ; then
4225 # Prepend 'http://' to given URL where necessary for later output.
4226 [[ ${url} != http(s|)://* ]] && url='http://'${url}
4227 tiny='http://tinyurl.com/create.php?url='
4228 if check_com -c wget ; then
4229 grabber='wget -O- -o/dev/null'
4231 print "wget is not available, but mandatory for ${PN}. Aborting."
4233 # Looking for i.e.`copy('http://tinyurl.com/7efkze')' in TinyURL's HTML code.
4234 search='copy\(?http://tinyurl.com/[[:alnum:]]##*'
4235 result=${(M)${${${(f)"$(${=grabber} ${tiny}${url})"}[(fr)${search}*]}//[()\';]/}%%http:*}
4236 # TinyURL provides the rather new feature preview for more confidence. <http://tinyurl.com/preview.php>
4237 preview='http://preview.'${result#http://}
4239 printf '%s\n\n' "${PN} - Shrinking long URLs via webservice TinyURL <http://tinyurl.com>."
4240 printf '%s\t%s\n\n' 'Given URL:' ${url}
4241 printf '%s\t%s\n\t\t%s\n' 'TinyURL:' ${result} ${preview}
4247 #f2# Print a specific line of file(s).
4251 if [ $# -lt 2 ] ; then
4252 print "Usage: linenr <number>[,<number>] <file>" ; return 1
4253 elif [ $# -eq 2 ] ; then
4256 command ed -s $file <<< "${number}n"
4260 for file in "$@" ; do
4261 if [ ! -d $file ] ; then
4263 command ed -s $file <<< "${number}n" 2> /dev/null
4272 #f2# Find history events by search pattern and list them by date.
4276 local usage help ident format_l format_s first_char remain first last
4277 usage='USAGE: whatwhen [options] <searchstring> <search range>'
4278 help='Use' \`'whatwhen -h'\'' for further explanations.'
4279 ident=${(l,${#${:-Usage: }},, ,)}
4280 format_l="${ident}%s\t\t\t%s\n"
4281 format_s="${format_l//(\\t)##/\\t}"
4282 # Make the first char of the word to search for case
4283 # insensitive; e.g. [aA]
4284 first_char=[${(L)1[1]}${(U)1[1]}]
4286 # Default search range is `-100'.
4288 # Optional, just used for `<first> <last>' given.
4292 printf '%s\n\n' 'ERROR: No search string specified. Aborting.'
4293 printf '%s\n%s\n\n' ${usage} ${help} && return 1
4296 printf '%s\n\n' ${usage}
4298 printf $format_l '-h' 'show help text'
4300 print 'SEARCH RANGE:'
4301 printf $format_l "'0'" 'the whole history,'
4302 printf $format_l '-<n>' 'offset to the current history number; (default: -100)'
4303 printf $format_s '<[-]first> [<last>]' 'just searching within a give range'
4304 printf '\n%s\n' 'EXAMPLES:'
4305 printf ${format_l/(\\t)/} 'whatwhen grml' '# Range is set to -100 by default.'
4306 printf $format_l 'whatwhen zsh -250'
4307 printf $format_l 'whatwhen foo 1 99'
4310 printf '%s\n%s\n\n' ${usage} ${help} && return 1
4313 # -l list results on stout rather than invoking $EDITOR.
4314 # -i Print dates as in YYYY-MM-DD.
4315 # -m Search for a - quoted - pattern within the history.
4316 fc -li -m "*${first_char}${remain}*" $first $last
4322 # change fluxbox keys from 'Alt-#' to 'Alt-F#' and vice versa
4325 [[ -n "$FLUXKEYS" ]] || local FLUXKEYS="$HOME/.fluxbox/keys"
4326 if ! [[ -r "$FLUXKEYS" ]] ; then
4327 echo "Sorry, \$FLUXKEYS file $FLUXKEYS could not be read - nothing to be done."
4330 if grep -q 'Mod1 F[0-9] :Workspace [0-9]' $FLUXKEYS ; then
4331 echo -n 'Switching to Alt-# mode in ~/.fluxbox/keys: '
4332 sed -i -e 's|^\(Mod[0-9]\+[: space :]\+\)F\([0-9]\+[: space :]\+:Workspace.*\)|\1\2|' $FLUXKEYS && echo done || echo failed
4333 elif grep -q 'Mod1 [0-9] :Workspace [0-9]' $FLUXKEYS ; then
4334 echo -n 'Switching to Alt-F# mode in ~/.fluxbox/keys: '
4335 sed -i -e 's|^\(Mod[0-9]\+[: space :]\+\)\([0-9]\+[: space :]\+:Workspace.*\)|\1F\2|' $FLUXKEYS && echo done || echo failed
4337 echo 'Sorry, do not know what to do.'
4343 # retrieve weather information on the console
4344 # Usage example: 'weather LOWG'
4348 print 'Usage: weather <station_id>' >&2
4349 print 'List of stations: http://en.wikipedia.org/wiki/List_of_airports_by_ICAO_code'>&2
4353 local PLACE="${1:u}"
4354 local FILE="$HOME/.weather/$PLACE"
4355 local LOG="$HOME/.weather/log"
4357 [[ -d $HOME/.weather ]] || {
4358 print -n "Creating $HOME/.weather: "
4359 mkdir $HOME/.weather
4363 print "Retrieving information for ${PLACE}:"
4365 wget -T 10 --no-verbose --output-file=$LOG --output-document=$FILE --timestamping http://weather.noaa.gov/pub/data/observations/metar/decoded/$PLACE.TXT
4367 if [[ $? -eq 0 ]] ; then
4368 if [[ -n "$VERBOSE" ]] ; then
4371 DATE=$(grep 'UTC' $FILE | sed 's#.* /##')
4372 TEMPERATURE=$(awk '/Temperature/ { print $4" degree Celcius / " $2" degree Fahrenheit" }' $FILE| tr -d '(')
4374 echo "temp: $TEMPERATURE"
4377 print "There was an error retrieving the weather information for $PLACE" >&2
4384 # mercurial related stuff {{{
4385 if check_com -c hg ; then
4386 # gnu like diff for mercurial
4387 # http://www.selenic.com/mercurial/wiki/index.cgi/TipsAndTricks
4388 #f5# GNU like diff for mercurial
4391 for i in $(hg status -marn "$@") ; diff -ubwd <(hg cat "$i") "$i"
4394 # build debian package
4395 #a2# Alias for \kbd{hg-buildpackage}
4396 alias hbp='hg-buildpackage'
4398 # execute commands on the versioned patch-queue from the current repos
4399 alias mq='hg -R $(readlink -f $(hg root)/.hg/patches)'
4401 # diffstat for specific version of a mercurial repository
4402 # hgstat => display diffstat between last revision and tip
4403 # hgstat 1234 => display diffstat between revision 1234 and tip
4404 #f5# Diffstat for specific version of a mercurial repos
4407 [[ -n "$1" ]] && hg diff -r $1 -r tip | diffstat || hg export tip | diffstat
4410 #f5# Get current mercurial tip via hg itself
4414 if [[ -f mercurial-tree/.hg ]] ; then
4416 echo "Running hg pull for retreiving latest version..."
4418 echo "Finished update. Building mercurial"
4420 echo "Setting \$PATH to $PWD:\$PATH..."
4421 export PATH="$PWD:$PATH"
4423 echo "Downloading mercurial via hg"
4424 hg clone http://selenic.com/repo/hg mercurial-tree
4426 echo "Building mercurial"
4428 echo "Setting \$PATH to $PWD:\$PATH..."
4429 export PATH="$PWD:$PATH"
4430 echo "make sure you set it permanent via ~/.zshrc if you plan to use it permanently."
4431 # echo "Setting \$PYTHONPATH to PYTHONPATH=\${HOME}/lib/python,"
4432 # export PYTHONPATH=${HOME}/lib/python
4436 fi # end of check whether we have the 'hg'-executable
4438 # get current mercurial snapshot
4439 #f5# Get current mercurial snapshot
4443 if [[ -f mercurial-snapshot.tar.gz ]] ; then
4444 echo "mercurial-snapshot.tar.gz exists already, skipping download."
4446 echo "Downloading mercurial snapshot"
4447 wget http://www.selenic.com/mercurial/mercurial-snapshot.tar.gz
4449 echo "Unpacking mercurial-snapshot.tar.gz"
4450 tar zxf mercurial-snapshot.tar.gz
4451 cd mercurial-snapshot/
4452 echo "Installing required build-dependencies"
4453 $SUDO apt-get update
4454 $SUDO apt-get install python2.4-dev
4455 echo "Building mercurial"
4457 echo "Setting \$PATH to $PWD:\$PATH..."
4458 export PATH="$PWD:$PATH"
4459 echo "make sure you set it permanent via ~/.zshrc if you plan to use it permanently."
4463 # some useful commands often hard to remember - let's grep for them {{{
4464 # actually use our zg() function now. :)
4466 # Work around ion/xterm resize bug.
4467 #if [[ "$SHLVL" -eq 1 ]]; then
4468 # if check_com -c resize ; then
4469 # eval `resize </dev/null`
4474 # /usr/bin/jackd -dalsa -dhw:0 -r48000 -p1024 -n2
4475 # now play audio file:
4476 # alsaplayer -o jack foobar.mp3
4478 # send files via netcat
4480 # send() {j=$*; tar cpz ${j/%${!#}/}|nc -w 1 ${!#} 51330;}
4482 # alias receive='nc -vlp 51330 | tar xzvp'
4485 # dh_make -e foo@localhost -f $1
4486 # dpkg-buildpackage -rfakeroot
4488 # dpkg-scanpackages ./ /dev/null | gzip > Packages.gz
4489 # dpkg-scansources . | gzip > Sources.gz
4490 # grep-dctrl --field Maintainer $* /var/lib/apt/lists/*
4493 # convert -geometry 200x200 -interlace LINE -verbose
4494 # ldapsearch -x -b "OU=Bedienstete,O=tug" -h ldap.tugraz.at sn=$1
4495 # ps -ao user,pcpu,start,command
4496 # gpg --keyserver blackhole.pca.dfn.de --recv-keys
4497 # xterm -bg black -fg yellow -fn -misc-fixed-medium-r-normal--14-140-75-75-c-90-iso8859-15 -ah
4498 # nc -vz $1 1-1024 # portscan via netcat
4499 # wget --mirror --no-parent --convert-links
4501 # autoload -U tetris; zle -N tetris; bindkey '...' ; echo "press ... for playing tennis"
4503 # modify console cursor
4504 # see http://www.tldp.org/HOWTO/Framebuffer-HOWTO-5.html
4505 # print $'\e[?96;0;64c'
4508 # grml-small cleanups {{{
4510 # The following is used to remove zsh-config-items that do not work
4511 # in grml-small by default.
4512 # If you do not want these adjustments (for whatever reason), set
4513 # $GRMLSMALL_SPECIFIC to 0 in your .zshrc.pre file (which this configuration
4514 # sources if it is there).
4516 if (( GRMLSMALL_SPECIFIC > 0 )) && isgrmlsmall ; then
4519 unalias 'V' &> /dev/null
4520 unfunction vman &> /dev/null
4521 unfunction vimpm &> /dev/null
4522 unfunction vimhelp &> /dev/null
4523 unfunction viless &> /dev/null
4524 unfunction 2html &> /dev/null
4526 # manpages are not in grmlsmall
4527 unfunction manzsh &> /dev/null
4528 unalias man2 &> /dev/null
4529 unalias man &> /dev/null
4530 unfunction man2 &> /dev/null
4538 ## genrefcard.pl settings {{{
4540 ### doc strings for external functions from files
4541 #m# f5 grml-wallpaper() Sets a wallpaper (try completion for possible values)
4543 ### example: split functions-search 8,16,24,32
4544 #@# split functions-search 8
4548 ## END OF FILE #################################################################
4549 # vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4