# enable bash-like extended expansion set --brace-expand # enable recursive pathname expansion set --extended-glob # prevent redirections from overwriting existing files set --no-clobber # don't implicitly expand non-existent variables to empty strings set --no-unset # if yash is built with command history enabled... if command --identify --builtin-command history >/dev/null; then # don't save commands starting with a space in history set --hist-space fi # if yash is built with line-editing enabled... if command --identify --builtin-command bindkey >/dev/null; then # print job status update ASAP, but only while line-editing set --notify-le # some terminfo data are broken; meta flags have to be ignored for UTF-8 set --le-no-conv-meta # enable command line prediction set --le-predict set --emacs # some useful key bindings bindkey --emacs '\^N' beginning-search-forward bindkey --emacs '\^O' clear-candidates bindkey --emacs '\^P' beginning-search-backward bindkey --emacs '\N' complete-next-column bindkey --emacs '\P' complete-prev-column fi # some useful shortcuts alias r='fc -s' # normally yash is more POSIX-compliant than /bin/sh :-) sh() { yash --posix "$@"; } yash() { command yash "$@"; } # By re-defining 'yash' using the 'command' built-in, the 'jobs' built-in # prints a command name that exposes the arguments like # 'yash --posix -n foo.sh' rather than a command name that hides the # arguments like 'yash --posix "${@}"'. This applies to the 'yash' command # invoked via the 'sh' function. # ensure job control works as expected case $- in (*m*) trap - TSTP TTIN TTOU esac # This should be set by $HOME/.config/shrc... : ${PAGER:=less} ${EDITOR:=vi} ${FCEDIT:=$EDITOR} : ${LOGNAME:=$(logname)} ${HOSTNAME:=$(uname -n)} # variables needed for command history HISTFILE=~/.config/yash/yash_history HISTSIZE=5000 # HISTRMDUP makes prediction less accurate # HISTRMDUP=500 # emulate bash's $SHLVL if [ "${_old_shlvl+set}" != set ]; then _old_shlvl=${SHLVL-} fi SHLVL=$((_old_shlvl+1)) 2>/dev/null || SHLVL=1 export SHLVL # initialize event handlers COMMAND_NOT_FOUND_HANDLER=() PROMPT_COMMAND=() YASH_AFTER_CD=() # define prompt. this should be done by $HOME/.config/shrc _hc='\fg.' # green hostname for local _uc=$_hc _hc= # same username color as hostname for non-root user # The main prompt ($YASH_PS1) contains the username, hostname, working # directory, last exit status (only if non-zero), and $SHLVL (only if # non-one). YASH_PS1=''$_hc'\fd.''d:${${${PWD:/~/\~}##*/}:-$PWD} e:${{?:/0/}:+\\fr.$?\\fd.} ${{SHLVL-0}:/1} do> ' YASH_PS1R='\fc.${_vcs_info}' YASH_PS1S='\fo.' YASH_PS2=$'> ' YASH_PS2S=$YASH_PS1S YASH_PS4='\fm.+ ' YASH_PS4S='\fmo.' unset _hc _uc # No escape sequences allowed in the POSIXly-correct mode. PS1='${LOGNAME}@${HOSTNAME%%.*} '$PS1 # find escape sequence to change terminal window title case "$TERM" in (xterm|xterm[+-]*|gnome|gnome[+-]*|putty|putty[+-]*|cygwin) _tsl='\033];' _fsl='\a' ;; (*) _tsl=$( (tput tsl 0; echo) 2>/dev/null | sed -e 's;\\;\\\\;g' -e 's;;\\033;g' -e 's;;\\a;g' -e 's;%;%%;g') _fsl=$( (tput fsl ; echo) 2>/dev/null | sed -e 's;\\;\\\\;g' -e 's;;\\033;g' -e 's;;\\a;g' -e 's;%;%%;g') ;; esac # if terminal window title can be changed... if [ "$_tsl" ] && [ "$_fsl" ]; then # set terminal window title on each prompt _set_term_title() if [ -t 2 ]; then printf "$_tsl"'%s@%s:%s'"$_fsl" "${LOGNAME}" "${HOSTNAME%%.*}" \ "${${PWD:/$HOME/\~}/#$HOME\//\~\/}" >&2 fi PROMPT_COMMAND=("$PROMPT_COMMAND" '_set_term_title') cmd() { if [ -t 2 ]; then printf "$_tsl""$0 %s""$_fsl" "$*" >&2; fi command $0 "$@" } # reset window title when invoking long-running programs ssh() { if [ -t 2 ]; then printf "$_tsl"'ssh %s'"$_fsl" "$*" >&2; fi command ssh "$@" } tine() { printf "$_tsl""tine %s""$_fsl" "$*" >&2 command tine "$@" } kiss() { printf "$_tsl""kiss %s""$_fsl" "$*" >&2 command kiss "$@" } fpm() { printf "$_tsl""fpm %s""$_fsl" "$*" >&2 command fpm "$@" } fpv() { printf "$_tsl""fpv %s""$_fsl" "$*" >&2 command fpv "$@" } links() { printf "$_tsl""links""$_fsl" "$*" >&2 command links "$@" } man() { printf "$_tsl""man %s""$_fsl" "$*" >&2 command man "$@" } ed() { printf "$_tsl""ed %s""$_fsl" "$*" >&2 command ed "$@" } less() { printf "$_tsl""less %s""$_fsl" "$*" >&2 command less "$@" } bc() { printf "$_tsl""bc %s""$_fsl" "$*" >&2 command bc "$@" } axel() { printf "$_tsl""axel %s""$_fsl" "$*" >&2 command axel "$@" } ssu() { printf "$_tsl""ssu %s""$_fsl" "$*" >&2 command ssu "$@" } iview() { printf "$_tsl""iview %s""$_fsl" "$*" >&2 command iview "$@" } fi # define function that updates $_vcs_info and $_vcs_root _update_vcs_info() { typeset type branch { read --raw-mode type read --raw-mode _vcs_root read --raw-mode branch } <( exec 2>/dev/null typeset COMMAND_NOT_FOUND_HANDLER= while true; do if [ -e .git ] || [ . -ef "${GIT_WORK_TREE-}" ]; then printf 'git\n%s\n' "${GIT_WORK_TREE:-$PWD}" git branch --no-color | sed -n '/^\*/s/^..//p' exit elif [ -d .hg ]; then printf 'hg\n%s\n' "$PWD" exec cat .hg/branch elif [ -d .svn ]; then printf 'svn\n' _vcs_root=$(svn info --show-item=wc-root) printf '%s\n' "$_vcs_root" path=$(svn info --show-item=relative-url) case $path in (*/branches/*) printf '%s\n' "${${path#*/branches/}%%/*}" esac exit fi if [ / -ef . ] || [ . -ef .. ]; then exit fi cd -P .. done ) case "$type#$branch" in (hg#default) _vcs_info='hg';; (git#master) _vcs_info='git';; (*# ) _vcs_info="$type";; (* ) _vcs_info="$type@$branch";; esac } # update $_vcs_info on each prompt PROMPT_COMMAND=("$PROMPT_COMMAND" '_update_vcs_info') # these aliases choose a version controlling program for the current directory alias _vcs='${${_vcs_info:?not in a version-controlled directory}%%@*}' alias ci='_vcs commit' alias co='_vcs checkout' alias di='_vcs diff' alias log='_vcs log' alias st='_vcs status' alias up='_vcs update' # when a directory name is entered as a command, treat as "cd" _autocd() if [ -d "$1" ]; then HANDLED=true cd -- "$@" break -i fi COMMAND_NOT_FOUND_HANDLER=("$COMMAND_NOT_FOUND_HANDLER" '_autocd "$@"') # treat command names starting with % as "fg" _autofg() if [ $# -eq 1 ]; then case $1 in (%*) HANDLED=true fg "$1" break -i esac fi COMMAND_NOT_FOUND_HANDLER=("$COMMAND_NOT_FOUND_HANDLER" '_autofg "$@"') # print file type when executing non-executable files _file_type() if [ -e "$1" ] && ! [ -d "$1" ]; then file -- "$1" fi COMMAND_NOT_FOUND_HANDLER=("$COMMAND_NOT_FOUND_HANDLER" '_file_type "$@"') . /etc/profile