18次发布

0.5.1 2024年4月15日
0.4.1 2023年9月1日
0.3.4 2023年1月12日
0.3.2 2022年11月5日
0.1.5 2021年10月14日

命令行界面 中排名第92

Download history 8/week @ 2024-05-16 6/week @ 2024-05-23 4/week @ 2024-06-06 3/week @ 2024-06-13 1/week @ 2024-06-27 41/week @ 2024-07-04

每月下载量达982

MIT/Apache

2MB
1K SLoC

lk

Crates.io

概述

bash函数的命令面板。在包含大量bash文件的目录中运行,模糊查找函数并运行它。它看起来像这样

模式

您可以通过三种不同的方式探索您的bash函数

  1. 终端用户界面(TUI),它占据整个终端窗口

  2. 类似于fzf的行内搜索

  3. 通过打印函数列表。

TUI

默认模式(--tui-t)。

这是在它的自己的仓库上运行的lk

它具有模糊查找:

您按回车键运行函数。

行内模糊查找

旧的默认设置(--fuzzy-f

这显然也具有模糊查找

列表

您还可以通过列表模式(--list)探索bash文件,如下所示

您可以深入这些文件以查看它们有哪些函数。注意,您现在不需要--list

您可以通过传递函数名称来执行这些函数

这意味着如果您想的话,可以编写使用lk的脚本

更改默认模式

您可以通过编辑位于lk的配置文件来更改默认模式,该文件位于~/.config/lk/lk.toml

日志文件也位于该目录中,如果您感兴趣或想为lk的开发做出贡献。显然,您可以通过运行lk --help来查看所有lk选项。

为什么使用lk

  1. 您是一位多语言工程师,对包管理感到疲惫。因此,您想将所有内容都隐藏在bash之后,bash是通用语言。
  2. 您做了很多devops,并且有很多bash。
  3. 您有很多项目,您每个月都不会工作,您需要将这些项目重新访问时的体验保持一致。
  4. 您可以使用 makePHONY 在项目中执行非编译任务。 lk 只允许您编写没有所有 make 特定垃圾的正确的 bash。
  5. 您是否曾从您某处保存的文本文件中复制和粘贴 bash。

安装

Homebrew

brew tap jamescoleuk/taps
brew install lk

Cargo

cargo install lk

如何编写与 lk 兼容的 bash 文件

lk 执行 bash 函数。这类事情

# A glorious function that does all the things
be_glorious() {
    echo "Ta da!"
} 

它通过源文件执行这些函数,然后运行函数。这相当于

. my_file.sh
be_glorious

这意味着函数之外的所有内容都将被执行。如果您想源其他文件或设置环境变量,这将很有用,因为它们将可供您的函数使用。例如

#!/usr/bin/env bash
#
# Some comments.

. "~/scripts/lib.sh"
readonly DATABASE_USER="johnsmith"

# A glorious function that does all the things
be_glorious() {
    echo "Database user is ${DATABASE_USER}"
} 

但这确实意味着您的脚本中的大部分功能内容都需要在函数中。我理解这可能不是每个人都想要的工作方式,但对于许多用例来说是可以的。我最不想做的事情是告诉人们如何编写他们的脚本。

顺便说一句,上述脚本中的注释将在 --list 模式下出现,如下所示

因此 --list 模式允许您探索和发现您的脚本,而 --fuzzy 模式则允许您访问您可能已经更加熟悉的函数。

如果您使用 --fuzzy,则 lk 将将您执行的命令写入您的 bash 历史记录,这样您可以使用 ctrl-r 重新执行它。显然,如果您使用了 --list,它已经在那里了。

忽略文件

lk 支持基于 glob 的排除和包含,使用 toml。例如

excludes = [
  "**/exclude_me",
  "target",
  ".git",
]

您可以通过将其放入 ~/.config/lk/lk.toml 来使此设置全局,或者通过在,例如,项目目录中创建一个 lk.toml 文件来使其局部。如果 lk.toml 文件位于您执行 lk 的同一目录中,则它将找到并使用它。您还可以将包含和排除作为开关添加。有关详细信息,请参阅 lk --help

忽略函数

如果您在函数前加一个下划线,则 lk 将忽略它

_my_ignored_function() {
   echo "not happening"
}

安装

crate

cargo install lk

更新

cargo install --force lk

用例示例

  1. AWS
    1. 您需要从 AWS 拉取配置并将其存储在 .env 文件中。
    2. 您需要在 AWS 环境之间切换
  2. 您需要构建和部署许多服务,并希望隐藏边缘情况。例如,对于编译、构建和部署,您可能拥有 lk my_service jfdi
  3. 您需要定期设置 SSH 隧道,但记不住命令。

为什么名字叫“lk”?

如果您有任何打字员主键纪律,并且如果您在键盘上挥动右手,那么您很可能输入“lk”。所以它很短,且符合人体工程学。

有哪些可以改进的地方?

  • 轻微的 UI 改进?
  • 支持其他语言的脚本,例如 Python、rust-script、Typescript。
  • 为色盲人士禁用颜色
  • lk --fuzzy 添加计数
  • 合理的默认忽略
  • 使其可通过其他途径安装,例如 brew

贡献使我感到温暖。我很乐意支持任何希望做出贡献的人。此外,如果您是 Rust 的新手,我很乐意在您需要的范围内深化这种支持。

灵感

我之前已经编写了两个类似的工具

  • run_lib - 我的第一个草案,用 bash 编写
  • runsh - 我的第二个草案,使用Rust编写

run_lib 仍然有其用途。我曾在一个无法安装二进制文件的安全环境中工作。 run_lib 只是一个bash脚本。

fzf 真是太棒了。在 lk 中的 --fuzzy 选项来自于我使用 fzf 在我的shell历史中进行多年的 ctrl-r 模糊查找。我几乎没有实现这个功能,因为我认为“为什么麻烦?fzf 已经做得非常完美了。”或者更准确地说,我考虑过从 lk 通过管道到 fzf。但将功能原生实现是 lk 正确的做法。但你可能会注意到,lk 中模糊搜索的渲染在视觉上受到了 fzf 的很大启发。 fzf,我爱你。

贡献

欢迎贡献。感谢以下人员

依赖项

~14–25MB
~360K SLoC