#搜索引擎 #搜索 #终端 #建议 #URL #参数化 #打开

app sefr

用于交互式打开搜索引擎/参数化URL的终端程序

6 个版本

0.3.1 2019年5月30日
0.3.0 2019年5月18日
0.2.3 2019年5月16日

#2768命令行工具

GPL-3.0-or-later

225KB
979

sefr (搜索引擎前端)

Crates.ioCrates.io

用于交互式打开搜索引擎/参数化URL的终端程序。它有点像 surfraw,但带有交互式建议(通过解析 opensearch json)。

动机

我经常使用自定义URL栏搜索引擎,但浏览器对这些的支持令人沮丧。

  • Firefox 有一种非常复杂的定义方式,不允许指定建议端点,并且仍然不能同步。
  • Chrome 使得定义它们变得容易,可以同步,但不允许指定建议端点。
  • Vivaldi 使得定义它们变得容易,允许指定建议端点,但不能同步。

例如,在原始 Firefox 中,虽然你可以创建一个书签关键词,使得当你输入“r foo”到你的URL栏时,它会自动跳转到“reddit.com/r/foo”,但你无法获得补全,也无法将其设置为默认搜索引擎。

这是一个可定制的跨平台解决方案,因为它使用你的默认浏览器(更多详情),你可以通过全局热键将其集成到 GUI 工作流程中(见下文)。

安装

安装 sefr 有两种方法

  1. 克隆此仓库,安装 Rust 工具链,然后在克隆的目录中调用 cargo run 以试用它,或者调用 cargo build 以创建位于 target/debug/sefr 的二进制文件。
  2. 通过调用 cargo install sefr 来安装。这应该使它可以在任何地方运行。

通过将全局热键映射到在轻量级终端中启动它,方便地将它集成到您的桌面环境中,从而实现类似 rofi 的用户体验。

例如,我现在在 KDE 中使用这个(使用令人难以置信的轻量级的 suckless 终端),全局绑定到 Super+s,使用 kwin 规则隐藏 wmclass=sefr st 的窗口装饰。

st -n sefr -g 70x18  -f 'Monospace:size=14' -e ~/src/sefr/target/debug/sefr

对于i3,这效果很好。不确定为什么我必须指定 $BROWSER

for_window [instance="^sefr$"] floating enable, resize set 640 480, move position center
bindsym Mod4+s exec BROWSER=/usr/bin/firefox st -n sefr -f 'Monospace:size=14' -e ~/src/sefr/target/debug/sefr

配置/自定义

配置文件

在其首次启动时,sefr 将自动在由 directories crate 提供的配置目录中生成一个 TOML 配置文件。任何随后的更改都应该在其中进行。

例如,对于 Linux,配置文件将位于 ~/.config/sefr/config.toml

添加新引擎

警告:当前的配置格式可能在将来发生变化!

可以通过将它们添加到 config.toml 文件中来为 sefr 添加新引擎以供使用。

基本引擎定义看起来是这样的

[engines.yt]
name = "YouTube"
search_url = "https://www.youtube.com/results?q=%s"
suggestion_url = "http://suggestqueries.google.com/complete/search?client=firefox&ds=yt&q=%s"
  • [engines.PREFIX] 定义了什么 前缀(也称为 关键字触发器)激活引擎。
  • name 是引擎的名称,用于提示文本,如果未在提示部分定义(稍后将有更多介绍)。
  • search_url 在按下回车键时,会在您的浏览器中打开,并将 %s 替换为搜索词。
  • suggestion_url(可选)是查询建议的端点(将 %s 替换为搜索词)时。它必须返回 OpenSearch 建议架构 json
  • space_becomes(可选,默认为 +是打开 search_url 之前替换空格的内容。目前仅当设置为 "" 时防止输入空格,因为我们现在对搜索词进行 urlencode。在默认配置中
    • engines.wkt(维基词典)和 engines.w(维基百科)将其设置为 _,因为维基百科就是这样在其 URL 中编码空格的。 现在使用不同的搜索端点,不需要下划线。
    • engines.r(Subreddit)将其设置为空字符串,因为 subreddits 的名称中不能有空格(注意,此值防止在选中引擎时输入缓冲区中输入空格,以便可以使用空格选择建议而无需执行搜索)。

当未输入前缀时使用的引擎在配置中定义为 _default,并且程序启动是必需的。示例

[engines._default]
name = "Google"
search_url = "https://www.google.com/search?q=%s"
suggestion_url = "https://www.google.com/complete/search?client=chrome&q=%s"

此外,还有一个可选的 prompt 部分,它处理当调用引擎时显示的提示。它通常看起来像这样

[engines.yt.prompt]
icon = ""
icon_bg = "Red"
icon_fg = "White"
text = " Youtube "
text_bg = "White"
text_fg = "Black"

以下字段受支持,所有都是可选的

  • icon:提示中显示的图标
  • icon_bg:图标的背景颜色
  • icon_fg:图标的文字颜色
  • text:在提示中图标后面的文字
  • text_bg:文字的背景颜色
  • text_fg:文字的文字颜色

请注意,在示例配置中,icontext 用空格填充以美观,但这不是必需的。

所有字段都是字符串,除了颜色字段(*_bg*_fg)。它们可以是字符串(对应这里的颜色名称),8位数字(对应Ansi 颜色代码),或者8位RGB元组,例如[255,255,255]

如果省略了特定引擎的这一部分,将使用显示引擎名称的基本提示。

快捷键

快捷键正在开发中,但所有当前功能都可以在[keybinds]部分重新绑定。快捷键使用类似 Vim 的语法(例如 <Down><C-w><F12>),但有几点需要注意

  • 绑定和动作都使用双引号括起来。因此整个绑定就像这样的一行:"<Backspace>" = "DeleteChar"

  • 除了单个字符之外,所有绑定都是有效的(例如,在 "p" = "Exit" 中的实际字母 p)。但为什么你会创建这样的绑定呢?

  • CtrlC- 表示(例如,<C-w> 表示 'control + w')。Alt 可以用 A-M- 表示。

  • 除了修饰符之后的常规键之外,所有在 < 角括号 > 内的内容都是不区分大小写的。也就是说,<a-p><A-p><m-p><M-p> 都表示相同的意思('alt + p'),但 <m-P> 表示 'alt + shift + p'。

  • 这意味着没有 "shift" 修饰符。要注册 'alt + shift + s',你可以写 <a-S><A-S>

  • 'shift + tab' 用 <Backtab> 表示。

  • 'enter' 可以是 <CR><Enter>。'backspace' 可以是 <BS><Backspace>

  • 空字符串表示 NULL 字符,无论那是什么。

  • 如果您将两个函数分配给相同的键,则后来注册的将覆盖第一个。

默认配置摘录

[keybinds]
"<BackTab>" = "SelectPrev"
"<Backspace>" = "DeleteChar"
"<C-c>" = "Exit"

进度

此项目目前处于 alpha 阶段,但相对稳定。

  • 提示
  • 请求建议 / JSON 解析
  • 可定义带有前缀、提示和端点的引擎
  • 浏览器启动
  • 具有前缀边缘情况的建议选择
  • TOML 文件配置
  • 使用真实光标渲染输入缓冲区,并能够移动它
  • 可配置的快捷键
  • 当建议端点行为异常时提供更好的反馈
  • CLI 参数,例如通过参数提供初始输入缓冲区以进行别名化。

依赖项

~12MB
~301K SLoC