2 # Purpose: config file for zsh (z shell)
3 # Authors: grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
4 # Bug-Reports: see http://grml.org/bugs/
5 # License: This file is licensed under the GPL v2.
6 # Latest change: Fre Jän 05 19:35:27 CET 2007 [mika]
7 ################################################################################
8 # This file is sourced only for interactive shells. It
9 # should contain commands to set up aliases, functions,
10 # options, key bindings, etc.
12 # Global Order: zshenv, zprofile, zshrc, zlogin
13 ################################################################################
16 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
17 if [[ -n $ZSH_PROFILE_RC ]] ; then
22 # {{{ check for version/system
23 # check for versions (compatibility reasons)
24 if autoload is-at-least && is-at-least 2>/dev/null ; then
25 is4() { is-at-least 4 }
26 is42() { is-at-least 4.2 }
29 [[ $ZSH_VERSION == 4.* ]] && return 0
33 [[ $ZSH_VERSION == 4.<2->* ]] && return 0
40 [ -f /etc/grml_version ] && return 0
45 [ -f /etc/grml_cd ] && return 0
51 [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
54 isgrmlsmall() { return 1 }
57 # are we running within an utf environment?
59 case "$LANG $CHARSET $LANGUAGE" in
65 # check for user, if not running as root set $SUDO to sudo
66 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
68 # change directory to home on first invocation of zsh
69 # important for rungetty -> autologin
70 # Thanks go to Bart Schaefer!
71 isgrml && checkhome() {
72 if [[ -z "$ALREADY_DID_CD_HOME" ]]; then
73 export ALREADY_DID_CD_HOME=$HOME
79 # {{{ set some variables
80 export EDITOR=${EDITOR:-vim}
81 export MAIL=${MAIL:-/var/mail/$USER}
82 [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
83 [[ -x /usr/bin/dircolors ]] && eval `dircolors -b`
85 # Search path for the cd comman
88 # Support our own site-functions
89 [ -d /etc/zsh/site-functions ] && FPATH=/etc/zsh/site-functions:$FPATH
91 # automatically remove duplicates from these arrays
92 typeset -U path cdpath fpath manpath
96 if [[ "$TERM" != emacs ]]; then
97 [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
98 [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
99 [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
100 [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
101 [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
102 [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
103 [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
104 [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
105 [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
106 [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
107 [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
108 [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
110 [[ "$terminfo[kcuu1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
111 [[ "$terminfo[kcud1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
112 [[ "$terminfo[kcuf1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
113 [[ "$terminfo[kcub1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
114 [[ "$terminfo[khome]" == "
\eO"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
115 [[ "$terminfo[kend]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
116 [[ "$terminfo[khome]" == "
\eO"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
117 [[ "$terminfo[kend]" == "
\eO"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
120 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
121 # use emacs style per default:
126 #if [[ "$TERM" == screen ]]; then
127 bindkey '\e[1~' beginning-of-line # home
128 bindkey '\e[4~' end-of-line # end
129 bindkey "^[[A" up-line-or-search # cursor up
130 bindkey "^[[B" down-line-or-search # <ESC>-
131 bindkey '^x' history-beginning-search-backward # alternative ways of searching the shell history
132 # bindkey -s '^L' "|less\n" # ctrl-L pipes to less
133 # bindkey -s '^B' " &\n" # ctrl-B runs it in the background
134 # if terminal type is set to 'rxvt':
135 bindkey '\e[7~' beginning-of-line # home
136 bindkey '\e[8~' end-of-line # end
139 # bindkey '\eq' push-line-or-edit
142 # power completion - abbreviation expansion {{{
143 # power completion / abbreviation expansion / buffer expansion
144 # see http://zshwiki.org/home/examples/zleiab for details
145 # less risky than the global aliases but powerful as well
146 # just type the abbreviation key and afterwards ',.' to expand it
149 setopt interactivecomments
157 'G' '|& grep --color=auto'
159 'Hl' ' --help |& less -r'
164 'R' '| tr A-z N-za-m'
169 'hide' "echo -en '\033]50;nil2\007'"
170 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
171 'small' 'echo -en "\033]50;6x10\007"'
172 'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
173 'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
174 'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
175 'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
176 'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
177 'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
181 'co' "./configure && make && sudo make install"
182 'CH' "./configure --help"
183 'conkeror' 'firefox -chrome chrome://conkeror/content'
185 'lad' $'ls -d .*(/)\n# only show dot-directories'
186 'lsa' $'ls -a .*(.)\n# only show dot-files'
187 'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
188 'lsl' $'ls -l *(@[1,10])\n# only symlinks'
189 'lsx' $'ls -l *(*[1,10])\n# only executables'
190 'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
191 'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
192 'lsd' $'ls -d *(/)\n# only show directories'
193 'lse' $'ls -d *(/^F)\n# only show empty directories'
194 'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
195 'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
196 'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
198 '600' 'chmod u+rw-x,g-rwx,o-rwx'
200 '700' 'chmod u+rwx,g-rwx,o-rwx'
201 'r--' 'chmod u+r-wx,g-rwx,o-rwx'
202 '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
203 '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
205 'cmplayer' 'mplayer -vo -fs -zoom fbdev'
206 'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
207 'fblinks' 'links2 -driver fb'
208 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
209 'fori' 'for i ({..}) { }'
212 'se' 'setopt interactivecomments'
213 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
214 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
215 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3'
217 'D' 'export DISPLAY=:0.0'
218 'mp' 'mplayer -vo xv -fs -zoom'
223 matched_chars='[.-|_a-zA-Z0-9]#'
224 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
225 LBUFFER+=${abk[$MATCH]:-$MATCH}
229 bindkey ",." globalias
233 autoload -U zmv # who needs mmv or rename?
234 autoload history-search-end
236 # we don't want to quote/espace URLs on our own...
237 # avoid 'url-quote-magic: function definition file not found' on some older boxes
238 if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Zle/url-quote-magic" ] && \
239 autoload -U url-quote-magic && zle -N self-insert url-quote-magic ; then
240 zle -N self-insert url-quote-magic
242 print 'Notice: no url-quote-magic available :('
245 alias run-help >&/dev/null && unalias run-help
246 autoload run-help # use via 'esc-h'
249 if autoload -U compinit && compinit 2>/dev/null ; then
250 compinit 2>/dev/null || print 'Notice: no compinit available :('
252 print 'Notice: no compinit available :('
257 is4 && autoload -U zed # use ZLE editor to edit a file or function
259 is4 && for mod in complist deltochar mathfunc ; do
260 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
263 # autoload zsh modules when they are referenced
264 is4 && for opt mod in a stat \
268 zmodload -${opt} zsh/${mod} ${mod}
271 is4 && autoload -U insert-files && \
272 zle -N insert-files && \
273 bindkey "^Xf" insert-files # C-x-f
275 bindkey ' ' magic-space # also do history expansion on space
276 bindkey '\ei' menu-complete # menu completion via esc-i
278 # press esc-e for editing command line in $EDITOR or $VISUAL
279 is4 && autoload -U edit-command-line && \
280 zle -N edit-command-line && \
281 bindkey '\ee' edit-command-line
283 # menu selection: pick item but stay in the menu (press esc-return)
284 is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
286 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
287 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
288 bindkey '\C-ed' _bkdate
291 # press esc-m for inserting last typed word again (thanks to caphuso!)
292 insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
293 zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
295 # set command prediction from history, see 'man 1 zshcontrib'
296 # is4 && autoload -U predict-on && \
297 # zle -N predict-on && \
298 # zle -N predict-off && \
299 # bindkey "^X^Z" predict-on && \
300 # bindkey "^Z" predict-off
302 # put job into foreground via ctrl-z:
303 bindkey -s '^z' "fg\n"
305 # press ctrl-q to quote line:
307 # zle beginning-of-line
309 # # RBUFFER="'$RBUFFER'"
310 # RBUFFER=${(q)RBUFFER}
313 # zle -N mquote && bindkey '^q' mquote
315 # run command line as user root via sudo:
316 _sudo-command-line() {
317 [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
319 zle -N sudo-command-line _sudo-command-line
320 bindkey "^Os" sudo-command-line
323 # {{{ set some important options
328 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
329 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
330 setopt extended_history # save each command's beginning timestamp and the duration to the history file
331 is4 && setopt histignorealldups # If a new command line being added to the history
332 # list duplicates an older one, the older command is removed from the list
333 setopt histignorespace # remove command lines from the history list when
334 # the first character on the line is a space
335 # setopt histallowclobber # add `|' to output redirections in the history
336 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
337 setopt auto_cd # if a command is issued that can't be executed as a normal command,
338 # and the command is the name of a directory, perform the cd command to that directory
339 setopt extended_glob # in order to use #, ~ and ^ for filename generation
340 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
341 # -> searches for word not in compressed files
342 # don't forget to quote '^', '~' and '#'!
343 setopt notify # report the status of backgrounds jobs immediately
344 setopt hash_list_all # Whenever a command completion is attempted, make sure \
345 # the entire command path is hashed first.
346 setopt completeinword # not just at the end
347 # setopt nocheckjobs # don't warn me about bg processes when exiting
348 setopt nohup # and don't kill them, either
349 # setopt printexitvalue # alert me if something failed
350 # setopt dvorak # with spelling correction, assume dvorak kb
351 setopt auto_pushd # make cd push the old directory onto the directory stack.
352 setopt nonomatch # try to avoid the 'zsh: no matches found...'
353 setopt nobeep # avoid "beep"ing
355 MAILCHECK=30 # mailchecks
356 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 secondes
357 watch=(notme root) # watch for everyone but me and root
359 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
360 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
362 # WORDCHARS='*?_[]~=&;!#$%^(){}'
363 # WORDCHARS='${WORDCHARS:s@/@}'
365 # only slash should be considered as a word separator:
366 slash-backward-kill-word() {
367 local WORDCHARS="${WORDCHARS:s@/@}"
369 zle backward-kill-word
371 zle -N slash-backward-kill-word
372 bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
376 export ZSHDIR=$HOME/.zsh
377 HISTFILE=$HOME/.zsh_history
378 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
379 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
382 # dirstack handling {{{
384 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
385 dirstack=( ${(uf)"$(< ~/.zdirs)"} )
386 # "cd -" won't work after login by just setting $OLDPWD, so
387 cd $dirstack[0] && cd $OLDPWD
390 builtin dirs -pl >! ~/.zdirs
394 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
395 if [ -n "$BATTERY" ] ; then
396 if [ -x =acpi ] ; then
397 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
398 [ -z "$PERCENT" ] && PERCENT='acpi not present'
399 if [ "${PERCENT%%%}" -lt 20 ] ; then
400 PERCENT="warning: ${PERCENT}%"
407 if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Prompts/promptinit" ] && autoload promptinit && promptinit 2>/dev/null ; then
408 promptinit # people should be able to use their favourite prompt
410 print 'Notice: no promptinit available :('
413 # precmd() => a function which is executed just before each prompt
414 # use 'NOPRECMD=1' to disable the precmd + preexec commands
416 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
418 is4 && [[ -z $NOPRECMD ]] && precmd () {
419 [[ -n $NOPRECMD ]] && return 0
420 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
421 if [[ -z ${DONTSETRPROMPT} ]] ; then
422 if [ -n "$BATTERY" ] ; then
423 # RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
424 RPROMPT="${PERCENT}${SCREENTITLE}"
426 # RPROMPT="%(?..:()% ${SCREENTITLE}"
427 RPROMPT="${SCREENTITLE}"
430 # adjust title of xterm
431 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
432 case $TERM in (xterm*|rxvt)
433 print -Pn "\e]0;%n@%m: %~\a"
438 # chpwd () => a function which is executed whenever the directory is changed
440 # preexec() => a function running before every command
441 is4 && [[ -z $NOPRECMD ]] && preexec () {
442 [[ -n $NOPRECMD ]] && return 0
443 # set hostname if not running on host with name 'grml'
444 local HOSTNAME=$(hostname)
445 if [[ "$HOSTNAME" != grml ]] ; then
448 # get the name of the program currently running and hostname of local machine
449 # set screen window title if running in a screen
450 if [[ "$TERM" == screen* ]]; then
451 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
452 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
453 echo -ne "\ek$CMD\e\\"
455 # set the screen title to "zsh" when sitting at the command prompt:
456 if [[ "$TERM" == screen* ]]; then
457 SCREENTITLE=$'%{\ekzsh\e\\%}'
461 # adjust title of xterm
462 case $TERM in (xterm*|rxvt)
463 print -Pn "\e]0;%n@%m: $1\a"
469 if autoload colors && colors 2>/dev/null ; then
470 BLUE="%{${fg[blue]}%}"
471 RED="%{${fg_bold[red]}%}"
472 GREEN="%{${fg[green]}%}"
473 CYAN="%{${fg[cyan]}%}"
474 WHITE="%{${fg[white]}%}"
475 NO_COLOUR="%{${reset_color}%}"
482 NO_COLOUR="%{
\e[0m%}"
485 EXITCODE="%(?..%?%1v )"
486 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
487 PS3='?# ' # selection prompt used within a select loop.
488 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
490 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
491 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
492 debian_chroot=$(cat /etc/debian_chroot)
495 # don't use colors on dumb terminals (like emacs):
496 if [[ "$TERM" == dumb ]] ; then
497 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
499 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
500 # set variable identifying the chroot you work in (used in the prompt below)
501 if [[ -n "$GRMLPROMPT" ]]; then
502 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
503 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
505 if (( EUID != 0 )); then
506 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
508 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
513 # if we are inside a grml-chroot set a specific prompt theme
514 if [ -n "$GRML_CHROOT" ] ; then
515 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
519 # {{{ 'hash' some often used directories
520 hash -d deb=/var/cache/apt/archives
521 hash -d doc=/usr/share/doc
522 hash -d linux=/lib/modules/$(command uname -r)/build/
524 hash -d slog=/var/log/syslog
526 hash -d templ=/usr/share/doc/grml-templates
527 hash -d tt=/usr/share/doc/texttools-doc
532 if [ $UID = 0 ] ; then
533 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
534 elif [ -r $HOME/.screenrc ] ; then
535 alias screen="/usr/bin/screen -c $HOME/.screenrc"
537 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
540 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
541 alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
542 alias la='ls -la --color=auto'
543 alias ll='ls -l --color=auto'
544 alias lh='ls -hAl --color=auto'
545 alias l='ls -lF --color=auto'
554 alias cp='nocorrect cp' # no spelling correction on cp
555 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
556 alias mv='nocorrect mv' # no spelling correction on mv
557 alias rm='nocorrect rm' # no spelling correction on rm
562 alias swspeak="setopt singlelinezle ; unsetopt prompt_cr ; export PS1='%m%# ' ; speechd-up" # set up software synth.
564 # I like clean prompt, so provide simple way to get that
565 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
567 # truecrypt; use e.g. via 'truec /dev/ice' /mnt/ice' or 'truec -i'
568 if [ -x /usr/sbin/truecrypt ] ; then
570 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
572 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
576 zsh-help(){print "$bg[white]$fg[black]
577 zsh-help - hints for use of zsh on grml
578 =======================================$reset_color
580 Main configuration of zsh happens in /etc/zsh/zshrc (global)
581 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
582 The files are part of the package grml-etc-core, if you want to
583 use them on a non-grml-system just get the tar.gz from
584 http://deb.grml.org/ or get the files from the mercurial
587 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
588 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
590 If you want to stay in sync with zsh configuration of grml
591 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
592 your own stuff in \$HOME/.zshrc.local. System wide configuration
593 without touching configuration files of grml can take place
594 in /etc/zsh/zshrc.local.
596 If you want to use the configuration of user grml also when
597 running as user root just run 'zshskel' which will source
598 the file /etc/skel/.zshrc.
600 For information regarding zsh start at http://grml.org/zsh/
602 Take a look at grml's zsh refcard:
603 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
605 Check out the main zsh refcard:
606 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
608 And of course visit the zsh-lovers:
611 You can adjust some options through environment variables when
612 invoking zsh without having to edit configuration files.
613 Basically meant for bash users who are not used to the power of
616 \"NOCOR=1 zsh\" => deactivate automatic correction
617 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
618 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
619 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
621 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
622 Enjoy your grml system with the zsh!$reset_color"
626 if [ -r /etc/debian_version ] ; then
627 alias acs='apt-cache search'
628 alias acsh='apt-cache show'
629 alias acp='apt-cache policy'
630 alias adg="$SUDO apt-get dist-upgrade"
631 alias agi="$SUDO apt-get install"
632 alias ag="$SUDO apt-get upgrade"
633 alias au="$SUDO apt-get update"
634 alias dbp='dpkg-buildpackage'
635 alias ge='grep-excuses'
639 if [ -z "$1" ] ; then
641 $SUDO apt-get -u upgrade
643 ssh $1 $SUDO apt-get update
644 # ask before the upgrade
646 ssh $1 $SUDO apt-get --no-act upgrade
647 echo -n 'Process the upgrade?'
649 if [[ $dummy == "y" ]] ; then
650 ssh $1 $SUDO apt-get -u upgrade --yes
655 isgrmlcd && alias su="sudo su" # change to user root
656 alias tlog="tail -f /var/log/syslog" # take a look at the syslog
657 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
660 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
661 if [ -L /usr/bin/cdrecord -o ! -x =cdrecord ] ; then
662 if [ -x =wodim ] ; then
663 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
664 See #377109 in the BTS of Debian for more details.
666 Please use the wodim binary instead' ; return 1"
670 # I hate lacking backward compability, so provide an alternative therefore
671 if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
672 function apache2-ssl-certificate(){
674 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
675 print 'You might want to take a look at Debian the package ssl-cert as well.'
676 print 'To generate a certificate for use with apache2 follow the instructions:'
680 export RANDFILE=/dev/random
681 mkdir /etc/apache2/ssl/
682 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
683 chmod 600 /etc/apache2/ssl/apache.pem
685 Run "grml-tips ssl-certificate" if you need further instructions.
691 # {{{ Use hard limits, except for a smaller stack and no core dumps
694 isgrmlcd && limit core 0 # important for a live-cd-system
698 # {{{ completion stuff
700 # Where to look for autoloaded function definitions
701 if [ -d /etc/zsh/completion.d ] ; then
702 local comp=/etc/zsh/completion.d
703 for func in $comp/*(N-.:t); . ${comp}/${func}
706 # called later (via is4 && grmlcomp)
707 # notice: use 'zstyle' for getting current settings
708 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
711 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
712 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
713 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
714 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
715 zstyle ':completion:*:correct:*' original true #
716 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
717 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
718 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
719 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
720 zstyle ':completion:*:history-words' list false #
721 zstyle ':completion:*:history-words' menu yes # activate menu
722 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
723 zstyle ':completion:*:history-words' stop yes #
724 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
725 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
726 zstyle ':completion:*' group-name ''
727 if [[ -z "$NOMENU" ]] ; then
728 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
730 setopt no_auto_menu # don't use any menus at all
732 zstyle ':completion:*:messages' format '%d' #
733 zstyle ':completion:*:options' auto-description '%d' #
734 zstyle ':completion:*:options' description 'yes' # describe options in full
735 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
736 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
737 zstyle ':completion:*' verbose true # provide verbose completion information
738 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
739 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
740 zstyle ':completion:correct:' prompt 'correct to: %e' #
741 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
743 # complete manual by their section
744 zstyle ':completion:*:manuals' separate-sections true
745 zstyle ':completion:*:manuals.*' insert-sections true
746 zstyle ':completion:*:man:*' menu yes select
749 # run rehash on completion so new installed program are found automatically:
751 (( CURRENT == 1 )) && rehash
752 return 1 # Because we didn't really complete anything
754 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
755 if [[ -n "$NOCOR" ]] ; then
756 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete
757 setopt nocorrect # do not try to correct the spelling if possible
759 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate
760 setopt correct # try to correct the spelling if possible
761 zstyle -e ':completion:*' completer '
762 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
763 _last_try="$HISTNO$BUFFER$CURSOR"
764 reply=(_complete _match _prefix)
766 if [[ $words[1] = (rm|mv) ]]; then
769 reply=(_oldlist _expand _force_rehash _complete _correct _approximate)
773 # zstyle ':completion:*' completer _complete _correct _approximate
774 # zstyle ':completion:*' expand prefix suffix
776 # automatic rehash? Credits go to Frank Terbeck
777 # function my_accept () {
779 # [[ -z ${BUFFER} ]] && zle accept-line && return
780 # buf=( ${(z)BUFFER} )
781 # [[ -z ${commands[${buf[1]}]} ]] && rehash
785 # bindkey "^M" my_accept
787 # command for process lists, the local web server details and host completion
788 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
791 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
792 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
796 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
797 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
809 zstyle ':completion:*:hosts' hosts $hosts
810 # zstyle '*' hosts $hosts
812 # specify your logins:
814 # {grml,grml1}@foo.invalid
815 # grml-devel@bar.invalid
818 # {fred,root}@foo.invalid
821 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
822 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
824 # specify specific port/service settings:
825 # telnet_users_hosts_ports=(
828 # @mail-server:{smtp,pop3}
832 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
834 # use generic completion system for programs not yet defined:
835 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
837 # see upgrade function in this file
838 compdef _hosts upgrade
844 # people should use 'grml-x'!
846 if [ -e /etc/X11/xorg.conf ] ; then
847 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
849 echo "Please use the script \"grml-x\" for starting the X Window System
850 because there does not exist /etc/X11/xorg.conf yet.
851 If you want to use startx anyway please call \"/usr/bin/startx\"."
857 if [ -e /etc/X11/xorg.conf ] ; then
858 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
860 echo "Please use the script \"grml-x\" for starting the X Window System.
861 because there does not exist /etc/X11/xorg.conf yet.
862 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
867 if [ -x /usr/sbin/915resolution ] ; then
868 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
871 alias grml-version='cat /etc/grml_version'
873 if [ -x /usr/sbin/rebuildfstab ] ; then
874 alias grml-rebuildfstab='rebuildfstab -v -r -config'
879 # {{{ now run the functions
881 is4 && isgrml && grmlstuff
886 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
889 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
890 # You use it as follows:
891 # $ NTREF=/reference/file
893 # This lists all the files in the current directory newer than the reference file.
894 # You can also specify the reference file inline; note quotes:
895 # $ ls -l *(e:'nt ~/.zshenv':)
900 [[ $REPLY -nt $NTREF ]]
904 # shell functions {{{
905 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
906 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
908 if [[ "$#*" -eq 0 ]]; then
909 [ -r ~/.zshrc ] && . ~/.zshrc
918 compdef _functions reload freload
921 if type -p qma &>/dev/null ; then
922 manzsh() { qma zshall "$1" }
924 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
925 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
926 # manzsh() { man zshall | $MYLESS -p $1 ; }
929 # use "dchange <package-name>" to view Debian's changelog of the package:
931 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
932 most /usr/share/doc/${1}/changelog.Debian.gz
934 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
935 most /usr/share/doc/${1}/changelog.gz
937 echo "No changelog for package $1 found, sorry."
942 _dchange() { _files -W /usr/share/doc -/ }
943 compdef _dchange dchange
945 # use "uchange <package-name>" to view upstream's changelog of the package:
947 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
948 most /usr/share/doc/${1}/changelog.gz
950 echo "No changelog for package $1 found, sorry."
954 _uchange() { _files -W /usr/share/doc -/ }
955 compdef _uchange uchange
959 ZSH_PROFILE_RC=1 $SHELL "$@"
962 # edit alias via zle:
964 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
966 compdef _aliases edalias
968 # edit function via zle:
970 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
972 compdef _functions edfunc
974 # use it e.g. via 'Restart apache2'
975 if [ -d /etc/init.d ] ; then
976 for i in Start Restart Stop Force-Reload Reload ; do
977 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
979 # now the completion for this:
980 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
983 # provide useful information on globbing
990 p named pipes (FIFOs)
991 * executable plain files (0100)
992 % device files (character or block special)
993 %b block special files
994 %c character special files
995 r owner-readable files (0400)
996 w owner-writable files (0200)
997 x owner-executable files (0100)
998 A group-readable files (0040)
999 I group-writable files (0020)
1000 E group-executable files (0010)
1001 R world-readable files (0004)
1002 W world-writable files (0002)
1003 X world-executable files (0001)
1004 s setuid files (04000)
1005 S setgid files (02000)
1006 t files with the sticky bit (01000)
1008 print *(m-1) # Files modified up to a day ago
1009 print *(a1) # Files accessed a day ago
1010 print *(@) # Just symlinks
1011 print *(Lk+50) # Files bigger than 50 kilobytes
1012 print *(Lk-50) # Files smaller than 50 kilobytes
1013 print **/*.c # All *.c files recursively starting in \$PWD
1014 print **/*.c~file.c # Same as above, but excluding 'file.c'
1015 print (foo|bar).* # Files starting with 'foo' or 'bar'
1016 print *~*.* # All Files that do not contain a dot
1017 chmod 644 *(.^x) # make all plain non-executable files publically readable
1018 print -l *(.c|.h) # Lists *.c and *.h
1019 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1020 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1022 alias help-zshglob=H-Glob
1024 type -p qma &>/dev/null && alias ?='qma zshall'
1026 # grep for running process, like: 'any vim'
1028 if [ -z "$1" ] ; then
1029 echo "any - grep for process(es) by keyword" >&2
1030 echo "Usage: any <keyword>" >&2 ; return 1
1033 local LENGTH=$(expr length $STRING)
1034 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1035 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1036 ps xauwww| grep "[$FIRSCHAR]$REST"
1040 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1042 # NO_SWITCH="yes" command bash "$@"
1045 # exec $SHELL $SHELL_ARGS "$@"
1050 # log out? set timeout in seconds {{{
1052 # do not log out in some specific terminals:
1053 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1058 # {{{ make sure our environment is clean regarding colors
1059 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1062 # source another config file if present {{{
1063 if [ -r /etc/zsh/zshrc.local ]; then
1064 source /etc/zsh/zshrc.local
1068 # "persistent history" {{{
1069 # just write important commands you always need to ~/.important_commands
1070 if [ -r ~/.important_commands ] ; then
1071 fc -R ~/.important_commands
1075 ## END OF FILE #################################################################
1076 # vim:foldmethod=marker expandtab