dotfiles/.zsh/fzy.zsh

145 lines
2.6 KiB
Bash

#! /bin/zsh
#
# zsh-fzy.plugin.zsh
# Copyright (C) 2018 Adrian Perez <aperez@igalia.com>
#
# Distributed under terms of the MIT license.
#
ZSH_FZY_TMUX="${0:A:h}/fzy-tmux"
if command -v fzf > /dev/null 2>&1; then
ZSH_FZY=fzf
elif command -v fzy > /dev/null 2>&1; then
ZSH_FZY=fzy
else
return 1
fi
function fzy-history-default-command
{
builtin fc -l -n -r 1
}
function fzy-file-default-command
{
command find -L . \( -path '*/\.*' -o -fstype dev -o -fstype proc \) -prune \
-o -type f -print \
-o -type d -print \
-o -type l -print 2> /dev/null | sed 1d | cut -b3-
}
function fzy-cd-default-command
{
command find -L . \( -path '*/\.*' -o -fstype dev -o -fstype proc \) -prune \
-o -type d -print 2> /dev/null | sed 1d | cut -b3-
}
function fzy-proc-default-command
{
command ps -ef | sed 1d
}
function __fzy_cmd
{
emulate -L zsh
local widget=$1
shift
local -a args=( )
local value
if zstyle -s ":fzy:${widget}" prompt value ; then
args+=( "--prompt=${value}" )
else
args+=( "--prompt=${widget} >> " )
fi
if zstyle -s ":fzy:${widget}" lines value ; then
if [[ ${value} = min:* ]]; then
local pos
print '\e[6n' > /dev/tty
read -rsd 'R' pos < /dev/tty
pos=${pos#*\[}
pos=${pos%;*}
value=${value#min:}
local available_lines=$(( LINES - pos - 1 ))
if [[ ${available_lines} -gt ${value} ]]; then
value=${available_lines}
fi
fi
args+=( -l "${value}" )
fi
if zstyle -t ":fzy:${widget}" show-scores ; then
args+=( -s )
fi
local -a cmd
zstyle -a ":fzy:${widget}" command cmd || cmd=( )
if [[ ${#cmd} -eq 0 ]] ; then
cmd=("fzy-${widget}-default-command")
fi
if zstyle -t :fzy:tmux enabled && [[ -n ${TMUX} ]] ; then
"${cmd[@]}" | "${ZSH_FZY_TMUX}" -- "${args[@]}" "$@"
else
"${cmd[@]}" | "${ZSH_FZY}" "${args[@]}" "$@"
fi
}
function __fzy_fsel
{
__fzy_cmd file | while read -r item ; do
echo -n "${(q)item} "
done
echo
}
function __fzy_psel
{
__fzy_cmd proc | awk '{print $2}' | tr '\n' ' '
}
function fzy-file-widget
{
emulate -L zsh
zle -I
LBUFFER="${LBUFFER}$(__fzy_fsel)"
zle reset-prompt
}
function fzy-cd-widget
{
emulate -L zsh
zle -I
cd "${$(__fzy_cmd cd):-.}"
zle reset-prompt
}
function fzy-history-widget
{
emulate -L zsh
zle -I
local S=$(__fzy_cmd history -q "${LBUFFER//$/\\$}")
if [[ -n $S ]] ; then
LBUFFER=$S
fi
zle reset-prompt
}
function fzy-proc-widget
{
emulate -L zsh
zle -I
LBUFFER="${LBUFFER}$(__fzy_psel)"
zle reset-prompt
}
zle -N fzy-file-widget
zle -N fzy-cd-widget
zle -N fzy-history-widget
zle -N fzy-proc-widget
bindkey '\ec' fzy-cd-widget
bindkey '^T' fzy-file-widget
bindkey '^R' fzy-history-widget
bindkey '^P' fzy-proc-widget