aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Riedstra <mitch@riedstra.dev>2021-09-06 23:32:39 -0400
committerMitchell Riedstra <mitch@riedstra.dev>2021-09-06 23:32:39 -0400
commitb5e7ba34556bf97a1bee92fd4554e8053dac6fb1 (patch)
tree3fbaf32962e6da9d64ca7921a2802980fd477fab
parent248decae39a982cc320d7ae24a5b4ef433b30bdf (diff)
downloaddotfiles-b5e7ba34556bf97a1bee92fd4554e8053dac6fb1.tar.gz
dotfiles-b5e7ba34556bf97a1bee92fd4554e8053dac6fb1.tar.xz
Writing portable shell configuration is hard. Add yashrc modified from their examples
-rw-r--r--kshrc18
-rw-r--r--yashrc272
2 files changed, 282 insertions, 8 deletions
diff --git a/kshrc b/kshrc
index 48504f2..78663da 100644
--- a/kshrc
+++ b/kshrc
@@ -131,9 +131,9 @@ mount
umount"
# Only add aliases for commands that actually exist on our system
- if [ -x "$_sudo" ] ; then
+ if [ -n "$_sudo" ] ; then
for _c in $_cmds ; do
- [ -x "$(command -v "$_c")" ] && eval "alias $_c=\"$_sudo $_c\""
+ [ -n "$(command -v "$_c")" ] && eval "alias $_c=\"$_sudo $_c\""
done
fi
case $_sudo in
@@ -490,19 +490,19 @@ pull() {
echo "pull usage: -f <output> -u <url>"; return
fi
- if [ -x "$(command -v wget)" ] ; then
+ if [ -n "$(command -v wget)" ] ; then
wget "$_u" -O "$_f" && return
fi
- if [ -x "$(command -v curl)" ] ; then
+ if [ -n "$(command -v curl)" ] ; then
curl "$_u" -o "$_f" && return
fi
- if [ -x "$(command -v ftp)" ] && [ "$(uname)" = "OpenBSD" ] ; then
+ if [ -n "$(command -v ftp)" ] && [ "$(uname)" = "OpenBSD" ] ; then
ftp -o "$_f" "$_u" && return
fi
- if [ -x "$(command -v fetch)" ] && [ "$(uname)" = "FreeBSD" ] ; then
+ if [ -n "$(command -v fetch)" ] && [ "$(uname)" = "FreeBSD" ] ; then
fetch "$_u" -o "$_f" && return
fi
@@ -638,12 +638,14 @@ setsudoaliases
# Support various different shells
-if [ -n "$KSH_VERSION" ] ; then
+if [ -n "$YASH_VERSION" ] ; then
+ echo "Intentionally left blank" >/dev/null 2>&1
+elif [ -n "$KSH_VERSION" ] ; then
export HISTFILE="$HOME/.ksh_history"
export HISTSIZE=10000
- set -o emacs
bind ^L=clear-screen
+ set -o emacs
#shellcheck disable=SC2155
# if you want PWD
diff --git a/yashrc b/yashrc
new file mode 100644
index 0000000..c989764
--- /dev/null
+++ b/yashrc
@@ -0,0 +1,272 @@
+##### Common Yashrc #####
+# This file is in the public domain.
+
+# 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
+
+ # prevent clearing history by accident
+ history()
+ if [ -t 0 ] && (
+ for arg do
+ case "${arg}" in
+ (-[drsw]?* | --*=*) ;;
+ (-*c*) exit;;
+ esac
+ done
+ false
+ ) then
+ printf 'history: seems you are trying to clear the whole history.\n' >&2
+ printf 'are you sure? (yes/no) ' >&2
+ case "$(head -n 1)" in
+ ([Yy]*) command history "$@";;
+ (*) printf 'history: cancelled.\n' >&2;;
+ esac
+ else
+ command history "$@"
+ fi
+
+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 -- -='cd -'
+alias la='ls -a' ll='ls -l' lla='ll -a'
+alias r='fc -s'
+
+# avoid removing/overwriting existing files by accident
+cp() if [ -t 0 ]; then command cp -i "$@"; else command cp "$@"; fi
+mv() if [ -t 0 ]; then command mv -i "$@"; else command mv "$@"; fi
+rm() if [ -t 0 ]; then command rm -i "$@"; else command rm "$@"; fi
+
+# 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
+
+# if the terminal supports color...
+if [ "$(tput colors 2>/dev/null || echo 0)" -ge 8 ]; then
+
+ # make command output colorful
+ if ls --color=auto -d / >/dev/null 2>&1; then
+ ls() { command ls --color=auto "$@"; }
+ fi
+ if grep --color=auto -q X <<<X 2>/dev/null; then
+ grep() { command grep --color=auto "$@"; }
+ fi
+ if ggrep --color=auto -q X <<<X 2>/dev/null; then
+ ggrep() { command ggrep --color=auto "$@"; }
+ fi
+
+fi
+
+# if vim is available...
+if command --identify vim >/dev/null 2>&1; then
+
+ # prefer vim over vi
+ vi() { vim "$@"; }
+ view() { vim -R "$@"; }
+ vim() { command vim "$@"; } # Re-definition hack. See above.
+
+fi
+
+# avoid removing existing crontab by accident
+crontab()
+if [ -t 0 ] && (
+ for arg do
+ case "${arg}" in
+ (-*r*) exit;;
+ esac
+ done
+ false
+) then
+ printf 'crontab: seems you are trying to clear your crontab.\n' >&2
+ printf 'are you sure? (yes/no) ' >&2
+ case "$(head -n 1)" in
+ ([Yy]*) command crontab "$@";;
+ (*) printf 'crontab: cancelled.\n' >&2;;
+ esac
+else
+ command crontab "$@"
+fi
+
+# an alias that opens a file
+if command --identify xdg-open >/dev/null 2>&1; then
+ alias o='xdg-open'
+elif command --identify cygstart >/dev/null 2>&1; then
+ alias o='cygstart'
+elif [ "$(uname)" = Darwin ] 2>/dev/null; then
+ alias o='open'
+fi
+
+# define some basic variables if missing
+: ${PAGER:=less} ${EDITOR:=vi} ${FCEDIT:=$EDITOR}
+: ${LOGNAME:=$(logname)} ${HOSTNAME:=$(uname -n)}
+
+# disable confusing treatment of arguments in the echo command
+: ${ECHO_STYLE:=RAW}
+
+# variables needed for command history
+HISTFILE=~/.yash_history HISTSIZE=5000
+# HISTRMDUP makes prediction less accurate
+# HISTRMDUP=500
+
+# default mail check interval is too long
+MAILCHECK=0
+
+# 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
+if [ -n "${SSH_CONNECTION-}" ]; then
+ _hc='\fy.' # yellow hostname for SSH remote
+else
+ _hc='\fg.' # green hostname for local
+fi
+if [ "$(id -u)" -eq 0 ]; then
+ _uc='\fr.' # red username for root
+ _2c='\fr.' # red PS2 for root
+else
+ _uc=$_hc _hc= # same username color as hostname for non-root user
+ _2c= # PS2 in normal color for non-root user
+fi
+# The main prompt ($YASH_PS1) contains the username, hostname, working
+# directory, last exit status (only if non-zero), and $SHLVL (only if
+# non-one).
+_un="${LOGNAME//mitch/}"; [ -n "$_un" ] && _un="${_un}@"
+YASH_PS1=$_uc'${_un}'$_hc'${HOSTNAME%%.*}\fd. '\
+'${${${PWD:/~/\~}##*/}:-$PWD} ${{?:/0/}:+\\fr.$?\\fd. }\$ '
+# YASH_PS1R='\fc.${_vcs_info}'
+# YASH_PS1R='\fc.${HOSTNAME%%.*} ${${${PWD:/~/\~}##*/}:-$PWD}'
+YASH_PS1R=
+YASH_PS1S='\fo.'
+YASH_PS2=$_2c'> '
+YASH_PS2R=
+YASH_PS2S=$YASH_PS1S
+YASH_PS4='\fm.+ '
+YASH_PS4S='\fmo.'
+unset _hc _uc _2c _un
+# No escape sequences allowed in the POSIXly-correct mode.
+PS1='${LOGNAME}@${HOSTNAME%%.*} '$PS1
+YASH_PS1="${?:/0/}$ "
+
+# 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')
+
+ # reset window title when changing host or user
+ ssh() {
+ if [ -t 2 ]; then printf "$_tsl"'ssh %s'"$_fsl" "$*" >&2; fi
+ command ssh "$@"
+ }
+ su() {
+ if [ -t 2 ]; then printf "$_tsl"'su %s'"$_fsl" "$*" >&2; fi
+ command su "$@"
+ }
+ sudo() {
+ if [ -t 2 ]; then printf "$_tsl"'sudo %s'"$_fsl" "$*" >&2; fi
+ command sudo "$@"
+ }
+
+fi
+
+# 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 "$@"')
+
+
+. ~/.kshrc