命令行上的narrowing(隨着輸入逐步減少備選項)工具


前面在介紹zsh的時候,說過它的補全用來起比bash的Tab補全方便多了,在有多個備選項是你只要用光標鍵來挑選就是了,而不是全列出來提示你再多輸入幾個字符。而Emacs的anything / helm 則更近一步,首先就把備選項列出來,隨着你的輸入減少備選項,少到一定程度你就可以用眼睛瀏覽並進行選擇了。

說起來有點費勁,看一下peco的這個演示圖就明白了:

peco demo

最近看到幾個命令行上的這種工具,可以讓我們在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 來查找文件

select file with fzf

• 利用它與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的預編譯版本,可以在樹莓派上用)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM