前面在介绍zsh的时候,说过它的补全用来起比bash的Tab补全方便多了,在有多个备选项是你只要用光标键来挑选就是了,而不是全列出来提示你再多输入几个字符。而Emacs的anything / helm 则更近一步,首先就把备选项列出来,随着你的输入减少备选项,少到一定程度你就可以用眼睛浏览并进行选择了。

说起来有点费劲,看一下peco的这个演示图就明白了:

最近看到几个命令行上的这种工具,可以让我们在bash或者vim里面也用上这种机制(至于具体用来干什么,就看自己的小宇宙了)

name homepage language github stars pros cons comment <
fzf https://github.com/junegunn/fzf go/ruby 3696 vim, tmux, bash/zsh support A command-line fuzzy finder written in Go \n旧版本采用ruby编写,安装时对于没有提供二进制包的平台,会安装这个ruby版本的
peco https://github.com/peco/peco go 2793 arm/windows binary 设计上尽力模仿了percol
PathPicker https://github.com/facebook/PathPicker python 2718 PathPicker accepts a wide range of input -- output from git commands, grep results, searches --
percol https://github.com/mooz/percol python 1938 拼音 adds flavor of interactive filtering to the traditional pipe concept of UNIX shell
selecta https://github.com/garybernhardt/selecta/ ruby 1000 vim A fuzzy text selector for files and anything else you need to select. Use it from vim, from the command line, or anywhere you can run a shell command.
pick https://github.com/thoughtbot/pick c 349 vim; 已经进入Debian 9 https://robots.thoughtbot.com/announcing-pick
zsh-zaw https://github.com/zsh-users/zaw zsh 289 很多预配置sources zsh anything.el-like widget.
canything https://github.com/keiji0/canything c 23

参见: fuzzy matchers overview? - commandline

我目前在用的是 fzfpercol/peco 。对于zsh-zaw也用过一阵,但总觉得有点过于机巧,并且还得需要zsh。

fzf

https://github.com/junegunn/fzf

之所以用它主要是因为它直接提供了几个使用场景(见下面的描述),而percol/selecta这些只是提供了一个“挑选”的机制(按Emacs的举例而言,就是percol这些只提供了 anything.el 而没有提供 anything-config.el )。另外,虽然fzf并没有为树莓派提供预编译的版本(我也还不知道怎么自己装golang环境来编译),但它还有一个ruby版本,使用起来差别不大。

fzf 预提供的两个功能:

• 自己输入 fzf /home/johndoe 来查找文件

• 利用它与bash/zsh的集成,来补全命令参数。跟bash的集成方法是 source fzf-0.10/shell/completion.sh && source fzf-0.10/shell/key-binding.sh ,然后就可以使用了:输入vim **<tab> 它就会调fzf列出当前目录所有文件让你选,输入ssh **<tab>它就列出~/.ssh/config里面的所有主机给你选

另外fzf提供了一个跟tmux配合的脚本(fzf-tmux),用它来挑备选项的话,它会检测当前是否在tmux里面,如果是的话就用tmux临时开一个面板来让你跟它交互。

peco/percol

这两个的功能基本上一致,都是列出一排备选项供用户挑,至于拿挑出来的结果干什么,则完全是用户自己来想,比如 vim $(locate -b '*.org' | fzf)

peco基本上是安装percol的设计来实现的,区别是percol是python编写的,peco是用go,结果是后者只需要单个可执行文件即可工作,并且性能好得多。

percol/peco的功能其实fzf 也支持(比如 vim $(locate -b '*.org' | fzf) 这种场景,但在fzf之余还用percol/peco的原因是:

• fzf 对非ansi字符支持得不好,会乱码,而peco和percol都支持utf-8
• percol 支持按拼音首字母匹配(比如输入bj会匹配出带有“编辑”、“比较”、“悲剧”、“北京”、“背景”的行。需要先pip install pinyin然后用percol --match-method=pinyin。我贡献的补丁,不过commit message里面错把pinyin写成pinin了)。
• 如果备选项很多(比如我想搜索博客园闪存的离线文件,目前有4000行左右),ruby版本的fzf 和 python写的percol 有性能上的问题,那就用peco好了(peco还提供了一个armv7的预编译版本,可以在树莓派上用)

命令行上的narrowing(随着输入逐步减少备选项)工具的更多相关文章

  1. Linux命令行上程序执行的那一刹那!

    转自:http://www.cppblog.com/cuijixin/archive/2008/03/14/44463.html by falcon<zhangjinw@gmail.com> ...

  2. 【转】PowerShell入门(七):管道——在命令行上编程

    转至:http://www.cnblogs.com/ceachy/archive/2013/02/22/PowerShell_Pipeline.html 管道对于Shell来说是个化腐朽为神奇的东西, ...

  3. 自学Linux Shell16.4-在命令行上使用函数

    点击返回 自学Linux命令行与Shell脚本之路 16.4-在命令行上使用函数 脚本函数不仅可以用作shell脚本命令,也可以用作命令行界面的命令.一旦在shell中定义了函数,可以从系统的任意目录 ...

  4. Linux 在一个命令行上执行多个命令

    Linux 在一个命令行上执行多个命令 1. [ ; ] 如果被分号(;)所分隔的命令会连续的执行下去,就算是错误的命令也会继续执行后面的命令. 2. [ && ] 如果命令被 &am ...

  5. Linux 在一个命令行上执行多个命令(转载)

    对于单个命令执行我想大多数人都是明了的,也就是在一个命令行上执行一条命令.那对于在一行上执行多个命令怎么办呢,其实也很简单,只需在各命令之间加上特殊命令符号,我们常规使用到的有3个特殊命令符号. 1. ...

  6. Linux (rz、sz命令行)与本地电脑 命令行上传、下载文件

    Linux 与本地电脑直接交互, 命令行上传.下载文件. 一.lrzsz命令行安装: 1.rpm安装:(链接: http://pan.baidu.com/s/1cBuTm2 密码: vijf) rpm ...

  7. 您可以从 Windows 命令行上运行 gcc、g++、ar、ranlib、dlltool 和其他一些 GNU 工具

    Windows 上的安装为了在 Windows 上安装 GCC,您需要安装 MinGW.为了安装 MinGW,请访问 MinGW 的主页 www.mingw.org,进入 MinGW 下载页面,下载最 ...

  8. 在命令行上启动genymotion虚拟机

    自从有了genymotion,多机联调就解放了,一台电脑运行两个genymotion虚拟机毫无压力,不过也看用的是哪种os image,之前我以为google自己的Nexus应该最适应,哪知道开起来比 ...

  9. Ubuntu server使用命令行上板VPNclient

    Ubuntu server使用命令行上板VPNclient VPN,虚拟专用网络,这个技术还是非常有用的.近期笔者參与的项目中就使用上了VPN,大概情况是这种.有两个开发团队,在异地,代码服务器在深圳 ...

随机推荐

  1. WPF之 DataGrid分页

    接着上一篇WPF之 DataGrid数据绑定,继续讲述WPF中DataGrid分页. 由于分页经常用到,就做了一个自定义控件,由于当时的局限性,只支持DataTable数据源,不过木关系,网上很多其他 ...

  2. 6.5 为什么Android用Java不用c实现?

    C/C++过于底层,开发者要花很多的经历对C/C++的语言研究清楚,例如C/C++的内存机制,如果稍不注意,就会忘了开启或者释放.而Java的GC会自动处理这些,省去了很多的时间让开发者专注于自己的业 ...

  3. javaWeb-mvc之利用c3p0写入数据库出现乱码

    在使用c3p0向数据库中写入中文数据时出现乱码,于是我采用了和properties中配置url一样 url=jdbc:mysql://localhost:3306/student?Unicode=tr ...

  4. sublime text 3 技巧

    sublime text 技巧 学习目的:熟悉sublime快捷键和功能,改进自己的工作方式. 学习流程:先把视频中涉及到的技巧记录下,再完整的看一遍所有的菜单和功能. 前端开发工具技巧介绍-Subl ...

  5. iOS ViewController生命周期

    ViewController是view的controller,viewController的职责主要包括管理内部各个view的加载显示与卸载,同时负责与其他ViewController的通信和协调. ...

  6. WebSphere试用过期问题处理

    WebSphere Application Server的试用期为60天,过期将无法启动WAS. E:\IBM\WebSphere\AppServer\profiles\Dmgr01\bin>s ...

  7. Upstart 1.10 发布,系统初始化守护进程

    Upstart 是一个用以替换 /sbin/init 守护进程的软件,基于事件机制开发.可用来处理启动过程中的任务和服务启动. Upstart 1.10 发布,改进记录: New bridges: u ...

  8. VS2010 调试不会命中当前断点

    方法1.直接把整个文件格式化了一次,断点就可以用了Ctrl + A全选菜单:编辑-〉高级-〉设置选定内容的格式 (Ctrl+K, Ctrl+F)通过比较文件发现是由于制表符Tab(0x09)引起的,原 ...

  9. 如何带领一个Android开发团队

    1)重构,夜未眠 将框架从业务中剥离 如何提高开发效率 如何提高程序性能 单元测试 技术调研 代码版本管理 2)渠道包管理 自动打包工具 批量打渠道包的两种解决方案 定制渠道包的流程管理 3)稳定性, ...

  10. C#课外实践——校园二手平台(技术篇3)

    说明:生活中,又有谁,能真正摆脱周围环境的束缚,而追随自己的内心呢? ListView的简单用法. 最后展示几张效果图吧 主窗体 登录窗体,虽然没有角色 选择,但已经隐藏在代码里了. 选择购买窗体,这 ...