X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=zsh%2Frc;h=7222619ca0b86c08de528ba30bc082951f3174a2;hb=363110875986d10c37122e5b430f357520504d8a;hp=0cb114d5d2f8fc844a683bf45cd07e78ec480c29;hpb=31ba983543edee7aac65d0fad181086011bd292f;p=config%2Fdotfiles.git diff --git a/zsh/rc b/zsh/rc index 0cb114d..7222619 100644 --- a/zsh/rc +++ b/zsh/rc @@ -86,7 +86,7 @@ setopt longlistjobs # Use Vi(m) style key bindings. bindkey -v -# Use jk to exit insert mode (jj is too slow). +# Use jk to exit insert mode (jj is too slow to type). bindkey 'jk' vi-cmd-mode # I don't need the arrow keys, I use ^N and ^P for this (see below). @@ -184,12 +184,12 @@ bindkey -a '^N' history-beginning-search-forward # Enable incremental search which is especially useful when the string is an # argument and not the command. -bindkey '^R' history-incremental-search-backward +bindkey '^R' history-incremental-pattern-search-backward # Also enable my usual use of Ctrl-P/Ctrl-N to get the previous/next matching # history entry. if [[ $ZSH_VERSION == (4.<4->*|<5->*) ]]; then - bindkey -M isearch '^P' history-incremental-search-backward - bindkey -M isearch '^N' history-incremental-search-forward + bindkey -M isearch '^P' history-incremental-pattern-search-backward + bindkey -M isearch '^N' history-incremental-pattern-search-forward fi # Automatically push cd-ed directories on the directory stack. @@ -211,7 +211,8 @@ autoload -Uz colors; colors zmodload zsh/datetime # Some shortcuts for colors. The %{...%} tells zsh that the data in between -# doesn't need any space, necessary for correct prompt drawing. +# doesn't need any space, necessary for correct prompt drawing. Use %F{color} +# in more recent zsh versions (here compatibility is important). local red="%{${fg[red]}%}" local blue="%{${fg[blue]}%}" local green="%{${fg[green]}%}" @@ -343,8 +344,14 @@ zshrc_longrun_preexec() { zshrc_resolve_fg_to_resumed_job_name $program program=$REPLY + # No background process found. + if [[ -z $program ]]; then + return + fi + # Don't track the time for certain (possible) long running processes which # need no automatic notification. + local ignore for ignore in elinks man mutt vim; do case $program in $ignore | $ignore\ *) @@ -767,7 +774,9 @@ zstyle ':completion:*:*:-command-:*' ignored-patterns './config.*' # Don't complete unwanted files with Vim. Thanks to Nomexous in #zsh on # Freenode (2010-06-06 04:54 CEST). See below for a way to complete them. zstyle ':completion:*:*:vim:*:all-files' ignored-patterns \ - '*.aux' '*.log' '*.pdf' \ + '*.aux' '*.log' '*.pdf' '*.bbl' '*.blg' '*.out' '*-blx.bib' '*.run.xml' \ + '*.o' \ + '*.pyc' \ '*.class' # Provide a fallback completer which always completes files. Useful when Zsh's @@ -777,11 +786,12 @@ zle -C complete-files complete-word _generic zstyle ':completion:complete-files:*' completer _files bindkey '^F' complete-files -# Completion for my wrapper scripts +# Completion for my wrapper scripts. compdef slocate=locate compdef srsync=rsync compdef srsync-incremental=rsync compdef svalgrind=valgrind +compdef sc=systemctl # CUSTOM ALIASES AND FUNCTIONS @@ -830,11 +840,14 @@ alias -g A1="| awk '{ print \$1 }'" alias -g A2="| awk '{ print \$2 }'" alias -g A3="| awk '{ print \$3 }'" alias -g G='| grep' +alias -g GB='| grep -vE "^Binary file .+ matches\$"' alias -g H='| head' alias -g P='| perl' alias -g S='| sort' +alias -g SL='| sort | less' alias -g T='| tail' alias -g U='| uniq' +alias -g X='`xsel -p || xclip -o`' # X selection # Make going up directories simple. alias -g ...='../..' @@ -865,11 +878,15 @@ fi command tig --max-count=200 --branches --remotes --tags "$@" } -# Choose the "best" PDF viewer available: xpdf, then zathura (in the past -# zathura was preferred, but recent versions are completely broken: still no -# working search and no page-wise scrolling anymore). Also setup completion -# for `pdf`. -if (( $+commands[xpdf] )); then +# Choose the "best" PDF viewer available. Also setup completion for `pdf`. +if (( $+commands[katarakt] )); then + pdf() { + command katarakt "$@" 2>/dev/null & + disown %command + } + # No completion for katarakt yet. + compdef pdf=xpdf +elif (( $+commands[xpdf] )); then pdf() { command xpdf "$@" 2>/dev/null & disown %command @@ -921,7 +938,8 @@ fi # If not already in screen or tmux, reattach to a running session or create a # new one. This also starts screen/tmux on a remote server when connecting # through ssh. -if [[ $TERM != dumb && $TERM != linux && -z $STY && -z $TMUX ]]; then +if [[ $TERM != dumb && $TERM != dialup && $TERM != linux + && -z $STY && -z $TMUX ]]; then # Get running detached sessions. if [[ $zshrc_use_multiplexer = screen ]]; then session=$(screen -list | grep 'Detached' | awk '{ print $1; exit }') @@ -975,9 +993,14 @@ if [[ $LD_PRELOAD != *libcoloredstderr.so* ]]; then # process when starting GNU screen/tmux (see above). else exec 2>>(while read -r -k -u 0 line; do - printf '\e[91m%s\e[0m' "$line" + printf '\e[91m%s\e[0m' $line print -n $'\0' done &) + + # Reset doesn't work with this hack. + reset() { + command reset "$@" 2>&1 + } fi fi @@ -1023,7 +1046,7 @@ zshrc_restart_precmd() { fi local startup - strftime -s startup '%Y-%m-%d %H:%M:%S' "$zshrc_startup_time" + strftime -s startup '%Y-%m-%d %H:%M:%S' $zshrc_startup_time echo -n "${fg[magenta]}" echo -n "~/.zshrc modified since startup ($startup) ... " @@ -1042,12 +1065,12 @@ zshrc_restart_precmd() { fi # Try to start a new interactive shell. If it fails, something is wrong. - # Don't kill our current session by execing it. + # Don't kill our current session by execing it, abort instead. zsh -i -c 'exit 42' if [[ $? -ne 42 ]]; then - echo -n "${fg_bold[red]}" + echo -n ${fg_bold[red]} echo 'failed to start new zsh!' - echo -n "${fg_bold[default]}" + echo -n ${fg_bold[default]} return fi @@ -1058,4 +1081,39 @@ zshrc_restart_precmd() { } precmd_functions+=(zshrc_restart_precmd) + +# RELOAD SETTINGS + +zshenv_reload_time=0 # load before first command +zshenv_boot_time=$(date -d "$(uptime -s)" '+%s') # uptime in epoch seconds + +# Automatically source ~/.zsh/env.update when the file changes (and exists). +# Can be used e.g. to update SSH_AGENT_PID and GPG_AGENT_INFO variables in +# running zsh processes. Sourced immediately before executing shell commands +# (preexec) to ensure the environment is always up to date. +zshenv_reload_preexec() { + local file + file=~/.zsh/env.update + + local stat + if ! zstat -A stat +mtime $file 2>/dev/null; then + return + fi + # File was modified before reboot. Skip it to prevent loading of old + # values. + if [[ $stat -lt $zshenv_boot_time ]]; then + return + fi + # File wasn't modified, nothing to do. + if [[ $stat -le $zshenv_reload_time ]]; then + return + fi + zshenv_reload_time=$EPOCHSECONDS + + unsetopt warn_create_global + . $file + setopt warn_create_global +} +preexec_functions+=(zshenv_reload_preexec) + # vim: ft=zsh