16 个稳定版本

2.8.0 2023 年 9 月 19 日
2.7.0 2023 年 1 月 23 日
2.6.0 2022 年 1 月 23 日
2.5.1 2021 年 9 月 28 日
0.10.0 2017 年 7 月 1 日

#405命令行工具

Download history 9/week @ 2024-04-02 2/week @ 2024-05-28

80 每月下载量

MIT 许可证

125KB
3K SLoC

Scout

Build Status

Scout 是一个使用 Rust 编写的、为终端构建的小型模糊查找工具。

scout demo

它受到了其他工具如 selecta 和无处不在的 fzf 的极大启发。

scout 的主要功能包括

  • 异步架构,得益于 async-std 库。这意味着它不会阻塞 UI 等待 STDIN 完成,您可以立即开始输入。
  • 可定制的 UI。您可以根据需要更改 UI 中所有元素的颜色和符号。
  • 基于 Atom 编辑器中使用的 fuzzaldrin-plug 包的快速模糊匹配算法。

警告

此工具使用位于 /dev/tty 的系统伪终端来打印 UI 并捕获输入,这意味着它只能在 UNIX 系统(如 Linux 或 macOS)上运行,据我所知。

安装

通过发行版包安装

从版本 v1.0.0(不包括)开始,每个发行版都有一个为不同架构编译的 scout 包。您可以尝试下载和安装与您的架构匹配的包。

您可以在其 GitHub 页面 中找到这些发行版。

通过 cargo 安装

Scout 位于主要的 crates 仓库中,因此您可以使用 cargo 安装它

$ cargo install scout

请记住将 cargo 二进制路径添加到主 $PATH 环境变量中

export PATH=$PATH:~/.cargo/bin

通过 homebrew 安装(仅限 macOS)

您可以使用我的自定义 tap 仓库使用 homebrew 安装 scout

$ brew tap jhbabon/tap
$ brew install scout

通过 MacPorts 安装(仅限 macOS)

在macOS上,您还可以通过MacPorts安装scout

$ sudo port install scout

从源码安装

scout是一个Rust项目,因此您需要在系统中安装Rust。请检查rustup以了解如何安装Rust。要构建scout,您需要Rust v1.43或更高版本。

克隆仓库并从中运行cargo install

$ git clone https://github.com/jhbabon/scout.git path/to/scout
$ cd path/to/scout
$ cargo install --path .

如果您只是想试一试,也可以运行cargo build --release。二进制文件将在./target/release/scout路径下。

用法

scout的主要思想,或者任何其他模糊查找器,都是过滤一个项目列表(例如文件路径列表),然后对所选内容进行一些操作。为此,您运行一个命令,将其输出管道传递给scout,然后将scout的输出管道传递给另一个命令。

例如,您可以尝试查找一个文件并cat其内容

$ find * -type f | scout | xargs -n1 cat

scout有一组选项,允许您控制其外观。它还支持一组控制序列和键来导航UI。

您可以使用--help标志在程序的主帮助中查看这些选项

scout 2.0.0
Your friendly fuzzy finder

USAGE:
    scout [FLAGS] [OPTIONS]

FLAGS:
    -f, --full-screen    Show scout in full screen (default)
    -h, --help           Prints help information
    -i, --inline         Show scout under the current line
    -p, --preserve-order Do not sort the result by score
    -v, --version        Prints version information

OPTIONS:
    -c, --config <FILE>     Uses a custom config file
    -l, --lines <LINES>     Number of lines to display in inline mode, including prompt
    -s, --search <QUERY>    Start searching with the given query

SUPPORTED KEYS:
    - Enter to select the current highlighted match and print it to STDOUT
    - ^u to clear the prompt
    - ^n or Down arrow key to select the next match
    - ^p or Up arrow key to select the previous match
    - ^e to go to the end of the prompt
    - ^a to go to the beginning of the prompt
    - Left arrow key to move the cursor to the left in the prompt
    - Right arrow key to move the cursor to the right in the prompt
    - ESC to quit without selecting a match

EXAMPLE:
    $ find * -type f | scout

    # Pass an initial query to start filtering right away
    $ find * -type f | scout --search=foo

    # Use a custom config file
    $ find * -type f | scout --config="./config.toml"

    # Select a git branch and check it out with an inline menu
    $ git branch --sort=-committerdate| cut -c 3- | scout -i -p | xargs git checkout

配置

您可以使用配置文件来配置scout的UI。默认情况下,程序将尝试在路径$HOME/.config/scout.toml中找到此文件,但您可以使用--config选项传递自定义路径。

这是没有定义样式的scout的外观

default UI

这是一个包含所有可能设置的配置文件的示例

# General screen options
[screen]
# Display inline (under the current line) or in full screen
mode = "inline" # or "full"
# Max number of lines to display the whole UI. Only used in inline mode
lines = 8

# The prompt is where you type your query
[prompt]
# Symbol displayed before the text you will type
symbol = ""
# Style for the query (your text)
style = "bold underline"
# Style for the symbol
style_symbol = "fg:green"

# The gauge indicates the number of matches vs total number of lines
[gauge]
# Symbol used to separate both numbers
symbol = ""
# Text before the numbers
prefix = "- "
# Style for the numbers
style = "fg:bright-yellow"

# A candidate is an item in the list that is not selected
[candidate]
# Symbol displayed before the candidate's text
symbol = ""
# Style for the candidate's text
style = "bg:red fg:black"
# Style for the symbol
style_symbol = "bg:red"
# A match is a character that is in both the query and the candidate
style_match = "underline bg:black fg:red bold"

# The selected candidate
[selection]
# Symbol displayed before the selection's text
symbol = ""
# Style for the selection's text
style = "bg:green fg:black"
# Style for the symbol
style_symbol = "bg:green"
# A match is a character that is in both the query and the selection
style_match = "underline fg:bright-green bg:black"

将此配置放置在$HOME/.config/scout.toml中,将生成此UI

customized UI

这并不漂亮,但它只是展示您可以做什么的一个例子。

样式由一个空格分隔的值string定义。我基于starship.rs配置系统来定义语法。

您可以使用以下值来定义样式

  • underline:在文本下方画线
  • strikethrough:用线划掉文本
  • reverse:反转当前终端颜色
  • bold:使用粗体字体
  • italic:使用斜体字体(如果终端支持的话)
  • dimmed:略微淡化前景颜色
  • none:重置任何颜色,使用终端的默认值。这将忽略样式定义中的任何其他规则
  • fg:<color-name>:使用指定的颜色作为前景(文本)颜色。可能的名称有 blackredyellowgreenbluepurplecyanwhite。您还可以使用它们的明亮版本,带有 bright-* 前缀
  • fg:<number>:使用指定的 ANSI 颜色 号码作为前景颜色
  • fg:#<hex>:使用给定 RGB 颜色的十六进制表示作为前景颜色。例如 fg:#ffbbcc 将是 rgb(255, 187, 204)
  • bg:<color-name>:与 fg: 相同,但用于背景
  • bg:<number>:与 fg: 相同,但用于背景
  • bg:#<hex>:与 fg: 相同,但用于背景

对于颜色设置,这实际上取决于您的终端颜色功能。不过,大多数现代终端都允许您设置任何颜色。

模糊匹配算法

您可以在 fuzzaldrin-plus 包的仓库页面上的 README 中了解更多关于模糊匹配算法的信息。该算法中缺失的唯一部分是路径评分奖励。

在所有模糊匹配算法中,这是我最完整的一个,所以我决定尝试移植它。

开发

请参阅 贡献指南

Neovim 集成

构建这个工具的主要原因是想有一个通用的模糊查找器,我可以在 Neovim 中使用。如果您也想这样做,您可以使用我的 scout.vim 插件。

常见问题解答

这比 X 好吗?

我不知道。也许?这完全取决于您的需求。我首先构建这个工具是为了学习 Rust,其次是因为我不太喜欢其他更重的工具。这并不意味着它更好或更差。它可能更简单。试一试 scout,看看它是否适合您,如果不适合,就试用其他工具,这也很好。

这比 X 快吗?

说实话,我没有运行过任何基准测试。对我来说,它已经足够快了,很可能对大多数人来说也是如此。

这有用吗?

是的。

依赖项

~11-22MB
~318K SLoC