Shell 交互神器 percol

Emacs 补全框架Helm 的迁移

Updated on 2017-09-18 00:33 (Created on: 2017-09-17 11:35)

percol 是 Emacs 大神 mooz 的又一力作。得益于 Unix Shell的管道和重定向设计理念,percol 让所有的输入输出变得可交互,percol 给我 一种很熟悉的感觉,后来意识到,其实就是 Eamcs 中 Helm 这个 narrow 框架实现的增量 补全 (incremental completion)的功能. Percol 真的可以提高10倍工作效率。

例子

Git 切换分支

假如你要用git 切换分支,但是分支很多,你不能记住你要切换的分支的名字。那么有 percol 你可以:

$ git checkout $(git branch|percol)

那样,你就可以自由选择要切换的分支了

Kill Process

平时在Linux/Unix 下,如果要kill 掉某个进程的话,笔者一般是用 htop 或者是 ps 找出要kill 掉的进程的pid,然后 kill pid.但是现在有了 percol, 可以一步搞定 所有的步骤。官网给出的例子:

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 $*
}

历史命令查找

又或者是更好地进行查找历史命令:

function exists { which $1 &> /dev/null }

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
    bindkey '^R' percol_select_history
fi

自定义函数

有时候,笔者需要复制当前目录下某个文件的路径,但是无论是文件管理器,还是 shell 都要用鼠标来复制指定文件的路径,效率不高且很不方便。在 陈斌 代码的启发 下,我自己写了一个函数来复制当前文件夹某个特定目录的路径,很方便地解决了问题:

OS_NAME=`uname`
function pclip() {
    if [ $OS_NAME = "CYGWIN" ]; then
	putclip "$@";
    elif [ $OS_NAME = "Darwin" ]; then
	pbcopy "$@";
    else
	if [ -x /usr/bin/xsel ]; then
	    xsel -ib "$@";
	else
	    if [ -x /usr/bin/xclip ]; then
		xclip -selection c "$@";
	    else
		echo "Neither xsel or xclip is installed!"
	    fi
	fi
    fi
}

function pwdf()
{
    local current_dir=`pwd`
    local copied_file=`find $current_dir -type f -print |percol`
    echo -n $copied_file |pclip;
}

运行截图

更多的用法就要查看官方文档 percol

Enjoy Shell :)