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 #键绑定
80 每月下载量
170KB
3.5K SLoC
Watchbind
将任何 shell 命令转换成具有自定义键绑定的强大 TUI。
目录
功能
- 可定制性:所有键绑定和样式(颜色和粗体)都是可定制的。
- 灵活性:设置可以通过 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
发行版软件包
Arch Linux
watchbind
可以通过 extra 仓库 使用 pacman 安装
pacman -S watchbind
Alpine Linux
watchbind
在 Alpine Edge 中可用。启用 测试仓库 后,可以通过 apk 安装。
apk add watchbind
工作原理
Watchbind 是一个命令行工具,旨在帮助您轻松地将静态 CLI 命令构建成自定义 TUI。它通过指定一个输出某些行到 stdout 的“监视命令”来工作,这些行是您希望观察的。然后,我们通过在指定的监视速率下重新执行它来使这个静态输出 动态,并通过可以操作单个输出行的自定义键绑定来使 TUI 交互式。
配置
配置 watchbind 设置有几种方法
- 命令行参数(参见
watchbind -h
了解所有可用参数)。 - 一个 本地 TOML 配置文件,通过
watchbind --local-config-file <FILE>
指定。 - 一个 全局 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
表示:如果配置设置 X
在 a
和 b
中都配置了,则使用 a
中 X
的值。
键绑定
通过命令行参数
在命令行中,您可以指定一个逗号分隔的快捷键列表,其中每个快捷键的格式为 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 。 |
帮助-[显示|隐藏|切换] |
[显示|隐藏|切换] 显示所有激活的键绑定的帮助菜单。 |
所有 CMD
和 TUI-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-env
和unset-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