#命令行 #命令输出 #配置文件 #键绑定 #toml配置 #shell #tui

app watchbind

一个 CLI 菜单,可以周期性地监视程序输出,并通过键绑定在其行上执行命令

22 个版本

0.2.1 2024年1月22日
0.2.0 2023年11月18日
0.1.19 2023年10月10日
0.1.17 2023年3月11日
0.1.4 2022年11月27日

#1 in #键绑定

Download history 382/week @ 2024-04-23 13/week @ 2024-07-02 80/week @ 2024-07-30

80 每月下载量

自定义许可LGPL-3.0-or-later

170KB
3.5K SLoC

Watchbind

Build status Releases Crates.io

将任何 shell 命令转换成具有自定义键绑定的强大 TUI。

screenshot screenshot

目录

功能

  • 可定制性:所有键绑定和样式(颜色和粗体)都是可定制的。
  • 灵活性:设置可以通过 CLI 参数、本地 TOML 配置文件、全局 TOML 配置文件或这些的组合进行配置。
  • 速度:使用异步 Rust 和 Tokio 编写。

安装

从二进制文件

发布页面 包含适用于 Linux、macOS 和 Windows 的预编译二进制文件。

crates.io

cargo install watchbind

或从 main 分支安装最新 git 版本

cargo install --git https://github.com/fritzrehde/watchbind --branch main 

发行版软件包

Packaging status

Arch Linux

watchbind 可以通过 extra 仓库 使用 pacman 安装

pacman -S watchbind

Alpine Linux

watchbindAlpine Edge 中可用。启用 测试仓库 后,可以通过 apk 安装。

apk add watchbind

工作原理

Watchbind 是一个命令行工具,旨在帮助您轻松地将静态 CLI 命令构建成自定义 TUI。它通过指定一个输出某些行到 stdout 的“监视命令”来工作,这些行是您希望观察的。然后,我们通过在指定的监视速率下重新执行它来使这个静态输出 动态,并通过可以操作单个输出行的自定义键绑定来使 TUI 交互式

配置

配置 watchbind 设置有几种方法

  1. 命令行参数(参见 watchbind -h 了解所有可用参数)。
  2. 一个 本地 TOML 配置文件,通过 watchbind --local-config-file <FILE> 指定。
  3. 一个 全局 TOML 配置文件,位于用户指定的 WATCHBIND_CONFIG_DIR 环境变量中,或者在默认配置目录中(参见 watchbind -h 了解特定于操作系统的默认配置目录),如果存在则自动加载。本地和全局配置文件的区别在于,后者不需要在每次 watchbind 调用时都使用 --local-config-file <FILE> 指定,这使得它方便应用于所有 watchbind 调用的全局设置。

所有配置方式都可以同时使用,并且 watchbind 将根据以下配置层次结构确定使用哪些设置

CLI arguments > local TOML config file > global TOML config file

其中 a > b 表示:如果配置设置 Xab 中都配置了,则使用 aX 的值。

键绑定

通过命令行参数

在命令行中,您可以指定一个逗号分隔的快捷键列表,其中每个快捷键的格式为 KEY:OP[+OP]*。一个 KEY 可以绑定到多个操作,因此,每个操作列表(OPS)的语法为 OP[+OP]*。操作由 + 分隔,依次执行。

TLDR:

  • 各个快捷键之间用 , 分隔。
  • 快捷键是键和(多个)操作通过 : 分隔的配对。
  • 多个操作由 + 分隔。

通过 TOML 配置文件

在 TOML 配置文件中,指定快捷键如下

[keybindings]
"KEY" = [ "OP" ]
"KEY" = [ "OP", "OP", "OP" ]
"KEY" = [ 
  "OP",
  "OP"
]

这种语法与命令行语法不同,因为使用 TOML 数组功能更具有表达性和更符合 TOML 文件格式。此外,这允许您在命令中使用 + 字符。它也不需要转义像 $ 这样的特定于 shell 的字符(更多信息请参见 本节)。

您可以在 examples/ 目录中找到一些快捷键示例。

所有支持的 KEY

<MODIFIER>+<CODE>
<CODE>

所有支持的 MODIFIER

alt
ctrl

所有支持的 CODE

esc
enter
left
right
up
down
home
end
pageup
pagedown
backtab
backspace
del
delete
insert
ins
f1
f2
f3
f4
f5
f6
f7
f8
f9
f10
f11
f12
space
tab
<any single character>

操作

所有支持的 OP

操作 描述
exit 退出 watchbind。
reload 手动重新加载监视的命令,重置间隔计时器。
cursor[down|up] <N> 移动光标 [下|上] N 行。
cursor[first|last] 将光标移动到 [第一|最后一] 行。
select 选择光标所在的行(即添加光标所在的行到选中行)。
取消选择 取消选择当前光标所在的行。
切换选择 切换当前光标所在行的选择状态。
全选 选择所有行。
取消全选 取消选择所有当前选中的行。
执行-- <CMD> 执行 CMD 并阻塞,直到终止。
执行& -- <CMD> 作为后台进程执行 CMD,即不阻塞直到命令终止。
执行 tui-- <TUI-CMD> 执行一个 TUI-CMD 命令,该命令会启动一个 TUI(例如文本编辑器)。Watchbind 的自用 TUI 将被 TUI-CMD 的 TUI 替换,直到 TUI-CMD 终止。注意,TUI-CMD 必须启动一个全屏 TUI,它覆盖整个终端,否则可能会出现未定义的行为。
设置-环境<ENV> -- <CMD> 阻塞执行 CMD,并将其输出保存到环境变量 ENV 中。
取消设置-环境<ENV> -- <CMD> 取消设置环境变量 ENV
帮助-[显示|隐藏|切换] [显示|隐藏|切换] 显示所有激活的键绑定的帮助菜单。

所有 CMDTUI-CMD 壳命令都将在一个子壳中执行(即 sh -c "CMD"),该子壳设置了一些环境变量。环境变量 $line 设置为光标所在的行。环境变量 $lines 设置为所有选中的行,如果没有选中,则为光标所在的行。所有设置的环境变量 ENV 都将可供所有未来启动的命令/进程使用,包括监视的命令、任何执行的子命令,以及 set-env 操作中执行的命令。如果选中了多行,它们将在 $lines 中由换行符分隔。

样式

前景颜色、背景颜色和粗体可以自定义。以下样式选项可用:

  • 当前光标所在的行使用 cursor-[fg|bg|boldness]
  • 标题行使用 header-[fg|bg|boldness]
  • 所有其他行使用 non-cursor-non-header-[fg|bg|boldness]
  • 选择指示器使用 selected-bg

命令行选项中的自定义字段名称(例如 --cursor-fg blue)与 TOML 配置文件中的名称相同(例如 cursor-fg = "blue")。

此外,watchbind 还支持根据输入文本中的 ANSI 代码进行样式化。

所有支持的 COLOR

white
black
red
green
yellow
blue
magenta
cyan
gray
dark_gray
light_red
light_green
light_yellow
light_blue
light_magenta
light_cyan
reset        # Reset the fg and bg
unspecified  # Don't applying any styling => use style from ANSI input text

所有支持的 BOLDNESS

bold         # Make everything bold
non-bold     # Make sure nothing is bold (i.e. remove any bold styling from input ANSI)
unspecified  # Don't applying any styling => use style from ANSI input text

使用字段分隔符和字段选择进行格式化

watchbind 支持一些类似于 Unix cut 命令的额外格式化功能。

  • 字段分隔符:定义一个分隔符/定界符,将命令输出分割成不同的字段。每个分隔符将被替换为弹性制表位,从而形成一个类似于“表格”的结构,类似于cut -d <SEPARATOR> -t命令。

  • 字段选择:仅选择特定的字段进行显示。您可以指定逗号分隔的索引列表(从1开始)以指定单个字段(X),范围(X-Y),或从X开始捕获所有字段(X-)。例如,字段选择1,3-4,6-将显示第一、第三和第四字段,以及从第六个字段开始的所有字段。

重要:传递给exec --操作的$lines将保持未格式化,即不会将分隔符替换为弹性制表位,也不会省略未选择的字段。

状态管理

set-envunset-env操作允许您通过环境变量来管理状态。此外,您可以使用initial-env选项指定一个set-env命令列表,这些命令将在第一次执行监视命令之前执行。这种强大的组合允许您使用initial-env设置一些初始状态,直接在监视命令中引用该状态,并通过set-env在运行时使用快捷键更新状态。

技巧

在所选行上的快捷键,用于删除一些输入行

我将“删除输入行”定义为执行一个快捷键,该快捷键会改变监视命令输出的长度。换句话说:如果在执行快捷键后,监视命令生成的输出比执行快捷键之前更长或更短,那么该快捷键会删除输入行。

这个定义为什么重要?因为所选行仅存储为索引,因此与watchbind中显示的实际行没有关联。

以下是一个示例,说明这可能会引起什么问题:您选择五行,然后通过快捷键执行一个删除这些五行的命令。下次监视命令执行时,它将输出五行更少(在watchbind中显示),因为已经删除了这五行。问题是删除行的索引仍然被标记为已选择。因此,现在将有五个不同的行,与被删除的五行相同的索引,这将可能是不希望的。

为了解决这个问题,建议以下快捷键格式用于转换输入的快捷键

[keybindings]
"KEY" = [ "exec -- DELETE-OP", "reload", "unselect-all" ]

首先,使用DELETE-OP(例如echo $lines | xargs rm)删除所选行。然后,我们希望看到监视命令更新后的输出,其中不再包含已删除的行,因此我们执行reload。最后,我们想要删除现在已删除的行的选择,因此我们调用unselect-all

管道

如果您想在命令行上的监视命令中使用管道,请确保像这样转义管道符号

watchbind ls \| grep "test"

或者将监视命令放在引号内

watchbind "ls | grep test"

否则,shell会认为您想要将watchbind exec -- ls的输出管道到grep test

子壳

您绑定的键命令将在子壳中使用 sh -c 执行。

这意味着您可以运行类似

watchbind --bind "enter:notify-send \$lines" ls

的命令,环境变量 $lines 将包含光标当前所在的行。

但请注意

watchbind --bind "enter:notify-send $lines" ls

不会按预期工作,因为 $lines 将在您从 watchbind 命令运行的 shell 中被替换。

阻塞时的 UI 更新

当执行阻塞子命令时,Watchbind 可以进入阻塞状态。在阻塞状态下的默认行为是 显示从监视命令接收到的任何新输出行。但是,可以通过 --update-ui-while-blocking <BOOL> 选项轻松自定义此行为。

依赖项

~19–31MB
~478K SLoC