From b5e7ba34556bf97a1bee92fd4554e8053dac6fb1 Mon Sep 17 00:00:00 2001 From: Mitchell Riedstra Date: Mon, 6 Sep 2021 23:32:39 -0400 Subject: Writing portable shell configuration is hard. Add yashrc modified from their examples --- yashrc | 272 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100644 yashrc (limited to 'yashrc') 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 <</dev/null; then + grep() { command grep --color=auto "$@"; } + fi + if ggrep --color=auto -q X <</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 -- cgit v1.2.3