From 3e7fae06aed9242d38c1a876e68d4a865dd63acd Mon Sep 17 00:00:00 2001 From: Luca Bilke Date: Mon, 10 Jun 2024 01:45:17 +0200 Subject: [PATCH] clean up ZSH config --- .config/zsh/.zshrc | 16 +- .config/zsh/configs/{widgets => 1-functions} | 3 +- .../2-setup} | 33 ++ .config/zsh/configs/aliases | 57 ++-- .config/zsh/configs/bindings | 2 + .config/zsh/configs/setup | 32 -- .config/zsh/plugins/fzf/bindings.zsh | 111 ------ .config/zsh/plugins/fzf/completions.zsh | 323 ------------------ 8 files changed, 73 insertions(+), 504 deletions(-) rename .config/zsh/configs/{widgets => 1-functions} (98%) rename .config/zsh/{plugins/virtualenvwrapper.plugin.zsh => configs/2-setup} (58%) mode change 100755 => 100644 delete mode 100644 .config/zsh/configs/setup delete mode 100644 .config/zsh/plugins/fzf/bindings.zsh delete mode 100644 .config/zsh/plugins/fzf/completions.zsh diff --git a/.config/zsh/.zshrc b/.config/zsh/.zshrc index 807c3859a..cf5785c6d 100644 --- a/.config/zsh/.zshrc +++ b/.config/zsh/.zshrc @@ -1,14 +1,12 @@ #!/bin/zsh -source "$ZDOTDIR/configs/widgets" -source "$ZDOTDIR/configs/setup" -source "$ZDOTDIR/configs/bindings" -source "$ZDOTDIR/configs/aliases" -source "$ZDOTDIR/configs/hashes" -source "$ZDOTDIR/configs/prompt" -[ -r "$ZDOTDIR/configs/host-setup" ] && source "$ZDOTDIR/configs/host-setup" -source "$ZDOTDIR/plugins/fzf/bindings.zsh" -source "$ZDOTDIR/plugins/virtualenvwrapper.plugin.zsh" +for f in \ + "$ZDOTDIR"/configs/* \ + /usr/share/zsh/plugins/*/*.plugin.zsh \ + /usr/share/fzf/*.zsh +do + source $f +done export GPG_TTY="$(tty)" gpg-connect-agent updatestartuptty /bye >/dev/null 2>&1 diff --git a/.config/zsh/configs/widgets b/.config/zsh/configs/1-functions similarity index 98% rename from .config/zsh/configs/widgets rename to .config/zsh/configs/1-functions index b2abda34a..acc927911 100644 --- a/.config/zsh/configs/widgets +++ b/.config/zsh/configs/1-functions @@ -1,5 +1,6 @@ #!/bin/zsh -venv_prompt() { + +function venv_prompt() { [[ -n ${VIRTUAL_ENV} ]] || return echo -e "%F{yellow}%f ${VIRTUAL_ENV:t:gs/%/%%}" } diff --git a/.config/zsh/plugins/virtualenvwrapper.plugin.zsh b/.config/zsh/configs/2-setup old mode 100755 new mode 100644 similarity index 58% rename from .config/zsh/plugins/virtualenvwrapper.plugin.zsh rename to .config/zsh/configs/2-setup index dd0f38bc4..f88fcce00 --- a/.config/zsh/plugins/virtualenvwrapper.plugin.zsh +++ b/.config/zsh/configs/2-setup @@ -1,3 +1,36 @@ +#!/bin/zsh + +[ ! -f $XDG_DATA_HOME/zsh/history ] && mkdir -p $XDG_DATA_HOME/zsh && touch $XDG_DATA_HOME/zsh/history + +fpath=($XDG_CONFIG_HOME/zsh/completions $fpath) + +setopt hist_ignore_all_dups hist_reduce_blanks hist_verify bang_hist interactive_comments autocd noflowcontrol longlistjobs nonomatch notify hash_list_all appendhistory sharehistory histignorespace prompt_subst + +autoload -Uz colors && colors +autoload -Uz edit-command-line && zle -N edit-command-line +autoload -Uz add-zsh-hook +autoload -Uz compinit +autoload -Uz edit-command-line + +zstyle ':completion:*' menu select matcher-list 'm:{a-z}={A-Za-z}' +zmodload zsh/complist +compinit +_comp_options+=(globdots) + +zle_highlight+=(paste:none) + +# Set the titlestring +add-zsh-hook preexec write_title_cmd +add-zsh-hook precmd write_title_wd +add-zsh-hook preexec reset_beam + +export HISTSIZE=10000000 +export SAVEHIST=10000000 +export HISTFILE="$XDG_DATA_HOME/zsh/history" +export KEYTIMEOUT=1 + +# Virtualenvwrapper Setup + source "$(which virtualenvwrapper_lazy.sh)" type workon >/dev/null 2>&1 [ -z "$WORKON_HOME" ] && { diff --git a/.config/zsh/configs/aliases b/.config/zsh/configs/aliases index 2d24aedfb..a108f7fbb 100644 --- a/.config/zsh/configs/aliases +++ b/.config/zsh/configs/aliases @@ -1,51 +1,52 @@ -#!/bin/sh +#!/bin/zsh + # shellcheck disable=SC2142 # sudo not required for some system commands for command in mount umount xbps-install xbps-remove su shutdown poweroff reboot; do - # shellcheck disable=SC2139 - command -v $command 1>/dev/null 2>&1 && alias $command="sudo $command" + # shellcheck disable=SC2139 + command -v $command 1>/dev/null 2>&1 && alias $command="sudo $command" done unset command # Colorization alias \ - ls="ls --color=auto --group-directories-first" \ - grep="grep --color=auto" \ - diff="diff --color=auto" \ - ccat="highlight --out-format=ansi" \ - grep="grep --color=auto" \ - diff="diff --color=auto" \ - ip="ip -color=auto" + ls="ls --color=auto --group-directories-first" \ + grep="grep --color=auto" \ + diff="diff --color=auto" \ + ccat="highlight --out-format=ansi" \ + grep="grep --color=auto" \ + diff="diff --color=auto" \ + ip="ip -color=auto" # Common flags alias \ - vim="nvim" \ - cp="cp -iv" \ - mv="mv -iv" \ - rm="rm -vI" \ - bc="bc -ql" \ - mkd="mkdir -pv" \ - tldr="tldr -s" \ - ffmpeg="ffmpeg -hide_banner" \ - nvidia-settings="nvidia-settings --config=\$XDG_CONFIG_HOME/nvidia/settings" \ + vim="nvim" \ + cp="cp -iv" \ + mv="mv -iv" \ + rm="rm -vI" \ + bc="bc -ql" \ + mkd="mkdir -pv" \ + tldr="tldr -s" \ + ffmpeg="ffmpeg -hide_banner" \ + nvidia-settings="nvidia-settings --config=\$XDG_CONFIG_HOME/nvidia/settings" \ pltd="perltidy -b -bext='/' -l=120 -vmll -ci 4 -xci -nolq -nola -nolc -pt=2 -sbt=2 -bt=2 -bbt=2 -tso -nsfs -ce -cpb -otr -wn -wfc -sot -sct -drc -mbl=1 -blbs=2 -blbp=2" - less="less -r" +less="less -r" # Shortening alias \ - ka="killall" \ - ll="ls -lhpANX --color=auto --group-directories-first" \ - subup="git submodule update --remote --recursive --merge" + ka="killall" \ + ll="ls -lhpANX --color=auto --group-directories-first" \ + subup="git submodule update --remote --recursive --merge" # Quasi functions alias \ - xgetkeys="xev | sed -ne '/^KeyPress/,/^$/p'" \ - whed='() { $EDITOR $(which "$1") }' \ - xpick="xprop | awk ' + xgetkeys="xev | sed -ne '/^KeyPress/,/^$/p'" \ + whed='() { $EDITOR $(which "$1") }' \ + xpick="xprop | awk ' /^WM_CLASS/{sub(/.* =/, \"instance:\"); sub(/,/, \"\nclass:\"); print} /^WM_NAME/{sub(/.* =/, \"title:\"); print}'" # Void specific aliases alias \ - x="xbps-install" \ - xr="xbps-remove" \ + x="xbps-install" \ + xr="xbps-remove" diff --git a/.config/zsh/configs/bindings b/.config/zsh/configs/bindings index de6ce5992..f4648b168 100644 --- a/.config/zsh/configs/bindings +++ b/.config/zsh/configs/bindings @@ -1,3 +1,5 @@ +#!/bin/zsh + # vi mode bindkey -v diff --git a/.config/zsh/configs/setup b/.config/zsh/configs/setup deleted file mode 100644 index 42c714f49..000000000 --- a/.config/zsh/configs/setup +++ /dev/null @@ -1,32 +0,0 @@ -[ ! -f $XDG_DATA_HOME/zsh/history ] && mkdir -p $XDG_DATA_HOME/zsh && touch $XDG_DATA_HOME/zsh/history - -fpath=($XDG_CONFIG_HOME/zsh/completions $fpath) - -setopt HIST_IGNORE_ALL_DUPS HIST_REDUCE_BLANKS HIST_VERIFY BANG_HIST interactive_comments autocd noflowcontrol longlistjobs nonomatch notify hash_list_all share_history histignorespace PROMPT_SUBST - -autoload -Uz colors && colors -autoload -Uz edit-command-line && zle -N edit-command-line -autoload -Uz add-zsh-hook -autoload -Uz compinit -autoload -Uz edit-command-line - -zstyle ':completion:*' menu select -zmodload zsh/complist -compinit -_comp_options+=(globdots) - -zle_highlight+=(paste:none) - -# Set the titlestring -add-zsh-hook preexec write_title_cmd -add-zsh-hook precmd write_title_wd -add-zsh-hook preexec reset_beam - -export HISTSIZE=10000000 -export SAVEHIST=10000000 -export HISTFILE="$XDG_DATA_HOME/zsh/history" -export KEYTIMEOUT=1 - - -source $ZDOTDIR/configs/hashes -source $ZDOTDIR/configs/prompt diff --git a/.config/zsh/plugins/fzf/bindings.zsh b/.config/zsh/plugins/fzf/bindings.zsh deleted file mode 100644 index 2cf10b9e3..000000000 --- a/.config/zsh/plugins/fzf/bindings.zsh +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/zsh - -# TODO: move this into other zsh config - -# Key bindings -# ------------ - -# The code at the top and the bottom of this file is the same as in completion.zsh. -# Refer to that file for explanation. -if 'zmodload' 'zsh/parameter' 2>'/dev/null' && (( ${+options} )); then - __fzf_key_bindings_options="options=(${(j: :)${(kv)options[@]}})" -else - () { - __fzf_key_bindings_options="setopt" - 'local' '__fzf_opt' - for __fzf_opt in "${(@)${(@f)$(set -o)}%% *}"; do - if [[ -o "$__fzf_opt" ]]; then - __fzf_key_bindings_options+=" -o $__fzf_opt" - else - __fzf_key_bindings_options+=" +o $__fzf_opt" - fi - done - } -fi - -'emulate' 'zsh' '-o' 'no_aliases' - -{ - -[[ -o interactive ]] || return 0 - -# CTRL-T - Paste the selected file path(s) into the command line -__fsel() { - local cmd="${FZF_CTRL_T_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \ - -o -type f -print \ - -o -type d -print \ - -o -type l -print 2> /dev/null | cut -b3-"}" - setopt localoptions pipefail no_aliases 2> /dev/null - local item - eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_CTRL_T_OPTS" $(__fzfcmd) -m "$@" | while read item; do - echo -n "${(q)item} " - done - local ret=$? - echo - return $ret -} - -__fzfcmd() { - [ -n "$TMUX_PANE" ] && { [ "${FZF_TMUX:-0}" != 0 ] || [ -n "$FZF_TMUX_OPTS" ]; } && - echo "fzf-tmux ${FZF_TMUX_OPTS:--d${FZF_TMUX_HEIGHT:-40%}} -- " || echo "fzf" -} - -fzf-file-widget() { - LBUFFER="${LBUFFER}$(__fsel)" - local ret=$? - zle reset-prompt - return $ret -} -zle -N fzf-file-widget -bindkey -M emacs '^T' fzf-file-widget -bindkey -M vicmd '^T' fzf-file-widget -bindkey -M viins '^T' fzf-file-widget - -# ALT-C - cd into the selected directory -fzf-cd-widget() { - local cmd="${FZF_ALT_C_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \ - -o -type d -print 2> /dev/null | cut -b3-"}" - setopt localoptions pipefail no_aliases 2> /dev/null - local dir="$(eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_ALT_C_OPTS" $(__fzfcmd) +m)" - if [[ -z "$dir" ]]; then - zle redisplay - return 0 - fi - zle push-line # Clear buffer. Auto-restored on next prompt. - BUFFER="builtin cd -- ${(q)dir}" - zle accept-line - local ret=$? - unset dir # ensure this doesn't end up appearing in prompt expansion - zle reset-prompt - return $ret -} -zle -N fzf-cd-widget -bindkey -M emacs '\ec' fzf-cd-widget -bindkey -M vicmd '\ec' fzf-cd-widget -bindkey -M viins '\ec' fzf-cd-widget - -# CTRL-R - Paste the selected command from history into the command line -fzf-history-widget() { - local selected num - setopt localoptions noglobsubst noposixbuiltins pipefail no_aliases 2> /dev/null - selected=( $(fc -rl 1 | awk '{ cmd=$0; sub(/^[ \t]*[0-9]+\**[ \t]+/, "", cmd); if (!seen[cmd]++) print $0 }' | - FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} $FZF_DEFAULT_OPTS -n2..,.. --tiebreak=index --bind=ctrl-r:toggle-sort,ctrl-z:ignore $FZF_CTRL_R_OPTS --query=${(qqq)LBUFFER} +m" $(__fzfcmd)) ) - local ret=$? - if [ -n "$selected" ]; then - num=$selected[1] - if [ -n "$num" ]; then - zle vi-fetch-history -n $num - fi - fi - zle reset-prompt - return $ret -} -zle -N fzf-history-widget -bindkey -M emacs '^R' fzf-history-widget -bindkey -M vicmd '^R' fzf-history-widget -bindkey -M viins '^R' fzf-history-widget - -} always { - eval $__fzf_key_bindings_options - 'unset' '__fzf_key_bindings_options' -} diff --git a/.config/zsh/plugins/fzf/completions.zsh b/.config/zsh/plugins/fzf/completions.zsh deleted file mode 100644 index 2577eacb3..000000000 --- a/.config/zsh/plugins/fzf/completions.zsh +++ /dev/null @@ -1,323 +0,0 @@ -# ____ ____ -# / __/___ / __/ -# / /_/_ / / /_ -# / __/ / /_/ __/ -# /_/ /___/_/ completion.zsh -# -# - $FZF_TMUX (default: 0) -# - $FZF_TMUX_OPTS (default: '-d 40%') -# - $FZF_COMPLETION_TRIGGER (default: '**') -# - $FZF_COMPLETION_OPTS (default: empty) - -# Both branches of the following `if` do the same thing -- define -# __fzf_completion_options such that `eval $__fzf_completion_options` sets -# all options to the same values they currently have. We'll do just that at -# the bottom of the file after changing options to what we prefer. -# -# IMPORTANT: Until we get to the `emulate` line, all words that *can* be quoted -# *must* be quoted in order to prevent alias expansion. In addition, code must -# be written in a way works with any set of zsh options. This is very tricky, so -# careful when you change it. -# -# Start by loading the builtin zsh/parameter module. It provides `options` -# associative array that stores current shell options. -if 'zmodload' 'zsh/parameter' 2>'/dev/null' && (( ${+options} )); then - # This is the fast branch and it gets taken on virtually all Zsh installations. - # - # ${(kv)options[@]} expands to array of keys (option names) and values ("on" - # or "off"). The subsequent expansion# with (j: :) flag joins all elements - # together separated by spaces. __fzf_completion_options ends up with a value - # like this: "options=(shwordsplit off aliases on ...)". - __fzf_completion_options="options=(${(j: :)${(kv)options[@]}})" -else - # This branch is much slower because it forks to get the names of all - # zsh options. It's possible to eliminate this fork but it's not worth the - # trouble because this branch gets taken only on very ancient or broken - # zsh installations. - () { - # That `()` above defines an anonymous function. This is essentially a scope - # for local parameters. We use it to avoid polluting global scope. - 'local' '__fzf_opt' - __fzf_completion_options="setopt" - # `set -o` prints one line for every zsh option. Each line contains option - # name, some spaces, and then either "on" or "off". We just want option names. - # Expansion with (@f) flag splits a string into lines. The outer expansion - # removes spaces and everything that follow them on every line. __fzf_opt - # ends up iterating over option names: shwordsplit, aliases, etc. - for __fzf_opt in "${(@)${(@f)$(set -o)}%% *}"; do - if [[ -o "$__fzf_opt" ]]; then - # Option $__fzf_opt is currently on, so remember to set it back on. - __fzf_completion_options+=" -o $__fzf_opt" - else - # Option $__fzf_opt is currently off, so remember to set it back off. - __fzf_completion_options+=" +o $__fzf_opt" - fi - done - # The value of __fzf_completion_options here looks like this: - # "setopt +o shwordsplit -o aliases ..." - } -fi - -# Enable the default zsh options (those marked with in `man zshoptions`) -# but without `aliases`. Aliases in functions are expanded when functions are -# defined, so if we disable aliases here, we'll be sure to have no pesky -# aliases in any of our functions. This way we won't need prefix every -# command with `command` or to quote every word to defend against global -# aliases. Note that `aliases` is not the only option that's important to -# control. There are several others that could wreck havoc if they are set -# to values we don't expect. With the following `emulate` command we -# sidestep this issue entirely. -'emulate' 'zsh' '-o' 'no_aliases' - -# This brace is the start of try-always block. The `always` part is like -# `finally` in lesser languages. We use it to *always* restore user options. -{ - -# Bail out if not interactive shell. -[[ -o interactive ]] || return 0 - -# To use custom commands instead of find, override _fzf_compgen_{path,dir} -if ! declare -f _fzf_compgen_path > /dev/null; then - _fzf_compgen_path() { - echo "$1" - command find -L "$1" \ - -name .git -prune -o -name .hg -prune -o -name .svn -prune -o \( -type d -o -type f -o -type l \) \ - -a -not -path "$1" -print 2> /dev/null | sed 's@^\./@@' - } -fi - -if ! declare -f _fzf_compgen_dir > /dev/null; then - _fzf_compgen_dir() { - command find -L "$1" \ - -name .git -prune -o -name .hg -prune -o -name .svn -prune -o -type d \ - -a -not -path "$1" -print 2> /dev/null | sed 's@^\./@@' - } -fi - -########################################################### - -__fzf_comprun() { - if [[ "$(type _fzf_comprun 2>&1)" =~ function ]]; then - _fzf_comprun "$@" - elif [ -n "$TMUX_PANE" ] && { [ "${FZF_TMUX:-0}" != 0 ] || [ -n "$FZF_TMUX_OPTS" ]; }; then - shift - if [ -n "$FZF_TMUX_OPTS" ]; then - fzf-tmux ${(Q)${(Z+n+)FZF_TMUX_OPTS}} -- "$@" - else - fzf-tmux -d ${FZF_TMUX_HEIGHT:-40%} -- "$@" - fi - else - shift - fzf "$@" - fi -} - -# Extract the name of the command. e.g. foo=1 bar baz** -__fzf_extract_command() { - local token tokens - tokens=(${(z)1}) - for token in $tokens; do - token=${(Q)token} - if [[ "$token" =~ [[:alnum:]] && ! "$token" =~ "=" ]]; then - echo "$token" - return - fi - done - echo "${tokens[1]}" -} - -__fzf_generic_path_completion() { - local base lbuf cmd compgen fzf_opts suffix tail dir leftover matches - base=$1 - lbuf=$2 - cmd=$(__fzf_extract_command "$lbuf") - compgen=$3 - fzf_opts=$4 - suffix=$5 - tail=$6 - - setopt localoptions nonomatch - eval "base=$base" - [[ $base = *"/"* ]] && dir="$base" - while [ 1 ]; do - if [[ -z "$dir" || -d ${dir} ]]; then - leftover=${base/#"$dir"} - leftover=${leftover/#\/} - [ -z "$dir" ] && dir='.' - [ "$dir" != "/" ] && dir="${dir/%\//}" - matches=$(eval "$compgen $(printf %q "$dir")" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS" __fzf_comprun "$cmd" ${(Q)${(Z+n+)fzf_opts}} -q "$leftover" | while read item; do - echo -n "${(q)item}$suffix " - done) - matches=${matches% } - if [ -n "$matches" ]; then - LBUFFER="$lbuf$matches$tail" - fi - zle reset-prompt - break - fi - dir=$(dirname "$dir") - dir=${dir%/}/ - done -} - -_fzf_path_completion() { - __fzf_generic_path_completion "$1" "$2" _fzf_compgen_path \ - "-m" "" " " -} - -_fzf_dir_completion() { - __fzf_generic_path_completion "$1" "$2" _fzf_compgen_dir \ - "" "/" "" -} - -_fzf_feed_fifo() ( - command rm -f "$1" - mkfifo "$1" - cat <&0 > "$1" & -) - -_fzf_complete() { - setopt localoptions ksh_arrays - # Split arguments around -- - local args rest str_arg i sep - args=("$@") - sep= - for i in {0..${#args[@]}}; do - if [[ "${args[$i]}" = -- ]]; then - sep=$i - break - fi - done - if [[ -n "$sep" ]]; then - str_arg= - rest=("${args[@]:$((sep + 1)):${#args[@]}}") - args=("${args[@]:0:$sep}") - else - str_arg=$1 - args=() - shift - rest=("$@") - fi - - local fifo lbuf cmd matches post - fifo="${TMPDIR:-/tmp}/fzf-complete-fifo-$$" - lbuf=${rest[0]} - cmd=$(__fzf_extract_command "$lbuf") - post="${funcstack[1]}_post" - type $post > /dev/null 2>&1 || post=cat - - _fzf_feed_fifo "$fifo" - matches=$(FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS $str_arg" __fzf_comprun "$cmd" "${args[@]}" -q "${(Q)prefix}" < "$fifo" | $post | tr '\n' ' ') - if [ -n "$matches" ]; then - LBUFFER="$lbuf$matches" - fi - command rm -f "$fifo" -} - -_fzf_complete_telnet() { - _fzf_complete +m -- "$@" < <( - command grep -v '^\s*\(#\|$\)' /etc/hosts | command grep -Fv '0.0.0.0' | - awk '{if (length($2) > 0) {print $2}}' | sort -u - ) -} - -_fzf_complete_ssh() { - _fzf_complete +m -- "$@" < <( - setopt localoptions nonomatch - command cat <(command tail -n +1 ~/.ssh/config ~/.ssh/config.d/* /etc/ssh/ssh_config 2> /dev/null | command grep -i '^\s*host\(name\)\? ' | awk '{for (i = 2; i <= NF; i++) print $1 " " $i}' | command grep -v '[*?]') \ - <(command grep -oE '^[[a-z0-9.,:-]+' ~/.ssh/known_hosts | tr ',' '\n' | tr -d '[' | awk '{ print $1 " " $1 }') \ - <(command grep -v '^\s*\(#\|$\)' /etc/hosts | command grep -Fv '0.0.0.0') | - awk '{if (length($2) > 0) {print $2}}' | sort -u - ) -} - -_fzf_complete_export() { - _fzf_complete -m -- "$@" < <( - declare -xp | sed 's/=.*//' | sed 's/.* //' - ) -} - -_fzf_complete_unset() { - _fzf_complete -m -- "$@" < <( - declare -xp | sed 's/=.*//' | sed 's/.* //' - ) -} - -_fzf_complete_unalias() { - _fzf_complete +m -- "$@" < <( - alias | sed 's/=.*//' - ) -} - -_fzf_complete_kill() { - _fzf_complete -m --preview 'echo {}' --preview-window down:3:wrap --min-height 15 -- "$@" < <( - command ps -ef | sed 1d - ) -} - -_fzf_complete_kill_post() { - awk '{print $2}' -} - -fzf-completion() { - local tokens cmd prefix trigger tail matches lbuf d_cmds - setopt localoptions noshwordsplit noksh_arrays noposixbuiltins - - # http://zsh.sourceforge.net/FAQ/zshfaq03.html - # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags - tokens=(${(z)LBUFFER}) - if [ ${#tokens} -lt 1 ]; then - zle ${fzf_default_completion:-expand-or-complete} - return - fi - - cmd=$(__fzf_extract_command "$LBUFFER") - - # Explicitly allow for empty trigger. - trigger=${FZF_COMPLETION_TRIGGER-'**'} - [ -z "$trigger" -a ${LBUFFER[-1]} = ' ' ] && tokens+=("") - - # When the trigger starts with ';', it becomes a separate token - if [[ ${LBUFFER} = *"${tokens[-2]}${tokens[-1]}" ]]; then - tokens[-2]="${tokens[-2]}${tokens[-1]}" - tokens=(${tokens[0,-2]}) - fi - - lbuf=$LBUFFER - tail=${LBUFFER:$(( ${#LBUFFER} - ${#trigger} ))} - - # Trigger sequence given - if [ ${#tokens} -gt 1 -a "$tail" = "$trigger" ]; then - d_cmds=(${=FZF_COMPLETION_DIR_COMMANDS:-cd pushd rmdir}) - - [ -z "$trigger" ] && prefix=${tokens[-1]} || prefix=${tokens[-1]:0:-${#trigger}} - [ -n "${tokens[-1]}" ] && lbuf=${lbuf:0:-${#tokens[-1]}} - - if eval "type _fzf_complete_${cmd} > /dev/null"; then - prefix="$prefix" eval _fzf_complete_${cmd} ${(q)lbuf} - zle reset-prompt - elif [ ${d_cmds[(i)$cmd]} -le ${#d_cmds} ]; then - _fzf_dir_completion "$prefix" "$lbuf" - else - _fzf_path_completion "$prefix" "$lbuf" - fi - # Fall back to default completion - else - zle ${fzf_default_completion:-expand-or-complete} - fi -} - -[ -z "$fzf_default_completion" ] && { - binding=$(bindkey '^I') - [[ $binding =~ 'undefined-key' ]] || fzf_default_completion=$binding[(s: :w)2] - unset binding -} - -zle -N fzf-completion -bindkey '^I' fzf-completion - -} always { - # Restore the original options. - eval $__fzf_completion_options - 'unset' '__fzf_completion_options' -}