diff --git a/zsh/README b/zsh/README new file mode 100644 index 0000000..528ded8 --- /dev/null +++ b/zsh/README @@ -0,0 +1,14 @@ +# My ZSH configs + +All the files prefixed with `omz_` are default configs from oh-my-zsh. +I'm in the process of migrating off of oh-my-zsh but I'm used to -- and +like -- some of those default configs. I'm slowly looking into each one +and deciding if I want to keep it or remove it. + +## Completions + +Put completions in `~/.zsh/completions`. + +## Functions + +Put functions in `~/.zsh/functions`. diff --git a/zsh/completions/_rg b/zsh/completions/_rg new file mode 100644 index 0000000..6fcae09 --- /dev/null +++ b/zsh/completions/_rg @@ -0,0 +1,125 @@ +#compdef rg + +_rg() { + typeset -A opt_args + local ret=1 + + local context curcontext="$curcontext" state line + _arguments -s -S -C \ +"*-e+[A regular expression used for searching.]" \ +"*--regexp+[A regular expression used for searching.]" \ +"--color+[When to use color. \[default: auto\]]: :(never auto always ansi)" \ +"*--colors+[Configure color settings and styles.]" \ +"-E+[Specify the text encoding of files to search.]" \ +"--encoding+[Specify the text encoding of files to search.]" \ +"*-g+[Include or exclude files/directories.]" \ +"*--glob+[Include or exclude files/directories.]" \ +"*-t+[Only search files matching TYPE.]" \ +"*--type+[Only search files matching TYPE.]" \ +"*-T+[Do not search files matching TYPE.]" \ +"*--type-not+[Do not search files matching TYPE.]" \ +"-A+[Show NUM lines after each match.]" \ +"--after-context+[Show NUM lines after each match.]" \ +"-B+[Show NUM lines before each match.]" \ +"--before-context+[Show NUM lines before each match.]" \ +"-C+[Show NUM lines before and after each match.]" \ +"--context+[Show NUM lines before and after each match.]" \ +"--context-separator+[Set the context separator string. \[default: --\]]" \ +"--dfa-size-limit+[The upper size limit of the generated dfa.]" \ +"*-f+[Search for patterns from the given file.]" \ +"*--file+[Search for patterns from the given file.]" \ +"*--ignore-file+[Specify additional ignore files.]" \ +"-m+[Limit the number of matches.]" \ +"--max-count+[Limit the number of matches.]" \ +"--max-filesize+[Ignore files larger than NUM in size.]" \ +"--maxdepth+[Descend at most NUM directories.]" \ +"--path-separator+[Path separator to use when printing file paths.]" \ +"-r+[Replace matches with string given.]" \ +"--replace+[Replace matches with string given.]" \ +"--regex-size-limit+[The upper size limit of the compiled regex.]" \ +"-j+[The approximate number of threads to use.]" \ +"--threads+[The approximate number of threads to use.]" \ +"-M+[Don't print lines longer than this limit in bytes.]" \ +"--max-columns+[Don't print lines longer than this limit in bytes.]" \ +"*--type-add+[Add a new glob for a file type.]" \ +"*--type-clear+[Clear globs for given file type.]" \ +"(-f --file -e --regexp --type-list)--files[Print each file that would be searched.]" \ +"(-f --file --files -e --regexp)--type-list[Show all supported file types.]" \ +"-a[Search binary files as if they were text.]" \ +"--text[Search binary files as if they were text.]" \ +"-c[Only show count of matches for each file.]" \ +"--count[Only show count of matches for each file.]" \ +"-F[Treat the pattern as a literal string.]" \ +"--fixed-strings[Treat the pattern as a literal string.]" \ +"-i[Case insensitive search.]" \ +"--ignore-case[Case insensitive search.]" \ +"-n[Show line numbers.]" \ +"--line-number[Show line numbers.]" \ +"-N[Suppress line numbers.]" \ +"--no-line-number[Suppress line numbers.]" \ +"-q[Do not print anything to stdout.]" \ +"--quiet[Do not print anything to stdout.]" \ +"*-u[Reduce the level of "smart" searching.]" \ +"*--unrestricted[Reduce the level of "smart" searching.]" \ +"-v[Invert matching.]" \ +"--invert-match[Invert matching.]" \ +"-w[Only show matches surrounded by word boundaries.]" \ +"--word-regexp[Only show matches surrounded by word boundaries.]" \ +"--column[Show column numbers]" \ +"--debug[Show debug messages.]" \ +"-l[Only show the paths with at least one match.]" \ +"--files-with-matches[Only show the paths with at least one match.]" \ +"--files-without-match[Only show the paths that contains zero matches.]" \ +"-H[Show file name for each match.]" \ +"--with-filename[Show file name for each match.]" \ +"--no-filename[Never show the file name for a match.]" \ +"--heading[Show matches grouped by each file.]" \ +"--no-heading[Don't group matches by each file.]" \ +"--hidden[Search hidden files and directories.]" \ +"-L[Follow symbolic links.]" \ +"--follow[Follow symbolic links.]" \ +"--mmap[Searching using memory maps when possible.]" \ +"--no-messages[Suppress all error messages.]" \ +"--no-mmap[Never use memory maps.]" \ +"--no-ignore[Don't respect ignore files.]" \ +"--no-ignore-parent[Don't respect ignore files in parent directories.]" \ +"--no-ignore-vcs[Don't respect VCS ignore files]" \ +"-0[Print NUL byte after file names]" \ +"--null[Print NUL byte after file names]" \ +"(-r --replace)-o[Print only matched parts of a line.]" \ +"(-r --replace)--only-matching[Print only matched parts of a line.]" \ +"-p[Alias for --color always --heading -n.]" \ +"--pretty[Alias for --color always --heading -n.]" \ +"-s[Search case sensitively.]" \ +"--case-sensitive[Search case sensitively.]" \ +"-S[Smart case search.]" \ +"--smart-case[Smart case search.]" \ +"--sort-files[Sort results by file path. Implies --threads=1.]" \ +"--vimgrep[Show results in vim compatible format.]" \ +"-h[Prints help information. Use --help for more details.]" \ +"--help[Prints help information. Use --help for more details.]" \ +"-V[Prints version information]" \ +"--version[Prints version information]" \ +"1:: :_rg_commands" \ +&& ret=0 + +} + +(( $+functions[_rg_commands] )) || +_rg_commands() { + local commands; commands=( + "PATTERN:A regular expression used for searching." \ +"PATH:A file or directory to search." \ + ) + _describe -t commands 'rg commands' commands "$@" +} +(( $+functions[_rg_commands] )) || +_rg_commands() { + local commands; commands=( + "PATTERN:A regular expression used for searching." \ +"PATH:A file or directory to search." \ + ) + _describe -t commands 'rg commands' commands "$@" +} + +_rg "$@" \ No newline at end of file diff --git a/zsh/functions/omz_compfix.zsh b/zsh/functions/omz_compfix.zsh new file mode 100644 index 0000000..208aaad --- /dev/null +++ b/zsh/functions/omz_compfix.zsh @@ -0,0 +1,60 @@ +# Handle completions insecurities (i.e., completion-dependent directories with +# insecure ownership or permissions) by: +# +# * Human-readably notifying the user of these insecurities. +# * Moving away all existing completion caches to a temporary directory. Since +# any of these caches may have been generated from insecure directories, they +# are all suspect now. Failing to do so typically causes subsequent compinit() +# calls to fail with "command not found: compdef" errors. (That's bad.) +function handle_completion_insecurities() { + # List of the absolute paths of all unique insecure directories, split on + # newline from compaudit()'s output resembling: + # + # There are insecure directories: + # /usr/share/zsh/site-functions + # /usr/share/zsh/5.0.6/functions + # /usr/share/zsh + # /usr/share/zsh/5.0.6 + # + # Since the ignorable first line is printed to stderr and thus not captured, + # stderr is squelched to prevent this output from leaking to the user. + local -aU insecure_dirs + insecure_dirs=( ${(f@):-"$(compaudit 2>/dev/null)"} ) + + # If no such directories exist, get us out of here. + if (( ! ${#insecure_dirs} )); then + print "[oh-my-zsh] No insecure completion-dependent directories detected." + return + fi + + # List ownership and permissions of all insecure directories. + print "[oh-my-zsh] Insecure completion-dependent directories detected:" + ls -ld "${(@)insecure_dirs}" + print "[oh-my-zsh] For safety, completions will be disabled until you manually fix all" + print "[oh-my-zsh] insecure directory permissions and ownership and restart oh-my-zsh." + print "[oh-my-zsh] See the above list for directories with group or other writability.\n" + + # Locally enable the "NULL_GLOB" option, thus removing unmatched filename + # globs from argument lists *AND* printing no warning when doing so. Failing + # to do so prints an unreadable warning if no completion caches exist below. + setopt local_options null_glob + + # List of the absolute paths of all unique existing completion caches. + local -aU zcompdump_files + zcompdump_files=( "${ZSH_COMPDUMP}"(.) "${ZDOTDIR:-${HOME}}"/.zcompdump* ) + + # Move such caches to a temporary directory. + if (( ${#zcompdump_files} )); then + # Absolute path of the directory to which such files will be moved. + local ZSH_ZCOMPDUMP_BAD_DIR="${ZSH_CACHE_DIR}/zcompdump-bad" + + # List such files first. + print "[oh-my-zsh] Insecure completion caches also detected:" + ls -l "${(@)zcompdump_files}" + + # For safety, move rather than permanently remove such files. + print "[oh-my-zsh] Moving to \"${ZSH_ZCOMPDUMP_BAD_DIR}/\"...\n" + mkdir -p "${ZSH_ZCOMPDUMP_BAD_DIR}" + mv "${(@)zcompdump_files}" "${ZSH_ZCOMPDUMP_BAD_DIR}/" + fi +} diff --git a/zsh/functions/omz_completion.zsh b/zsh/functions/omz_completion.zsh new file mode 100644 index 0000000..a1e9343 --- /dev/null +++ b/zsh/functions/omz_completion.zsh @@ -0,0 +1,70 @@ +# fixme - the load process here seems a bit bizarre +zmodload -i zsh/complist + +WORDCHARS='' + +unsetopt menu_complete # do not autoselect the first completion entry +unsetopt flowcontrol +setopt auto_menu # show completion menu on successive tab press +setopt complete_in_word +setopt always_to_end + +# should this be in keybindings? +bindkey -M menuselect '^o' accept-and-infer-next-history +zstyle ':completion:*:*:*:*:*' menu select + +# case insensitive (all), partial-word and substring completion +if [[ "$CASE_SENSITIVE" = true ]]; then + zstyle ':completion:*' matcher-list 'r:|=*' 'l:|=* r:|=*' +else + if [[ "$HYPHEN_INSENSITIVE" = true ]]; then + zstyle ':completion:*' matcher-list 'm:{a-zA-Z-_}={A-Za-z_-}' 'r:|=*' 'l:|=* r:|=*' + else + zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|=*' 'l:|=* r:|=*' + fi +fi +unset CASE_SENSITIVE HYPHEN_INSENSITIVE + +zstyle ':completion:*' list-colors '' +zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;34=0=01' + +if [[ "$OSTYPE" = solaris* ]]; then + zstyle ':completion:*:*:*:*:processes' command "ps -u $USER -o pid,user,comm" +else + zstyle ':completion:*:*:*:*:processes' command "ps -u $USER -o pid,user,comm -w -w" +fi + +# disable named-directories autocompletion +zstyle ':completion:*:cd:*' tag-order local-directories directory-stack path-directories + +# Use caching so that commands like apt and dpkg complete are useable +zstyle ':completion::complete:*' use-cache 1 +zstyle ':completion::complete:*' cache-path $ZSH_CACHE_DIR + +# Don't complete uninteresting users +zstyle ':completion:*:*:*:users' ignored-patterns \ + adm amanda apache at avahi avahi-autoipd beaglidx bin cacti canna \ + clamav daemon dbus distcache dnsmasq dovecot fax ftp games gdm \ + gkrellmd gopher hacluster haldaemon halt hsqldb ident junkbust kdm \ + ldap lp mail mailman mailnull man messagebus mldonkey mysql nagios \ + named netdump news nfsnobody nobody nscd ntp nut nx obsrun openvpn \ + operator pcap polkitd postfix postgres privoxy pulse pvm quagga radvd \ + rpc rpcuser rpm rtkit scard shutdown squid sshd statd svn sync tftp \ + usbmux uucp vcsa wwwrun xfs '_*' + +# ... unless we really want to. +zstyle '*' single-ignored show + +if [[ $COMPLETION_WAITING_DOTS = true ]]; then + expand-or-complete-with-dots() { + # toggle line-wrapping off and back on again + [[ -n "$terminfo[rmam]" && -n "$terminfo[smam]" ]] && echoti rmam + print -Pn "%{%F{red}......%f%}" + [[ -n "$terminfo[rmam]" && -n "$terminfo[smam]" ]] && echoti smam + + zle expand-or-complete + zle redisplay + } + zle -N expand-or-complete-with-dots + bindkey "^I" expand-or-complete-with-dots +fi diff --git a/zsh/functions/omz_directories.zsh b/zsh/functions/omz_directories.zsh new file mode 100644 index 0000000..a50a692 --- /dev/null +++ b/zsh/functions/omz_directories.zsh @@ -0,0 +1,34 @@ +# Changing/making/removing directory +setopt auto_pushd +setopt pushd_ignore_dups +setopt pushdminus + +alias -g ...='../..' +alias -g ....='../../..' +alias -g .....='../../../..' +alias -g ......='../../../../..' + +alias -- -='cd -' +alias 1='cd -' +alias 2='cd -2' +alias 3='cd -3' +alias 4='cd -4' +alias 5='cd -5' +alias 6='cd -6' +alias 7='cd -7' +alias 8='cd -8' +alias 9='cd -9' + +alias md='mkdir -p' +alias rd=rmdir +alias d='dirs -v | head -10' + +# List directory contents +alias lsa='ls -lah' +alias l='ls -lah' +alias ll='ls -lh' +alias la='ls -lAh' + +# Push and pop directories on directory stack +alias pu='pushd' +alias po='popd' diff --git a/zsh/functions/omz_functions.zsh b/zsh/functions/omz_functions.zsh new file mode 100644 index 0000000..f306537 --- /dev/null +++ b/zsh/functions/omz_functions.zsh @@ -0,0 +1,231 @@ +function zsh_stats() { + fc -l 1 | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n20 +} + +function uninstall_oh_my_zsh() { + env ZSH=$ZSH sh $ZSH/tools/uninstall.sh +} + +function upgrade_oh_my_zsh() { + env ZSH=$ZSH sh $ZSH/tools/upgrade.sh +} + +function take() { + mkdir -p $1 + cd $1 +} + +function open_command() { + emulate -L zsh + setopt shwordsplit + + local open_cmd + + # define the open command + case "$OSTYPE" in + darwin*) open_cmd='open' ;; + cygwin*) open_cmd='cygstart' ;; + linux*) open_cmd='xdg-open' ;; + msys*) open_cmd='start ""' ;; + *) echo "Platform $OSTYPE not supported" + return 1 + ;; + esac + + # don't use nohup on OSX + if [[ "$OSTYPE" == darwin* ]]; then + $open_cmd "$@" &>/dev/null + else + nohup $open_cmd "$@" &>/dev/null + fi +} + +# +# Get the value of an alias. +# +# Arguments: +# 1. alias - The alias to get its value from +# STDOUT: +# The value of alias $1 (if it has one). +# Return value: +# 0 if the alias was found, +# 1 if it does not exist +# +function alias_value() { + alias "$1" | sed "s/^$1='\(.*\)'$/\1/" + test $(alias "$1") +} + +# +# Try to get the value of an alias, +# otherwise return the input. +# +# Arguments: +# 1. alias - The alias to get its value from +# STDOUT: +# The value of alias $1, or $1 if there is no alias $1. +# Return value: +# Always 0 +# +function try_alias_value() { + alias_value "$1" || echo "$1" +} + +# +# Set variable "$1" to default value "$2" if "$1" is not yet defined. +# +# Arguments: +# 1. name - The variable to set +# 2. val - The default value +# Return value: +# 0 if the variable exists, 3 if it was set +# +function default() { + test `typeset +m "$1"` && return 0 + typeset -g "$1"="$2" && return 3 +} + +# +# Set environment variable "$1" to default value "$2" if "$1" is not yet defined. +# +# Arguments: +# 1. name - The env variable to set +# 2. val - The default value +# Return value: +# 0 if the env variable exists, 3 if it was set +# +function env_default() { + env | grep -q "^$1=" && return 0 + export "$1=$2" && return 3 +} + + +# Required for $langinfo +zmodload zsh/langinfo + +# URL-encode a string +# +# Encodes a string using RFC 2396 URL-encoding (%-escaped). +# See: https://www.ietf.org/rfc/rfc2396.txt +# +# By default, reserved characters and unreserved "mark" characters are +# not escaped by this function. This allows the common usage of passing +# an entire URL in, and encoding just special characters in it, with +# the expectation that reserved and mark characters are used appropriately. +# The -r and -m options turn on escaping of the reserved and mark characters, +# respectively, which allows arbitrary strings to be fully escaped for +# embedding inside URLs, where reserved characters might be misinterpreted. +# +# Prints the encoded string on stdout. +# Returns nonzero if encoding failed. +# +# Usage: +# omz_urlencode [-r] [-m] [-P] +# +# -r causes reserved characters (;/?:@&=+$,) to be escaped +# +# -m causes "mark" characters (_.!~*''()-) to be escaped +# +# -P causes spaces to be encoded as '%20' instead of '+' +function omz_urlencode() { + emulate -L zsh + zparseopts -D -E -a opts r m P + + local in_str=$1 + local url_str="" + local spaces_as_plus + if [[ -z $opts[(r)-P] ]]; then spaces_as_plus=1; fi + local str="$in_str" + + # URLs must use UTF-8 encoding; convert str to UTF-8 if required + local encoding=$langinfo[CODESET] + local safe_encodings + safe_encodings=(UTF-8 utf8 US-ASCII) + if [[ -z ${safe_encodings[(r)$encoding]} ]]; then + str=$(echo -E "$str" | iconv -f $encoding -t UTF-8) + if [[ $? != 0 ]]; then + echo "Error converting string from $encoding to UTF-8" >&2 + return 1 + fi + fi + + # Use LC_CTYPE=C to process text byte-by-byte + local i byte ord LC_ALL=C + export LC_ALL + local reserved=';/?:@&=+$,' + local mark='_.!~*''()-' + local dont_escape="[A-Za-z0-9" + if [[ -z $opts[(r)-r] ]]; then + dont_escape+=$reserved + fi + # $mark must be last because of the "-" + if [[ -z $opts[(r)-m] ]]; then + dont_escape+=$mark + fi + dont_escape+="]" + + # Implemented to use a single printf call and avoid subshells in the loop, + # for performance (primarily on Windows). + local url_str="" + for (( i = 1; i <= ${#str}; ++i )); do + byte="$str[i]" + if [[ "$byte" =~ "$dont_escape" ]]; then + url_str+="$byte" + else + if [[ "$byte" == " " && -n $spaces_as_plus ]]; then + url_str+="+" + else + ord=$(( [##16] #byte )) + url_str+="%$ord" + fi + fi + done + echo -E "$url_str" +} + +# URL-decode a string +# +# Decodes a RFC 2396 URL-encoded (%-escaped) string. +# This decodes the '+' and '%' escapes in the input string, and leaves +# other characters unchanged. Does not enforce that the input is a +# valid URL-encoded string. This is a convenience to allow callers to +# pass in a full URL or similar strings and decode them for human +# presentation. +# +# Outputs the encoded string on stdout. +# Returns nonzero if encoding failed. +# +# Usage: +# omz_urldecode - prints decoded string followed by a newline +function omz_urldecode { + emulate -L zsh + local encoded_url=$1 + + # Work bytewise, since URLs escape UTF-8 octets + local caller_encoding=$langinfo[CODESET] + local LC_ALL=C + export LC_ALL + + # Change + back to ' ' + local tmp=${encoded_url:gs/+/ /} + # Protect other escapes to pass through the printf unchanged + tmp=${tmp:gs/\\/\\\\/} + # Handle %-escapes by turning them into `\xXX` printf escapes + tmp=${tmp:gs/%/\\x/} + local decoded + eval "decoded=\$'$tmp'" + + # Now we have a UTF-8 encoded string in the variable. We need to re-encode + # it if caller is in a non-UTF-8 locale. + local safe_encodings + safe_encodings=(UTF-8 utf8 US-ASCII) + if [[ -z ${safe_encodings[(r)$caller_encoding]} ]]; then + decoded=$(echo -E "$decoded" | iconv -f UTF-8 -t $caller_encoding) + if [[ $? != 0 ]]; then + echo "Error converting string from UTF-8 to $caller_encoding" >&2 + return 1 + fi + fi + + echo -E "$decoded" +} diff --git a/zsh/functions/omz_grep.zsh b/zsh/functions/omz_grep.zsh new file mode 100644 index 0000000..abc1650 --- /dev/null +++ b/zsh/functions/omz_grep.zsh @@ -0,0 +1,28 @@ +# is x grep argument available? +grep-flag-available() { + echo | grep $1 "" >/dev/null 2>&1 +} + +GREP_OPTIONS="" + +# color grep results +if grep-flag-available --color=auto; then + GREP_OPTIONS+=" --color=auto" +fi + +# ignore VCS folders (if the necessary grep flags are available) +VCS_FOLDERS="{.bzr,CVS,.git,.hg,.svn}" + +if grep-flag-available --exclude-dir=.cvs; then + GREP_OPTIONS+=" --exclude-dir=$VCS_FOLDERS" +elif grep-flag-available --exclude=.cvs; then + GREP_OPTIONS+=" --exclude=$VCS_FOLDERS" +fi + +# export grep settings +alias grep="grep $GREP_OPTIONS" + +# clean up +unset GREP_OPTIONS +unset VCS_FOLDERS +unfunction grep-flag-available diff --git a/zsh/functions/omz_history.zsh b/zsh/functions/omz_history.zsh new file mode 100644 index 0000000..5de71c2 --- /dev/null +++ b/zsh/functions/omz_history.zsh @@ -0,0 +1,24 @@ +## Command history configuration +if [ -z "$HISTFILE" ]; then + HISTFILE=$HOME/.zsh_history +fi + +HISTSIZE=10000 +SAVEHIST=10000 + +# Show history +case $HIST_STAMPS in + "mm/dd/yyyy") alias history='fc -fl 1' ;; + "dd.mm.yyyy") alias history='fc -El 1' ;; + "yyyy-mm-dd") alias history='fc -il 1' ;; + *) alias history='fc -l 1' ;; +esac + +setopt append_history +setopt extended_history +setopt hist_expire_dups_first +setopt hist_ignore_dups # ignore duplication command history list +setopt hist_ignore_space +setopt hist_verify +setopt inc_append_history +setopt share_history # share command history data diff --git a/zsh/functions/omz_key-bindings.zsh b/zsh/functions/omz_key-bindings.zsh new file mode 100644 index 0000000..41cca20 --- /dev/null +++ b/zsh/functions/omz_key-bindings.zsh @@ -0,0 +1,66 @@ +# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html +# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Zle-Builtins +# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Standard-Widgets + +# Make sure that the terminal is in application mode when zle is active, since +# only then values from $terminfo are valid +if (( ${+terminfo[smkx]} )) && (( ${+terminfo[rmkx]} )); then + function zle-line-init() { + echoti smkx + } + function zle-line-finish() { + echoti rmkx + } + zle -N zle-line-init + zle -N zle-line-finish +fi + +bindkey -e # Use emacs key bindings + +bindkey '\ew' kill-region # [Esc-w] - Kill from the cursor to the mark +bindkey -s '\el' 'ls\n' # [Esc-l] - run command: ls +bindkey '^r' history-incremental-search-backward # [Ctrl-r] - Search backward incrementally for a specified string. The string may begin with ^ to anchor the search to the beginning of the line. +if [[ "${terminfo[kpp]}" != "" ]]; then + bindkey "${terminfo[kpp]}" up-line-or-history # [PageUp] - Up a line of history +fi +if [[ "${terminfo[knp]}" != "" ]]; then + bindkey "${terminfo[knp]}" down-line-or-history # [PageDown] - Down a line of history +fi + +# start typing + [Up-Arrow] - fuzzy find history forward +if [[ "${terminfo[kcuu1]}" != "" ]]; then + autoload -U up-line-or-beginning-search + zle -N up-line-or-beginning-search + bindkey "${terminfo[kcuu1]}" up-line-or-beginning-search +fi +# start typing + [Down-Arrow] - fuzzy find history backward +if [[ "${terminfo[kcud1]}" != "" ]]; then + autoload -U down-line-or-beginning-search + zle -N down-line-or-beginning-search + bindkey "${terminfo[kcud1]}" down-line-or-beginning-search +fi + +if [[ "${terminfo[khome]}" != "" ]]; then + bindkey "${terminfo[khome]}" beginning-of-line # [Home] - Go to beginning of line +fi +if [[ "${terminfo[kend]}" != "" ]]; then + bindkey "${terminfo[kend]}" end-of-line # [End] - Go to end of line +fi + +bindkey ' ' magic-space # [Space] - do history expansion + +bindkey '^[[1;5C' forward-word # [Ctrl-RightArrow] - move forward one word +bindkey '^[[1;5D' backward-word # [Ctrl-LeftArrow] - move backward one word + +if [[ "${terminfo[kcbt]}" != "" ]]; then + bindkey "${terminfo[kcbt]}" reverse-menu-complete # [Shift-Tab] - move through the completion menu backwards +fi + +bindkey '^?' backward-delete-char # [Backspace] - delete backward +if [[ "${terminfo[kdch1]}" != "" ]]; then + bindkey "${terminfo[kdch1]}" delete-char # [Delete] - delete forward +else + bindkey "^[[3~" delete-char + bindkey "^[3;5~" delete-char + bindkey "\e[3~" delete-char +fi diff --git a/zsh/functions/omz_spectrum.zsh b/zsh/functions/omz_spectrum.zsh new file mode 100644 index 0000000..87092d8 --- /dev/null +++ b/zsh/functions/omz_spectrum.zsh @@ -0,0 +1,37 @@ +#! /bin/zsh +# A script to make using 256 colors in zsh less painful. +# P.C. Shyamshankar +# Copied from http://github.com/sykora/etc/blob/master/zsh/functions/spectrum/ + +typeset -AHg FX FG BG + +FX=( + reset "%{%}" + bold "%{%}" no-bold "%{%}" + italic "%{%}" no-italic "%{%}" + underline "%{%}" no-underline "%{%}" + blink "%{%}" no-blink "%{%}" + reverse "%{%}" no-reverse "%{%}" +) + +for color in {000..255}; do + FG[$color]="%{[38;5;${color}m%}" + BG[$color]="%{[48;5;${color}m%}" +done + + +ZSH_SPECTRUM_TEXT=${ZSH_SPECTRUM_TEXT:-Arma virumque cano Troiae qui primus ab oris} + +# Show all 256 colors with color number +function spectrum_ls() { + for code in {000..255}; do + print -P -- "$code: %{$FG[$code]%}$ZSH_SPECTRUM_TEXT%{$reset_color%}" + done +} + +# Show all 256 colors where the background is set to specific color +function spectrum_bls() { + for code in {000..255}; do + print -P -- "$code: %{$BG[$code]%}$ZSH_SPECTRUM_TEXT%{$reset_color%}" + done +} diff --git a/zsh/functions/omz_theme-and-appearance.zsh b/zsh/functions/omz_theme-and-appearance.zsh new file mode 100644 index 0000000..96f34aa --- /dev/null +++ b/zsh/functions/omz_theme-and-appearance.zsh @@ -0,0 +1,55 @@ +# ls colors +autoload -U colors && colors + +# Enable ls colors +export LSCOLORS="Gxfxcxdxbxegedabagacad" + +# TODO organise this chaotic logic + +if [[ "$DISABLE_LS_COLORS" != "true" ]]; then + # Find the option for using colors in ls, depending on the version + if [[ "$OSTYPE" == netbsd* ]]; then + # On NetBSD, test if "gls" (GNU ls) is installed (this one supports colors); + # otherwise, leave ls as is, because NetBSD's ls doesn't support -G + gls --color -d . &>/dev/null && alias ls='gls --color=tty' + elif [[ "$OSTYPE" == openbsd* ]]; then + # On OpenBSD, "gls" (ls from GNU coreutils) and "colorls" (ls from base, + # with color and multibyte support) are available from ports. "colorls" + # will be installed on purpose and can't be pulled in by installing + # coreutils, so prefer it to "gls". + gls --color -d . &>/dev/null && alias ls='gls --color=tty' + colorls -G -d . &>/dev/null && alias ls='colorls -G' + elif [[ "$OSTYPE" == darwin* ]]; then + # this is a good alias, it works by default just using $LSCOLORS + ls -G . &>/dev/null && alias ls='ls -G' + + # only use coreutils ls if there is a dircolors customization present ($LS_COLORS or .dircolors file) + # otherwise, gls will use the default color scheme which is ugly af + [[ -n "$LS_COLORS" || -f "$HOME/.dircolors" ]] && gls --color -d . &>/dev/null && alias ls='gls --color=tty' + else + # For GNU ls, we use the default ls color theme. They can later be overwritten by themes. + if [[ -z "$LS_COLORS" ]]; then + (( $+commands[dircolors] )) && eval "$(dircolors -b)" + fi + + ls --color -d . &>/dev/null && alias ls='ls --color=tty' || { ls -G . &>/dev/null && alias ls='ls -G' } + + # Take advantage of $LS_COLORS for completion as well. + zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" + fi +fi + +setopt auto_cd +setopt multios +setopt prompt_subst + +[[ -n "$WINDOW" ]] && SCREEN_NO="%B$WINDOW%b " || SCREEN_NO="" + +# Apply theming defaults +PS1="%n@%m:%~%# " + +# git theming default: Variables for theming the git info prompt +ZSH_THEME_GIT_PROMPT_PREFIX="git:(" # Prefix at the very beginning of the prompt, before the branch name +ZSH_THEME_GIT_PROMPT_SUFFIX=")" # At the very end of the prompt +ZSH_THEME_GIT_PROMPT_DIRTY="*" # Text to display if the branch is dirty +ZSH_THEME_GIT_PROMPT_CLEAN="" # Text to display if the branch is clean diff --git a/zsh/load.sh b/zsh/load.sh new file mode 100644 index 0000000..844e2fd --- /dev/null +++ b/zsh/load.sh @@ -0,0 +1,14 @@ +# path to my zsh configs +ZSH=$HOME/.zsh + +# load the things +fpath=($ZSH/functions $ZSH/completions $fpath) +autoload -U compaudit compinit + +# Load all of the config files in ~/oh-my-zsh that end in .zsh +# TIP: Add files you don't want in git to .gitignore +for config_file ($ZSH/functions/*.zsh); do + source $config_file +done + +compinit -d "${ZSH_COMPDUMP}/cache" diff --git a/zsh/zsh-syntax-highlighting b/zsh/zsh-syntax-highlighting new file mode 160000 index 0000000..ad522a0 --- /dev/null +++ b/zsh/zsh-syntax-highlighting @@ -0,0 +1 @@ +Subproject commit ad522a091429ba180c930f84b2a023b40de4dbcc diff --git a/zshrc b/zshrc index 0288271..22764b9 100644 --- a/zshrc +++ b/zshrc @@ -1,17 +1,5 @@ -# Path to your oh-my-zsh configuration. -ZSH=$HOME/.oh-my-zsh - -# Set name of the theme to load. -# Look in ~/.oh-my-zsh/themes/ -#ZSH_THEME="robbyrussell" - -# Comment this out to disable weekly auto-update checks -# DISABLE_AUTO_UPDATE="true" - -# Plugins to load -plugins=(git go osx zsh-syntax-highlighting) - -source $ZSH/oh-my-zsh.sh +# load my zsh configs +source ~/.zsh/load.sh # turn off mostly unhelpful autocorrect unsetopt correct_all @@ -48,3 +36,6 @@ export GOPATH=$HOME/Projects/go export PATH=$HOME/bin:$GOPATH/bin:$PATH export PATH=/home/mike/.gem/ruby/2.3.0/bin:$PATH export PATH=/opt/android-studio/bin:/home/mike/.cargo/bin:$PATH + +# source zsh-syntax-highlighting last +source $ZSH/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh