Move the rest of the zsh functions into the dotfiles role

This commit is contained in:
Eryn Wells 2024-10-02 20:08:35 -07:00
parent 01312752fc
commit 398c6f2d18
48 changed files with 50 additions and 9 deletions

View file

@ -0,0 +1,39 @@
# Eryn Wells <eryn@erynwells.me>
# vim:ft=zsh:
append_to_path() {
local should_export_path=1
local should_be_verbose=0
while getopts "ve" opt; do
case $opt in
"e") should_export_path=1;;
"+e") should_export_path=0;;
"v") should_be_verbose=1;;
*) ;;
esac
done
local result=1
local path_to_add=$@[$OPTIND]
if [[ -d "$path_to_add" ]]; then
if (( $should_be_verbose )); then
echo "Appending $path_to_add to \$path"
fi
path+="$path_to_add"
else
if (( $should_be_verbose )); then
echo "$path_to_add doesn't exist"
fi
result=0
fi
if (( $should_export_path )); then
export path
fi
return $result
}
append_to_path "$@"

View file

@ -0,0 +1,8 @@
# Eryn Wells <eryn@erynwells.me>
binary_exists() {
hash $1 1>/dev/null 2>&1
return $?
}
binary_exists "$@"

View file

@ -0,0 +1,17 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
function connect_ssh_agent
{
# Start SSH agent for password-less logins
if [[ -z "$SSH_AUTH_SOCK" && -x "$SSHAGENT" ]]; then
if ! pgrep -u $USER ssh-agent 1>/dev/null; then
eval $(ssh-agent -s > ~/.ssh_agent_vars)
trap "kill $SSH_AGENT_PID" 0
else
eval $(cat ~/.ssh_agent_vars)
fi
fi
}
connect_ssh_agent "$@"

View file

@ -0,0 +1,9 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
function darwin-icloud-drive-path
{
echo "$HOME/Library/Mobile Documents/com~apple~CloudDocs"
}
darwin-icloud-drive-path "$@"

View file

@ -0,0 +1,11 @@
# Eryn Wells <eryn@erynwells.me>
darwin-hardware-model() {
if [[ -z "$darwin_hardware_model" ]]; then
darwin_hardware_model=`sysctl -n hw.model`
fi
echo "$darwin_hardware_model"
}
darwin-hardware-model "$@"

View file

@ -0,0 +1,11 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
darwin-os-build() {
if [[ -z "$darwin_os_build" ]]; then
darwin_os_build=`sysctl -n kern.osversion`
fi
echo "$darwin_os_build"
}
darwin-os-build "$@"

View file

@ -0,0 +1,11 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
darwin-os-version() {
if [[ -z "$darwin_os_version" ]]; then
darwin_os_version=`sysctl -n kern.osproductversion`
fi
echo "$darwin_os_version"
}
darwin-os-version "$@"

View file

@ -0,0 +1,21 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
autoload darwin_icloud_drive_path
icloud=`darwin_icloud_drive_path`
if [[ ! -d "$icloud" ]]; then
return 1
fi
# Put screenshots in iCloud Drive, in a directory according to hostname
local name=`hostname -s | tr A-Z a-z | tr ' ' -`
local screenshots_dir="$icloud/Screenshots/$name"
mkdir -p "$screenshots_dir"
echo "$screenshots_dir"
defaults write com.apple.screencapture screenshots_diration "$screenshots_dir"
killall Dock
return 0

View file

@ -0,0 +1,22 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
autoload darwin_icloud_drive_path
autoload darwin_configure_screenshots_directory
autoload init_xcode
function darwin_init_once
{
# Dim dock icons of apps that have been hidden.
defaults write com.apple.Dock showhidden -boolean yes
killall Dock
darwin_configure_screenshots_directory
# See https://techstuffer.com/this-app-is-damaged-error-macos-sierra/
sudo spctl --master-disable
init_xcode
}
darwin_init_once "$@"

View file

@ -0,0 +1,8 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
for func in ${(P)${1}}; do
if autoload +X -Uz $func &> /dev/null; then
$func
fi
done

View file

@ -0,0 +1,13 @@
# vim: set ft=zsh:
# Open a file or folder in Finder.
function finder
{
if [[ -z "$1" ]]; then
open -R .
fi
open -R "$1"
}
finder "$@"

View file

@ -0,0 +1,16 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
function g {
if [[ $# -gt 0 ]]; then
git $@
else
git status --short --branch
fi
return $?
}
# Use git completion for the g function
compdef g='git'
g "$@"

View file

@ -0,0 +1,19 @@
#!/usr/bin/env zsh
autoload binary_exists
function homebrew-prefix
{
if [[ -e "$SYSTEM_PARAMETERS_FILE" ]] && binary_exists jq; then
jq .parameters.homebrew_prefix.value "$SYSTEM_PARAMETERS_FILE"
return
fi
if ! binary_exists brew; then
return
fi
brew --prefix
}
homebrew-prefix "$@"

View file

@ -0,0 +1,45 @@
# vim:ft=zsh:
#
# Import the CAcert root CA on OS X. Based on the tutorial on their wiki.
#
# http://wiki.cacert.org/MacOSX_X509Anchors
#
# Eryn Wells <eryn@erynwells.me>
function import_cacert
{
# SHA1 fingerprints of the root and class3 keys.
local root_fingerprint="13:5C:EC:36:F4:9C:B8:E9:3B:1A:B2:70:CD:80:88:46:76:CE:8F:33"
local class3_fingerprint="AD:7C:3F:64:FC:44:39:FE:F4:E9:0B:E8:F4:7C:6C:FA:8A:AD:FD:CE"
local savewd=`pwd`
local tmpdir=`mktemp -dt cacert`
cd "$tmpdir"
# Download the certificates.
curl -k -o root.crt "https://www.cacert.org/certs/root.crt"
curl -k -o class3.crt "https://www.cacert.org/certs/class3.crt"
# Verify fingerprints and import.
if openssl x509 -noout -fingerprint < root.crt \
| grep "Fingerprint=$root_fingerprint" 1>/dev/null
then
sudo security add-trusted-cert -d \
-k /Library/Keychains/System.keychain \
-r trustRoot \
root.crt
fi
if openssl x509 -noout -fingerprint < class3.crt \
| grep "Fingerprint=$class3_fingerprint" 1>/dev/null
then
sudo security add-trusted-cert -d \
-k /Library/Keychains/System.keychain \
-r trustAsRoot \
class3.crt
fi
cd "$savewd"
rm -rf "$tmpdir"
}

View file

@ -0,0 +1,17 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
autoload binary_exists
function init_app_environments
{
# NetHack options
# use color in the terminal
binary_exists nethack && export NETHACKOPTIONS="color"
# Default ledger file
local ledgerFile="$HOME/Documents/Ledger/personal.ledger"
[[ -e "$ledgerFile" ]] && LEDGER_FILE="$ledgerFile"
}
init_app_environments "$@"

View file

@ -0,0 +1,30 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
local system_ls=`which ls`
local has_gnu_ls
local ls_options
if $system_ls --version 2>&1 | grep GNU 1>/dev/null; then
has_gnu_ls=1
ls_options='--color=auto'
else
has_gnu_ls=0
ls_options='-G'
fi
alias ls="$system_ls $ls_options"
alias la="$system_ls -A $ls_options"
alias ll="$system_ls -l $ls_options"
alias l.="$system_ls -d $ls_options .*"
local dircolors_bin=`whence -p dircolors || whence -p gdircolors`
if [[ $has_gnu_ls -eq 1 && -n "$dircolors_bin" ]]; then
if [[ -e "$HOME/.dircolors/$SYS.cfg" ]]; then
dircolors="$HOME/.dircolors/$SYS.cfg"
else
dircolors="$HOME/.dircolors/default.cfg"
fi
eval `$dircolors_bin $dircolors`
fi

View file

@ -0,0 +1,7 @@
# Eryn Wells <eryn@erynwells.me>
init_profile_darwin() {
( ssh-add --apple-load-keychain & ) 1>/dev/null 2>&1
}
init_profile_darwin "$@"

View file

@ -0,0 +1,34 @@
# Eryn Wells <eryn@erynwells.me>
autoload -Uz binary_exists
autoload -Uz darwin-os-version
autoload -Uz darwin-os-build
autoload -Uz darwin-hardware-model
init_profile_darwin_say_hello() {
local cat_program=cat
if binary_exists lolcat; then
cat_program=lolcat
fi
local hello_message="It's `date +'%H:%M on %A, %B %d'`."
local hardware_model=`darwin-hardware-model`
if [[ -n "$hardware_model" ]]; then
hello_message+="\nThis machine is a $hardware_model."
fi
local os_version=`darwin-os-version`
if [[ -n "$os_version" ]]; then
local os_build=`darwin-os-build`
if [[ -n "$os_build" ]]; then
hello_message+="\nYou're running macOS $os_version ($os_build)."
else
hello_message+="\nYou're running macOS $os_version."
fi
fi
print "$hello_message\n" | $cat_program
}
init_profile_darwin_say_hello "$@"

View file

@ -0,0 +1,37 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
autoload binary_exists
function init_rc_aliases
{
alias j='jobs'
alias h='history'
alias df='df -h'
alias du='du -h'
alias e='emacs'
alias v='vi'
alias chux='chmod u+x'
alias chuw='chmod u+w'
alias chur='chmod u+r'
alias cho="chown $USER"
alias today='date +%Y-%m-%d'
alias addkey="ssh-agent ~/.ssh/id_rsa"
alias gp='g p origin $gitbranch'
alias gpf='g p -f origin $gitbranch'
alias bx='bundle exec'
binary_exists ledger && alias l='ledger'
binary_exists gpg2 && alias gpg='gpg2'
alias -s c='vim'
alias -s tex='vim'
alias -s txt='vim'
alias -s xml='vim'
alias -s jar='java -jar'
}
init_rc_aliases "$@"

View file

@ -0,0 +1,41 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
autoload -Uz compinit
compinit
# Cache completions
zstyle ':completion::complete:*' use-cache 1
zstyle ':completion::complete:*' cache-path ~/.zsh/cache
# Make ls show completion list in color.
# See also: https://github.com/ohmyzsh/ohmyzsh/issues/6060
if [[ -n "$LS_COLORS" ]]; then
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
else
zstyle ':completion:*:default' list-colors \
'di=34' 'ln=35' 'so=32' 'pi=33' 'ex=31' 'bd=34;46' 'cd=34;43' 'su=30;41' \
'sg=30;46' 'tw=30;42' 'ow=30;43'
fi
# For rm, cp, and mv don't complete if file is on the line already
zstyle ':completion:*:rm:*' ignore-line yes
zstyle ':completion:*:cp:*' ignore-line yes
zstyle ':completion:*:mv:*' ignore-line yes
# Remove trailing slashes in directory arguments
zstyle ':completion:*' squeeze-slashes true
# Never select parent directory
zstyle ':completion:*:cd:*' ignore-parents parent pwd
# Expand partial paths
zstyle ':completion:*' expand 'yes'
# Show a pretty menu of killable processes
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'
zstyle ':completion:*:*:kill:*' menu yes select
# Complete man pages by section
zstyle ':completion:*:manuals' separate-sections true
zstyle ':completion:*:manuals.*' insert-sections true

View file

@ -0,0 +1,24 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
local theme=loquacious
autoload -U add-zsh-hook
autoload -Uz vcs_info
zstyle ':vcs_info:*' disable p4 bzr cdv darcs mtn svk tla cvs svn
zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:git:general:*' formats '%b'
zstyle ':vcs_info:git-svn:general:*' formats '%b'
# Export the current Git branch before every prompt.
function export_gitbranch {
vcs_info general
export gitbranch=${vcs_info_msg_0_}
}
add-zsh-hook precmd export_gitbranch
autoload -U promptinit
promptinit
prompt $theme

View file

@ -0,0 +1,20 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
local mode=emacs
if [[ -z "$mode" ]]; then
mode=emacs
fi
function configure_zle_emacs { }
function configure_zle_vim { }
if [[ $mode == 'vim' ]]; then
bindkey -v
configure_zle_vim
zle -A .backward-delete-char vi-backward-delete-char
elif [[ $mode == 'emacs' ]]; then
bindkey -e
configure_zle_emacs
fi

View file

@ -0,0 +1,18 @@
# Eryn Wells <eryn@erynwells.me>
autoload binary_exists
autoload homebrew-prefix
function init_rc_fpath_darwin
{
if binary_exists brew; then
local brew_fpath="$(homebrew-prefix)/share/zsh/site-functions"
if [[ -d "$brew_fpath" ]]; then
fpath+=($brew_fpath)
fi
export FPATH
fi
}
init_rc_fpath_darwin "$@"

View file

@ -0,0 +1,11 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
function init_rc_linux
{
alias iptls='sudo iptables --line-numbers -nv -L'
alias ip6tls='sudo ip6tables --line-numbers -nv -L'
alias rlx="xrdb $HOME/.Xdefaults"
}
init_rc_linux "$@"

View file

@ -0,0 +1,12 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
for x in "$HOME/Code" "$HOME/Documents/Code"; do
if [[ ! -d "$x" ]]; then
continue
fi
export c="$x"
break
done
export dd="$HOME/Library/Developer/Xcode/DerivedData"

View file

@ -0,0 +1,9 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
function init_site_environments
{
export ERYNWELLS_ME_SITE="$HOME/Developer/erynwells.me"
}
init_site_environments "$@"

View file

@ -0,0 +1,9 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
function init_website_environments
{
export ERYNWELLS_ME_SITE="$HOME/Developer/erynwells.me"
}
init_website_environments "$@"

View file

@ -0,0 +1,13 @@
# Eryn Wells <eryn@erynwells.me>
# vim: ft=zsh:
function init_xcode
{
if [[ -d "~df/Xcode/IDETemplateMacros.plist" ]]; then
echo "Copying IDETemplateMacros.plist"
mkdir -p ~/Library/Developer/Xcode/UserData
cp ~df/Xcode/IDETemplateMacros.plist ~/Library/Developer/Xcode/UserData
fi
}
init_xcode "%@"

View file

@ -0,0 +1,16 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
autoload load_module
local myfpath="$HOME/.zsh/func"
for func in $myfpath/*; do
[[ ! -e "$func" || -d "$func" ]] && continue
local functionName=`basename $func`
[[ "$functionName" =~ "prompt_*" ]] && continue
[[ "$functionName" =~ "init_*" ]] && continue
autoload -Uz $functionName
done

View file

@ -0,0 +1,21 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
function init_zsh_history
{
setopt \
APPEND_HISTORY \
EXTENDED_HISTORY \
INC_APPEND_HISTORY \
HIST_FIND_NO_DUPS \
HIST_IGNORE_SPACE \
HIST_NO_STORE \
HIST_IGNORE_DUPS \
HIST_REDUCE_BLANKS
HISTSIZE=1000000
SAVEHIST=1000000
HISTFILE="$HOME/.zhistory"
}
init_zsh_history "$@"

View file

@ -0,0 +1,16 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
function init_zsh_options
{
# Report seconds since shell was invoked in milliseconds
typeset -F SECONDS
# See zshoptions(1)
setopt EXTENDED_GLOB \
MULTIOS \
AUTO_REMOVE_SLASH \
COMPLETE_IN_WORD
}
init_zsh_options "$@"

View file

@ -0,0 +1,16 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
function list_tmux_session
{
local tmux_out=`tmux list-sessions 2>/dev/null`
[[ -z "$tmux_out" || -n "$TMUX" ]] && return
echo "You have the following active tmux sessions:"
for session in ${(f)tmux_out}; do
echo " $session"
done
echo
}
list_tmux_session "$@"

View file

@ -0,0 +1,39 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
function load_module
{
local mod=$1
if [[ -z "$mod" ]]; then
print "Missing argument: path to module to load." >&2
return -1
fi
# Make sure $mod isn't already in $fpath
local modpath
for p in $fpath; do
modpath=$p/$mod
[[ -d $modpath ]] && break
modpath=''
done
if [[ -z "$modpath" ]]; then
return 1
fi
fpath+=($modpath)
for file in $modpath/*; do
if [[ -f "$file" ]]; then
autoload $func
fi
if [[ -d "$file" ]]; then
load_module "$file"
fi
done
return 0
}
load_module "$@"

View file

@ -0,0 +1,24 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
autoload -Uz binary_exists
neovim_init_once()
{
if binary_exists npm; then
npm install -g \
@tailwindcss/language-server \
eslint \
pyright \
typescript-language-server \
typescript \
vscode-langservers-extracted
else
print "Cannot find npm binary" >&2
return -1
fi
return 0
}
neovim_init_once "$@"

View file

@ -0,0 +1,31 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
function nethack
{
local remote
while getopts 'lr' opt; do
case $opt in
h) echo "Usage: $0 [-l][-r]";;
l) remote=0;;
r) remote=1;;
*)
echo "Invalid argument: $OPTARG" 1>&2
return -1
;;
esac
done
if (( $remote )); then
ssh nethack@alt.org
return $?
elif binary_exists nethack; then
command nethack "$@[$OPTIND,-1]"
return $?
else
ssh nethack@alt.org
return $?
fi
}
nethack "$@"

View file

@ -0,0 +1,12 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
open-xcode() {
local selectedXcode=`xcode-select -p`
while [[ ! `basename $selectedXcode` =~ ".app$" ]]; do
selectedXcode=`dirname "$selectedXcode"`
done
open -a "$selectedXcode" $@
}
open-xcode "$@"

View file

@ -0,0 +1,38 @@
# Eryn Wells <eryn@erynwells.me>
prepend_to_path() {
local should_export_path=1
local should_be_verbose=0
while getopts "ve" opt; do
case $opt in
"e") should_export_path=1;;
"+e") should_export_path=0;;
"v") should_be_verbose=1;;
*) ;;
esac
done
local result=1
local path_to_add=$@[$OPTIND]
if [[ -d "$path_to_add" ]]; then
if (( $should_be_verbose )); then
echo "Prepending $path_to_add to \$path"
fi
path=("$path_to_add" $path)
else
if (( $should_be_verbose )); then
echo "$path_to_add doesn't exist"
fi
result=0
fi
if (( $should_export_path )); then
export path
fi
return $result
}
prepend_to_path "$@"

View file

@ -0,0 +1,38 @@
#!/usr/bin/zsh
# Return a prompt string with appropriate color escapes
# Eryn Wells <eryn@erynwells.me>
local bold=0
local foreground=''
local background=''
while getopts 'bf:k:' opt; do
case $opt in
b) bold=1;;
f) foreground=$OPTARG;;
k) background=$OPTARG;;
*) echo "Unknown option: $opt" 1>&2; return -1;;
esac
done
local str=$@[$OPTIND,${#@}]
autoload -U is-at-least
if is-at-least '4.3.7'; then
[[ -n "$foreground" ]] && str="%F{$foreground}$str%f"
[[ -n "$background" ]] && str="%K{$background}$str%k"
[[ $bold -eq 1 ]] && str="%B$str%b"
else
local fg_hash bg_hash
if [[ $bold -eq 1 ]]; then
fg_hash='fg_bold'
bg_hash='bg_bold'
else
fg_hash='fg_no_bold'
bg_hash='bg_no_bold'
fi
[[ -n "$foreground" ]] && str="%{\$${fg_hash}[$foreground]%}$str%{\$reset_color%}"
[[ -n "$background" ]] && str="%%{\$${bg_hash}[$background]%}$str%{\$reset_color%}"
fi
print $str

View file

@ -0,0 +1,175 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
function prompt_loquacious_help
{
cat <<EOF
This prompt takes up two lines. At its most verbose, it looks like this:
<user> at <host> in <cwd> on <repo>(<branch>)
%
By default, <host> is only shown when the SSH_CONNECTION variable is set; in
other words, when this shell session was opened via an SSH connection. The
prompt will also show the current repository and branch using vcs_info if the
current directory is in a repo.
EOF
}
function prompt_loquacious_setup
{
typeset -ga precmd_functions
typeset -ga preexec_functions
autoload -U prompt_colorize
autoload -Uz vcs_info
autoload -U add-zsh-hook
add-zsh-hook chpwd set_repo_name
add-zsh-hook precmd set_xterm_title
add-zsh-hook precmd set_tmux_window_name
add-zsh-hook precmd print_newline
add-zsh-hook precmd set_prompt_info
add-zsh-hook preexec print_newline
add-zsh-hook preexec set_tmux_window_name
prompt_opts=(cr subst percent)
# Set up vcs_info
zstyle ':vcs_info:git:loquacious_chpwd:*' formats '%F{cyan}%r%f'
zstyle ':vcs_info:git-svn:loquacious_chpwd:*' formats '[%F{red}svn%f]%F{cyan}%r%f'
zstyle ':vcs_info:git:loquacious_precmd:*' formats '(%F{blue}%b%f)'
zstyle ':vcs_info:git-svn:loquacious_precmd:*' formats '(%F{blue}%b%f)'
PS1='$PS1_PLACE, $PS1_TIME $PS1_ZLE_MODE
$PS1_LINE'
zle -N zle-keymap-select on_keymap_select
}
function prompt_loquacious_preview
{
# TODO: Implement prompt preview.
}
#
# HELPER FUNCTIONS
#
# First prompt flag. See precmd_newline.
is_first_prompt=1
function print_newline
{
# Don't print newlines the first time the prompt is displayed.
if [[ -n $is_first_prompt ]]; then
unset is_first_prompt
[[ -z $SSH_CONNECTION ]] && return
fi
echo
}
function set_repo_name
{
vcs_info loquacious_chpwd
if [[ -n "${vcs_info_msg_0_}" ]]; then
PS1_REPO="on ${vcs_info_msg_0_}"
else
PS1_REPO=""
fi
}
function set_prompt_info
{
PS1_TIMESTAMP="%*"
PS1_STATUS="%(?..%F{red}[$?]%f)"
PS1_HISTORY="№%F{blue}%!%f"
PS1_TIME="$PS1_HISTORY$PS1_STATUS at $PS1_TIMESTAMP"
PS1_NAME="%F{magenta}%n%f"
PS1_HOST="%F{red}%m%f"
PS1_CWD="%F{green}%~%f"
PS1_PLACE="$PS1_NAME"
if [[ -n "$SSH_CONNECTION" && "$TERM_PROGRAM" != "tmux" ]]; then
PS1_PLACE="$PS1_PLACE at $PS1_HOST"
fi
PS1_PLACE="$PS1_PLACE in $PS1_CWD"
# Get git repo information, if it exists. See setup function for
# configuration details.
vcs_info loquacious_precmd
PS1_BRANCH="${vcs_info_msg_0_}"
if [[ -n "$vcs_info_msg_0_" ]]; then
PS1_PLACE="$PS1_PLACE $PS1_REPO$PS1_BRANCH"
fi
# Show background jobs, if any.
if [[ `jobs | wc -l` -ge 1 ]]; then
PS1_JOBS='%j'
fi
# Show background job count if any exist.
RPS1="%(1j.[%F{magenta}%j%f].)"
PS1_LINE='%(!.%F{red}.%F{default})%#%f '
}
function set_xterm_title
{
local tmux_session_name=''
local title='%n@%m'
if [[ -n "$TMUX" ]]; then
local tmux_session_name=`tmux display-message -p '#S'`
title+=" (${tmux_session_name})"
fi
# Set xterm and screen titles
if [[ -n "$DISPLAY" || -n "$TERM_PROGRAM" ]]; then
print -Pn "\e]2;${title}\a"
fi
# For Apple Terminal.app, add a link to the current directory.
if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]]; then
print -Pn "\e]7;file://%d\a"
fi
}
function set_tmux_window_name
{
if [[ -z "$TMUX" ]]; then
return
fi
local process="${${(z)1}[1]}"
if [[ -n "$process" ]]; then
tmux rename-window "$process"
else
tmux rename-window "`print -Pn "%2~"`"
fi
}
function set_zle_mode_info
{
if [[ -z "$1" || "$1" == 'viins' || "$1" == 'main' ]]; then
PS1_ZLE_MODE="%F{black}<INS>%f"
elif [[ "$1" == 'vicmd' ]]; then
PS1_ZLE_MODE="%F{black}<CMD>%f"
else
PS1_ZLE_MODE=''
fi
}
function on_keymap_select
{
# Regenerate the prompt with the new mode
set_zle_mode_info $KEYMAP
# Redraw the prompt
zle reset-prompt
}
# Finally, run setup to get everything going
prompt_loquacious_setup "$@"

View file

@ -0,0 +1,34 @@
#!/usr/bin/env zsh
. $HOME/.shell-functions
TAGS_DIR=$HOME/.tags
function refresh_system_tags
{
if [[ "$SYS" == "darwin" ]]; then
print_info "Refreshing Apple frameworks in /System/Library/Frameworks"
find /System/Library/Frameworks -maxdepth 2 -name Headers \
-exec ctags -Ra -f "$TAGS_DIR/apple_frameworks.tags" {} \;
print_info "Refreshing 3rd party frameworks in /Library/Frameworks"
find /Library/Frameworks -maxdepth 2 -name Headers \
-exec ctags -Ra -f "$TAGS_DIR/3rdparty_frameworks.tags" {} \;
fi
# Generic UNIX system include directory
if [[ -d /usr/include ]]; then
print_info "Refreshing system includes in /usr/include"
ctags -Ra -f "$TAGS_DIR/usr.tags" /usr/include
fi
# Generic UNIX local system include directory
if [[ -d /usr/local/include ]]; then
print_info "Refreshing local system includes in /usr/local/include"
ctags -Ra -f "$TAGS_DIR/usr_local.tags" /usr/local/include
fi
}
refresh_system_tags

View file

@ -0,0 +1,88 @@
#!/usr/bin/env zsh
#
# Set up for CPython development.
#
# Eryn Wells <eryn@erynwells.me>
function _usage-setup-cpython
{
cat <<EOF
Usage: $1 [-h] [-r root]
Setup for CPython development.
Arguments:
-h Show this help.
-r root Use the given directory as the root of the CPython source tree.
EOF
}
function setup-cpython
{
root="$HOME/Code/cpython"
coverage="$HOME/Code/coveragepy"
while getopts 'hr:' opt; do
case $opt in
(h)
_usage-setup-cpython "$0"
return 0
;;
(r)
root="$OPTARG"
;;
(*)
echo "Invalid argument: $OPTARG" 1>&2
return -1
;;
esac
done
if [[ ! -d "$root" ]]; then
print_error "Invalid source root: $root"
return 1
fi
export coverage
export lib="$root/Lib"
export root
function cov
{
local cmd
case "$1" in
(html)
local module="$root/Lib/$2"
if [[ ! -d "$module" ]]; then
if [[ -f "$module.py" ]]; then
module="$module.py"
fi
fi
cmd="html -i --include=$module"
;;
(report)
cmd="report"
;;
(run)
cmd="run --pylib --source=$2 Lib/test/regrtest.py test_$2"
;;
esac
(cd "$root"; ./python.exe "$coverage" "$cmd")
}
unsetup_functions=(unsetup-cpython)
}
function unsetup-cpython
{
unset coverage
unset lib
unset root
unfunction cov
}
setup-cpython "$@"

View file

@ -0,0 +1,15 @@
#!/usr/bin/zsh
#
# Setup the shell for Android development
#
# Eryn Wells <eryn@erynwells.me>
function setup_android
{
export ANDROID_ROOT="$HOME/toolchain/android/sdk-r22.0.4"
path=("$ANDROID_ROOT/platform-tools" "$ANDROID_ROOT/tools" $path)
rehash
}
setup_android $@

View file

@ -0,0 +1,55 @@
#!/usr/bin/env zsh
# Eryn Wells <eryn@erynwells.me>
function solarized
{
cat <<EOF
SOLARIZED HEX 16/8 TERMCOL XTERM/HEX L*A*B RGB HSB
--------- ------- ---- ------- ----------- ---------- ----------- -----------
base03 #002b36 8/4 brblack 234 #1c1c1c 15 -12 -12 0 43 54 193 100 21
base02 #073642 0/4 black 235 #262626 20 -12 -12 7 54 66 192 90 26
base01 #586e75 10/7 brgreen 240 #585858 45 -07 -07 88 110 117 194 25 46
base00 #657b83 11/7 bryellow 241 #626262 50 -07 -07 101 123 131 195 23 51
base0 #839496 12/6 brblue 244 #808080 60 -06 -03 131 148 150 186 13 59
base1 #93a1a1 14/4 brcyan 245 #8a8a8a 65 -05 -02 147 161 161 180 9 63
base2 #eee8d5 7/7 white 254 #e4e4e4 92 -00 10 238 232 213 44 11 93
base3 #fdf6e3 15/7 brwhite 230 #ffffd7 97 00 10 253 246 227 44 10 99
yellow #b58900 3/3 yellow 136 #af8700 60 10 65 181 137 0 45 100 71
orange #cb4b16 9/3 brred 166 #d75f00 50 50 55 203 75 22 18 89 80
red #dc322f 1/1 red 160 #d70000 50 65 45 220 50 47 1 79 86
magenta #d33682 5/5 magenta 125 #af005f 50 65 -05 211 54 130 331 74 83
violet #6c71c4 13/5 brmagenta 61 #5f5faf 50 15 -45 108 113 196 237 45 77
blue #268bd2 4/4 blue 33 #0087ff 55 -10 -45 38 139 210 205 82 82
cyan #2aa198 6/6 cyan 37 #00afaf 60 -35 -05 42 161 152 175 74 63
green #859900 2/2 green 64 #5f8700 60 -20 65 133 153 0 68 100 60
EOF
if [[ "$1" == "dark" || "$2" == "dark" ]]; then
echo
echo "COLOR USAGE"
echo "-------- ------------------------------------------"
echo "base3 unused"
echo "base2 unused"
echo "base1 optional emphasized content"
echo "base0 body text / default code / primary content"
echo "base00 unused"
echo "base01 comments / secondary content"
echo "base02 background highlights"
echo "base03 background"
elif [[ "$1" == "light" || "$2" == "light" ]]; then
echo
echo "COLOR USAGE"
echo "-------- ------------------------------------------"
echo "base03 unused"
echo "base02 unused"
echo "base01 optional emphasized content"
echo "base00 body text / default code / primary content"
echo "base0 unused"
echo "base1 comments / secondary content"
echo "base2 background highlights"
echo "base3 background"
fi
}
solarized "$@"

View file

@ -0,0 +1,15 @@
#!/usr/bin/zsh
# Go up $1 directories, where $1 is an integer (saves me from having to type ../
# ad nauseum)
# Eryn Wells <eryn@erynwells.me>
if [[ -z $1 ]]; then
cd ..
else
local updir=''
for (( i=0; $i < $1; i++ ))
do
updir="../$updir"
done
cd $updir
fi

View file

@ -0,0 +1,146 @@
# Eryn Wells <eryn@erynwells.me>
# vim: set ft=zsh:
function _update-path-usage
{
local -r function_name=$1
local usage_string=$(cat <<EOF
Usage: $function_name <arguments> [<path>...]
Modify the target path-like variable by adding or removing paths provided as
positional arguments. Before adding, check that the target path variable doesn't
already contain the path and that the directory exists.
This function returns the number of paths that were skipped in the input. If all
paths were processed, it returns 0. It returns 255 if an error occurred while
processing arguments.
Arguments
---------
%B-e%b | %B--export%b | %B--no-export%b
Export the variable after modification.
%B-f%b | %B--force%b
Unconditionally add the path, even if it doesn't exist.
%B-h%b | %B--help%b
Print this message.
%B-p%b | %B--prepend%b
Prepend paths to the target path variable, instead of appending. When
prepending, directories will be added in reverse order so their precedence
is preserved. That is, the first directory in the list will be at the start
of the path.
%B-P%b | %B--path%b <path_variable_name>
The name of a path-like variable to modify. The default is 'path'.
%B-r%b | %B--remove%b
Remove paths instead of adding. -p and -f are ignored when removing
directories from the path.
%B-v%b | %B--verbose%b
Print extra information while processing directories.
EOF
)
print -P $usage_string
}
function update-path
{
zmodload zsh/zutil
local -a o_args o_export o_force o_help o_prepend o_remove o_verbose o_pathvar
zparseopts -a o_args -D -E -F - \
{e,-export,-no-export}=o_export \
{f,-force}=o_force \
{h,-help}=o_help \
{p,-prepend}=o_prepend \
{P,-path}:=o_pathvar \
{r,-remove}=o_remove \
{v,-verbose}=o_verbose
local -ri parse_status=$?
if (( parse_status )); then
_update-path-usage $0
return 255
fi
if [[ $#o_help -ne 0 ]]; then
_update-path-usage $0
return 0
fi
local -r verbose=$#o_verbose
local -r path_variable_name=${o_pathvar[-1]:-path}
if ! typeset -p $path_variable_name &> /dev/null; then
print "Invalid path variable: \$$path_variable_name" 1>&2
return 255
fi
[[ $verbose -ne 0 ]] && print "Modifying $path_variable_name"
local -i candidates_skipped=0
local did_update_path
local -a candidates=($@)
if [[ $#o_prepend -ne 0 ]]; then
# If prepending, reverse the list so paths are added in the right order.
candidates=(${(Oa)@})
fi
for candidate in $candidates; do
local candidate_index=${${(P)path_variable_name}[(Ie)$candidate]}
# An empty $o_remove means we're adding to the array.
if [[ $#o_remove -eq 0 ]]; then
if [[ $candidate_index -ne 0 ]]; then
[[ $verbose -ne 0 ]] && print "Skipping $candidate"
(( candidates_skipped++ ))
continue
fi
if [[ $#force -eq 0 && ! -d "$candidate" ]]; then
[[ $verbose -ne 0 ]] && print "$candidate doesn't exist"
(( candidates_skipped++ ))
continue
fi
did_update_path=yes
[[ $verbose -ne 0 ]] && print "Adding $candidate"
if [[ $#o_prepend -ne 0 ]]; then
eval "${path_variable_name}=(${candidate} ${path})"
else
eval "${path_variable_name}+=${candidate}"
fi
else
if [[ $candidate_index -eq 0 ]]; then
[[ $verbose -ne 0 ]] && print "Skipping $candidate"
(( candidates_skipped++ ))
continue
fi
[[ $verbose -ne 0 ]] && print "Removing $candidate"
did_update_path=yes
eval "${path_variable_name}[${candidate_index}]=()"
fi
done
if [[ -n $did_update_path && $o_export[(I)--no-export] -ne 0 ]]; then
[[ $verbose -ne 0 ]] && print "Exporting $path_variable_name"
export $path_variable_name
if [[ "$path_variable_name" == "path" ]]; then
rehash
fi
fi
return $candidates_skipped
}
update-path "$@"

View file

@ -0,0 +1,15 @@
#!/usr/bin/env zsh
autoload init_website_environment
function weeknotes
{
init_website_environment
YEAR=`date '+%Y'`
WEEK_NUMBER=`date '+%V'`
PAGE_PATH=blog/${YEAR}/weeknotes-${YEAR}w${WEEK_NUMBER}.md
UPCOMING_SUNDAY=`${ERYNWELLS_ME_SITE}/scripts/next_sunday.py`
}
weeknotes "$@"

View file

@ -9,7 +9,9 @@ function init-env-fpath
{
local -r fpath_candidates=( \
"$HOME/.zsh/${SYS}-functions" \
"$HOME/.zsh/func" \
"$HOME/.zsh/init-env-functions" \
"$HOME/.zsh/init-rc-functions" \
"$HOME/.zsh/functions" \
)
# Process the array in reverse order (`Oa` means "descending index order",

View file

@ -1,5 +1,5 @@
---
- name: (ZSH) Link startup files
- name: (zsh) Link startup files
ansible.builtin.file:
path: ~/.{{ item }}
src: "{{ role_path }}/files/zsh/{{ item }}"
@ -10,16 +10,22 @@
- zshrc
- zprofile
- name: (ZSH) Link env functions
- name: (zsh) Create zsh directories
ansible.builtin.file:
path: ~/.zsh/init-env-functions
src: "{{ role_path }}/files/zsh/init-env-functions"
state: link
path: "{{ item }}"
state: directory
force: true
loop:
- ~/.zsh
- ~/.zsh/cache
- name: (ZSH) Link rc functions
- name: (zsh) Link function library directories
ansible.builtin.file:
path: ~/.zsh/init-rc-functions
src: "{{ role_path }}/files/zsh/init-rc-functions"
path: ~/.zsh/{{ item }}
src: "{{ role_path }}/files/zsh/{{ item }}"
state: link
force: true
loop:
- init-env-functions
- init-rc-functions
- functions