Added percol as plugin.
This commit is contained in:
parent
45ae712208
commit
19299ac13b
17
plugins/percol/_percol
Normal file
17
plugins/percol/_percol
Normal file
@ -0,0 +1,17 @@
|
||||
#compdef percol
|
||||
|
||||
local context state line
|
||||
typeset -A opt_args
|
||||
|
||||
_arguments : \
|
||||
'1:input file name:_files' \
|
||||
'(--help -h)'{--help,-h}'[show this help message and exit]' \
|
||||
'--tty=[path to the TTY]:tty:{compadd $(find /dev/pts -print)}' \
|
||||
'--rcfile=[path to the settings file]:rc.py:_files -g \*\.py' \
|
||||
'--encoding=[encoding for input and output]:encoding:' \
|
||||
'--query=[pre-input query]:query:' \
|
||||
'--match-method=[specify matching method for query.]:match method:((string\:normal\ match regex\:regular\ expression migemo\:migemo))' \
|
||||
'--caret-position=[position of the caret]:caret position:' \
|
||||
'--initial-index=[position of the initial index of the selection]:initial index:(first last)' \
|
||||
'--peep[exit immediately without doing anything]'
|
||||
|
251
plugins/percol/percol.zsh
Normal file
251
plugins/percol/percol.zsh
Normal file
@ -0,0 +1,251 @@
|
||||
#!zsh
|
||||
|
||||
# This script arranges some percol-related userful zle-widgets and
|
||||
# commands
|
||||
#
|
||||
# To use this script, put a following line into your .zshrc
|
||||
#
|
||||
# source PATH_TO_THIS_FILE
|
||||
#
|
||||
# Then, you can bind percol's zle-widgets to some key, by calling
|
||||
# bindkey.
|
||||
#
|
||||
# bindkey '^R' percol_select_history
|
||||
#
|
||||
# Here is the list of zle-widgets provided by this script.
|
||||
#
|
||||
# * percol_select_history
|
||||
# * percol_cd_sibling
|
||||
# * percol_cd_upper_dirs
|
||||
# * percol_cd_bookmark
|
||||
# * percol_cd_repository
|
||||
# * percol_insert_bookmark
|
||||
# * percol_insert_ls
|
||||
#
|
||||
# And this script also provides following commands.
|
||||
#
|
||||
# * ppgrep
|
||||
# * ppkill
|
||||
#
|
||||
# Enjoy!
|
||||
|
||||
# ------------------------------------------------------------ #
|
||||
# Initialize
|
||||
# ------------------------------------------------------------ #
|
||||
|
||||
PERCOL_ENABLED=true
|
||||
|
||||
function exists() {
|
||||
which $1 &> /dev/null
|
||||
}
|
||||
|
||||
# Define tac wrapper
|
||||
exists gtac && _PERCOL_TAC="gtac" || \
|
||||
{ exists tac && _PERCOL_TAC="tac" || \
|
||||
{ _PERCOL_TAC="tail -r" } }
|
||||
function _percol_tac() {
|
||||
eval $_PERCOL_TAC
|
||||
}
|
||||
|
||||
# Arrange a tmp dir for percol
|
||||
PERCOL_TMP_DIR=/tmp/percol.zsh.tmp
|
||||
if ! [ -d ${PERCOL_TMP_DIR} ]; then
|
||||
mkdir ${PERCOL_TMP_DIR}
|
||||
fi
|
||||
|
||||
# ------------------------------------------------------------ #
|
||||
# FIFO for percol_popup
|
||||
# ------------------------------------------------------------ #
|
||||
|
||||
# Arrange fifos
|
||||
local PERCOL_IN=${PERCOL_TMP_DIR}/percol-channel-in-$$
|
||||
local PERCOL_OUT=${PERCOL_TMP_DIR}/percol-channel-out-$$
|
||||
function _percol_create_fifo() {
|
||||
[ -p $PERCOL_IN ] || { command rm -f $PERCOL_IN; mkfifo -m 600 $PERCOL_IN }
|
||||
[ -p $PERCOL_OUT ] || { command rm -f $PERCOL_OUT; mkfifo -m 600 $PERCOL_OUT }
|
||||
}
|
||||
function _percol_clean_fifos() {
|
||||
command rm -f $PERCOL_IN
|
||||
command rm -f $PERCOL_OUT
|
||||
}
|
||||
trap _percol_clean_fifos EXIT SIGINT SIGTERM
|
||||
|
||||
# ------------------------------------------------------------ #
|
||||
# Arrange percol_popup on top of tmux
|
||||
# ------------------------------------------------------------ #
|
||||
|
||||
function _percol_popup_tmux() {
|
||||
_percol_create_fifo
|
||||
tmux split-window "percol $* < ${PERCOL_IN} > ${PERCOL_OUT}"
|
||||
}
|
||||
|
||||
function _percol_popup() {
|
||||
INPUT=$1
|
||||
PERCOL_OPTION=$2
|
||||
if [[ -n $TMUX && -n $PERCOL_USE_TMUX ]]; then
|
||||
eval "_percol_popup_tmux ${PERCOL_OPTION}; ${INPUT} > ${PERCOL_IN} &; cat ${PERCOL_OUT}"
|
||||
else
|
||||
eval "${INPUT} | percol ${(Q)PERCOL_OPTION}"
|
||||
fi
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------ #
|
||||
# Common functions
|
||||
# ------------------------------------------------------------ #
|
||||
|
||||
# TODO: I'm not sure whether this process is proper or not
|
||||
function _percol_clean_prompt() {
|
||||
if [[ -n $TMUX ]]; then
|
||||
zle reset-prompt
|
||||
else
|
||||
zle -R -c
|
||||
fi
|
||||
}
|
||||
|
||||
function _percol_list_upper_directories() {
|
||||
local dir_cursor
|
||||
dir_cursor=$(dirname ${PWD})
|
||||
local dir_prefix="../../"
|
||||
while [[ ${dir_cursor} != "/" ]]; do
|
||||
echo ${dir_prefix}$(basename ${dir_cursor})
|
||||
dir_cursor=$(dirname ${dir_cursor})
|
||||
dir_prefix="../"${dir_prefix}
|
||||
done
|
||||
echo "/"
|
||||
}
|
||||
|
||||
function _percol_list_siblings() {
|
||||
local mydirname=$(basename $PWD)
|
||||
local parentdir=$(dirname $PWD)
|
||||
find $parentdir -maxdepth 1 -type d ! -iname ".*" -printf "%f\n" | sed -n '/${mydirname}/!p'
|
||||
}
|
||||
|
||||
function _percol_get_destination_from_history() {
|
||||
_percol_popup 'sort ${CD_HISTORY_FILE} | uniq -c | sort -r | \
|
||||
sed -e "s/^[ ]*[0-9]*[ ]*//" | \
|
||||
sed -e s"/^${HOME//\//\\/}/~/"'
|
||||
}
|
||||
|
||||
function _percol_go_to_repository_top() {
|
||||
cd ./$(git rev-parse --show-cdup)
|
||||
if [ $# = 1 ]; then
|
||||
cd $1
|
||||
fi
|
||||
}
|
||||
|
||||
function _percol_get_repository_dir() {
|
||||
_percol_go_to_repository_top > /dev/null;
|
||||
destination=$(_percol_popup 'find . -path "*/.git" -prune -o -type d')
|
||||
if [[ $destination != "" ]]; then
|
||||
r > /dev/null
|
||||
cd $destination > /dev/null
|
||||
echo $PWD
|
||||
else
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------ #
|
||||
# Define percol widgets
|
||||
# ------------------------------------------------------------ #
|
||||
|
||||
function percol_select_history() {
|
||||
output=$(_percol_popup 'history -n 1 | _percol_tac' '--query \"${LBUFFER}\"')
|
||||
|
||||
if [[ $output != "" ]]; then
|
||||
BUFFER=$output
|
||||
CURSOR=$#BUFFER
|
||||
fi
|
||||
|
||||
_percol_clean_prompt
|
||||
}
|
||||
zle -N percol_select_history
|
||||
|
||||
function percol_cd_sibling() {
|
||||
destination=$(_percol_popup "_percol_list_siblings")
|
||||
if [[ $destination != "" ]]; then
|
||||
cd $destination
|
||||
fi
|
||||
_percol_clean_prompt
|
||||
}
|
||||
zle -N percol_cd_sibling
|
||||
|
||||
function percol_cd_upper_dirs() {
|
||||
destination=$(_percol_popup "_percol_list_upper_directories")
|
||||
if [[ $destination != "" ]]; then
|
||||
cd $destination
|
||||
fi
|
||||
_percol_clean_prompt
|
||||
}
|
||||
zle -N percol_cd_upper_dirs
|
||||
|
||||
function percol_insert_bookmark() {
|
||||
local destination=$(_percol_get_destination_from_history)
|
||||
if [ $? -eq 0 ]; then
|
||||
local new_left="${LBUFFER} ${destination} "
|
||||
BUFFER=${new_left}${RBUFFER}
|
||||
CURSOR=${#new_left}
|
||||
fi
|
||||
_percol_clean_prompt
|
||||
}
|
||||
zle -N percol_insert_bookmark
|
||||
|
||||
function percol_cd_bookmark() {
|
||||
local destination=$(_percol_get_destination_from_history)
|
||||
[ -n $destination ] && cd ${destination/#\~/${HOME}}
|
||||
_percol_clean_prompt
|
||||
}
|
||||
zle -N percol_cd_bookmark
|
||||
|
||||
function percol_insert_ls() {
|
||||
local basedir
|
||||
local left
|
||||
basedir=$(echo ${LBUFFER} | perl -e '<STDIN> =~ /((?:[^ ]|\\\\ )+)$/; print "$1";')
|
||||
left=$(echo ${LBUFFER} | perl -e '<STDIN> =~ /(.*)((?:[^ ]|\\\\ )+)$/; print "$1";')
|
||||
|
||||
local destination
|
||||
if [ -n $basedir ]; then
|
||||
destination=$(\ls $basedir | percol)
|
||||
else
|
||||
destination=$(\ls | percol)
|
||||
fi
|
||||
if [ $? -eq 0 ]; then
|
||||
local new_left="${left}${destination} "
|
||||
BUFFER=${new_left}${RBUFFER}
|
||||
CURSOR=${#new_left}
|
||||
fi
|
||||
_percol_clean_prompt
|
||||
}
|
||||
zle -N percol_insert_ls
|
||||
|
||||
function percol_cd_repository() {
|
||||
local destination
|
||||
destination=$(_percol_get_repository_dir)
|
||||
[[ $destination != "" ]] && cd ${destination}
|
||||
_percol_clean_prompt
|
||||
}
|
||||
zle -N percol_cd_repository
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# Define useful commands
|
||||
# ------------------------------------------------------------
|
||||
|
||||
function ppgrep() {
|
||||
if [[ $1 == "" ]]; then
|
||||
PERCOL=percol
|
||||
else
|
||||
PERCOL="percol --query $1"
|
||||
fi
|
||||
ps aux | eval $PERCOL | awk '{ print $2 }'
|
||||
}
|
||||
|
||||
function ppkill() {
|
||||
if [[ $1 =~ "^-" ]]; then
|
||||
QUERY="" # options only
|
||||
else
|
||||
QUERY=$1 # with a query
|
||||
[[ $# > 0 ]] && shift
|
||||
fi
|
||||
ppgrep $QUERY | xargs kill $*
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user