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: Son Jän 14 10:57:03 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
66 # check for user, if not running as root set $SUDO to sudo
67 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
69 # change directory to home on first invocation of zsh
70 # important for rungetty -> autologin
71 # Thanks go to Bart Schaefer!
72 isgrml && checkhome() {
73 if [[ -z "$ALREADY_DID_CD_HOME" ]]; then
74 export ALREADY_DID_CD_HOME=$HOME
80 # {{{ set some variables
81 export EDITOR=${EDITOR:-vim}
82 export MAIL=${MAIL:-/var/mail/$USER}
83 [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
84 [[ -x /usr/bin/dircolors ]] && eval `dircolors -b`
86 # Search path for the cd comman
89 # Support our own site-functions
90 [ -d /etc/zsh/site-functions ] && FPATH=/etc/zsh/site-functions:$FPATH
92 # automatically remove duplicates from these arrays
93 typeset -U path cdpath fpath manpath
97 if [[ "$TERM" != emacs ]]; then
98 [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
99 [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
100 [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
101 [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
102 [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
103 [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
104 [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
105 [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
106 [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
107 [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
108 [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
109 [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
111 [[ "$terminfo[kcuu1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
112 [[ "$terminfo[kcud1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
113 [[ "$terminfo[kcuf1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
114 [[ "$terminfo[kcub1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
115 [[ "$terminfo[khome]" == "
\eO"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
116 [[ "$terminfo[kend]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
117 [[ "$terminfo[khome]" == "
\eO"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
118 [[ "$terminfo[kend]" == "
\eO"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
121 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
122 # use emacs style per default:
127 #if [[ "$TERM" == screen ]]; then
128 bindkey '\e[1~' beginning-of-line # home
129 bindkey '\e[4~' end-of-line # end
130 bindkey "^[[A" up-line-or-search # cursor up
131 bindkey "^[[B" down-line-or-search # <ESC>-
132 bindkey '^x' history-beginning-search-backward # alternative ways of searching the shell history
133 # bindkey -s '^L' "|less\n" # ctrl-L pipes to less
134 # bindkey -s '^B' " &\n" # ctrl-B runs it in the background
135 # if terminal type is set to 'rxvt':
136 bindkey '\e[7~' beginning-of-line # home
137 bindkey '\e[8~' end-of-line # end
140 # bindkey '\eq' push-line-or-edit
143 # power completion - abbreviation expansion {{{
144 # power completion / abbreviation expansion / buffer expansion
145 # see http://zshwiki.org/home/examples/zleiab for details
146 # less risky than the global aliases but powerful as well
147 # just type the abbreviation key and afterwards ',.' to expand it
150 setopt interactivecomments
158 'G' '|& grep --color=auto'
160 'Hl' ' --help |& less -r'
165 'R' '| tr A-z N-za-m'
170 'hide' "echo -en '\033]50;nil2\007'"
171 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
172 'small' 'echo -en "\033]50;6x10\007"'
173 'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
174 'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
175 'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
176 'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
177 'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
178 'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
182 'co' "./configure && make && sudo make install"
183 'CH' "./configure --help"
184 'conkeror' 'firefox -chrome chrome://conkeror/content'
186 'lad' $'ls -d .*(/)\n# only show dot-directories'
187 'lsa' $'ls -a .*(.)\n# only show dot-files'
188 'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
189 'lsl' $'ls -l *(@[1,10])\n# only symlinks'
190 'lsx' $'ls -l *(*[1,10])\n# only executables'
191 'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
192 'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
193 'lsd' $'ls -d *(/)\n# only show directories'
194 'lse' $'ls -d *(/^F)\n# only show empty directories'
195 'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
196 'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
197 'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
199 '600' 'chmod u+rw-x,g-rwx,o-rwx'
201 '700' 'chmod u+rwx,g-rwx,o-rwx'
202 'r--' 'chmod u+r-wx,g-rwx,o-rwx'
203 '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
204 '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
206 'cmplayer' 'mplayer -vo -fs -zoom fbdev'
207 'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
208 'fblinks' 'links2 -driver fb'
209 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
210 'fori' 'for i ({..}) { }'
213 'se' 'setopt interactivecomments'
214 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
215 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
216 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3'
218 'D' 'export DISPLAY=:0.0'
219 'mp' 'mplayer -vo xv -fs -zoom'
224 matched_chars='[.-|_a-zA-Z0-9]#'
225 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
226 LBUFFER+=${abk[$MATCH]:-$MATCH}
230 bindkey ",." globalias
234 autoload -U zmv # who needs mmv or rename?
235 autoload history-search-end
237 # we don't want to quote/espace URLs on our own...
238 # avoid 'url-quote-magic: function definition file not found' on some older boxes
239 if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Zle/url-quote-magic" ] && \
240 autoload -U url-quote-magic && zle -N self-insert url-quote-magic ; then
241 zle -N self-insert url-quote-magic
243 print 'Notice: no url-quote-magic available :('
246 alias run-help >&/dev/null && unalias run-help
247 autoload run-help # use via 'esc-h'
250 if autoload -U compinit && compinit 2>/dev/null ; then
251 compinit 2>/dev/null || print 'Notice: no compinit available :('
253 print 'Notice: no compinit available :('
258 is4 && autoload -U zed # use ZLE editor to edit a file or function
260 is4 && for mod in complist deltochar mathfunc ; do
261 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
264 # autoload zsh modules when they are referenced
265 is4 && for opt mod in a stat \
269 zmodload -${opt} zsh/${mod} ${mod}
272 is4 && autoload -U insert-files && \
273 zle -N insert-files && \
274 bindkey "^Xf" insert-files # C-x-f
276 bindkey ' ' magic-space # also do history expansion on space
277 bindkey '\ei' menu-complete # menu completion via esc-i
279 # press esc-e for editing command line in $EDITOR or $VISUAL
280 is4 && autoload -U edit-command-line && \
281 zle -N edit-command-line && \
282 bindkey '\ee' edit-command-line
284 # menu selection: pick item but stay in the menu (press esc-return)
285 is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
287 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
288 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
289 bindkey '\C-ed' _bkdate
292 # press esc-m for inserting last typed word again (thanks to caphuso!)
293 insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
294 zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
296 # set command prediction from history, see 'man 1 zshcontrib'
297 # is4 && autoload -U predict-on && \
298 # zle -N predict-on && \
299 # zle -N predict-off && \
300 # bindkey "^X^Z" predict-on && \
301 # bindkey "^Z" predict-off
303 # put job into foreground via ctrl-z:
304 bindkey -s '^z' "fg\n"
306 # press ctrl-q to quote line:
308 # zle beginning-of-line
310 # # RBUFFER="'$RBUFFER'"
311 # RBUFFER=${(q)RBUFFER}
314 # zle -N mquote && bindkey '^q' mquote
316 # run command line as user root via sudo:
317 _sudo-command-line() {
318 [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
320 zle -N sudo-command-line _sudo-command-line
321 bindkey "^Os" sudo-command-line
324 # {{{ set some important options
329 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
330 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
331 setopt extended_history # save each command's beginning timestamp and the duration to the history file
332 is4 && setopt histignorealldups # If a new command line being added to the history
333 # list duplicates an older one, the older command is removed from the list
334 setopt histignorespace # remove command lines from the history list when
335 # the first character on the line is a space
336 # setopt histallowclobber # add `|' to output redirections in the history
337 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
338 setopt auto_cd # if a command is issued that can't be executed as a normal command,
339 # and the command is the name of a directory, perform the cd command to that directory
340 setopt extended_glob # in order to use #, ~ and ^ for filename generation
341 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
342 # -> searches for word not in compressed files
343 # don't forget to quote '^', '~' and '#'!
344 setopt notify # report the status of backgrounds jobs immediately
345 setopt hash_list_all # Whenever a command completion is attempted, make sure \
346 # the entire command path is hashed first.
347 setopt completeinword # not just at the end
348 # setopt nocheckjobs # don't warn me about bg processes when exiting
349 setopt nohup # and don't kill them, either
350 # setopt printexitvalue # alert me if something failed
351 # setopt dvorak # with spelling correction, assume dvorak kb
352 setopt auto_pushd # make cd push the old directory onto the directory stack.
353 setopt nonomatch # try to avoid the 'zsh: no matches found...'
354 setopt nobeep # avoid "beep"ing
356 MAILCHECK=30 # mailchecks
357 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 secondes
358 watch=(notme root) # watch for everyone but me and root
360 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
361 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
363 # WORDCHARS='*?_[]~=&;!#$%^(){}'
364 # WORDCHARS='${WORDCHARS:s@/@}'
366 # only slash should be considered as a word separator:
367 slash-backward-kill-word() {
368 local WORDCHARS="${WORDCHARS:s@/@}"
370 zle backward-kill-word
372 zle -N slash-backward-kill-word
373 bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
377 export ZSHDIR=$HOME/.zsh
378 HISTFILE=$HOME/.zsh_history
379 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
380 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
383 # dirstack handling {{{
385 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
386 dirstack=( ${(uf)"$(< ~/.zdirs)"} )
387 # "cd -" won't work after login by just setting $OLDPWD, so
388 cd $dirstack[0] && cd $OLDPWD
391 builtin dirs -pl >! ~/.zdirs
395 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
396 if [ -n "$BATTERY" ] ; then
397 if [ -x $(which acpi) ] ; then
398 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
399 [ -z "$PERCENT" ] && PERCENT='acpi not present'
400 if [ "${PERCENT%%%}" -lt 20 ] ; then
401 PERCENT="warning: ${PERCENT}%"
408 if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Prompts/promptinit" ] && autoload promptinit && promptinit 2>/dev/null ; then
409 promptinit # people should be able to use their favourite prompt
411 print 'Notice: no promptinit available :('
414 # precmd() => a function which is executed just before each prompt
415 # use 'NOPRECMD=1' to disable the precmd + preexec commands
417 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
419 is4 && [[ -z $NOPRECMD ]] && precmd () {
420 [[ -n $NOPRECMD ]] && return 0
421 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
422 if [[ -z ${DONTSETRPROMPT} ]] ; then
423 if [ -n "$BATTERY" ] ; then
424 # RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
425 RPROMPT="${PERCENT}${SCREENTITLE}"
427 # RPROMPT="%(?..:()% ${SCREENTITLE}"
428 RPROMPT="${SCREENTITLE}"
431 # adjust title of xterm
432 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
433 case $TERM in (xterm*|rxvt)
434 print -Pn "\e]0;%n@%m: %~\a"
439 # chpwd () => a function which is executed whenever the directory is changed
441 # preexec() => a function running before every command
442 is4 && [[ -z $NOPRECMD ]] && preexec () {
443 [[ -n $NOPRECMD ]] && return 0
444 # set hostname if not running on host with name 'grml'
445 local HOSTNAME=$(hostname)
446 if [[ "$HOSTNAME" != grml ]] ; then
449 # get the name of the program currently running and hostname of local machine
450 # set screen window title if running in a screen
451 if [[ "$TERM" == screen* ]]; then
452 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
453 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
454 echo -ne "\ek$CMD\e\\"
456 # set the screen title to "zsh" when sitting at the command prompt:
457 if [[ "$TERM" == screen* ]]; then
458 SCREENTITLE=$'%{\ekzsh\e\\%}'
462 # adjust title of xterm
463 case $TERM in (xterm*|rxvt)
464 print -Pn "\e]0;%n@%m: $1\a"
470 if autoload colors && colors 2>/dev/null ; then
471 BLUE="%{${fg[blue]}%}"
472 RED="%{${fg_bold[red]}%}"
473 GREEN="%{${fg[green]}%}"
474 CYAN="%{${fg[cyan]}%}"
475 WHITE="%{${fg[white]}%}"
476 NO_COLOUR="%{${reset_color}%}"
483 NO_COLOUR="%{
\e[0m%}"
486 EXITCODE="%(?..%?%1v )"
487 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
488 PS3='?# ' # selection prompt used within a select loop.
489 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
491 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
492 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
493 debian_chroot=$(cat /etc/debian_chroot)
496 # don't use colors on dumb terminals (like emacs):
497 if [[ "$TERM" == dumb ]] ; then
498 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
500 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
501 # set variable identifying the chroot you work in (used in the prompt below)
502 if [[ -n "$GRMLPROMPT" ]]; then
503 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
504 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
506 if (( EUID != 0 )); then
507 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
509 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
514 # if we are inside a grml-chroot set a specific prompt theme
515 if [ -n "$GRML_CHROOT" ] ; then
516 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
520 # {{{ 'hash' some often used directories
521 hash -d deb=/var/cache/apt/archives
522 hash -d doc=/usr/share/doc
523 hash -d linux=/lib/modules/$(command uname -r)/build/
525 hash -d slog=/var/log/syslog
527 hash -d templ=/usr/share/doc/grml-templates
528 hash -d tt=/usr/share/doc/texttools-doc
533 if [ $UID = 0 ] ; then
534 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
535 elif [ -r $HOME/.screenrc ] ; then
536 alias screen="/usr/bin/screen -c $HOME/.screenrc"
538 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
541 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
542 alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
543 alias la='ls -la --color=auto'
544 alias ll='ls -l --color=auto'
545 alias lh='ls -hAl --color=auto'
546 alias l='ls -lF --color=auto'
555 alias cp='nocorrect cp' # no spelling correction on cp
556 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
557 alias mv='nocorrect mv' # no spelling correction on mv
558 alias rm='nocorrect rm' # no spelling correction on rm
563 alias swspeak="setopt singlelinezle ; unsetopt prompt_cr ; export PS1='%m%# ' ; speechd-up" # set up software synth.
565 # I like clean prompt, so provide simple way to get that
566 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
568 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
569 if [ -x /usr/sbin/truecrypt ] ; then
571 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
573 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
577 zsh-help(){print "$bg[white]$fg[black]
578 zsh-help - hints for use of zsh on grml
579 =======================================$reset_color
581 Main configuration of zsh happens in /etc/zsh/zshrc (global)
582 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
583 The files are part of the package grml-etc-core, if you want to
584 use them on a non-grml-system just get the tar.gz from
585 http://deb.grml.org/ or get the files from the mercurial
588 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
589 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
591 If you want to stay in sync with zsh configuration of grml
592 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
593 your own stuff in \$HOME/.zshrc.local. System wide configuration
594 without touching configuration files of grml can take place
595 in /etc/zsh/zshrc.local.
597 If you want to use the configuration of user grml also when
598 running as user root just run 'zshskel' which will source
599 the file /etc/skel/.zshrc.
601 For information regarding zsh start at http://grml.org/zsh/
603 Take a look at grml's zsh refcard:
604 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
606 Check out the main zsh refcard:
607 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
609 And of course visit the zsh-lovers:
612 You can adjust some options through environment variables when
613 invoking zsh without having to edit configuration files.
614 Basically meant for bash users who are not used to the power of
617 \"NOCOR=1 zsh\" => deactivate automatic correction
618 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
619 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
620 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
622 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
623 Enjoy your grml system with the zsh!$reset_color"
627 if [ -r /etc/debian_version ] ; then
628 alias acs='apt-cache search'
629 alias acsh='apt-cache show'
630 alias acp='apt-cache policy'
631 alias adg="$SUDO apt-get dist-upgrade"
632 alias agi="$SUDO apt-get install"
633 alias ag="$SUDO apt-get upgrade"
634 alias au="$SUDO apt-get update"
635 alias dbp='dpkg-buildpackage'
636 alias ge='grep-excuses'
640 if [ -z "$1" ] ; then
642 $SUDO apt-get -u upgrade
644 ssh $1 $SUDO apt-get update
645 # ask before the upgrade
647 ssh $1 $SUDO apt-get --no-act upgrade
648 echo -n 'Process the upgrade?'
650 if [[ $dummy == "y" ]] ; then
651 ssh $1 $SUDO apt-get -u upgrade --yes
656 isgrmlcd && alias su="sudo su" # change to user root
657 alias tlog="tail -f /var/log/syslog" # take a look at the syslog
658 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
661 # sort installed Debian-packages by size
662 if [ -x /usr/bin/grep-status ] ; then
663 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
664 -n "install ok installed" | paste -sd " \n" | sort -rn'
667 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
668 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
669 if [ -x $(which wodim) ] ; then
670 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
671 See #377109 in the BTS of Debian for more details.
673 Please use the wodim binary instead' ; return 1"
677 # I hate lacking backward compability, so provide an alternative therefore
678 if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
679 function apache2-ssl-certificate(){
681 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
682 print 'You might want to take a look at Debian the package ssl-cert as well.'
683 print 'To generate a certificate for use with apache2 follow the instructions:'
687 export RANDFILE=/dev/random
688 mkdir /etc/apache2/ssl/
689 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
690 chmod 600 /etc/apache2/ssl/apache.pem
692 Run "grml-tips ssl-certificate" if you need further instructions.
698 # {{{ Use hard limits, except for a smaller stack and no core dumps
701 isgrmlcd && limit core 0 # important for a live-cd-system
705 # {{{ completion stuff
707 # Where to look for autoloaded function definitions
708 if [ -d /etc/zsh/completion.d ] ; then
709 local comp=/etc/zsh/completion.d
710 for func in $comp/*(N-.:t); . ${comp}/${func}
713 # called later (via is4 && grmlcomp)
714 # notice: use 'zstyle' for getting current settings
715 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
718 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
719 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
720 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
721 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
722 zstyle ':completion:*:correct:*' original true #
723 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
724 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
725 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
726 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
727 zstyle ':completion:*:history-words' list false #
728 zstyle ':completion:*:history-words' menu yes # activate menu
729 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
730 zstyle ':completion:*:history-words' stop yes #
731 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
732 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
733 zstyle ':completion:*' group-name ''
734 if [[ -z "$NOMENU" ]] ; then
735 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
737 setopt no_auto_menu # don't use any menus at all
739 zstyle ':completion:*:messages' format '%d' #
740 zstyle ':completion:*:options' auto-description '%d' #
741 zstyle ':completion:*:options' description 'yes' # describe options in full
742 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
743 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
744 zstyle ':completion:*' verbose true # provide verbose completion information
745 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
746 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
747 zstyle ':completion:correct:' prompt 'correct to: %e' #
748 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
750 # complete manual by their section
751 zstyle ':completion:*:manuals' separate-sections true
752 zstyle ':completion:*:manuals.*' insert-sections true
753 zstyle ':completion:*:man:*' menu yes select
756 # run rehash on completion so new installed program are found automatically:
758 (( CURRENT == 1 )) && rehash
759 return 1 # Because we didn't really complete anything
761 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
762 if [[ -n "$NOCOR" ]] ; then
763 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete
764 setopt nocorrect # do not try to correct the spelling if possible
766 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate
767 setopt correct # try to correct the spelling if possible
768 zstyle -e ':completion:*' completer '
769 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
770 _last_try="$HISTNO$BUFFER$CURSOR"
771 reply=(_complete _match _prefix)
773 if [[ $words[1] = (rm|mv) ]]; then
776 reply=(_oldlist _expand _force_rehash _complete _correct _approximate)
780 # zstyle ':completion:*' completer _complete _correct _approximate
781 # zstyle ':completion:*' expand prefix suffix
783 # automatic rehash? Credits go to Frank Terbeck
784 # function my_accept () {
786 # [[ -z ${BUFFER} ]] && zle accept-line && return
787 # buf=( ${(z)BUFFER} )
788 # [[ -z ${commands[${buf[1]}]} ]] && rehash
792 # bindkey "^M" my_accept
794 # command for process lists, the local web server details and host completion
795 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
798 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
799 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
801 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
803 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
804 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
816 zstyle ':completion:*:hosts' hosts $hosts
817 # zstyle '*' hosts $hosts
819 # specify your logins:
821 # {grml,grml1}@foo.invalid
822 # grml-devel@bar.invalid
825 # {fred,root}@foo.invalid
828 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
829 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
831 # specify specific port/service settings:
832 # telnet_users_hosts_ports=(
835 # @mail-server:{smtp,pop3}
839 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
841 # use generic completion system for programs not yet defined:
842 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
844 # see upgrade function in this file
845 compdef _hosts upgrade
851 # people should use 'grml-x'!
853 if [ -e /etc/X11/xorg.conf ] ; then
854 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
856 echo "Please use the script \"grml-x\" for starting the X Window System
857 because there does not exist /etc/X11/xorg.conf yet.
858 If you want to use startx anyway please call \"/usr/bin/startx\"."
864 if [ -e /etc/X11/xorg.conf ] ; then
865 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
867 echo "Please use the script \"grml-x\" for starting the X Window System.
868 because there does not exist /etc/X11/xorg.conf yet.
869 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
874 if [ -x /usr/sbin/915resolution ] ; then
875 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
878 alias grml-version='cat /etc/grml_version'
880 if [ -x /usr/sbin/rebuildfstab ] ; then
881 alias grml-rebuildfstab='rebuildfstab -v -r -config'
886 # {{{ now run the functions
888 is4 && isgrml && grmlstuff
893 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
896 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
897 # You use it as follows:
898 # $ NTREF=/reference/file
900 # This lists all the files in the current directory newer than the reference file.
901 # You can also specify the reference file inline; note quotes:
902 # $ ls -l *(e:'nt ~/.zshenv':)
907 [[ $REPLY -nt $NTREF ]]
911 # shell functions {{{
912 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
913 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
915 if [[ "$#*" -eq 0 ]]; then
916 [ -r ~/.zshrc ] && . ~/.zshrc
925 compdef _functions reload freload
928 if type -p qma &>/dev/null ; then
929 manzsh() { qma zshall "$1" }
932 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
933 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
934 # manzsh() { man zshall | $MYLESS -p $1 ; }
937 # use "dchange <package-name>" to view Debian's changelog of the package:
939 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
940 most /usr/share/doc/${1}/changelog.Debian.gz
942 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
943 most /usr/share/doc/${1}/changelog.gz
945 echo "No changelog for package $1 found, sorry."
950 _dchange() { _files -W /usr/share/doc -/ }
951 compdef _dchange dchange
953 # use "uchange <package-name>" to view upstream's changelog of the package:
955 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
956 most /usr/share/doc/${1}/changelog.gz
958 echo "No changelog for package $1 found, sorry."
962 _uchange() { _files -W /usr/share/doc -/ }
963 compdef _uchange uchange
967 ZSH_PROFILE_RC=1 $SHELL "$@"
970 # edit alias via zle:
972 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
974 compdef _aliases edalias
976 # edit function via zle:
978 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
980 compdef _functions edfunc
982 # use it e.g. via 'Restart apache2'
983 if [ -d /etc/init.d ] ; then
984 for i in Start Restart Stop Force-Reload Reload ; do
985 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
987 # now the completion for this:
988 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
991 # provide useful information on globbing
998 p named pipes (FIFOs)
999 * executable plain files (0100)
1000 % device files (character or block special)
1001 %b block special files
1002 %c character special files
1003 r owner-readable files (0400)
1004 w owner-writable files (0200)
1005 x owner-executable files (0100)
1006 A group-readable files (0040)
1007 I group-writable files (0020)
1008 E group-executable files (0010)
1009 R world-readable files (0004)
1010 W world-writable files (0002)
1011 X world-executable files (0001)
1012 s setuid files (04000)
1013 S setgid files (02000)
1014 t files with the sticky bit (01000)
1016 print *(m-1) # Files modified up to a day ago
1017 print *(a1) # Files accessed a day ago
1018 print *(@) # Just symlinks
1019 print *(Lk+50) # Files bigger than 50 kilobytes
1020 print *(Lk-50) # Files smaller than 50 kilobytes
1021 print **/*.c # All *.c files recursively starting in \$PWD
1022 print **/*.c~file.c # Same as above, but excluding 'file.c'
1023 print (foo|bar).* # Files starting with 'foo' or 'bar'
1024 print *~*.* # All Files that do not contain a dot
1025 chmod 644 *(.^x) # make all plain non-executable files publically readable
1026 print -l *(.c|.h) # Lists *.c and *.h
1027 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1028 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1030 alias help-zshglob=H-Glob
1032 type -p qma &>/dev/null && alias ?='qma zshall'
1034 # grep for running process, like: 'any vim'
1036 if [ -z "$1" ] ; then
1037 echo "any - grep for process(es) by keyword" >&2
1038 echo "Usage: any <keyword>" >&2 ; return 1
1041 local LENGTH=$(expr length $STRING)
1042 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1043 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1044 ps xauwww| grep "[$FIRSCHAR]$REST"
1048 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1049 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1050 [ -r /proc/1/maps ] && deswap() {
1051 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1052 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1053 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1056 # print hex value of a number
1058 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1061 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1062 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1064 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1065 perl -e "print eval($CALC),\"\n\";"
1067 functions peval &>/dev/null && alias calc=peval
1069 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1071 # NO_SWITCH="yes" command bash "$@"
1074 # exec $SHELL $SHELL_ARGS "$@"
1079 # log out? set timeout in seconds {{{
1081 # do not log out in some specific terminals:
1082 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1087 # {{{ make sure our environment is clean regarding colors
1088 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1091 # source another config file if present {{{
1092 if [ -r /etc/zsh/zshrc.local ]; then
1093 source /etc/zsh/zshrc.local
1097 # "persistent history" {{{
1098 # just write important commands you always need to ~/.important_commands
1099 if [ -r ~/.important_commands ] ; then
1100 fc -R ~/.important_commands
1104 ## END OF FILE #################################################################
1105 # vim:foldmethod=marker expandtab