aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron LI <aly@aaronly.me>2019-10-03 11:53:02 +0800
committerAaron LI <aly@aaronly.me>2019-10-03 11:54:04 +0800
commitd2a4672e74290fc8a0662fb459e8e268b72a0fdf (patch)
treeeb8d5cd0ca786688184cf3e5be380702c4a2cb34
parentb7c96f96473856ec0aaa2ffdd4454a2fca6c7735 (diff)
downloaddotfiles-d2a4672e74290fc8a0662fb459e8e268b72a0fdf.tar.bz2
zsh: Merge zsh/* configs into zshrc
Meanwhile, drop some unused configurations ...
-rw-r--r--_zsh/00-checks.zsh19
-rw-r--r--_zsh/10-param.zsh13
-rw-r--r--_zsh/10-setopt.zsh71
-rw-r--r--_zsh/20-colors.zsh20
-rw-r--r--_zsh/30-prompt.zsh50
-rw-r--r--_zsh/40-completion.zsh61
-rw-r--r--_zsh/40-functions.zsh155
-rw-r--r--_zsh/40-hooks.zsh19
-rw-r--r--_zsh/50-term.zsh13
-rw-r--r--_zsh/50-vi-mode.zsh62
-rw-r--r--_zsh/60-bindkeys.zsh104
-rw-r--r--_zsh/60-zle.zsh20
-rw-r--r--_zsh/70-history.zsh34
-rw-r--r--_zsh/80-emacs.zsh43
-rw-r--r--_zsh/80-gpg.zsh64
-rw-r--r--_zsh/80-tmux.zsh37
-rw-r--r--_zsh/90-aliases.zsh31
-rw-r--r--_zsh/90-exports.zsh23
-rw-r--r--_zshrc548
19 files changed, 514 insertions, 873 deletions
diff --git a/_zsh/00-checks.zsh b/_zsh/00-checks.zsh
deleted file mode 100644
index 69282a6..0000000
--- a/_zsh/00-checks.zsh
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# zsh/checks.zsh
-#
-# Credits: http://zanshin.net/2013/02/02/zsh-configuration-from-the-ground-up/
-#
-
-if [[ $(uname) = 'Linux' ]]; then
- IS_LINUX=1
-elif [[ $(uname) = 'Darwin' ]]; then
- IS_MAC=1
-elif [[ $(uname) = 'FreeBSD' ]]; then
- IS_FREEBSD=1
- IS_BSD=1
-elif [[ $(uname) = 'DragonFly' ]]; then
- IS_DRAGONFLY=1
- IS_BSD=1
-fi
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/10-param.zsh b/_zsh/10-param.zsh
deleted file mode 100644
index 99f0942..0000000
--- a/_zsh/10-param.zsh
+++ /dev/null
@@ -1,13 +0,0 @@
-#
-# zsh/param.zsh
-# see zshparam(1)
-#
-
-# Ask only if the top of the listing would scroll off the screen
-LISTMAX=0
-
-# Report consuming time statistics if user+system greater than 60 seconds
-REPORTTIME=60
-
-# Format of process time reports with the `time' keyword
-TIMEFMT="%J %U user %S system %P cpu %MM memory %*E total"
diff --git a/_zsh/10-setopt.zsh b/_zsh/10-setopt.zsh
deleted file mode 100644
index 8d95b41..0000000
--- a/_zsh/10-setopt.zsh
+++ /dev/null
@@ -1,71 +0,0 @@
-#
-# zsh/setopt.zsh
-# see zshoptions(1)
-#
-
-## Basics
-setopt NO_BEEP
-setopt AUTO_CD
-# make cd push the old directory onto the directory stack
-setopt AUTO_PUSHD
-# don't push multiple copies of the same directory into the directory stack
-setopt PUSHD_IGNORE_DUPS
-# exchange meanings of `+` and `-` when specifying a directory in the stack
-setopt PUSHD_MINUS
-# do not print the directory stack after `pushd` or `popd`
-setopt PUSHD_SILENT
-# treat #, ~, and ^ as part of patterns for filename generation
-setopt EXTENDED_GLOB
-# allow comments even in interactive shells (especially for Muness)
-setopt INTERACTIVE_COMMENTS
-# display PID when suspending processes as well
-setopt LONG_LIST_JOBS
-# disable output flow control via start/stop characters (^S/^Q)
-unsetopt FLOW_CONTROL
-
-## History
-# allow multiple terminal sessions to all append to one zsh command history
-setopt APPEND_HISTORY
-# include timestamp of command and duration to history
-setopt EXTENDED_HISTORY
-# add comamnds as they are typed, don't wait until shell exit
-setopt INC_APPEND_HISTORY
-# do not write events to history that are duplicates of previous events
-setopt HIST_IGNORE_DUPS
-# remove command line from history list when it begins a space
-setopt HIST_IGNORE_SPACE
-# when searching history don't display results already cycled through twice
-setopt HIST_FIND_NO_DUPS
-# remove extra blanks from each command line being added to history
-setopt HIST_REDUCE_BLANKS
-# don't execute, just expand history
-setopt HIST_VERIFY
-
-
-## Completion
-# `*' shouldn't match dotfiles. ever.
-setopt NO_GLOB_DOTS
-# allow completion from within a word/phrase
-setopt COMPLETE_IN_WORD
-# when completing from middle of a word, move cursor to the end of the word
-setopt ALWAYS_TO_END
-# show completion menu on successive tab press (needs 'unsetopt MENU_COMPLETE')
-setopt AUTO_MENU
-unsetopt MENU_COMPLETE
-# make the completion list compact
-setopt LIST_PACKED
-
-## Correction
-# spelling correction for commands
-setopt CORRECT
-# spelling correction for arguments
-#setopt CORRECTALL
-
-## Prompt
-# enable parameter expansion, command substitution, and arithmetic expansion
-# in the prompt
-setopt PROMPT_SUBST
-# remove any right prompt from display when accepting a command line
-setopt TRANSIENT_RPROMPT
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/20-colors.zsh b/_zsh/20-colors.zsh
deleted file mode 100644
index 427ea20..0000000
--- a/_zsh/20-colors.zsh
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# zsh/colors.sh
-#
-
-autoload -U colors && colors
-
-# The variables are wrapped in %{%}. This should be the case for every
-# variable that does not contain space.
-for COLOR in RED GREEN YELLOW BLUE MAGENTA CYAN BLACK WHITE; do
- eval PR_$COLOR='%{$fg_no_bold[${(L)COLOR}]%}'
- eval PR_BOLD_$COLOR='%{$fg_bold[${(L)COLOR}]%}'
-done
-
-eval RESET='$reset_color'
-export PR_RED PR_GREEN PR_YELLOW PR_BLUE PR_WHITE PR_BLACK
-export PR_BOLD_RED PR_BOLD_GREEN PR_BOLD_YELLOW PR_BOLD_BLUE
-export PR_BOLD_WHITE PR_BOLD_BLACK
-
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/30-prompt.zsh b/_zsh/30-prompt.zsh
deleted file mode 100644
index cfd42f3..0000000
--- a/_zsh/30-prompt.zsh
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# zsh/prompt.zsh
-#
-# Credit: http://chneukirchen.org/dotfiles/.zshrc
-#
-
-
-# gitpwd - format the current path with inline git branch for the
-# prompt; the current path is limited to $NDIR segments,
-# meanwhile long segments are shortened to be
-# '<prefix>…<suffix>'.
-NDIRS=3
-function gitpwd() {
- local -a segs splitprefix
- local prefix branch
- segs=("${(Oas:/:)${(D)PWD}}")
- segs=("${(@)segs/(#b)(?(#c10))??*(?(#c5))/${(j:\u2026:)match}}")
-
- if gitprefix=$(git rev-parse --show-prefix 2>/dev/null); then
- splitprefix=("${(s:/:)gitprefix}")
- if ! branch=$(git symbolic-ref -q --short HEAD); then
- branch=$(git name-rev --name-only HEAD 2>/dev/null)
- [[ $branch = *\~* ]] || branch+="~0" # distinguish detached HEAD
- fi
- if (( $#splitprefix > NDIRS )); then
- print -n "${segs[$#splitprefix]}@$branch "
- else
- segs[$#splitprefix]+=@$branch
- fi
- fi
-
- (( $#segs == NDIRS+1 )) && [[ $segs[-1] == "" ]] && print -n /
- print "${(j:/:)${(@Oa)segs[1,NDIRS]}}"
-}
-
-
-function myprompt() {
- setopt PROMPT_SUBST
- nbsp=$'\u00A0'
- PROMPT='%S%B%F{green}[%m]%s%(?.. %F{red}%??)%(1j. %F{yellow}%j&.)%b%f $(gitpwd)%B%(!.%F{red}.%F{green})%#${SSH_CONNECTION:+%#}$nbsp%b%f'
- RPROMPT=''
- # Prompt for spelling correction
- SPROMPT='zsh: correct %B%F{red}%R%b%f to %B%F{green}%r%b%f [(y)es (n)o (a)bort (e)dit]? '
-}
-
-
-myprompt
-
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/40-completion.zsh b/_zsh/40-completion.zsh
deleted file mode 100644
index 5275f6b..0000000
--- a/_zsh/40-completion.zsh
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-# zsh/completion.zsh
-#
-
-fpath=(~/.zsh.completions $fpath)
-autoload -U compinit && compinit
-zmodload -i zsh/complist
-
-# man zshcontrib
-zstyle ':vcs_info:*' actionformats '%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '
-zstyle ':vcs_info:*' formats '%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{5}]%f '
-zstyle ':vcs_info:*' enable git #svn cvs
-
-# enable completion caching, use rehash to clear
-zstyle ':completion::complete:*' use-cache on
-zstyle ':completion::complete:*' cache-path ~/.cache/zsh/${HOST}
-
-# fallback to built in ls colors
-zstyle ':completion:*' list-colors ''
-
-# make the list prompt friendly
-zstyle ':completion:*' list-prompt '%SAt %p: Hit TAB for more, or the character to insert%s'
-
-# make the selection prompt friendly when there are a lot of choices
-zstyle ':completion:*' select-prompt '%SScrolling active: current selection at %p%s'
-
-# add simple colors to kill
-zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;34=0=01'
-
-# list of completers to use
-zstyle ':completion:*::::' completer _expand _complete _ignored _approximate
-
-zstyle ':completion:*' menu select=1 _complete _ignored _approximate
-
-# insert all expansions for expand completer
-#zstyle ':completion:*:expand:*' tag-order all-expansions
-
-# match uppercase from lowercase
-zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
-
-# offer indexes before parameters in subscripts
-zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
-
-# formatting and messages
-zstyle ':completion:*' verbose yes
-zstyle ':completion:*:descriptions' format '%B%d%b'
-zstyle ':completion:*:messages' format '%d'
-zstyle ':completion:*:warnings' format 'No matches for: %d'
-zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b'
-zstyle ':completion:*' group-name ''
-
-# ignore completion functions (until the _ignored completer)
-zstyle ':completion:*:functions' ignored-patterns '_*'
-zstyle ':completion:*:scp:*' tag-order files users 'hosts:-host hosts:-domain:domain hosts:-ipaddr"IP\ Address *'
-zstyle ':completion:*:scp:*' group-order files all-files users hosts-domain hosts-host hosts-ipaddr
-zstyle ':completion:*:ssh:*' tag-order users 'hosts:-host hosts:-domain:domain hosts:-ipaddr"IP\ Address *'
-zstyle ':completion:*:ssh:*' group-order hosts-domain hosts-host users hosts-ipaddr
-zstyle '*' single-ignored show
-
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/40-functions.zsh b/_zsh/40-functions.zsh
deleted file mode 100644
index cbf15ad..0000000
--- a/_zsh/40-functions.zsh
+++ /dev/null
@@ -1,155 +0,0 @@
-#
-# zsh/functions.zsh
-#
-# execute 'functions <func_name>' to show function details.
-#
-
-## Check the existence/accessibility of a command
-# Credit: https://stackoverflow.com/a/677212/4856091
-function exists() {
- # 'command' is POSIX-compliant and more portable;
- # 'hash' only searches for commands;
- # while 'type' also considers builtins and keywords.
- type "$1" >/dev/null 2>&1
-}
-
-
-## Check whether the program is running
-function is_running() {
- pgrep -x -u "${USER}" "$1" >/dev/null 2>&1
-}
-
-
-function zsh_recompile() {
- autoload -U zrecompile
- rm -f ~/.zsh/*.zwc
- [[ -f ~/.zshrc ]] && zrecompile -p ~/.zshrc
- [[ -f ~/.zshrc.zwc.old ]] && rm -f ~/.zshrc.zwc.old
-
- local f
- for f in ~/.zsh/**/*.zsh; do
- [[ -f $f ]] && zrecompile -p $f
- [[ -f $f.zwc.old ]] && rm -f $f.zwc.old
- done
-
- [[ -f ~/.zcompdump ]] && zrecompile -p ~/.zcompdump
- [[ -f ~/.zcompdump.zwc.old ]] && rm -f ~/.zcompdump.zwc.old
-
- source ~/.zshrc
-}
-
-
-function extract() {
- echo "Extracting '$1' ..."
- if [ -f "$1" ] ; then
- case "$1" in
- *.tar.bz2)
- tar xjf "$1";;
- *.tar.gz)
- tar xzf "$1";;
- *.bz2)
- bunzip2 "$1";;
- *.rar)
- unrar x "$1";;
- *.gz)
- gunzip "$1";;
- *.tar)
- tar xf "$1";;
- *.tbz2)
- tar xjf "$1";;
- *.tgz)
- tar xzf "$1";;
- *.zip)
- unzip "$1";;
- *.Z)
- uncompress "$1";;
- *.7z)
- 7z x "$1";;
- *)
- echo "Unable to extract: '$1'" ;;
- esac
- else
- echo "Invalid file: '$1'"
- fi
-}
-
-
-function trash() {
- local path
- for path in "$@"; do
- # ignore any arguments
- if [[ "${path}" = -* ]]; then
- :
- else
- local dst="${path##*/}"
- # append the time if necessary
- while [ -e ~/.trash/"${dst}" ]; do
- dst="${dst} "$(date +%H-%M-%S)
- done
- command mv "${path}" ~/.trash/"${dst}"
- fi
- done
-}
-
-
-## Print a horizontal rule
-function rule() {
- printf "%$(tput cols)s\n" | tr ' ' "${1:-=}"
-}
-
-
-## Interactive move/rename: making renaming long filenames less sucks
-# Credit: http://chneukirchen.org/dotfiles/.zshrc
-function imv() {
- local src dst
- for src; do
- [[ -e "$src" ]] || { print -u2 "$src: does not exist"; continue }
- dst="$src"
- vared dst
- [[ "$src" != "$dst" ]] && mkdir -p ${dst:h} && mv -n $src $dst
- done
-}
-
-
-## Print pre-defined C macros
-# Credit: http://chneukirchen.org/dotfiles/.zshrc
-ccdef() {
- ${1:-cc} $@[2,-1] -dM -E - </dev/null
-}
-
-
-## Run up to N CMD in parallel with ARGS
-# zapply [-jN] [-iv] CMD... -- ARGS...
-# CMD will be run as zsh command if it contains a $
-# without explicit '--', assume CMD is first argument
-# {} (or $1) may be used to access argument
-# Credit: http://chneukirchen.org/dotfiles/.zshrc
-zapply() {
- local s="$@[(i)--]" xopt=
- (( s > $# )) && argv[2]=(-- "$argv[2]") && s=2
- zparseopts -D -M -A xopt n: p t P: j:=P v=t i=p # map to xargs(1) flags
- (( $@[(i){}] < s )) && xopt[-I]={}
- [[ $1 = *'$'* ]] && argv[1]=(zsh -c "$1" --) && (( s += 3 ))
- printf '%s\0' "$@[s+1,-1]" | xargs -0 -r -n1 ${(kv)=xopt} "$@[1,s-1]"
-}
-
-
-## Generate random password/string
-randpass() {
- local len=${1:-16}
- tr -dc '[:alnum:]' </dev/urandom | head -c ${len} | xargs
-}
-
-
-## Fix terminal
-# Credit: https://unix.stackexchange.com/a/299922
-fix() {
- reset
- stty sane
- tput rs1
- clear
- echo -e "\033c"
-}
-
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/40-hooks.zsh b/_zsh/40-hooks.zsh
deleted file mode 100644
index da15a29..0000000
--- a/_zsh/40-hooks.zsh
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# zsh/hooks.zsh
-#
-# Credit: http://chneukirchen.org/dotfiles/.zshrc
-#
-
-case "$TERM" in
-xterm*|rxvt*)
- function precmd() {
- [[ -t 1 ]] && print -Pn "\e]0;%m: %~\a"
- }
- function preexec() {
- [[ -t 1 ]] && print -n "\e]0;$HOST: ${(q)1//(#m)[$'\000-\037\177-']/${(q)MATCH}}\a"
- }
- ;;
-esac
-
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/50-term.zsh b/_zsh/50-term.zsh
deleted file mode 100644
index 7b60159..0000000
--- a/_zsh/50-term.zsh
+++ /dev/null
@@ -1,13 +0,0 @@
-#
-# zsh/term.zsh
-#
-# 2018-02-02
-#
-
-# Disable sending of start (Ctrl-Q) and stop (Ctrl-S) characters
-stty -ixoff
-
-# Disable XON/XOFF flow control
-stty -ixon
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/50-vi-mode.zsh b/_zsh/50-vi-mode.zsh
deleted file mode 100644
index 49c1a26..0000000
--- a/_zsh/50-vi-mode.zsh
+++ /dev/null
@@ -1,62 +0,0 @@
-#
-# zsh/vi-mode.zsh
-# see zshzle(1)
-#
-# Credits:
-# * https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/vi-mode/vi-mode.plugin.zsh
-# * http://zshwiki.org/home/zle/bindkeys
-#
-# 2015-11-18
-#
-
-# Updates editor information when the keymap changes.
-function zle-keymap-select() {
- zle reset-prompt
- zle -R
-}
-
-# Ensure that the prompt is redrawn when the terminal size changes.
-TRAPWINCH() {
- zle && { zle reset-prompt; zle -R }
-}
-
-zle -N zle-keymap-select
-zle -N edit-command-line
-
-
-# NOTE:
-# This will *reset* previous bindkey settings!
-bindkey -v
-
-# allow v to edit the command line (standard behaviour)
-autoload -Uz edit-command-line
-bindkey -M vicmd 'v' edit-command-line
-
-# allow ctrl-p, ctrl-n for navigate history (standard behaviour)
-bindkey '^P' up-history
-bindkey '^N' down-history
-
-# allow ctrl-h, ctrl-w, ctrl-? for char and word deletion (standard behaviour)
-bindkey '^?' backward-delete-char
-bindkey '^h' backward-delete-char
-bindkey '^w' backward-kill-word
-
-# allow ctrl-r for incremental history search
-bindkey -M viins '^r' history-incremental-search-backward
-bindkey -M vicmd '^r' history-incremental-search-backward
-
-# if mode indicator wasn't setup by theme, define default
-if [[ "$MODE_INDICATOR" == "" ]]; then
- MODE_INDICATOR="%{$fg_bold[red]%}<%{$fg[red]%}<<%{$reset_color%}"
-fi
-
-function vi_mode_prompt_info() {
- echo "${${KEYMAP/vicmd/$MODE_INDICATOR}/(main|viins)/}"
-}
-
-# define right prompt, if it wasn't defined by a theme
-if [[ "$RPS1" == "" && "$RPROMPT" == "" ]]; then
- RPS1='$(vi_mode_prompt_info)'
-fi
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/60-bindkeys.zsh b/_zsh/60-bindkeys.zsh
deleted file mode 100644
index a57ab83..0000000
--- a/_zsh/60-bindkeys.zsh
+++ /dev/null
@@ -1,104 +0,0 @@
-#
-# zsh/bindkeys.zsh
-# see zshzle(1)
-#
-# To see the key combo you want to use just do:
-# $ cat > /dev/null
-# then press it.
-#
-# NOTE:
-# Switching mode (e.g., `bindkey -v`) will *reset* the following settings!
-#
-# Credit:
-# * oh-my-zsh: https://github.com/robbyrussell/oh-my-zsh
-# lib/key-bindings.zsh
-#
-
-# 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
-
-# [Ctrl-r] - Search backward incrementally for a specified string.
-# The string may begin with ^ to anchor the search to the beginning of the line.
-bindkey '^r' history-incremental-search-backward
-
-# [PageUp] - Up a line of history
-if [[ "${terminfo[kpp]}" != "" ]]; then
- bindkey "${terminfo[kpp]}" up-line-or-history
-fi
-# [PageDown] - Down a line of history
-if [[ "${terminfo[knp]}" != "" ]]; then
- bindkey "${terminfo[knp]}" down-line-or-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
-
-# [Home] - Go to beginning of line
-if [[ "${terminfo[khome]}" != "" ]]; then
- bindkey "${terminfo[khome]}" beginning-of-line
-fi
-# [End] - Go to end of line
-if [[ "${terminfo[kend]}" != "" ]]; then
- bindkey "${terminfo[kend]}" end-of-line
-fi
-
-# [Space] - do history expansion
-bindkey ' ' magic-space
-# [Ctrl-RightArrow] - move forward one word
-bindkey '^[[1;5C' forward-word
-# [Ctrl-LeftArrow] - move backward one word
-bindkey '^[[1;5D' backward-word
-
-# [Shift-Tab] - move through the completion menu backwards
-if [[ "${terminfo[kcbt]}" != "" ]]; then
- bindkey "${terminfo[kcbt]}" reverse-menu-complete
-fi
-
-# [Backspace] - delete backward
-bindkey '^?' backward-delete-char
-# [Delete] - delete forward
-if [[ "${terminfo[kdch1]}" != "" ]]; then
- bindkey "${terminfo[kdch1]}" delete-char
-else
- bindkey "^[[3~" delete-char
- bindkey "^[3;5~" delete-char
- bindkey "\e[3~" delete-char
-fi
-
-# Emacs style line editing
-bindkey "^K" kill-whole-line # ctrl-k
-bindkey "^R" history-incremental-search-backward # ctrl-r
-bindkey "^A" beginning-of-line # ctrl-a
-bindkey "^E" end-of-line # ctrl-e
-bindkey "[B" history-search-forward # down arrow
-bindkey "[A" history-search-backward # up arrow
-bindkey "^D" delete-char # ctrl-d
-bindkey "^F" forward-char # ctrl-f
-bindkey "^B" backward-char # ctrl-b
-
-# see zshcontrib(1)
-autoload -U select-word-style
-# bash-style word killing: word characters are alphanumeric characters only
-select-word-style bash
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/60-zle.zsh b/_zsh/60-zle.zsh
deleted file mode 100644
index 92c339d..0000000
--- a/_zsh/60-zle.zsh
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# zsh/zle.zsh
-# some generic ZLE settings
-# see zshzle(1)
-#
-# 2016-05-29
-#
-
-# Turn off ZLE bracketed paste in dumb and cons25 (DFly default console) term,
-# otherwise turn on ZLE bracketed-paste-magic
-# Credit: http://zmwangx.github.io/blog/2015-09-21-zsh-51-and-bracketed-paste.html
-# See also zshparam(1)
-if [[ ${TERM} == dumb ]] || [[ ${TERM} == cons25 ]]; then
- unset zle_bracketed_paste
-else
- autoload -Uz bracketed-paste-magic
- zle -N bracketed-paste bracketed-paste-magic
-fi
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/70-history.zsh b/_zsh/70-history.zsh
deleted file mode 100644
index 1d294f6..0000000
--- a/_zsh/70-history.zsh
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# zsh/history.zsh
-# see zshparam(1)
-#
-
-HISTFILE=~/.zsh_history
-HISTSIZE=9000
-SAVEHIST=9000
-# ignore these commands without arguments
-HISTIGNORE="cd:ls:ll"
-
-
-# Combine history search with `percol`
-# Credit: https://github.com/mooz/percol
-if exists percol; then
- function percol_select_history() {
- local tac
- exists gtac && tac="gtac" || {
- exists tac && tac="tac" || {
- tac="tail -r" } }
- BUFFER=$(fc -l -n 1 | eval ${tac} | percol --query "${LBUFFER}")
- CURSOR=${#BUFFER} # move cursor
- zle -R -c # refresh
- }
-
- zle -N percol_select_history
- # Override the bindkey settings in `60-bindkeys.zsh`
- bindkey '^R' percol_select_history
- # Override the bindkey settings in `50-vi-mode.zsh`
- bindkey -M viins '^r' percol_select_history
- bindkey -M vicmd '^r' percol_select_history
-fi
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/80-emacs.zsh b/_zsh/80-emacs.zsh
deleted file mode 100644
index 88a4b90..0000000
--- a/_zsh/80-emacs.zsh
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-# zsh/emacs.zsh
-#
-# Credits:
-# https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/emacs
-#
-# 2016-02-21
-#
-
-if exists emacsclient; then
- function eserver() {
- # NOTE:
- # Force "LC_CTYPE=zh_CN.UTF-8", otherwise, the Chinese input methods
- # (e.g., Fcitx) cannot be activated within Emacs (GUI) in non-Chinese
- # locale (e.g., "LANG=en_US.UTF-8" while "LC_CTYPE" unset)
- command env LC_CTYPE=zh_CN.UTF-8 emacs --daemon
- }
-
- function _emacsclient() {
- # Get list of available X windows.
- local X=$(emacsclient --alternate-editor '' \
- --eval '(x-display-list)' 2>/dev/null)
-
- if [ -z "$X" ] || [ "$X" = "nil" ]; then
- # Create one if there is no X window yet.
- local create_frame="--create-frame"
- else
- local create_frame=""
- fi
-
- command env LC_CTYPE=zh_CN.UTF-8 \
- emacsclient --alternate-editor "" $create_frame "$@"
- }
-
- alias emacs='_emacsclient -t'
- # Same as 'M-x eval' but outside of Emacs
- alias eeval='_emacsclient --eval'
- # Create a new X frame
- alias eframe='_emacsclient --create-frame --no-wait'
-fi # END: exists emacsclient
-
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/80-gpg.zsh b/_zsh/80-gpg.zsh
deleted file mode 100644
index 2cbb70c..0000000
--- a/_zsh/80-gpg.zsh
+++ /dev/null
@@ -1,64 +0,0 @@
-#
-# zsh/gpg.zsh
-#
-
-# NOTE:
-# Install both the `pinentry-gtk-2' and `pinentry-curses', and symlink
-# `pinentry-gtk-2' to `pinentry' as the default pinentry program, which
-# will fallback to the text mode when X11 is not avaiable (i.e.,
-# `$DISPLAY' is not set), e.g., through SSH logins.
-# `pinentry-gnome3' seems to have problem that cannot fallback to the
-# text mode ... (for reason unkown ...)
-
-# This `GPG_TTY' variable should be set to the correct TTY where the shell
-# is running. See `gpg-agent(1)' for more details.
-export GPG_TTY=$(tty)
-
-# Make SSH to use `gpg-agent'.
-unset SSH_AGENT_PID
-if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
- export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
-fi
-
-# Use curses-based pinentry for SSH logins
-# Credit: https://wiki.gentoo.org/wiki/GnuPG
-if [ -n "${SSH_CONNECTION}" ] ;then
- export PINENTRY_USER_DATA="USE_CURSES=1"
-fi
-
-# Let pinentry know which console to display in for `ssh-agent'.
-#
-# Since the 'ssh-agent' protocol does not contain a mechanism for telling
-# the agent on which terminal/display it is running, gpg-agent's
-# ssh-support can just use the TTY or X display when `gpg-agent' has been
-# started, which may be before the X session startup. Therefore, when the
-# switched to the X session, or login remotely through SSH, the `pinentry'
-# will get popped up on whatever display the `gpg-agent' has been started
-# or may just fail. In this case, a manual update is necessary.
-#
-# This will set startup TTY and X11 DISPLAY variables to the values of
-# this session.
-#
-# Credits:
-# * GnuPG: Commonly Seen Problems
-# https://www.gnupg.org/documentation/manuals/gnupg/Common-Problems.html
-# * `gpg-agent(1)': option `--enable-ssh-support'
-# * http://blog.mrloop.com/workflow/2017/02/09/pin-entry.html
-#
-update-gpg-tty() {
- gpg-connect-agent updatestartuptty /bye >/dev/null 2>&1 || true
-}
-autoload -U add-zsh-hook
-add-zsh-hook preexec update-gpg-tty
-
-# Delete all identities from the `gpg-agent', which is similar to
-# `ssh-add -D`.
-# Credit: http://blog.mrloop.com/workflow/2017/02/09/pin-entry.html
-ssh-delete() {
- grep -o '^[A-Z0-9]*' ${HOME}/.gnupg/sshcontrol | \
- xargs -I'%' rm ${HOME}/.gnupg/private-keys-v1.d/'%'.key
- echo "" > ${HOME}/.gnupg/sshcontrol
-}
-
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/80-tmux.zsh b/_zsh/80-tmux.zsh
deleted file mode 100644
index 9a4ad9c..0000000
--- a/_zsh/80-tmux.zsh
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# zsh/tmux.zsh
-#
-
-
-# Integrate `tmux` attach with `percol`
-# Credit: https://github.com/mooz/percol
-if exists percol; then
- function tmattach() {
- if [[ $1 == "" ]]; then
- PERCOL=percol
- else
- PERCOL="percol --query $1"
- fi
-
- sessions=$(tmux list-sessions)
- [ $? -ne 0 ] && return
-
- session=$(echo ${sessions} | eval ${PERCOL} | cut -d: -f1)
- if [[ -n "${session}" ]]; then
- tmux attach -t ${session}
- fi
- }
-fi
-
-
-# Handy aliases
-if exists tmattach; then
- alias tma=tmattach
-else
- alias tma='tmux attach -t'
-fi
-alias tml='tmux list-sessions'
-alias tms='tmux new-session -s'
-
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/90-aliases.zsh b/_zsh/90-aliases.zsh
deleted file mode 100644
index ac140b3..0000000
--- a/_zsh/90-aliases.zsh
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# zsh/aliases.zsh
-#
-
-alias zhelp='run-help'
-
-alias ..='cd ../'
-alias ...='cd ../../'
-alias ....='cd ../../../'
-alias cd..='cd ..'
-alias d='dirs -v | head -10'
-alias po=popd
-alias pu=pushd
-
-if [[ -n "${IS_LINUX}" ]]; then
- alias ls='ls --color=auto'
-elif [[ -n "${IS_BSD}" ]] || [[ -n "${IS_MAC}" ]]; then
- alias ls='ls -G'
-fi
-alias l='ls -lah'
-alias la='ls -lAh'
-alias ll='ls -lh'
-alias lsa='ls -lah'
-
-# Do not use `GREP_OPTIONS`
-alias grep='grep --color=auto'
-
-exists "vi" || alias vi=vim
-exists "safe-rm" && alias rm=safe-rm
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zsh/90-exports.zsh b/_zsh/90-exports.zsh
deleted file mode 100644
index f368161..0000000
--- a/_zsh/90-exports.zsh
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# zsh/exports.zsh
-#
-
-# NOTE:
-# Generic environment variables and those needing been set only once
-# should go to `~/.profile'.
-
-# colors for BSD ls
-if [[ -n "${IS_BSD}" ]]; then
- export CLICOLOR=1
- export LSCOLORS=exfxcxdxbxegedabagacad
-fi
-
-# Color setup for `ls': `LS_COLORS'
-# NOTE: For unknown reason, the `LS_COLORS' variable get overridden when
-# it is set in `~/.profile'.
-if exists dircolors; then
- eval $(dircolors -b)
-fi
-
-
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
diff --git a/_zshrc b/_zshrc
index 97c22ce..f877b5a 100644
--- a/_zshrc
+++ b/_zshrc
@@ -1,36 +1,516 @@
-## -*- mode: sh; -*-
-##
-## ~/.zshrc
-## ZSH configuration file
-## oh-my-zsh: http://ohmyz.sh/
-##
-## ZSH reads this file in all interactive shells, whether they are
-## login shells or not.
-##
-## Credits:
-## [1] https://github.com/spicycode/ze-best-zsh-config
-## [2] Zsh Configuration from the Ground Up
-## http://zanshin.net/2013/02/02/zsh-configuration-from-the-ground-up/
-## [3] GRML Zsh
-## http://grml.org/zsh/
-##
-## References:
-## [1] The Unix Shell's Humble if
-## https://robots.thoughtbot.com/the-unix-shells-humble-if
-##
-## Aaron LI
-## Created: 2014-05-31
-## Updated: 2016-05-15
-##
-
-
-for _f in ~/.zsh/[0-9][0-9]-*.zsh; do
- source ${_f}
-done
-unset _f
-
-## Local configurations
-[ -r ~/.zshrc.local ] && source ~/.zshrc.local || true
+#
+# ~/.zshrc
+# ZSH configuration file
+#
+# Credits:
+# [1] https://github.com/spicycode/ze-best-zsh-config
+# [2] Zsh Configuration from the Ground Up
+# http://zanshin.net/2013/02/02/zsh-configuration-from-the-ground-up/
+# [3] GRML Zsh
+# http://grml.org/zsh/
+#
+# References:
+# [1] The Unix Shell's Humble if
+# https://robots.thoughtbot.com/the-unix-shells-humble-if
+#
+
+#
+# OS checks
+#
+
+OS=$(uname -s)
+if [[ "${OS}" = 'Linux' ]]; then
+ IS_LINUX=1
+elif [[ "${OS}" = 'Darwin' ]]; then
+ IS_MAC=1
+elif [[ "${OS}" = 'DragonFly' ]] || [[ "${OS}" =~ '.*BSD' ]]; then
+ IS_BSD=1
+fi
+
+#
+# Zsh Parameters
+# See zshparam(1)
+#
+
+# Ask only if the top of the listing would scroll off the screen
+LISTMAX=0
+# Report consuming time statistics if user+system greater than 60 seconds
+REPORTTIME=60
+# Format of process time reports with the `time' keyword
+TIMEFMT="%J %U user %S system %P cpu %MM memory %*E total"
+
+# History
+HISTFILE=~/.zsh_history
+HISTSIZE=9000
+SAVEHIST=9000
+# Ignore these commands without arguments
+HISTIGNORE="cd:ls:ll"
+
+#
+# Zsh Options
+# See zshoptions(1)
+#
+
+## Basics
+setopt NO_BEEP
+setopt AUTO_CD
+# make cd push the old directory onto the directory stack
+setopt AUTO_PUSHD
+# don't push multiple copies of the same directory into the directory stack
+setopt PUSHD_IGNORE_DUPS
+# exchange meanings of `+` and `-` when specifying a directory in the stack
+setopt PUSHD_MINUS
+# do not print the directory stack after `pushd` or `popd`
+setopt PUSHD_SILENT
+# treat #, ~, and ^ as part of patterns for filename generation
+setopt EXTENDED_GLOB
+# allow comments even in interactive shells (especially for Muness)
+setopt INTERACTIVE_COMMENTS
+# display PID when suspending processes as well
+setopt LONG_LIST_JOBS
+# disable output flow control via start/stop characters (^S/^Q)
+unsetopt FLOW_CONTROL
+
+## History
+# allow multiple terminal sessions to all append to one zsh command history
+setopt APPEND_HISTORY
+# include timestamp of command and duration to history
+setopt EXTENDED_HISTORY
+# add comamnds as they are typed, don't wait until shell exit
+setopt INC_APPEND_HISTORY
+# do not write events to history that are duplicates of previous events
+setopt HIST_IGNORE_DUPS
+# remove command line from history list when it begins a space
+setopt HIST_IGNORE_SPACE
+# when searching history don't display results already cycled through twice
+setopt HIST_FIND_NO_DUPS
+# remove extra blanks from each command line being added to history
+setopt HIST_REDUCE_BLANKS
+# don't execute, just expand history
+setopt HIST_VERIFY
+
+## Completion
+# `*' shouldn't match dotfiles. ever.
+setopt NO_GLOB_DOTS
+# allow completion from within a word/phrase
+setopt COMPLETE_IN_WORD
+# when completing from middle of a word, move cursor to the end of the word
+setopt ALWAYS_TO_END
+# show completion menu on successive tab press (needs 'unsetopt MENU_COMPLETE')
+setopt AUTO_MENU
+unsetopt MENU_COMPLETE
+# make the completion list compact
+setopt LIST_PACKED
+
+## Correction
+# spelling correction for commands
+setopt CORRECT
+# spelling correction for arguments
+#setopt CORRECTALL
+
+#
+# Prompt
+# Credit: http://chneukirchen.org/dotfiles/.zshrc
+#
+
+# enable parameter expansion, command substitution, and arithmetic expansion
+setopt PROMPT_SUBST
+# remove any right prompt from display when accepting a command line
+setopt TRANSIENT_RPROMPT
+
+# gitpwd - format the current path with inline git branch for the
+# prompt; the current path is limited to $NDIR segments,
+# meanwhile long segments are shortened to be
+# '<prefix>…<suffix>'.
+NDIRS=3
+function gitpwd() {
+ local -a segs splitprefix
+ local prefix branch
+ segs=("${(Oas:/:)${(D)PWD}}")
+ segs=("${(@)segs/(#b)(?(#c10))??*(?(#c5))/${(j:\u2026:)match}}")
+
+ if gitprefix=$(git rev-parse --show-prefix 2>/dev/null); then
+ splitprefix=("${(s:/:)gitprefix}")
+ if ! branch=$(git symbolic-ref -q --short HEAD); then
+ branch=$(git name-rev --name-only HEAD 2>/dev/null)
+ [[ $branch = *\~* ]] || branch+="~0" # distinguish detached HEAD
+ fi
+ if (( $#splitprefix > NDIRS )); then
+ print -n "${segs[$#splitprefix]}@$branch "
+ else
+ segs[$#splitprefix]+=@$branch
+ fi
+ fi
+
+ (( $#segs == NDIRS+1 )) && [[ $segs[-1] == "" ]] && print -n /
+ print "${(j:/:)${(@Oa)segs[1,NDIRS]}}"
+}
+
+PROMPT='%S%B%F{green}[%m]%s%(?.. %F{red}%??)%(1j. %F{yellow}%j&.)%b%f $(gitpwd)%B%(!.%F{red}.%F{green})%#${SSH_CONNECTION:+%#} %b%f'
+RPROMPT=''
+SPROMPT='zsh: correct %B%F{red}%R%b%f to %B%F{green}%r%b%f [(y)es (n)o (a)bort (e)dit]? '
+
+#
+# Completion
+#
+
+fpath=(~/.zsh.completions $fpath)
+autoload -U compinit && compinit
+zmodload -i zsh/complist
+
+# enable completion caching, use rehash to clear
+zstyle ':completion::complete:*' use-cache on
+zstyle ':completion::complete:*' cache-path ~/.cache/zsh/${HOST}
+
+# make the selection prompt friendly when there are a lot of choices
+zstyle ':completion:*' select-prompt '%SScrolling active: current selection at %p%s'
+
+# list of completers to use
+zstyle ':completion:*::::' completer _expand _complete _ignored _approximate
+zstyle ':completion:*' menu select=1 _complete _ignored _approximate
+
+# match uppercase from lowercase
+zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
+
+#
+# Functions
+#
+
+## Fix terminal
+# Credit: https://unix.stackexchange.com/a/299922
+fix() {
+ reset
+ stty sane
+ tput rs1
+ clear
+ echo -e "\033c"
+}
+
+## Check the existence/accessibility of a command
+# Credit: https://stackoverflow.com/a/677212/4856091
+function exists() {
+ # 'command' is POSIX-compliant and more portable;
+ # 'hash' only searches for commands;
+ # while 'type' also considers builtins and keywords.
+ type "$1" >/dev/null 2>&1
+}
+
+## Check whether the program is running
+function is_running() {
+ pgrep -x -u "${USER}" "$1" >/dev/null 2>&1
+}
+
+## Interactive move/rename: making renaming long filenames less sucks
+# Credit: http://chneukirchen.org/dotfiles/.zshrc
+function imv() {
+ local src dst
+ for src; do
+ [[ -e "$src" ]] || { print -u2 "$src: does not exist"; continue }
+ dst="$src"
+ vared dst
+ [[ "$src" != "$dst" ]] && mkdir -p ${dst:h} && mv -n $src $dst
+ done
+}
+
+## Print pre-defined C macros
+# Credit: http://chneukirchen.org/dotfiles/.zshrc
+ccdef() {
+ ${1:-cc} $@[2,-1] -dM -E - </dev/null
+}
+
+#
+# Terminal settings
+#
+
+# disable sending of start (Ctrl-Q) and stop (Ctrl-S) characters
+stty -ixoff
+# disable XON/XOFF flow control
+stty -ixon
+
+#
+# Vi-mode
+#
+# Credits:
+# * https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/vi-mode/vi-mode.plugin.zsh
+# * http://zshwiki.org/home/zle/bindkeys
+#
+
+# Updates editor information when the keymap changes.
+function zle-keymap-select() {
+ zle reset-prompt
+ zle -R
+}
+
+# Ensure that the prompt is redrawn when the terminal size changes.
+TRAPWINCH() {
+ zle && { zle reset-prompt; zle -R }
+}
+
+zle -N zle-keymap-select
+zle -N edit-command-line
+
+
+# NOTE: This will *reset* previous bindkey settings!
+bindkey -v
+
+# allow v to edit the command line (standard behaviour)
+autoload -Uz edit-command-line
+bindkey -M vicmd 'v' edit-command-line
+# allow ctrl-p, ctrl-n for navigate history (standard behaviour)
+bindkey '^P' up-history
+bindkey '^N' down-history
-# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=zsh: #
+# allow ctrl-h, ctrl-w, ctrl-? for char and word deletion (standard behaviour)
+bindkey '^?' backward-delete-char
+bindkey '^h' backward-delete-char
+bindkey '^w' backward-kill-word
+
+# allow ctrl-r for incremental history search
+bindkey -M viins '^r' history-incremental-search-backward
+bindkey -M vicmd '^r' history-incremental-search-backward
+
+# if mode indicator wasn't setup by theme, define default
+if [[ "$MODE_INDICATOR" == "" ]]; then
+ MODE_INDICATOR="%{$fg_bold[red]%}<%{$fg[red]%}<<%{$reset_color%}"
+fi
+
+function vi_mode_prompt_info() {
+ echo "${${KEYMAP/vicmd/$MODE_INDICATOR}/(main|viins)/}"
+}
+
+# define right prompt, if it wasn't defined by a theme
+if [[ "$RPS1" == "" && "$RPROMPT" == "" ]]; then
+ RPS1='$(vi_mode_prompt_info)'
+fi
+
+#
+# Key bindings
+# See zshzle(1)
+#
+# Credit:
+# * oh-my-zsh: https://github.com/robbyrussell/oh-my-zsh
+# lib/key-bindings.zsh
+#
+
+# 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
+
+# [Ctrl-r] - Search backward incrementally for a specified string.
+# The string may begin with ^ to anchor the search to the beginning of the line.
+bindkey '^r' history-incremental-search-backward
+
+# [PageUp] - Up a line of history
+if [[ "${terminfo[kpp]}" != "" ]]; then
+ bindkey "${terminfo[kpp]}" up-line-or-history
+fi
+# [PageDown] - Down a line of history
+if [[ "${terminfo[knp]}" != "" ]]; then
+ bindkey "${terminfo[knp]}" down-line-or-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
+
+# [Home] - Go to beginning of line
+if [[ "${terminfo[khome]}" != "" ]]; then
+ bindkey "${terminfo[khome]}" beginning-of-line
+fi
+# [End] - Go to end of line
+if [[ "${terminfo[kend]}" != "" ]]; then
+ bindkey "${terminfo[kend]}" end-of-line
+fi
+
+# [Space] - do history expansion
+bindkey ' ' magic-space
+# [Ctrl-RightArrow] - move forward one word
+bindkey '^[[1;5C' forward-word
+# [Ctrl-LeftArrow] - move backward one word
+bindkey '^[[1;5D' backward-word
+
+# [Shift-Tab] - move through the completion menu backwards
+if [[ "${terminfo[kcbt]}" != "" ]]; then
+ bindkey "${terminfo[kcbt]}" reverse-menu-complete
+fi
+
+# [Backspace] - delete backward
+bindkey '^?' backward-delete-char
+# [Delete] - delete forward
+if [[ "${terminfo[kdch1]}" != "" ]]; then
+ bindkey "${terminfo[kdch1]}" delete-char
+else
+ bindkey "^[[3~" delete-char
+ bindkey "^[3;5~" delete-char
+ bindkey "\e[3~" delete-char
+fi
+
+# Emacs style line editing
+bindkey "^K" kill-whole-line # ctrl-k
+bindkey "^R" history-incremental-search-backward # ctrl-r
+bindkey "^A" beginning-of-line # ctrl-a
+bindkey "^E" end-of-line # ctrl-e
+bindkey "[B" history-search-forward # down arrow
+bindkey "[A" history-search-backward # up arrow
+bindkey "^D" delete-char # ctrl-d
+bindkey "^F" forward-char # ctrl-f
+bindkey "^B" backward-char # ctrl-b
+
+# Bash-style word killing: word characters are alphanumeric characters only
+# see zshcontrib(1)
+autoload -U select-word-style
+select-word-style bash
+
+#
+# ZLE generic settings
+# See zshzle(1)
+#
+
+# Turn off ZLE bracketed paste in dumb and cons25 (DFly default console) term,
+# otherwise turn on ZLE bracketed-paste-magic
+# Credit: http://zmwangx.github.io/blog/2015-09-21-zsh-51-and-bracketed-paste.html
+# See also zshparam(1)
+if [[ ${TERM} == dumb ]] || [[ ${TERM} == cons25 ]]; then
+ unset zle_bracketed_paste
+else
+ autoload -Uz bracketed-paste-magic
+ zle -N bracketed-paste bracketed-paste-magic
+fi
+
+#
+# GnuPG integration
+#
+
+# NOTE:
+# Install both the `pinentry-gtk-2' and `pinentry-curses', and symlink
+# `pinentry-gtk-2' to `pinentry' as the default pinentry program, which
+# will fallback to the text mode when X11 is not avaiable (i.e.,
+# `$DISPLAY' is not set), e.g., through SSH logins.
+# `pinentry-gnome3' seems to have problem that cannot fallback to the
+# text mode ... (for unkown reasons ...)
+
+# This `GPG_TTY' variable should be set to the correct TTY where the shell
+# is running. See `gpg-agent(1)' for more details.
+export GPG_TTY=$(tty)
+
+# Make SSH to use `gpg-agent'.
+unset SSH_AGENT_PID
+if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
+ export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
+fi
+
+# Use curses-based pinentry for SSH logins
+# Credit: https://wiki.gentoo.org/wiki/GnuPG
+if [ -n "${SSH_CONNECTION}" ] ;then
+ export PINENTRY_USER_DATA="USE_CURSES=1"
+fi
+
+# Let pinentry know which console to display in for `ssh-agent'.
+#
+# Since the 'ssh-agent' protocol does not contain a mechanism for telling
+# the agent on which terminal/display it is running, gpg-agent's
+# ssh-support can just use the TTY or X display when `gpg-agent' has been
+# started, which may be before the X session startup. Therefore, when the
+# switched to the X session, or login remotely through SSH, the `pinentry'
+# will get popped up on whatever display the `gpg-agent' has been started
+# or may just fail. In this case, a manual update is necessary.
+#
+# This will set startup TTY and X11 DISPLAY variables to the values of
+# this session.
+#
+# Credits:
+# * GnuPG: Commonly Seen Problems
+# https://www.gnupg.org/documentation/manuals/gnupg/Common-Problems.html
+# * `gpg-agent(1)': option `--enable-ssh-support'
+# * http://blog.mrloop.com/workflow/2017/02/09/pin-entry.html
+#
+update-gpg-tty() {
+ gpg-connect-agent updatestartuptty /bye >/dev/null 2>&1 || true
+}
+autoload -U add-zsh-hook
+add-zsh-hook preexec update-gpg-tty
+
+# Delete all identities from the `gpg-agent', which is similar to
+# `ssh-add -D`.
+# Credit: http://blog.mrloop.com/workflow/2017/02/09/pin-entry.html
+ssh-delete() {
+ grep -o '^[A-Z0-9]*' ${HOME}/.gnupg/sshcontrol | \
+ xargs -I'%' rm ${HOME}/.gnupg/private-keys-v1.d/'%'.key
+ echo "" > ${HOME}/.gnupg/sshcontrol
+}
+
+#
+# Aliases
+#
+
+alias zhelp='run-help'
+
+alias ..='cd ../'
+alias ...='cd ../../'
+alias ....='cd ../../../'
+alias cd..='cd ..'
+alias d='dirs -v | head -10'
+alias po=popd
+alias pu=pushd
+
+if [[ -n "${IS_LINUX}" ]]; then
+ alias ls='ls --color=auto'
+elif [[ -n "${IS_BSD}" ]] || [[ -n "${IS_MAC}" ]]; then
+ alias ls='ls -G'
+fi
+alias l='ls -lah'
+alias la='ls -lAh'
+alias ll='ls -lh'
+alias lsa='ls -lah'
+
+# Do not use `GREP_OPTIONS`
+alias grep='grep --color=auto'
+
+exists "vi" || alias vi=vim
+exists "safe-rm" && alias rm=safe-rm
+
+#
+# Evnironment variables
+#
+
+# NOTE:
+# Generic environment variables and those needing been set only once
+# should go to `~/.profile'.
+
+# colors for BSD ls
+if [[ -n "${IS_BSD}" ]]; then
+ export CLICOLOR=1
+ export LSCOLORS=exfxcxdxbxegedabagacad
+fi
+
+# Color setup for `ls': `LS_COLORS'
+# NOTE: For unknown reason, the `LS_COLORS' variable get overridden when
+# it is set in `~/.profile'.
+if exists dircolors; then
+ eval $(dircolors -b)
+fi
+
+#
+# Local configurations
+#
+
+[ -r ~/.zshrc.local ] && source ~/.zshrc.local || true