天下武功唯快不破,命令行虽然很多时候很快,但是整体的cd,ls,cd,ls也是让人心烦。之前使用了autojump,可以通过关键字跳转到最频繁操作的目录中,快!今天介绍的fasd,除了可以像autojump一样在目录中跳转,还可以通过关键字打开最频繁操作的文件,更快!!

安装

CentOS的默认软件仓库中没有fasd,需要添加opensuse的软件仓库才可以

cd /etc/yum.repos.d/
wget http://download.opensuse.org/repositories/utilities/CentOS_6/utilities.repo
yum install fasd

mac中直接使用brew安装即可:

brew install fasd

也可以通过源码安装:

git clone https://github.com/clvv/fasd.git
make install

安装后,需要在shell的rc文件中添加fasd的初始化命令

echo 'eval "$(fasd --init auto)"' >> ~/.bashrc
source ~/.bashrc

基本使用

fasd的基本原理和autojump一样,在内部维护一个表,记录着最近操作的每个文件/目录的路径,以及他们的权重。这个权重会随着你操作这个目录的次数而增加,所以在使用关键字匹配路径时,最常用的路径就会被选中。

fasd初始化命令会定义一些默认别名

alias a='fasd -a'        # any
alias s='fasd -si'       # show / search / select
alias d='fasd -d'        # directory
alias f='fasd -f'        # file
alias sd='fasd -sid'     # interactive directory selection
alias sf='fasd -sif'     # interactive file selection
alias z='fasd_cd -d'     # cd, same functionality as j in autojump
alias zz='fasd_cd -d -i' # cd with interactive selection

这些别名可以这样使用

a foo 列出最近操作的路径匹配'foo'的文件与目录
f foo 列出最近操作的路径匹配'foo'的文件
d foo 列出最近操作的路径匹配'foo'的目录
s foo 列出最近操作的路径匹配'foo'的文件与目录,并可以通过序号选择
sf foo 列出最近操作的路径匹配'foo'的文件,并可以通过序号选择
sd foo 列出最近操作的路径匹配'foo'的目录,并可以通过序号选择
z foo cd到最近操作的匹配'foo'并且得分最高的目录
zz foo 列出最近操作的路径匹配'foo'的目录,通过序号选择,然后cd进目录

除了zzz带有cd的效果,其他的命令都是列出对应的目录而已,需要配合其他命令使用,比如像这样:

vim `sf vimrc`  => vim ~/.vimrc

对于这种场景,fasd提供了-e参数可以指定使用什么编辑器操作选定的路径

$ sf -e vim rc
2   12         /home/vagrant/.bashrc
1   23.0068    /home/vagrant/.vimrc
> 按1即可用vim打开vimrc

所以可以添加一个别名用于快速使用vim打开文件:

alias v='f -e vim'

定制

我以前使用的是autojump,习惯使用j来跳转目录,j也的确比z好按得多。所以:

alias j='z'
alias jj='zz'

autojump会在跳转前显示要跳转目录的全路径,我觉得这个很有用,可以用来确定是否跳转正确了,而fasd不会显示,所以需要修改一下他的脚本,找到fasd_cd的定义:

fasd_cd() {if [ \$# -le 1 ]; thenfasd "\$@"elselocal _fasd_ret="\$(fasd -e 'printf %s' "\$@")"[ -z "\$_fasd_ret" ] && return[ -d "\$_fasd_ret" ] && cd "\$_fasd_ret" || printf %s\\n "\$_fasd_ret"fi}

[ -d "\$_fasd_ret" ] && cd "\$_fasd_ret" || printf %s\\n "\$_fasd_ret"

修改为

[ -d "\$_fasd_ret" ] && printf %s\\\\n "\$_fasd_ret" && cd "\$_fasd_ret"

不过修改源文件不太好,所以我们可以在自己的rc文件中覆盖这个函数,最后我的rc文件中对应的配置为:

eval "$(fasd --init auto)"fasd_cd (){if [ $# -le 1 ]; thenfasd "$@";elselocal _fasd_ret="$(fasd -e 'printf %s' "$@")";[ -z "$_fasd_ret" ] && return;[ -d "$_fasd_ret" ] && printf %s\\n "$_fasd_ret" && cd "$_fasd_ret";fi}alias j='z'alias jj='zz'alias v='f -e vim'

参考连接:

  • clvv/fasd
  • software.opensuse.org: 安装软件包 utilities / fasd
  • Installing via Package Managers · clvv/fasd Wiki