This commit adds a new function 'pwdf' to get the current Finder directory and an alias 'cdf' to change to that directory, improving integration between Terminal and Finder for macOS users.
339 lines
9.2 KiB
Bash
Executable file
339 lines
9.2 KiB
Bash
Executable file
### Sniff out the platform
|
|
# =========================
|
|
uname=`uname -s`
|
|
function linux() { [[ "$uname" = "Linux" ]] }
|
|
function mac() { [[ "$uname" = "Darwin" ]] }
|
|
|
|
# check if a command is available
|
|
function command_exists() { which "$1" >/dev/null 2>/dev/null }
|
|
|
|
# check if this is an interactive session
|
|
# (tests if stdout is a tty)
|
|
function is_interactive() { [ -t 1 ] }
|
|
|
|
[[ -d "$HOME/config/zsh" ]] && ZDOTDIR="$HOME/config/zsh"
|
|
|
|
if [[ -r "$ZDOTDIR/zlocal" ]]; then
|
|
source "$ZDOTDIR/zlocal"
|
|
fi
|
|
|
|
### Various environments
|
|
# =======================
|
|
# Do this before setting up PATH so ~/bin and similar still have the highest precedence.
|
|
|
|
if command_exists rbenv; then
|
|
eval "$(rbenv init -)"
|
|
fi
|
|
if command_exists pyenv; then
|
|
eval "$(pyenv init -)"
|
|
fi
|
|
if command_exists direnv; then
|
|
eval "$(direnv hook zsh)"
|
|
fi
|
|
|
|
### SSH keys
|
|
# ============
|
|
|
|
if mac && [[ "$TERM_PROGRAM" != "vscode" ]] && [[ -z "$INTELLIJ_ENVIRONMENT_READER" ]]; then
|
|
ssh-add --apple-load-keychain
|
|
fi
|
|
|
|
### Environment Vars
|
|
# ===================
|
|
|
|
custom_paths=(
|
|
/sbin /usr/sbin
|
|
/usr/local/bin /usr/local/sbin
|
|
$HOME/go/bin
|
|
$HOME/bin
|
|
)
|
|
for dir in $custom_paths; do
|
|
if [[ -d "$dir" ]]; then
|
|
path=($dir $path)
|
|
fi
|
|
done
|
|
export path
|
|
typeset -U path
|
|
|
|
# remove / from word chars
|
|
export WORDCHARS='*?_-.[]~=&;!#$%^(){}<>'
|
|
|
|
fpath=($fpath $ZDOTDIR/functions $ZDOTDIR/completions)
|
|
typeset -U fpath
|
|
|
|
cdpath=(~)
|
|
|
|
HOSTNAME=`hostname -s`
|
|
|
|
if [[ "$INSIDE_EMACS" != "" ]] || [[ "$EMACS" = "t" ]]; then
|
|
export PAGER=cat
|
|
export MANPAGER=cat
|
|
else
|
|
export PAGER='less'
|
|
# most rocks
|
|
if command_exists most; then
|
|
export MANPAGER='most'
|
|
fi
|
|
fi
|
|
|
|
if command_exists vim; then
|
|
export EDITOR="vim"
|
|
export VISUAL="vim"
|
|
else
|
|
export EDITOR="vi"
|
|
export VISUAL="vi"
|
|
fi
|
|
|
|
if mac; then
|
|
# Don't pollute tar archives with ._ files (Apple double files)
|
|
export COPYFILE_DISABLE=true
|
|
|
|
# Set Apple Terminal.app resume directory
|
|
if [[ $TERM_PROGRAM == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]] {
|
|
function chpwd {
|
|
local SEARCH=' '
|
|
local REPLACE='%20'
|
|
local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"
|
|
printf '\e]7;%s\a' "$PWD_URL"
|
|
}
|
|
|
|
chpwd
|
|
}
|
|
fi
|
|
|
|
if [[ -d ~/Library/Mobile\ Documents/com\~apple\~CloudDocs ]]; then
|
|
export icloud=~/Library/Mobile\ Documents/com\~apple\~CloudDocs
|
|
fi
|
|
|
|
### Shell Options
|
|
# ================
|
|
|
|
### Parameters and Shell Functionality
|
|
# ---------------------------------------
|
|
#setopt ignoreeof # ignore EOF ('^D') (i.e. don't log out on it)
|
|
setopt braceccl # {a-d} expands to a b c d
|
|
setopt noclobber # don't overwrite existing files w/ > output redir
|
|
setopt hist_allow_clobber # C-p or UP and command has >| now, ready to go
|
|
|
|
### Changing Directories
|
|
# -------------------------
|
|
setopt autocd # automatically cd to a directory if not cmd
|
|
setopt autopushd # automatically pushd directories on dirstack
|
|
setopt nopushdsilent # print dirstack after each cd/pushd
|
|
setopt pushdignoredups # don't push dups on stack
|
|
setopt pushdminus # pushd -N goes to Nth dir in stack
|
|
export DIRSTACKSIZE=8
|
|
setopt autonamedirs # % export h=/home/sjs; cd ~h; pwd => /home/sjs
|
|
setopt cdablevars # blah=~/media/movies; cd blah; pwd => ~/media/movies
|
|
|
|
### Shell Completion
|
|
# ---------------------
|
|
setopt correct # try to correct spelling...
|
|
setopt no_correctall # ...only for commands, not filenames
|
|
setopt no_listbeep # don't beep on ambiguous listings
|
|
setopt listpacked # variable col widths (takes up less space)
|
|
|
|
### Shell Expansion and Globbing
|
|
# ---------------------------------
|
|
setopt extendedglob # use extended globbing (#, ~, ^)
|
|
|
|
### History and History Expansion
|
|
# ----------------------------------
|
|
export HISTFILE="$ZDOTDIR/zhistory" # save history
|
|
export HISTSIZE=2000000 # huge internal buffer
|
|
export SAVEHIST=2000000 # huge history file
|
|
|
|
setopt extendedhistory # save timestamps in history
|
|
setopt no_histbeep # don't beep for erroneous history expansions
|
|
setopt histignoredups # ignore consecutive dups in history
|
|
setopt histfindnodups # backwards search produces diff result each time
|
|
setopt histreduceblanks # compact consecutive white space chars (cool)
|
|
setopt histnostore # don't store history related functions
|
|
setopt incappendhistory # incrementally add items to HISTFILE
|
|
|
|
### Job Control
|
|
# ----------------
|
|
setopt longlistjobs # list jobs in long format
|
|
|
|
### Shell Prompt
|
|
# -----------------
|
|
setopt promptsubst # allow parameter, command, so on in prompt
|
|
setopt transient_rprompt # hide RPROMPT after cmdline is executed
|
|
|
|
### ZLE
|
|
# --------
|
|
setopt no_beep # don't beep on errors (in ZLE)
|
|
|
|
# when completing and then typing | > etc. don't delete
|
|
# the preceding space
|
|
self-insert-redir() {
|
|
integer l=$#LBUFFER
|
|
zle self-insert
|
|
(( $l >= $#LBUFFER )) && LBUFFER[-1]=" $LBUFFER[-1]"
|
|
}
|
|
zle -N self-insert-redir
|
|
for op in \| \< \> \&
|
|
do bindkey "$op" self-insert-redir
|
|
done
|
|
|
|
### Auto quote pasted URLs
|
|
# ---------------------------
|
|
autoload -U url-quote-magic
|
|
zle -N self-insert url-quote-magic
|
|
|
|
### Terminal Settings
|
|
# ====================
|
|
function precmd {
|
|
rehash
|
|
}
|
|
autoload -U colors # we need the colors for some formats below
|
|
colors
|
|
|
|
### ZLE Keybindings
|
|
# ==================
|
|
bindkey '\ep' history-beginning-search-backward
|
|
|
|
### Prompt Subsystem
|
|
# ===================
|
|
# Load the prompt theme system
|
|
autoload -U promptinit
|
|
promptinit
|
|
|
|
# Use my prompt theme, based on wunjo (zsh-git)
|
|
prompt sjs
|
|
|
|
### Aliases
|
|
# ===========
|
|
|
|
### Convenience Aliases/Macros
|
|
# --------------------------------
|
|
alias bgd='bg; disown %1'
|
|
alias cp='nocorrect cp' # don't correct spelling for 'cp'
|
|
alias e='mate'
|
|
alias ez="$EDITOR ~/.zshrc && source ~/.zshrc"
|
|
|
|
alias mkdir='nocorrect mkdir' # don't correct spelling for 'mkdir'
|
|
alias mv='nocorrect mv' # don't correct spelling for 'mv'
|
|
alias u='cd ..'
|
|
alias uu='cd ../..'
|
|
alias uuu='cd ../../..'
|
|
alias uuuu='cd ../../../..'
|
|
alias myip='curl -4 icanhazip.com'
|
|
|
|
alias be='bundle exec'
|
|
alias doc='docker-compose'
|
|
|
|
### ls Aliases
|
|
# ----------------
|
|
if command_exists ls-comma; then
|
|
alias ls='ls-comma'
|
|
fi
|
|
if mac; then
|
|
gls_path=`which gls`
|
|
if [[ -x "$gls_path" ]]; then
|
|
alias ls='$gls_path -BF --color=auto'
|
|
alias la='$gls_path -AF --color=auto'
|
|
else
|
|
alias ls='ls -BF'
|
|
alias la='ls -AF'
|
|
fi
|
|
else
|
|
alias ls='ls -BF --color=auto'
|
|
alias la='ls -AF --color=auto'
|
|
fi
|
|
alias ll='ls -l'
|
|
alias lsd='ls -d'
|
|
alias lld='ls -dl'
|
|
|
|
### ruby
|
|
alias irb='irb --readline -r irb/completion'
|
|
|
|
### git
|
|
if command_exists git; then
|
|
alias a='git add'
|
|
alias b='git branch'
|
|
alias c='git commit'
|
|
alias cam='git commit -a -m'
|
|
alias co='git checkout'
|
|
alias chp='git cherry-pick'
|
|
alias d='git diff'
|
|
alias dc='git diff --cached'
|
|
alias dmcr='git diff-merge-conflict-resolution'
|
|
alias ds='git diff --stat'
|
|
alias ecf='git edit-conflicted-files'
|
|
alias f='git fetch'
|
|
alias glo='git log --oneline --decorate'
|
|
alias gls='git log --stat'
|
|
alias gup='git update'
|
|
alias m='git merge'
|
|
alias pfb='git push-feature-branch'
|
|
alias rmb='git remove-merged-branches'
|
|
alias s='git status -sb'
|
|
alias st='git stash'
|
|
alias stl='git stash list'
|
|
alias stp='git stash pop'
|
|
alias t='git tag'
|
|
|
|
function gl() {
|
|
git log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' "$@"
|
|
}
|
|
fi
|
|
|
|
# `cd /path/to/a/file` does `cd /path/to/a`
|
|
function cd () {
|
|
if [[ -f "$1" ]]; then
|
|
builtin cd "${1:h}"
|
|
elif [[ "$1" = "" ]]; then
|
|
builtin cd
|
|
else
|
|
builtin cd "$1"
|
|
fi
|
|
}
|
|
|
|
if mac; then
|
|
# Courtesy of https://curtclifton.net/finder-and-terminal-are-friends
|
|
pwdf() {
|
|
/usr/bin/osascript <<" EOT"
|
|
tell application "Finder"
|
|
try
|
|
set currFolder to (folder of the front window as alias)
|
|
on error
|
|
set currFolder to (path to desktop folder as alias)
|
|
end try
|
|
POSIX path of currFolder
|
|
end tell
|
|
EOT
|
|
}
|
|
alias cdf='cd "`pwdf`"'
|
|
fi
|
|
|
|
### Unsorted (new) stuff
|
|
# =======================
|
|
# if commands takes more than 60 seconds tell me how long it took
|
|
export REPORTTIME=60
|
|
|
|
# set shell options
|
|
setopt no_badpattern # supress err msgs
|
|
setopt cbases # 0xFF instead of 16#FF
|
|
setopt globsubst # parameter expns eligible for filename expn & generation
|
|
setopt interactivecomments # comments allowed in interactive shells
|
|
setopt no_hup # leave bg tasks running (a la nohup)
|
|
|
|
bindkey -e # emacs style key bindings
|
|
|
|
### Completion
|
|
# =============
|
|
|
|
if command_exists brew; then
|
|
FPATH=$(brew --prefix)/share/zsh/site-functions:$FPATH
|
|
fi
|
|
|
|
autoload -Uz compinit
|
|
compinit
|
|
|
|
### devicectl
|
|
# ==========
|
|
# Gui Rambo's iOS device control functions
|
|
# https://gist.github.com/insidegui/b570ec998b9e2aeb730f4e142f0593d1
|
|
|
|
source $ZDOTDIR/devicectl.sh
|