X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=zsh%2Frc;h=902d184bc4c0970c17d7ec06b6493a163c0b2873;hb=2dad868f3aa83676dde4b9891c49389e77b90a7e;hp=390ce7edba8dba58a2da6d3427f3222e4c64eb34;hpb=ee2f021829fff6de616c5839d9a707c44cf950db;p=config%2Fdotfiles.git diff --git a/zsh/rc b/zsh/rc index 390ce7e..902d184 100644 --- a/zsh/rc +++ b/zsh/rc @@ -52,7 +52,7 @@ if [[ -d ~/.zsh/functions ]]; then fi # Simulate hooks using _functions arrays for Zsh versions older than 4.3.4. At -# the moment only precmd() and preexec() are simulated. +# the moment only precmd(), preexec() and chpwd() are simulated. # # At least 4.3.4 (not sure about later versions) has an error in add-zsh-hook # so the compatibility version is used there too. @@ -60,7 +60,8 @@ if [[ $ZSH_VERSION != (4.3.<5->|4.<4->*|<5->*) ]]; then # Provide add-zsh-hook which was added in 4.3.4. fpath=(~/.zsh/functions/compatibility $fpath) - # Run all functions defined in the ${precmd,preexec}_functions arrays. + # Run all functions defined in the ${precmd,preexec,chpwd}_functions + # arrays. function precmd() { for function in $precmd_functions; do $function $@ @@ -71,11 +72,19 @@ if [[ $ZSH_VERSION != (4.3.<5->|4.<4->*|<5->*) ]]; then $function $@ done } + function chpwd() { + for function in $chpwd_functions; do + $function $@ + done + } fi # Autoload add-zsh-hook to add/remove zsh hook functions easily. autoload -Uz add-zsh-hook +# Load zmv (zsh move) which is powerful to rename files. +autoload zmv + # HISTORY SETTINGS @@ -91,10 +100,10 @@ setopt incappendhistory setopt histignoredups # Vim like completions of previous executed commands (also enter Vi-mode). If # called at the beginning it just recalls old commands (like cursor up), if -# called after typing something only likes starting with the typed are +# called after typing something, only lines starting with the typed are # returned. Very useful to get old commands quickly. Thanks to Mikachu in #zsh -# on Freenode (2010-01-17 12:47) for the information how to a function with -# bindkey. +# on Freenode (2010-01-17 12:47) for the information how to a use function +# with bindkey. zle -N my-vi-history-beginning-search-backward my-vi-history-beginning-search-backward() { local not_at_beginning_of_line @@ -104,18 +113,18 @@ my-vi-history-beginning-search-backward() { zle history-beginning-search-backward - # Start Vi-mode and stay at the same position (Vi-mode modes one left, + # Start Vi-mode and stay at the same position (Vi-mode moves one left, # this counters it). zle vi-cmd-mode if [[ -n $not_at_beginning_of_line ]]; then zle vi-forward-char fi } -bindkey "^P" my-vi-history-beginning-search-backward -bindkey -a "^P" history-beginning-search-backward # binding for Vi-mode +bindkey '^P' my-vi-history-beginning-search-backward +bindkey -a '^P' history-beginning-search-backward # binding for Vi-mode # Here only Vi-mode is necessary as ^P enters Vi-mode and ^N only makes sense # after calling ^P. -bindkey -a "^N" history-beginning-search-forward +bindkey -a '^N' history-beginning-search-forward # PROMPT SETTINGS @@ -123,22 +132,29 @@ bindkey -a "^N" history-beginning-search-forward # Use colorized output, necessary for prompts and completions. autoload -U colors && colors +# Some shortcuts for colors. +local red="%{${fg[red]}%}" +local blue="%{${fg[blue]}%}" +local green="%{${fg[green]}%}" +local yellow="%{${fg[yellow]}%}" +local default="%{${fg[default]}%}" + # Set the default prompt. The current host and working directory is displayed, # the exit code of the last command if it wasn't 0, the number of running jobs -# if not 0 and a + if this shell is running inside another shell. +# if not 0. +# # The prompt is in green and blue to make easily detectable, the error exit # code in red and bold and the job count in yellow. -PROMPT="%{${fg[green]}%}%B%m%b%{${fg[default]}%}:\ -%{${fg[blue]}%}%B%~%b%{${fg[default]}%} \ -%(1j.%{${fg[yellow]}%}%j%{${fg[default]}%}.)%(2L.+.)%# \ -%(?..(%{${fg[red]}%}%B%?%b%{${fg[default]}%}%) )" +PROMPT="$green%B%m%b$default:$blue%B%~%b$default \ +%(1j.$yellow%j$default.)%# \ +%(?..($red%B%?%b$default%) )" -# VCS_Info was added in 4.3.9 but it works in earlier versions too. So load it +# vcs_info was added in 4.3.9 but it works in earlier versions too. So load it # if the necessary files are available in ~/.zsh/functions/vcs_info (often a # symbolic link to current checkout of Zsh's sources). if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) || -d ~/.zsh/functions/vcs_info ]]; then - # Update fpath to allow loading the VCS_Info functions. + # Update fpath to allow loading the vcs_info functions. if [[ -d ~/.zsh/functions/vcs_info ]]; then fpath=(~/.zsh/functions/vcs_info/ ~/.zsh/functions/vcs_info/Backends @@ -152,23 +168,43 @@ if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) || autoload -Uz vcs_info # Only look for git and mercurial repositories; the only I use. zstyle ':vcs_info:*' enable git hg - # Set style of vcs_info display. The current branch (green) and vcs (blue) + # Check the repository for changes so they can be used in %u/%c (see + # below). This comes with a speed penalty for bigger repositories. + zstyle ':vcs_info:*' check-for-changes true + + # Set style of vcs_info display. The current branch (green) and VCS (blue) # is displayed. If there is an special action going on (merge, rebase) - # it's also displayed (red). - zstyle ':vcs_info:*' formats \ - "(%{${fg[green]}%}%b%{${fg[default]}%}:\ -%{${fg[blue]}%}%s%{${fg[default]}%})" - zstyle ':vcs_info:*' actionformats \ - "(%{${fg[green]}%}%b%{${fg[default]}%}/\ -%{${fg[red]}%}%a%{${fg[default]}%}:\ -%{${fg[blue]}%}%s%{${fg[default]}%})" + # it's also displayed (red). Also display if there are unstaged or staged + # (%u/%c) changes. + if [[ $ZSH_VERSION == (4.3.<11->|4.<4->*|<5->*) || + -d ~/.zsh/functions/vcs_info ]]; then + zstyle ':vcs_info:*' formats \ + "($green%b%u%c$default:$blue%s$default)" + zstyle ':vcs_info:*' actionformats \ + "($green%b%u%c$default/$red%a$default:$blue%s$default)" + else + # In older versions %u and %c are not defined yet and are not + # correctly expanded. + zstyle ':vcs_info:*' formats \ + "($green%b$default:$blue%s$default)" + zstyle ':vcs_info:*' actionformats \ + "($green%b$default/$red%a$default:$blue%s$default)" + fi + # Set style for formats/actionformats when unstaged (%u) and staged (%c) + # changes are detected in the repository; check-for-changes must be set to + # true for this to work. Thanks to Bart Trojanowski + # (http://jukie.net/~bart/blog/pimping-out-zsh-prompt) for the idea + # (2010-03-11 00:20). + zstyle ':vcs_info:*' unstagedstr '¹' + zstyle ':vcs_info:*' stagedstr '²' + # Call vcs_info as precmd before every prompt. prompt_precmd() { vcs_info } add-zsh-hook precmd prompt_precmd - # Display the vcs information in the right prompt. + # Display the VCS information in the right prompt. if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) ]]; then RPROMPT='${vcs_info_msg_0_}' # There is a bug in Zsh below 4.3.9 which displays a wrong symbol when @@ -179,29 +215,26 @@ if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) || fi fi +unset red blue green yellow default + # When screen, xterm or rxvt is used set the name of the window to the # currently running program. # # When a program is started preexec() sets the window's name to it; when it # stops precmd() resets the window's name to 'zsh'. # -# It works with screen and xterm. If screen is running in X11 (DISPLAY is set) -# and stumpwm is running then the window title is also set in stumpwm using -# stumpish. +# It works with screen, xterm and rxvt. # # If a command is run with sudo or if the shell is running as root then a ! is # added at the beginning of the command to make this clear. If a command is -# running on a different computer with ssh a @ is added at the beginning. This -# only works if the .zshrc on the server also uses this command. +# running on a different computer with ssh a @ is added at the beginning. If +# screen is running on the remote machine instead of @screen @:hostname +# (hostname replaced by the machine's hostname) is displayed. This only works +# if the .zshrc on the server also uses this command. if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then # Is set to a non empty value to reset the window name in the next # precmd() call. window_reset=yes - # Is set to a non empty value when the stump window manager is running. - ps aux | grep -q stumpwm | grep -v grep - if [[ $? -eq 0 ]]; then - window_stumpwm=yes - fi # Is set to a non empty value when the shell is running as root. if [[ $(id -u) -eq 0 ]]; then window_root=yes @@ -212,7 +245,7 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then local program_name=$1 # When sudo is used use real program name instead, but with an - # exclamation mark at the beginning. + # exclamation mark at the beginning (handled below). local program_sudo= if [[ $program_name == sudo* ]]; then program_name=${program_name#sudo } @@ -252,6 +285,12 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then # different computer. if [[ -n $SSH_CONNECTION ]]; then program_name="@$program_name" + + # If screen is running in SSH then display "@:hostname" as title + # in the term/outer screen. + if [[ $program_name == @screen ]]; then + program_name="@:${$(hostname)//.*/}" + fi fi # Set the window name to the currently running program. @@ -266,11 +305,11 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then [[ -z $window_reset ]] && return # Reset the window name to 'zsh'. - local name="zsh" + local name=zsh # If the function was called with an argument then reset the window # name to '.zsh' (used by clear alias). if [[ -n $1 ]]; then - name=".zsh" + name=.zsh fi # Prepend prefixes like in window_preexec(). @@ -287,20 +326,15 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then } # Sets the window title. Works with screen, xterm and rxvt. - window_title() { - if [[ $TERM == screen* ]]; then + if [[ $TERM == screen* ]]; then + window_title() { print -n "\ek$1\e\\" - - # Update window name in stumpwm if running screen in X11 and when - # stumpwm is used. - if [[ -n $DISPLAY && -n $window_stumpwm ]]; then - echo "$1" | stumpish -e "title" > /dev/null - fi - - elif [[ $TERM == xterm* || $TERM == rxvt* ]]; then + } + elif [[ $TERM == xterm* || $TERM == rxvt* ]]; then + window_title() { print -n "\e]2;$1\e\\" - fi - } + } + fi # Add the preexec() and precmd() hooks. add-zsh-hook preexec window_preexec @@ -314,7 +348,8 @@ fi # (coloring, scrollable). zmodload zsh/complist # Use new completion system, store dumpfile in ~/.zsh/cache to prevent -# cluttering of ~/. +# cluttering of ~/. $fpath must be set before calling this. Thanks to Adlai in +# #zsh on Freenode (2009-08-07 21:05) for reminding me of the $fpath problem. autoload -U compinit && compinit -d ~/.zsh/cache/zcompdump # Use cache to speed up completions. @@ -329,7 +364,7 @@ zstyle ':completion:*' completer _complete _match _correct _approximate setopt nolistambiguous # Allow completions in the middle of a text, i.e. "/usr/bin/whatever" # completes like "/usr/bin/". Useful when adding new options to commands. -bindkey "^I" expand-or-complete-prefix +bindkey '^I' expand-or-complete-prefix # Try uppercase if the currently typed string doesn't match. This allows # typing in lowercase most of the time and completion fixes the case. zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' @@ -371,65 +406,44 @@ TRAPINT() { # Store the current buffer in the history. zle && print -s -- $BUFFER - # Return the default exit code so zsh aborts the current command. + # Return the default exit code so Zsh aborts the current command. return $1 } # Colorize stderr. Very useful when looking for errors. Thanks to -# http://gentoo-wiki.com/wiki/Zsh -exec 2>>(while read line; do - print '\e[91m'${(q)line}'\e[0m' > /dev/tty; print -n $'\0'; done &) +# http://gentoo-wiki.com/wiki/Zsh for the basic script and Mikachu in #zsh on +# Freenode (2010-03-07 04:03) for some improvements (-r, printf). It's not yet +# perfect and doesn't work with su and git for example, but it can handle most +# interactive output quite well (even with no trailing new line) and in those +# cases the E alias can be used as workaround. +exec 2>>(while read -r -k -u 0 line; do + printf '\e[91m%s\e[0m' "$line"; + print -n $'\0'; +done &) + +# Load aliases and similar functions also used by other shells. +if [[ -f ~/.shell/aliases ]]; then + . ~/.shell/aliases +fi # Make sure aliases are expanded when using sudo. alias sudo='sudo ' -# Global aliases for often used commands used in the command line. +# Global aliases for often used commands in the command line. alias -g E='2>&1' alias -g L='E | less' alias -g D='E | colordiff L' alias -g G='| grep' alias -g S='| sort' alias -g U='| uniq' +alias -g H='| head' +alias -g T='| tail' # Make going up directories simple. alias -g ...='../..' alias -g ....='../../..' alias -g .....='../../../..' -# Shortcuts for often used programs. -alias c='clear' -alias e='elinks' -alias g='git' -alias m='mutt' -alias v='vim' -alias vi='vim' - -# Improved ls which displays the files in columns (-C), visualizes -# directories, links and other special files (-F) and pages everything through -# less (L). -# -# If available use GNU ls with colorized output. If it isn't available use -# normal ls which needs CLICOLOR_FORCE so it displays colors when used with a -# pager. -ls --color &> /dev/null -if [[ $? -eq 0 ]]; then - alias ls='ls --color' -else - alias ls='CLICOLOR_FORCE=1 ls -G' -fi -# Main ls function. -function ls() { - command ls -C -F $* L -} -# Helper function to list all files. -function la() { - ls -a $* -} -# Helper function to list all files in list format with access rights, etc. -function ll() { - la -l $* -} - # If the window naming feature is used (see above) then use ".zsh" (leading # dot) as title name after running clear so it's clear to me that the window # is empty. I open so much windows that I don't know in which I have something @@ -439,24 +453,6 @@ if [[ -n $window_reset ]]; then alias clear='clear; window_reset=yes; window_precmd reset' fi -# I sometimes confuse editor and shell, print a warning to prevent I exit the -# shell. -alias :q='echo "This is not Vim!" >&2' - -# Automatically use unified diffs. -alias diff='diff -u' - -# Display all files and use human readable sizes. -alias du='du -sh' - -# Use human readable sizes. -alias df='df -h' - -# Edit the mercurial patch queue series file for the current mercurial -# repository in Vim. Also change Vim's pwd to the patches directory so other -# patches can easily be opened. -alias vqs='vim -c "cd $(hg root)/.hg/patches/" "$(hg root)/.hg/patches/series"' - # Display all branches (except stash) in gitk but only 200 commits as this is # much faster. Also put in the background and disown. Thanks to sitaram in # #git on Freenode (2009-04-20 15:51). @@ -476,6 +472,40 @@ tig() { } +# OS SPECIFIC SETTINGS + +if [[ $(uname) == Linux ]]; then + # Settings when creating Debian packages. + DEBEMAIL=simon@ruderich.org + export DEBEMAIL + DEBFULLNAME='Simon Ruderich' + export DEBFULLNAME + +elif [[ $(uname) == Darwin ]]; then # Mac OS X + # Store the current clipboard in CLIPBOARD before every command so it can + # be used in commands. + os_darwin_preexec() { + export CLIPBOARD="$(pbpaste)" + } + # Add the function as preexec hook. + add-zsh-hook preexec os_darwin_preexec + + # Initialize CLIPBOARD so it's available for completion directly after + # startup. + CLIPBOARD="" + export CLIPBOARD + + # Fetch current URL in clipboard with wget. + alias wnc='wget --no-proxy $CLIPBOARD' +fi + + +# LOAD ADDITIONAL CONFIGURATION FILES + +# Load rc file for current hostname (first part before a dot) or rc.local. +source_config ~/.zsh host rc ${$(hostname)//.*/} + + # RUN COMMANDS # If not already in screen reattach to a running session or create a new one. @@ -495,11 +525,6 @@ if [[ $TERM != screen* && $TERM != 'dumb' ]]; then fi -# Load rc file for current OS. -source_config ~/.zsh os rc $(uname) nolocal -# Load rc file for current hostname (first part before a dot) or rc.local. -source_config ~/.zsh host rc ${$(hostname)//.*/} - source_debug "finished sourcing ~/.zsh/rc" # vim: ft=zsh