From d2a4672e74290fc8a0662fb459e8e268b72a0fdf Mon Sep 17 00:00:00 2001 From: Aaron LI Date: Thu, 3 Oct 2019 11:53:02 +0800 Subject: zsh: Merge zsh/* configs into zshrc Meanwhile, drop some unused configurations ... --- _zsh/00-checks.zsh | 19 -- _zsh/10-param.zsh | 13 -- _zsh/10-setopt.zsh | 71 ------- _zsh/20-colors.zsh | 20 -- _zsh/30-prompt.zsh | 50 ----- _zsh/40-completion.zsh | 61 ------ _zsh/40-functions.zsh | 155 -------------- _zsh/40-hooks.zsh | 19 -- _zsh/50-term.zsh | 13 -- _zsh/50-vi-mode.zsh | 62 ------ _zsh/60-bindkeys.zsh | 104 ---------- _zsh/60-zle.zsh | 20 -- _zsh/70-history.zsh | 34 --- _zsh/80-emacs.zsh | 43 ---- _zsh/80-gpg.zsh | 64 ------ _zsh/80-tmux.zsh | 37 ---- _zsh/90-aliases.zsh | 31 --- _zsh/90-exports.zsh | 23 --- _zshrc | 548 ++++++++++++++++++++++++++++++++++++++++++++++--- 19 files changed, 514 insertions(+), 873 deletions(-) delete mode 100644 _zsh/00-checks.zsh delete mode 100644 _zsh/10-param.zsh delete mode 100644 _zsh/10-setopt.zsh delete mode 100644 _zsh/20-colors.zsh delete mode 100644 _zsh/30-prompt.zsh delete mode 100644 _zsh/40-completion.zsh delete mode 100644 _zsh/40-functions.zsh delete mode 100644 _zsh/40-hooks.zsh delete mode 100644 _zsh/50-term.zsh delete mode 100644 _zsh/50-vi-mode.zsh delete mode 100644 _zsh/60-bindkeys.zsh delete mode 100644 _zsh/60-zle.zsh delete mode 100644 _zsh/70-history.zsh delete mode 100644 _zsh/80-emacs.zsh delete mode 100644 _zsh/80-gpg.zsh delete mode 100644 _zsh/80-tmux.zsh delete mode 100644 _zsh/90-aliases.zsh delete mode 100644 _zsh/90-exports.zsh 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 -# ''. -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 ' 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 - $# )) && 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/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 +# ''. +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 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 -- cgit v1.2.2