Add basic XDG compliant sh architecture
The only file left in $HOME is .zshenv, which sets up zsh to source everything from XDG_CONFIG_HOME/zsh. Shell files are split into sh and zsh directories, for global assignments (which should be posix compliant, work on any posix shell) like environemnt variables, xdg vars, and global aliases. zsh contains zsh specific customization (prompt customization, plugin loading, zsh completions). Zsh initialization will pull from sh directory first, loading the respective mirror to its startup file (`.zprofile` loads `sh/profile` and `profile.d/*`, `.zshenv` loads `sh/env` and `sh/env.d/*` and `zsh/env.d/*`, `.zshrc` loads `sh/alias`, `sh/alias.d/*` and `zsh/alias.d/*`) Once all is done, it will have loaded both global variables, aliases and settings, and zsh-only specifications. Other stow modules, if they want to add shell functionality, can include their aliases and functions in one of the above directories to automatically be picked up by zsh.
This commit is contained in:
parent
a0a02be852
commit
6380affb6f
46 changed files with 1657 additions and 677 deletions
112
sh/.config/sh/alias
Normal file
112
sh/.config/sh/alias
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
#!/usr/bin/env sh
|
||||
#
|
||||
# Global aliases for any shell
|
||||
|
||||
exist() { type "$1" >/dev/null 2>&1; }
|
||||
|
||||
# Avoid aliases which I did not create -- unalias EVERYTHING
|
||||
unalias -a
|
||||
|
||||
# v shorthand for neovim
|
||||
alias v="nvim"
|
||||
|
||||
# exit shell mimicks vim
|
||||
alias :q="exit"
|
||||
|
||||
# ls defaults
|
||||
if exist exa; then
|
||||
alias l="exa -l --git --git-ignore"
|
||||
alias L="exa -hal --grid --git"
|
||||
# a recursive tree
|
||||
# - usually want to change levels recursed with -L2 -L3 or similar
|
||||
alias ll="exa --tree -L2"
|
||||
alias LL="exa -a --tree -L2"
|
||||
else
|
||||
alias l="ls -lhF"
|
||||
alias L="ls -lAhF"
|
||||
fi
|
||||
|
||||
# cd defaults
|
||||
alias ..="cd .."
|
||||
alias ...="cd ../.."
|
||||
alias ~="cd ~"
|
||||
|
||||
# git alias
|
||||
if exist git; then
|
||||
alias g='git'
|
||||
|
||||
alias ga='git add'
|
||||
alias gaa='git add --all'
|
||||
alias gb='git branch'
|
||||
alias gbd='git branch -d'
|
||||
|
||||
alias gc='git commit -v'
|
||||
alias gc!='git commit -v --amend'
|
||||
alias gcn!='git commit -v --no-edit --amend'
|
||||
|
||||
alias gcm='git checkout master'
|
||||
alias gcd='git checkout develop'
|
||||
alias gcb='git checkout -b'
|
||||
alias gco='git checkout'
|
||||
|
||||
alias gd='git diff'
|
||||
alias gds='git diff --staged'
|
||||
|
||||
alias gi='git ignore'
|
||||
|
||||
alias glog='git log --stat'
|
||||
alias glg='git log --oneline --decorate --graph'
|
||||
alias glga='git log --oneline --decorate --graph --remotes --all'
|
||||
alias glgp='git log --stat -p'
|
||||
|
||||
alias gf='git fetch'
|
||||
alias gl='git pull'
|
||||
alias gpn='git push --dry-run'
|
||||
alias gp='git push'
|
||||
alias gpf!='git push --force'
|
||||
|
||||
alias grv='git remote -v'
|
||||
|
||||
alias grs='git restore --staged'
|
||||
alias grs!='git restore'
|
||||
|
||||
alias grbi='git rebase -i'
|
||||
alias grbc='git rebase --continue'
|
||||
|
||||
alias gst='git status'
|
||||
|
||||
autoload -Uz is-at-least
|
||||
if is-at-least 2.13 "$(git --version 2>/dev/null | awk '{print $3}')"; then
|
||||
alias gsta='git stash push'
|
||||
else
|
||||
alias gsta='git stash save'
|
||||
fi
|
||||
alias gstp='git stash pop'
|
||||
alias gstl='git stash list'
|
||||
fi
|
||||
|
||||
# clear my screen
|
||||
alias cl="clear"
|
||||
|
||||
# Display current external ip address
|
||||
alias myip="curl -s icanhazip.com"
|
||||
|
||||
# fzf
|
||||
if exist fzf; then
|
||||
# Display fuzzy-searchable history
|
||||
alias fzf_history="history | fzf --tac --height 20"
|
||||
# Fuzzy search packages to install
|
||||
if exist yay; then
|
||||
alias fzf_yay="yay -Slq | fzf -m --preview 'yay -Si {1}' | xargs -ro yay -S"
|
||||
# Fuzzy uninstall packages
|
||||
alias fzf_yayrns="yay -Qeq | fzf -m --preview 'yay -Qi {1}' | xargs -ro yay -Rns"
|
||||
fi
|
||||
fi
|
||||
|
||||
# vifm
|
||||
if exist vifm; then
|
||||
alias vm=vifm
|
||||
alias vmm='vifm ${PWD}'
|
||||
# enable picture preview script
|
||||
exist vifmrun && alias vifm=vifmrun
|
||||
fi
|
||||
27
sh/.config/sh/alias.d/enable-fasd-hook.sh
Normal file
27
sh/.config/sh/alias.d/enable-fasd-hook.sh
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
#!/bin/sh
|
||||
# more usage instructions at https://github.com/clvv/fasd
|
||||
eval "$(fasd --init posix-hook posix_alias bash-hook zsh-hook zsh-ccomp zsh-ccomp-install zsh-wcomp zsh-wcomp-install)"
|
||||
# eval "$(fasd --init auto)"
|
||||
|
||||
alias a='fasd -a' # any
|
||||
alias s='fasd -si' # show / search / select
|
||||
# alias d='fasd -d' # directory
|
||||
# alias f='fasd -f' # file
|
||||
# alias sd='fasd -sid' # interactive directory selection
|
||||
# alias sf='fasd -sif' # interactive file selection
|
||||
alias z='fasd_cd -d' # cd, same functionality as j in autojump
|
||||
alias zz='fasd_cd -d -i' # cd with interactive selection
|
||||
|
||||
# from: https://github.com/clvv/fasd/issues/10
|
||||
# since I can only load auto configuration and have default fasd_cd AND useless aliases
|
||||
# or manually load the modules and NOT have fasd_cd
|
||||
# it's easier to use this function
|
||||
fasd_cd() {
|
||||
fasd_ret="$(fasd -d "$@")"
|
||||
if [ -d "$fasd_ret" ]; then
|
||||
cd "$fasd_ret" || exit
|
||||
else
|
||||
print "$fasd_ret"
|
||||
fi
|
||||
unset fasd_ret
|
||||
}
|
||||
214
sh/.config/sh/alias.d/ssh-agent-autoconfiguration.sh
Normal file
214
sh/.config/sh/alias.d/ssh-agent-autoconfiguration.sh
Normal file
|
|
@ -0,0 +1,214 @@
|
|||
#!/bin/bash
|
||||
|
||||
## Integration at the Bottom
|
||||
|
||||
# Copyright (C) 2011 by Wayne Walker <wwalker@solid-constructs.com>
|
||||
#
|
||||
# Released under one of the versions of the MIT License.
|
||||
#
|
||||
# Copyright (C) 2011 by Wayne Walker <wwalker@solid-constructs.com>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
|
||||
_LIVE_AGENT_LIST=""
|
||||
declare -a _LIVE_AGENT_SOCK_LIST
|
||||
_LIVE_AGENT_SOCK_LIST=()
|
||||
|
||||
_debug_print() {
|
||||
if [[ $_DEBUG -gt 0 ]]; then
|
||||
printf "%s\n" "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
find_all_ssh_agent_sockets() {
|
||||
_SSH_AGENT_SOCKETS=$(find /tmp/ -type s -name agent.\* 2>/dev/null | grep '/tmp/ssh-.*/agent.*')
|
||||
_debug_print "$_SSH_AGENT_SOCKETS"
|
||||
}
|
||||
|
||||
find_all_gpg_agent_sockets() {
|
||||
_GPG_AGENT_SOCKETS=$(find /tmp/ -type s -name S.gpg-agent.ssh 2>/dev/null | grep '/tmp/gpg-.*/S.gpg-agent.ssh')
|
||||
_debug_print "$_GPG_AGENT_SOCKETS"
|
||||
}
|
||||
|
||||
find_all_gnome_keyring_agent_sockets() {
|
||||
_GNOME_KEYRING_AGENT_SOCKETS=$(find /tmp/ -type s -name "ssh" 2>/dev/null | grep '/tmp/keyring-.*/ssh$')
|
||||
_debug_print "$_GNOME_KEYRING_AGENT_SOCKETS"
|
||||
}
|
||||
|
||||
find_all_osx_keychain_agent_sockets() {
|
||||
[[ -n "$TMPDIR" ]] || TMPDIR=/tmp
|
||||
_OSX_KEYCHAIN_AGENT_SOCKETS=$(find $TMPDIR/ -type s -regex '.*/ssh-.*/agent..*$' 2>/dev/null)
|
||||
_debug_print "$_OSX_KEYCHAIN_AGENT_SOCKETS"
|
||||
}
|
||||
|
||||
test_agent_socket() {
|
||||
local SOCKET=$1
|
||||
SSH_AUTH_SOCK=$SOCKET ssh-add -l 2>/dev/null >/dev/null
|
||||
result=$?
|
||||
|
||||
_debug_print $result
|
||||
|
||||
if [[ $result -eq 0 ]]; then
|
||||
# contactible and has keys loaded
|
||||
_KEY_COUNT=$(SSH_AUTH_SOCK=$SOCKET ssh-add -l | wc -l | tr -d ' ')
|
||||
fi
|
||||
|
||||
if [[ $result -eq 1 ]]; then
|
||||
# contactible butno keys loaded
|
||||
_KEY_COUNT=0
|
||||
fi
|
||||
|
||||
if [ $result -eq 0 ] || [ $result -eq 1 ]; then
|
||||
if [[ -n "$_LIVE_AGENT_LIST" ]]; then
|
||||
_LIVE_AGENT_LIST="${_LIVE_AGENT_LIST} ${SOCKET}:$_KEY_COUNT"
|
||||
else
|
||||
_LIVE_AGENT_LIST="${SOCKET}:$_KEY_COUNT"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
find_live_gnome_keyring_agents() {
|
||||
for i in $_GNOME_KEYRING_AGENT_SOCKETS; do
|
||||
test_agent_socket "$i"
|
||||
done
|
||||
}
|
||||
|
||||
find_live_osx_keychain_agents() {
|
||||
for i in $_OSX_KEYCHAIN_AGENT_SOCKETS; do
|
||||
test_agent_socket "$i"
|
||||
done
|
||||
}
|
||||
|
||||
find_live_gpg_agents() {
|
||||
for i in $_GPG_AGENT_SOCKETS; do
|
||||
test_agent_socket "$i"
|
||||
done
|
||||
}
|
||||
|
||||
find_live_ssh_agents() {
|
||||
for i in $_SSH_AGENT_SOCKETS; do
|
||||
test_agent_socket "$i"
|
||||
done
|
||||
}
|
||||
|
||||
function fingerprints() {
|
||||
local file="$1"
|
||||
while read -r l; do
|
||||
[[ -n $l && ${l###} == "$l" ]] && ssh-keygen -l -f /dev/stdin <<<"$l"
|
||||
done <"$file"
|
||||
}
|
||||
|
||||
find_all_agent_sockets() {
|
||||
_SHOW_IDENTITY=0
|
||||
if [ "$1" = "-i" ]; then
|
||||
_SHOW_IDENTITY=1
|
||||
fi
|
||||
_LIVE_AGENT_LIST=
|
||||
find_all_ssh_agent_sockets
|
||||
find_all_gpg_agent_sockets
|
||||
find_all_gnome_keyring_agent_sockets
|
||||
find_all_osx_keychain_agent_sockets
|
||||
find_live_ssh_agents
|
||||
find_live_gpg_agents
|
||||
find_live_gnome_keyring_agents
|
||||
find_live_osx_keychain_agents
|
||||
_debug_print "$_LIVE_AGENT_LIST"
|
||||
_LIVE_AGENT_LIST=$(echo $_LIVE_AGENT_LIST | tr ' ' '\n' | sort -n -t: -k 2 -k 1 | uniq)
|
||||
_LIVE_AGENT_SOCK_LIST=()
|
||||
_debug_print "SORTED: $_LIVE_AGENT_LIST"
|
||||
if [[ $_SHOW_IDENTITY -gt 0 ]]; then
|
||||
i=0
|
||||
for a in $_LIVE_AGENT_LIST; do
|
||||
sock=${a/:*/}
|
||||
_LIVE_AGENT_SOCK_LIST[$i]=$sock
|
||||
# technically we could have multiple keys forwarded
|
||||
# But I haven't seen anyone do it
|
||||
akeys=$(SSH_AUTH_SOCK=$sock ssh-add -l)
|
||||
fingerprint=$(echo "${akeys}" | awk '{print $2}')
|
||||
if [ -e ~/.ssh/authorized_keys ]; then
|
||||
authorized_entry=$(fingerprints ~/.ssh/authorized_keys | grep "$fingerprint")
|
||||
fi
|
||||
comment=$(echo "${authorized_entry}" | awk '{print $3,$4,$5,$6,$7}')
|
||||
printf "export SSH_AUTH_SOCK=%s \t#%i) \t%s\n" "$sock" $((i + 1)) "$comment"
|
||||
i=$((i + 1))
|
||||
done
|
||||
else
|
||||
printf "%s\n" "$_LIVE_AGENT_LIST" | sed -e 's/ /\n/g' | sort -n -t: -k 2 -k 1
|
||||
fi
|
||||
}
|
||||
|
||||
set_ssh_agent_socket() {
|
||||
if [ "$1" = "-c" ] || [ "$1" = "--choose" ]; then
|
||||
find_all_agent_sockets -i
|
||||
|
||||
if [ -z "$_LIVE_AGENT_LIST" ]; then
|
||||
echo "No agents found"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo -n "Choose (1-${#_LIVE_AGENT_SOCK_LIST[@]})? "
|
||||
read -r choice
|
||||
if [ -n "$choice" ]; then
|
||||
n=$((choice - 1))
|
||||
if [ -z "${_LIVE_AGENT_SOCK_LIST[$n]}" ]; then
|
||||
echo "Invalid choice"
|
||||
return 1
|
||||
fi
|
||||
echo "Setting export SSH_AUTH_SOCK=${_LIVE_AGENT_SOCK_LIST[$n]}"
|
||||
export SSH_AUTH_SOCK=${_LIVE_AGENT_SOCK_LIST[$n]}
|
||||
fi
|
||||
else
|
||||
# Choose the first available
|
||||
SOCK=$(find_all_agent_sockets | tail -n 1 | awk -F: '{print $1}')
|
||||
if [ -z "$SOCK" ]; then
|
||||
return 1
|
||||
fi
|
||||
export SSH_AUTH_SOCK=$SOCK
|
||||
fi
|
||||
|
||||
# set agent pid
|
||||
if [ -n "$SSH_AUTH_SOCK" ]; then
|
||||
export SSH_AGENT_PID=$(($(echo "$SSH_AUTH_SOCK" | cut -d. -f2) + 1))
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
ssh-find-agent() {
|
||||
if [ "$1" = "-c" ] || [ "$1" = "--choose" ]; then
|
||||
set_ssh_agent_socket -c
|
||||
return $?
|
||||
elif [ "$1" = "-a" ] || [ "$1" = "--auto" ]; then
|
||||
set_ssh_agent_socket
|
||||
return $?
|
||||
else
|
||||
find_all_agent_sockets -i
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
# Automatically add ssh-agent to any new ssh connection
|
||||
ssh-find-agent -a
|
||||
if [ -z "$SSH_AUTH_SOCK" ]; then
|
||||
eval "$(ssh-agent)" >/dev/null
|
||||
ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'
|
||||
fi
|
||||
44
sh/.config/sh/env
Normal file
44
sh/.config/sh/env
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
#!/usr/bin/env sh
|
||||
#
|
||||
# Set global environment variables
|
||||
|
||||
# Load XDG specifications
|
||||
# shellcheck source=xdg
|
||||
[ -f ~/.config/sh/xdg ] && . ~/.config/sh/xdg
|
||||
|
||||
# anything on BIN_HOME should be executable form anywhere
|
||||
export PATH="$PATH:$XDG_BIN_HOME"
|
||||
|
||||
###############################
|
||||
## BEGIN GLOBAL ENV VARS ##
|
||||
###############################
|
||||
|
||||
# if we forgot to set it treat bash as default
|
||||
export SHELL=${SHELL:-/bin/bash}
|
||||
|
||||
# will be picked up by many programs as notes directory
|
||||
export WIKIROOT="${WIKIROOT:-$HOME/documents/notes}"
|
||||
# will be picked up by many programs as library root directory
|
||||
export LIBRARYROOT="${LIBRARYROOT:-$HOME/documents/library}"
|
||||
# the default bibtex file to work on
|
||||
# will change over time as primary projects change
|
||||
# basically functions as 'default library' variable
|
||||
export BIBFILE="${BIBFILE:-$LIBRARYROOT/academia/academia.bib}"
|
||||
|
||||
# these are my personal 'important' application settings
|
||||
export EDITOR=nvim
|
||||
export BROWSER=qutebrowser
|
||||
|
||||
export TERMINAL="alacritty"
|
||||
export PAGER="less"
|
||||
|
||||
export FILEREADER="zathura"
|
||||
export FILEMANAGER="vifm"
|
||||
|
||||
## gopath
|
||||
export GOPATH="$HOME/projects/gopath/"
|
||||
export PATH="$PATH:$GOPATH/bin"
|
||||
|
||||
## LANG LOCALE UTF-8
|
||||
export LC_ALL="en_US.UTF-8"
|
||||
export LANG="en_US.UTF-8"
|
||||
18
sh/.config/sh/profile
Normal file
18
sh/.config/sh/profile
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
#!/usr/bin/env sh
|
||||
#
|
||||
# Is executed for any base sh login-shell
|
||||
# Bash only executes when neither bash-profile nor bashrc exist
|
||||
# (will only load the first one it finds)
|
||||
#
|
||||
# see https://github.com/rbenv/rbenv/wiki/unix-shell-initialization
|
||||
|
||||
## Load all global environmment variables
|
||||
# shellcheck source=env
|
||||
[ -f ~/.config/sh/env ] && . ~/.config/sh/env
|
||||
# load additional packages
|
||||
if [ -d "$XDG_CONFIG_HOME/sh/env.d" ]; then
|
||||
for _env in "$XDG_CONFIG_HOME/sh/env.d"/*.sh; do
|
||||
. "$_env"
|
||||
done
|
||||
unset _env
|
||||
fi
|
||||
5
sh/.config/sh/profile.d/autostartx.sh
Normal file
5
sh/.config/sh/profile.d/autostartx.sh
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
if [ ! "$DISPLAY" ] && [ "$XDG_VTNR" -eq 1 ]; then
|
||||
exec startx "$XDG_CONFIG_HOME"/xresources/xinitrc
|
||||
fi
|
||||
33
sh/.config/sh/xdg
Normal file
33
sh/.config/sh/xdg
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
#!/usr/bin/env sh
|
||||
# XDG Base Directory Specification
|
||||
#
|
||||
# Sets up necessary environment variables for XDG convention,
|
||||
# and those that applications obey for their environments.
|
||||
#
|
||||
# Thank you remeberYou for the idea
|
||||
# see: https://github.com/rememberYou/dotfiles/blob/master/sh/.config/sh/xdg
|
||||
#
|
||||
# Additionally, home directories are set using the XDG specification,
|
||||
# if the xdg-user-dirs module is enabled.
|
||||
#
|
||||
# Shellcheck will complain about setting permissions for the directories
|
||||
# unless it is ignored https://github.com/koalaman/shellcheck/wiki/SC2174
|
||||
# shellcheck disable=SC2174
|
||||
|
||||
# http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||
test "$XDG_CACHE_HOME" || export XDG_CACHE_HOME="$HOME/.cache"
|
||||
test "$XDG_CONFIG_HOME" || export XDG_CONFIG_HOME="$HOME/.config"
|
||||
test "$XDG_DATA_HOME" || export XDG_DATA_HOME="$HOME/.local/share"
|
||||
|
||||
## Non-Standard additions
|
||||
# non-standard, is added to path to enable execution of any files herein
|
||||
test "$XDG_BIN_HOME" || export XDG_BIN_HOME="$HOME/.local/bin"
|
||||
|
||||
## ensure directories exist
|
||||
test -d "$XDG_BIN_HOME" || mkdir -p -m 0700 "$XDG_BIN_HOME"
|
||||
test -d "$XDG_CACHE_HOME" || mkdir -p -m 0700 "$XDG_CACHE_HOME"
|
||||
test -d "$XDG_CONFIG_HOME" || mkdir -p -m 0700 "$XDG_CONFIG_HOME"
|
||||
test -d "$XDG_DATA_HOME" || mkdir -p -m 0700 "$XDG_DATA_HOME"
|
||||
|
||||
## Applications that can be set through environment variables
|
||||
export ZDOTDIR="$XDG_CONFIG_HOME/zsh"
|
||||
Loading…
Add table
Add a link
Reference in a new issue