269 lines
6.8 KiB
Plaintext
269 lines
6.8 KiB
Plaintext
# 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
|