You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

203 lines
5.9 KiB

# this rg command will get a list of files that are not in gitignore or similar
export FZF_DEFAULT_COMMAND="fd --type f --hidden --follow --color=always --exclude .git --exclude .PlayOnLinux --exclude \"PlayOnLinux\'s virtual drives\""
export FZF_DEFAULT_OPTS="--reverse --ansi --height 40%"
export FZF_CTRL_R_OPTS=""
# this is the argument completeion optionm, use the same command
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_CTRL_T_OPTS="$FZF_DEFAULT_OPTS --ansi --preview \"bat --style=numbers --color=always {}\""
sourced="False"
if [ -e /usr/share/fzf/key-bindings.zsh ]; then
source /usr/share/fzf/key-bindings.zsh
source /usr/share/fzf/completion.zsh
sourced="True"
elif [ -e /usr/share/doc/fzf/examples/key-bindings.zsh ]; then
source /usr/share/doc/fzf/examples/key-bindings.zsh
source /usr/share/doc/fzf/examples/completion.zsh
sourced="True"
fi
if [ "$sourced" = "True" ]; then
# CTRL-W to select a wordlist
__fsel_wordlist() {
local cmd="$FZF_DEFAULT_COMMAND --exclude \*.md --exclude \*.gif --exclude \*.jpg --exclude \*.png --exclude \*.lua --exclude \*.jar --exclude \*.pl '' /usr/share/wordlists/ | sed 's#^/usr/share/wordlists/##'"
setopt localoptions pipefail 2> /dev/null
eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS $FZF_CTRL_T_OPTS --preview 'bat --color=always {}'" $(__fzfcmd) -m "$@" | while read item; do
echo -n "${(q)item} "
done
local ret=$?
echo
return $ret
}
fzf-wordlist-widget() {
LBUFFER="${LBUFFER}$(__fsel_wordlist)"
local ret=$?
zle reset-prompt
return $ret
}
#zle -N fzf-wordlist-widget
#bindkey '^W' fzf-wordlist-widget
# CTRL-P to select an IP address from project host
__fsel_ip() {
setopt localoptions pipefail 2> /dev/null
project hosts ip --fzf
local ret=$?
return $ret
}
fzf-ip-widget() {
LBUFFER="${LBUFFER}$(project hosts ip --fzf) "
local ret=$?
zle reset-prompt
return $ret
}
#zle -N fzf-ip-widget
#bindkey '^P' fzf-ip-widget
jhComplete(){
local comp=$(echo $1 | cut -d':' -f1)
local prompt=$(echo $1 | cut -d':' -f2)
local currentProject=$(project current --path)
find "$HOME/.local/share/snippets/" -name \*.func | while read line; do
source "$line"
done
case "${comp}" in
ip)
if [ -n "$currentProject" ]; then
project hosts ip --fzf
fi
;;
myip)
ip route | grep -oE '(dev|src) [^ ]+' | sed 'N;s/\n/,/;s/src //' | awk -F',' '{print $2 " " $1}' | sort -u | fzf --no-preview | cut -d' ' -f1
;;
pf)
if [ -n "$currentProject" ]; then
find "$currentProject" -type f | fzf
fi
;;
pd)
if [ -n "$currentProject" ]; then
find "$currentProject" -type d | fzf --no-preview
fi
;;
wl|wordlist)
__fsel_wordlist
;;
snip)
snippets
;;
network-interface|int)
ip -o link show | cut -d' ' -f2- | sed -E 's/[^:]+(UP|DOWN).*/\1/' | tr ':' ' ' | fzf --preview="interface=\$(echo {} | cut -f1 -d' ');ip address show \$interface" | cut -d' ' -f1
;;
*)
if command -v "jhcomplete::$comp" > /dev/null; then
"jhcomplete::$comp"
else
echo ""
fi
esac
}
jhswap(){
local orig="$1"
local inside=$(echo "$orig" | grep -Eo '<[^>]+>' | tr -d '<>')
local new=$(jhComplete "$inside")
echo "${orig/$inside/$new}" | tr -d '<>'
}
on_word_replace(){
setopt localoptions noshwordsplit noksh_arrays noposixbuiltins
local word="${LBUFFER##* }${RBUFFER%% *}"
if [ -n "$word" ]; then
local changeto=$(jhswap "$word" )
local lastWord="$changeto"
local LWORDS=$(echo $LBUFFER | tr ' ' '\n' | wc -l)
local RWORDS=$(echo $RBUFFER | tr ' ' '\n' | wc -l)
if [ "$LWORDS" -gt "1" ]; then
LBUFFER="${LBUFFER% *} $lastWord"
else
LBUFFER="$lastWord"
fi
if [ "$RWORDS" -gt "1" ]; then
RBUFFER=" ${RBUFFER#* }"
else
RBUFFER=""
fi
zle reset-prompt
zle -R
return 0
fi
}
# I want my tab complete to be based on "current" word I am typing sometimes, before the command
custom_tabcomplete(){
local tokens cmd prefix trigger tail fzf matches lbuf d_cmds
FZF_DEFAULT_OPTS="$FZF_DEFAULT_OPTS --reverse --height 40%"
setopt localoptions noshwordsplit noksh_arrays noposixbuiltins
if [ -n "$RBUFFER" ]; then
if [[ "${RBUFFER[1]}" != " " ]]; then
on_word_replace
return 0
fi
fi
# 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=${tokens[1]}
append=""
if [[ "$cmd" == "hashcat" ]]; then
if [[ "${tokens[-1]}" == "-m" || "${tokens[-1]}" == "--hash-type" ]]; then
append=$(hashcat --example-hashes | awk -v RS="\n\n" -F "\t" '{gsub("\n","\t",$0); print $1 "\t" $2 "\t" $3}' | sed 's/MODE: //; s/TYPE: //' | fzf -d "\t" --header="Mode Type" --with-nth='1,2' --preview='echo {3}' --preview-window=up:1 | cut -d' ' -f1)
#else
# append=$(hashcat --help | sed -n '/Options Short/,/^$/p' | sed -E 's/ +/ /g' | sed '/==============/d' | column -t -s '|' -o " " | fzf -d " " --with-nth="1,3" --tabstop=2 --header-lines="1" --no-preview | cut -d' ' -f1 | sed 's/\s*$//' | grep -Eo '\S+$')
fi
fi
if [ -n "$append" ]; then
# Make sure that we are adding a space
if [[ "${LBUFFER[-1]}" != " " ]]; then
LBUFFER="${LBUFFER} "
fi
LBUFFER="${LBUFFER}${append}"
zle reset-prompt
return $ret
return 0
fi
#local newLBuffer="${tokens:1:${#tokens[@]}-1}"
local newLBuffer
for i in $(seq 1 $((${#tokens[@]} - 1)) ); do
newLBuffer="${newLBuffer}${tokens[i]} "
done
if [[ "${LBUFFER[-1]}" == " " ]]; then
fzf-completion
else
local new=$(jhComplete "${tokens[-1]}")
if [ -n "$new" ]; then
LBUFFER="${newLBuffer}${new} "
local ret=$?
zle reset-prompt
return $ret
else
fzf-completion
fi
fi
}
zle -N custom_tabcomplete
bindkey '^I' custom_tabcomplete
fi