# *all* aliases, for example, use @@INSERT-aliases-all@@.
#}}}
-# Only load once
-[[ ${(t)GRML} != *association* ]] && typeset -gA GRML
-if (( ${GRML[ZSHRC_LOADED]} )); then
- return 0
-else
- GRML[ZSHRC_LOADED]=1
-fi
-
# zsh profiling {{{
# just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
if [[ $ZSH_PROFILE_RC -gt 0 ]] ; then
## alt-backspace is already the default for backwards-delete-word
## let's also set alt-delete for deleting current word (right of cursor)
-#k# Delete current word
+#k# Kill right-side word
bindkey "3~" delete-word
## use Ctrl-left-arrow and Ctrl-right-arrow for jumping to word-beginnings on the CL
bindkey '^[[1;3C' forward-word
bindkey '^[[1;3D' backward-word
-bindkey '^xp' history-beginning-search-backward
-bindkey '^xP' history-beginning-search-forward
-bindkey "\e[5~" history-beginning-search-backward #PageUp
-bindkey "\e[6~" history-beginning-search-forward #PageDown
+# Search backward in the history for a line beginning with the current
+# line up to the cursor and move the cursor to the end of the line then
+zle -N history-beginning-search-backward-end history-search-end
+zle -N history-beginning-search-forward-end history-search-end
+#k# search history backward for entry beginning with typed text
+bindkey '^xp' history-beginning-search-backward-end
+#k# search history forward for entry beginning with typed text
+bindkey '^xP' history-beginning-search-forward-end
+#k# search history backward for entry beginning with typed text
+bindkey "\e[5~" history-beginning-search-backward-end # PageUp
+#k# search history forward for entry beginning with typed text
+bindkey "\e[6~" history-beginning-search-forward-end # PageDown
+
# bindkey -s '^L' "|less\n" # ctrl-L pipes to less
# bindkey -s '^B' " &\n" # ctrl-B runs it in the background
-
# insert unicode character
# usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an ยง
# See for example http://unicode.org/charts/ for unicode characters code
}
zle -N slash-backward-kill-word
-#k# Kill everything in a word up to its last \kbd{/}
+#k# Kill left-side word or everything up to next slash
bindkey '\ev' slash-backward-kill-word
-#k# Kill everything in a word up to its last \kbd{/}
+#k# Kill left-side word or everything up to next slash
bindkey '\e^h' slash-backward-kill-word
-#k# Kill everything in a word up to its last \kbd{/}
+#k# Kill left-side word or everything up to next slash
bindkey '\e^?' slash-backward-kill-word
# use the new *-pattern-* widgets for incremental history search
zstyle ':acceptline:*' rehash true
function Accept-Line() {
- emulate -L zsh
+ setopt localoptions noksharrays
local -a subs
local -xi aldone
local sub
+ local alcontext=${1:-$alcontext}
zstyle -a ":acceptline:${alcontext}" actions subs
esac
}
+function Accept-Line-HandleContext() {
+ zle Accept-Line
+
+ default_action=$(Accept-Line-getdefault)
+ zstyle -T ":acceptline:${alcontext}" call_default \
+ && zle ${default_action}
+}
+
function accept-line() {
- emulate -L zsh
- local -a cmdline
+ setopt localoptions noksharrays
+ local -ax cmdline
local -x alcontext
local buf com fname format msg default_action
com="${cmdline[1]}"
fname="_${com}"
+ Accept-Line 'preprocess'
+
zstyle -t ":acceptline:${alcontext}" rehash \
&& [[ -z ${commands[$com]} ]] \
&& rehash
- if [[ -n ${reswords[(r)$com]} ]] \
+ if [[ -n ${com} ]] \
+ && [[ -n ${reswords[(r)$com]} ]] \
|| [[ -n ${aliases[$com]} ]] \
|| [[ -n ${functions[$com]} ]] \
|| [[ -n ${builtins[$com]} ]] \
# there is something sensible to execute, just do it.
alcontext='normal'
- zle Accept-Line
+ Accept-Line-HandleContext
- default_action=$(Accept-Line-getdefault)
- zstyle -T ":acceptline:${alcontext}" call_default \
- && zle ${default_action}
return
fi
# Okay, we warned the user before, he called us again,
# so have it his way.
alcontext='force'
- zle Accept-Line
+ Accept-Line-HandleContext
- default_action=$(Accept-Line-getdefault)
- zstyle -T ":acceptline:${alcontext}" call_default \
- && zle ${default_action}
return
fi
- # prepare warning message for the user, configurable via zstyle.
- zstyle -s ":acceptline:${alcontext}" compwarnfmt msg
+ if zstyle -t ":acceptline:${alcontext}" nocompwarn ; then
+ alcontext='normal'
+ Accept-Line-HandleContext
+ else
+ # prepare warning message for the user, configurable via zstyle.
+ zstyle -s ":acceptline:${alcontext}" compwarnfmt msg
- if [[ -z ${msg} ]] ; then
- msg="%c will not execute and completion %f exists."
- fi
+ if [[ -z ${msg} ]] ; then
+ msg="%c will not execute and completion %f exists."
+ fi
- zformat -f msg "${msg}" "c:${com}" "f:${fname}"
+ zformat -f msg "${msg}" "c:${com}" "f:${fname}"
- zle -M -- "${msg}"
+ zle -M -- "${msg}"
+ fi
return
elif [[ -n ${buf//[$' \t\n']##/} ]] ; then
# If we are here, the commandline contains something that is not
# executable, which is neither subject to _command_name correction
# and is not empty. might be a variable assignment
alcontext='misc'
- zle Accept-Line
+ Accept-Line-HandleContext
- default_action=$(Accept-Line-getdefault)
- zstyle -T ":acceptline:${alcontext}" call_default \
- && zle ${default_action}
return
fi
# If we got this far, the commandline only contains whitespace, or is empty.
alcontext='empty'
- zle Accept-Line
-
- default_action=$(Accept-Line-getdefault)
- zstyle -T ":acceptline:${alcontext}" call_default \
- && zle ${default_action}
+ Accept-Line-HandleContext
}
zle -N accept-line
zle -N Accept-Line
+zle -N Accept-Line-HandleContext
# }}}
fi
if is4 && zrcautoload insert-files && zle -N insert-files ; then
- #k# Insert files
+ #k# Insert files and test globbing
bindkey "^Xf" insert-files # C-x-f
fi
}
zle -N sudo-command-line
-#k# Put the current command line into a \kbd{sudo} call
+#k# prepend the current command with "sudo"
bindkey "^Os" sudo-command-line
### jump behind the first word on the cmdline.
fi
}
zle -N jump_after_first_word
-
+#k# jump to after first word (for adding options)
bindkey '^x1' jump_after_first_word
# complete word from history with menu (from Book: ZSH, OpenSource-Press)
#k# complete word from history with menu
bindkey "^X^X" hist-complete
-## complete word from currently visible SCREEN buffer.
-if check_com -c screen ; then
+## complete word from currently visible Screen or Tmux buffer.
+if check_com -c screen || check_com -c tmux; then
_complete_screen_display() {
[[ "$TERM" != "screen" ]] && return 1
local -U -a _screen_display_wordlist
trap "rm -f $TMPFILE" EXIT
- screen -X hardcopy $TMPFILE
# fill array with contents from screen hardcopy
+ if ((${+TMUX})); then
+ #works, but crashes tmux below version 1.4
+ #luckily tmux -V option to ask for version, was also added in 1.4
+ tmux -V &>/dev/null || return
+ tmux -q capture-pane \; save-buffer -b 0 $TMPFILE \; delete-buffer -b 0
+ else
+ screen -X hardcopy $TMPFILE
+ #screen sucks, it dumps in latin1, apparently always. so recode it to system charset
+ check_com recode && recode latin1 $TMPFILE
+ fi
_screen_display_wordlist=( ${(QQ)$(<$TMPFILE)} )
# remove PREFIX to be completed from that array
_screen_display_wordlist[${_screen_display_wordlist[(i)$PREFIX]}]=""
if [[ -f ${DIRSTACKFILE} ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then
dirstack=( ${(f)"$(< $DIRSTACKFILE)"} )
# "cd -" won't work after login by just setting $OLDPWD, so
- [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD
+ [[ -d $dirstack[1] ]] && cd $dirstack[1] && cd $OLDPWD
fi
chpwd() {
is4 && [[ $NOPRECMD -eq 0 ]] && precmd () {
[[ $NOPRECMD -gt 0 ]] && return 0
# update VCS information
- vcs_info
+ (( ${+functions[vcs_info]} )) && vcs_info
if [[ $TERM == screen* ]] ; then
if [[ -n ${vcs_info_msg_1_} ]] ; then
fi
}
-# set up software synthesizer via speakup
-swspeak() {
- if [ -x /usr/sbin/swspeak-setup ] ; then
- setopt singlelinezle
- unsetopt prompt_cr
- export PS1="%m%# "
- /usr/sbin/swspeak-setup $@
- else # old version:
- if ! [[ -r /dev/softsynth ]] ; then
- flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
- return 1
- else
- setopt singlelinezle
- unsetopt prompt_cr
- export PS1="%m%# "
- nice -n -20 speechd-up
- sleep 2
- flite -o play -t "Finished setting up software synthesizer"
- fi
- fi
-}
-
# I like clean prompt, so provide simple way to get that
check_com 0 || alias 0='return 0'
fi
}
+ _grmlinitd() {
+ local -a scripts
+ scripts=( /etc/init.d/*(x:t) )
+ _describe "service startup script" scripts
+ }
+
for i in Start Restart Stop Force-Reload Reload ; do
eval "$i() { __start_stop $i \"\$1\" \"\$2\" ; }"
+ compdef _grmlinitd $i
done
fi
}
alias help-zshglob=H-Glob
+#v1# set number of lines to display per page
+HELP_LINES_PER_PAGE=20
+#f1# helper function for help-zle, actually generates the help text
+help_zle_parse_keybindings()
+{
+ emulate -L zsh
+ setopt extendedglob
+ unsetopt ksharrays #indexing starts at 1
+
+ #v1# choose files that help-zle will parse for keybindings
+ ((${+HELPZLE_KEYBINDING_FILES})) || HELPZLE_KEYBINDING_FILES=( /etc/zsh/zshrc ~/.zshrc.pre ~/.zshrc ~/.zshrc.local )
+
+ #fill with default keybindings, possibly to be overwriten in a file later
+ #Note that due to zsh inconsistency on escaping assoc array keys, we encase the key in '' which we will remove later
+ local -A help_zle_keybindings
+ help_zle_keybindings['<Ctrl>@']="set MARK"
+ help_zle_keybindings['<Ctrl>X<Ctrl>J']="vi-join lines"
+ help_zle_keybindings['<Ctrl>X<Ctrl>B']="jump to matching brace"
+ help_zle_keybindings['<Ctrl>X<Ctrl>U']="undo"
+ help_zle_keybindings['<Ctrl>_']="undo"
+ help_zle_keybindings['<Ctrl>X<Ctrl>F<c>']="find <c> in cmdline"
+ help_zle_keybindings['<Ctrl>A']="goto beginning of line"
+ help_zle_keybindings['<Ctrl>E']="goto end of line"
+ help_zle_keybindings['<Ctrl>t']="transpose charaters"
+ help_zle_keybindings['<Alt>T']="transpose words"
+ help_zle_keybindings['<Alt>s']="spellcheck word"
+ help_zle_keybindings['<Ctrl>K']="backward kill buffer"
+ help_zle_keybindings['<Ctrl>U']="forward kill buffer"
+ help_zle_keybindings['<Ctrl>y']="insert previously killed word/string"
+ help_zle_keybindings["<Alt>'"]="quote line"
+ help_zle_keybindings['<Alt>"']="quote from mark to cursor"
+ help_zle_keybindings['<Alt><arg>']="repeat next cmd/char <arg> times (<Alt>-<Alt>1<Alt>0a -> -10 times 'a')"
+ help_zle_keybindings['<Alt>U']="make next word Uppercase"
+ help_zle_keybindings['<Alt>l']="make next word lowercase"
+ help_zle_keybindings['<Ctrl>Xd']="preview expansion under cursor"
+ help_zle_keybindings['<Alt>q']="push current CL into background, freeing it. Restore on next CL"
+ help_zle_keybindings['<Alt>.']="insert (and interate through) last word from prev CLs"
+ help_zle_keybindings['<Alt>,']="complete word from newer history (consecutive hits)"
+ help_zle_keybindings['<Alt>m']="repeat last typed word on current CL"
+ help_zle_keybindings['<Ctrl>V']="insert next keypress symbol literally (e.g. for bindkey)"
+ help_zle_keybindings['!!:n*<Tab>']="insert last n arguments of last command"
+ help_zle_keybindings['!!:n-<Tab>']="insert arguments n..N-2 of last command (e.g. mv s s d)"
+ help_zle_keybindings['<Alt>H']="run help on current command"
+
+ #init global variables
+ unset help_zle_lines help_zle_sln
+ typeset -g -a help_zle_lines
+ typeset -g help_zle_sln=1
+
+ local k v
+ local lastkeybind_desc contents #last description starting with #k# that we found
+ local num_lines_elapsed=0 #number of lines between last description and keybinding
+ #search config files in the order they a called (and thus the order in which they overwrite keybindings)
+ for f in $HELPZLE_KEYBINDING_FILES; do
+ [[ -r "$f" ]] || continue #not readable ? skip it
+ contents="$(<$f)"
+ for cline in "${(f)contents}"; do
+ #zsh pattern: matches lines like: #k# ..............
+ if [[ "$cline" == (#s)[[:space:]]#\#k\#[[:space:]]##(#b)(*)[[:space:]]#(#e) ]]; then
+ lastkeybind_desc="$match[*]"
+ num_lines_elapsed=0
+ #zsh pattern: matches lines that set a keybinding using bindkey or compdef -k
+ # ignores lines that are commentend out
+ # grabs first in '' or "" enclosed string with length between 1 and 6 characters
+ elif [[ "$cline" == [^#]#(bindkey|compdef -k)[[:space:]](*)(#b)(\"((?)(#c1,6))\"|\'((?)(#c1,6))\')(#B)(*) ]]; then
+ #description prevously found ? description not more than 2 lines away ? keybinding not empty ?
+ if [[ -n $lastkeybind_desc && $num_lines_elapsed -lt 2 && -n $match[1] ]]; then
+ #substitute keybinding string with something readable
+ k=${${${${${${${match[1]/\\e\^h/<Alt><BS>}/\\e\^\?/<Alt><BS>}/\\e\[5~/<PageUp>}/\\e\[6~/<PageDown>}//(\\e|\^\[)/<Alt>}//\^/<Ctrl>}/3~/<Alt><Del>}
+ #put keybinding in assoc array, possibly overwriting defaults or stuff found in earlier files
+ #Note that we are extracting the keybinding-string including the quotes (see Note at beginning)
+ help_zle_keybindings[${k}]=$lastkeybind_desc
+ fi
+ lastkeybind_desc=""
+ else
+ ((num_lines_elapsed++))
+ fi
+ done
+ done
+ unset contents
+ #calculate length of keybinding column
+ local kstrlen=0
+ for k (${(k)help_zle_keybindings[@]}) ((kstrlen < ${#k})) && kstrlen=${#k}
+ #convert the assoc array into preformated lines, which we are able to sort
+ for k v in ${(kv)help_zle_keybindings[@]}; do
+ #pad keybinding-string to kstrlen chars and remove outermost characters (i.e. the quotes)
+ help_zle_lines+=("${(r:kstrlen:)k[2,-2]}${v}")
+ done
+ #sort lines alphabetically
+ help_zle_lines=("${(i)help_zle_lines[@]}")
+}
+typeset -g help_zle_sln
+typeset -g -a help_zle_lines
+
+#f1# Provides (partially autogenerated) help on keybindings and the zsh line editor
+help-zle()
+{
+ emulate -L zsh
+ unsetopt ksharrays #indexing starts at 1
+ #help lines already generated ? no ? then do it
+ [[ ${+functions[help_zle_parse_keybindings]} -eq 1 ]] && {help_zle_parse_keybindings && unfunction help_zle_parse_keybindings}
+ #already displayed all lines ? go back to the start
+ [[ $help_zle_sln -gt ${#help_zle_lines} ]] && help_zle_sln=1
+ local sln=$help_zle_sln
+ #note that help_zle_sln is a global var, meaning we remember the last page we viewed
+ help_zle_sln=$((help_zle_sln + HELP_LINES_PER_PAGE))
+ zle -M "${(F)help_zle_lines[sln,help_zle_sln-1]}"
+}
+#k# display help for keybindings and ZLE (cycle pages with consecutive use)
+zle -N help-zle && bindkey '^Xz' help-zle
+
check_com -c qma && alias ?='qma zshall'
# grep for running process, like: 'any vim'
echo "any - grep for process(es) by keyword" >&2
echo "Usage: any <keyword>" >&2 ; return 1
else
- ps xauwww | grep --color=auto "[${1[1]}]${1[2,-1]}"
+ ps xauwww | grep -i --color=auto "[${1[1]}]${1[2,-1]}"
fi
}
}
functions peval &>/dev/null && alias calc=peval
-# brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
-# certain circumstances, so work around it, no matter which environment we have
-brltty() {
- if [[ -z "$DISPLAY" ]] ; then
- consolechars -f /usr/share/consolefonts/default8x16.psf.gz
- command brltty "$@"
- else
- command brltty "$@"
- fi
-}
-
# just press 'asdf' keys to toggle between dvorak and us keyboard layout
aoeu() {
echo -n 'Switching to us keyboard layout: '
firefox -a firefox -remote "openURL($1)" || firefox ${1}&
fi
}
+# smart cd function, allows switching to /etc when running 'cd /etc/fstab'
+cd() {
+ if (( ${#argv} == 1 )) && [[ -f ${1} ]]; then
+ [[ ! -e ${1:h} ]] && return 1
+ print "Correcting ${1} to ${1:h}"
+ builtin cd ${1:h}
+ else
+ builtin cd "$@"
+ fi
+}
+
#f5# Create Directoy and \kbd{cd} to it
mcd() {
mkdir -p "$@" && cd "$@"
mdiff() {
diff -udrP "$1" "$2" > diff.`date "+%Y-%m-%d"`."$1"
}
+
+#f5# Create directory under cursor or the selected area
+# Press ctrl-xM to create the directory under the cursor or the selected area.
+# To select an area press ctrl-@ or ctrl-space and use the cursor.
+# Use case: you type "mv abc ~/testa/testb/testc/" and remember that the
+# directory does not exist yet -> press ctrl-XM and problem solved
+inplaceMkDirs() {
+ local PATHTOMKDIR
+ if ((REGION_ACTIVE==1)); then
+ local F=$MARK T=$CURSOR
+ if [[ $F -gt $T ]]; then
+ F=${CURSOR}
+ T=${MARK}
+ fi
+ # get marked area from buffer and eliminate whitespace
+ PATHTOMKDIR=${BUFFER[F+1,T]%%[[:space:]]##}
+ PATHTOMKDIR=${PATHTOMKDIR##[[:space:]]##}
+ else
+ local bufwords iword
+ bufwords=(${(z)LBUFFER})
+ iword=${#bufwords}
+ bufwords=(${(z)BUFFER})
+ PATHTOMKDIR="$bufwords[iword]"
+ fi
+ [[ -z "${PATHTOMKDIR}" ]] && return 1
+ if [[ -e "${PATHTOMKDIR}" ]]; then
+ zle -M " path already exists, doing nothing"
+ else
+ zle -M "$(mkdir -p -v "${PATHTOMKDIR}")"
+ zle end-of-line
+ fi
+}
+#k# mkdir -p <dir> from string under cursor or marked area
+zle -N inplaceMkDirs && bindkey '^XM' inplaceMkDirs
+
#f5# Memory overview
memusage() {
ps aux | awk '{if (NR > 1) print $5; if (NR > 2) print "+"} END { print "p" }' | dc
lang=${1%:*}
[[ ${1} == *:* ]] && [[ -n ${1#*:} ]] && theme=${1#*:}
if [[ -n ${theme} ]] ; then
- highlight --xterm256 --syntax ${lang} --style ${theme} ${2} | less -SMr
+ highlight -O xterm256 --syntax ${lang} --style ${theme} ${2} | less -SMr
else
- highlight --ansi --syntax ${lang} ${2} | less -SMr
+ highlight -O ansi --syntax ${lang} ${2} | less -SMr
fi
;;
esac