面向高效程序员的命令行工具

2021-07-29 22:04:51

最近,我在命令行上做了很多事情。我不是一个铁杆终端人——我使用 VSCode 比 Vim 多——但我总是对使用 POSIX 标准命令行工具(如 grep、cat 和 sort)可以完成的复杂任务的数量感到惊讶。工具很强大。一个好的工具让工作更轻松、更快捷,一个好的工具可以解锁新的能力:以前不可能的事情变得可能,有时变得容易。随着我了解的更多,我一直在向命令行工具箱添加一些新工具,在本文中,我想分享一些我认为有价值的工具。我不确定我是如何遇到 broot 的,但它非常方便。如果您在一个小目录中并想查看土地的位置,那么树是极好的。 ✗ tree.├── dartboard.png├── header.jpg├── opensign.png├── quote1.png└── trophy.png0目录,5个文件但是,如果目录有很多文件或子目录,树变得没那么有用了:当文件从你身边滚过时,你只会看到最后一个充满信息的屏幕。 $ tree < 长时间滚动文字>├── banner.js└── index.html328目录,2028个文件

broot 通过了解终端窗口的大小并调整其输出以适应它来解决此问题。您可以使用 broot 中的箭头键进行导航,它也有助于通过传入 -w 标志 (broot -w) 来跟踪磁盘空间使用情况:它可以做很多其他事情,因此请查看 GitHub 指南,但对我来说,它只是一棵更好的树。如果您住在终端中,并且想将终端用作 IDE,那么根据当前目录更改终端会很有帮助。有很多方法可以做到这一点。 DirEnv 在您输入目录时加载和卸载 .env 文件。 smartcd 类似。它允许您在更改到特定路径时运行 shell 脚本——您可以启动和停止服务、更改提示或任何其他您想要的。然而,我最喜欢这种类型的是奇怪命名的 funky,它“通过使 shell 函数更易于定义、更灵活和更具交互性,将它们提升到一个新的水平。” funky 的工作方式很简单:当您进入一个目录时,funky 会查找一个包含 bash 函数列表的 .funky 文件。它加载它们,当你离开时,它卸载它们。这意味着当我在这个 Jekyll 博客的目录中时,我加载了别名以创建新帖子、标记我的降价、拉入图像等等。我可以通过输入 funky 列出这些

$ funky lint() { markdownlint --fix "./_posts/*.md" ; } set-header() { cp " $( latest-image ) " " $( image-folder ) /header.jpg" ; } set-image() { cp " $( latest-image ) " " $( image-folder ) / $( date +%s ) .png" ;不过,Funky 可以做的远不止这些。它具有交互式添加和编辑函数以及注册全局函数和别名的功能。不过,我喜欢的是能够在特定上下文中快速给出命令,即一个简短的别名。如果 funky 和 ​​broot 提高了我的生产力,那么更多的工具只能提高它的效率。所以我前往 Lobste.rs 并询问人们使用的其他工具。 FZF 出现了很多,我现在自己也开始使用它了。 FZF 是一个命令行模糊查找器。它很快,并且它允许您在许多需要在命令行输入值的地方根据模糊关键字匹配以交互方式过滤选项。如果您安装包含的快捷方式 (/usr/local/opt/fzf/install),您可以在任何地方使用 ** 并获得交互式模糊查找器以缩小到所需的路径。 FZF 还可以更快地搜索您的历史记录。它是一个 UNIX 过滤器,它读入输入,向您显示一个您过滤的交互式列表,然后将所选项目发送到另一端,但这种描述方式低估了它的用处。我建议观看这段视频,其中 Alexey Samoshkin 介绍了 FZF 的许多可能用途,并在背景中播放了舒缓的钢琴曲:

当您想打开文件 (vim **) 时,FZF 非常适合在命令行中过滤文件路径,但对于命令行完成,有比原始历史文件更多的可用信息。 McFly 尝试使用此额外信息来提供更相关的结果。它在 SQLite 数据库中跟踪所有这些,并通过以下方式跟踪和权衡建议: 被建议失败的命令是我的烦恼,但我从未考虑过根据当前目录或从未选择的降级项目来缩小选择范围。 McFly 使用神经网络进行排名,一个可能的缺点是如果您的 SQLite 数据库变得太大,则在提出建议时会滞后。但是,可以使用 MCFLY_HISTORY_LIMIT 来限制这种增长。我只使用了几天,所以我不能对它做出公正的评价,但是这个概念让我充满希望:使用额外的信息来定制工具以适应现实世界的使用。 FZF 对于某些路径补全效果很好,但我发现在使用 cd 更改目录时没有帮助:在我的主目录中键入 cd **TAB 后,FZF 需要一段时间来构建完整的列表选项。使用我现有的 ZSH 补全 cd TAB <choose a dir> TAB <choose a dir> 导航到文件夹要快得多。但是,存在许多试图改进 cd 的工具。 autojump、z 和 Fasd 都可以跟踪目录使用情况,并为您提供一个用于更改常用目录的快捷键。 r/commandline 详细讨论了这些不同的 cd 替代品,但最有动力的是 zoxide。 zoxide 是在 Rust 中对 z 的重写,并承诺提高速度。

安装后,您可以像 cd ( z ~/path/foo/bar) 一样使用它,但您也可以根据路径的排序文本匹配更改目录 ( z bar ~= cd ~/path/foo/bar )。您无需提供更改位置的完整路径,而是可以提供路径的唯一子字符串,zoxide 将使用其使用历史记录将您带到您想要的位置。为了便于采用,我选择用 zoxide 替换 cd,这就像在添加初始化 shell 代码时使用 --cmd 标志一样简单( eval "$(zoxide init zsh --cmd cd)")。该工具是 Lobste.rs 线程中的另一个发现。在 git 分支上工作时,我喜欢经常提交我的工作。例如,在我尝试删除博客文章中的一些大文本块之前,或者在我尝试重构某些代码之前,我会提交我的工作。当然,我稍后会压缩或重组这些提交,但为了方便起见,我有一个名为 wip(“正在进行中”)的 git 别名,它使我可以轻松地提交。 gitupdate 是对这个想法的简单改进。更新。提交您的文件,但使用已更改文件的文件名(但不是扩展名)来创建更有意义的提交消息。当提交消息无关紧要时,这非常有用。还有许多其他有用的命令行工具。在一篇文章中可以很好地涵盖更多内容。 JQ、mitmproxy、Pandoc 和 PSTree 是我经常使用的一些。还有一整类 Rust 重写了常见的 POSIX 工具,值得他们自己写一篇文章。当然,Earthly 本身是一个命令行工具,我经常使用它来将各种开发步骤粘合在一起。它,以及我用来整理散文的工具,已经成为我工作方式的标准部分。您使用哪些不太常见的命令行工具?如果您有工具建议,我很想听听。你可以在下面找到我的 Twitter 帐户和电子邮件,我很想听听你在使用什么。