高效程序员必备的六大命令行工具
程序员少不了和命令行打交道。而一个好的工具可以让工作变得更容易、更效率,一个好的工具可以解锁新的能力:将不可能化为可能,或者简单化一件事情。很明显当你使用一种工具时,它会驱使你走向某种类型的研究,这种研究方式会因为这个工具而更加轻松,因为你有了另一种思维方式,你的工具让其他任何人都做不到的事情得以发生,所以它能让你更有独创性。
我在earthly.dev找到了一个分享命令行工具的文章,以下是译文:
最近我向命令行工具箱添加了一些新工具,在本文,我想分享一些我发现的有价值的工具。
1、Broot
我不知道我是怎么认识Broot的,但它很实用。当你打开一个小目录,并想要查看land的位置,那么tree功能可以优秀地完成这点。
✗ tree.├── dartboard.png├── header.jpg├── opensign.png├── quote1.png└── trophy.png0 directories, 5 files
但是,如果目录有很多文件或子目录,tree就没有那么有用了:当文件滚动到你面前时,你只能看到最后一个屏幕上全是信息。
$ tree < scrolling text for a long time >├── banner.js└── index.html328 directories, 2028 files
Broot通过分析终端窗口的大小并调整其输出以适应它,来解决这个问题。
你可以在Broot中使用方向键进行导航,它也有助于通过传入-w标志(broot -w)来跟踪磁盘空间的使用情况:
它可以做很多其他的事情,可以看看GitHub guide的指南,但对我来说,它只是提供了一个更好的tree。
ℹ️ 安装 Broot
使用brew以在MacOS上安装,或者按照其他环境的安装说明安装。
brew install broot
2、Funky
如果你希望将终端用作IDE,那么根据当前目录更改终端是很有帮助的。有很多方法可以做到这一点,比如DirEnv。当进入目录时,DirEnv会加载和卸载.env文件;这点和smartcd类似。它允许在更改到特定路径时运行shell脚本——这让用户可以启动和停止服务,更改提示符,或任何用户想要的内容。
然而,我最喜欢用的是Funky,它有个很怪的名字。它通过“使shell函数更容易定义、更灵活、更具有交互性而将其提升到下一个层次。”
Funky的工作方式很简单:在进入一个目录时,Funky会查找一个包含bash函数列表的.funky文件。它会把这些文件加载,并在用户退出时卸载。
这意味着,当我进入这个Jekyll博客(一个ruby开发的博客系统)的目录时,我已经加载了新的别名,用于创建新文章、检查标记、拉入图像等等。
我可以通过键入Funky列出这些:
$ funkylint() { 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
安装Funky需要用到pip:
pip3 install pyfunky并在你的
.zshrc
,bashrc
或者类似的东西上加上hooks:## find where funky.sh was installed by pip and source itsource /usr/local/lib/python3.9/site-packages/scripts/shell/funky.sh
3、 Fuzzy Finder (FZF)
为这篇文章使用fzf定位生成的图像
如果说Funky和Broot提高了生产力,那么更多的工具将如虎添翼。所以我去Lobste.rs询问人们还在使用什么其他工具。FZF被提到了很多次,而现在我也开始使用它了。
FZF是一个命令行模糊查找器。它的运行速度很快,而且在需要在命令行输入值的许多地方,它可以交互式地让你基于模糊关键字匹配筛选选项。
如果用户安装了快捷方式(/usr/local/opt/fzf/install),就可以通过在任何地方键入**,获得一个交互式模糊查找器来缩小到所需的路径。FZF还可以更快地搜索历史记录。
它是一个UNIX过滤器,它读取输入,显示一个可向下过滤的交互式列表,然后将选中的项发送到另一端,但这种描述低估了它的用处。
我推荐看这个视频,Alexey Samoshkin在舒缓的钢琴演奏的背景下介绍了FZF的许多可能的用途:https://www.youtube.com/embed/qgG5Jhi_Els
ℹ️ 安装 FZF
使用 软件包管理器作为一个选择 安装FZF:
brew install fzf并在你的
.zshrc
,bashrc
或者类似的东西上加上hooks:#ZSHsource ~/.fzf.zsh#BASHsource ~/.fzf.bash
4、 McFly
使用McFly在此路径中常见的普通命令
当你想要打开一个文件(vim **)时,FZF非常适合在命令行中过滤文件路径,但是对于完成命令行,有比原始历史文件更多的可用信息。McFly试图使用这些额外的信息来提供更多相关的结果。
额外的信息是什么?
首先,McFly在其启发式排名中考虑了以下选项:
在命令之前输入的命令。
你运行该命令的频率。
你最近运行该命令的时间。
它在SQLite数据库中追踪所有这些信息,它还通过以下方式追踪和权衡建议:
命令的退出状态。
运行中命令的目录。
如果你以前在McFly中选择了它。
被建议失败的命令是令人讨厌的,但是我从来没有考虑过基于当前目录或从未被选择的降级项来缩小选择范围。
McFly使用神经网络来进行排名,一个可能的缺点是,如果你的SQLite数据库太大,那么在提出建议时就会滞后。但是,可以使用MCFLY_HISTORY_LIMIT来限制这种增长。
我只使用了几天,所以我不能给它一个公平的评价,但这种概念——使用额外的信息来定制工具,以适应实际使用——令人充满希望。
ℹ️ 安装 McFly
有许多方法可以安装McFly。 比如说brew:
brew tap cantino/mcflybrew install mcfly并在你的
.zshrc
,bashrc
或者类似的东西上加上hooks:eval "$(mcfly init zsh)"二进制文件发出初始化脚本,而不是将初始化脚本转储到主目录,这是一种很好的做
法。而Zoxide——下面要介绍的工具——也能做到这一点。此外,FZF会干扰McFly的
CTRL-R,必须注释掉FZF初始化脚本中的这一行以使McFly正常工作。
5、Better CD
使用zoxide作为cd的替代品
对于一些完成路径,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)"
)。
ℹ️ 安装 Zoxide
有许多方法可以安装Zoxide。 比如说brew:
brew install zoxide并在你的
.zshrc
,bashrc
或者类似的东西上加上hooks:eval "$(zoxide init zsh --cmd cd)"
6、 GitUpdate
这个工具是在Lobste.rs上的另一个发现。 在Git分支上工作时,我喜欢经常提交我的工作。
例如,在我试图删除博客文章中的一些巨大的文本块之前,或者在我尝试重构一些代码片段之前,我会提交我的工作。
当然,我稍后会压缩或重组这些提交,但为了方便,我有一个名为wip(“工作在进行中”)的git别名,这让我的提交更轻松。
git wip = !git add --all; git ci -m WIP
Gitupdate是对这个想法的一个简单改进。
Gitupdate可以提交文件,并使用更改文件的文件名(而不是扩展名)来创建更有意义的提交消息。当提交消息不重要时,它非常有用。
GitUpdate生成提交消息、提交和推送。
git clone https://github.com/nikitavoloboev/gitupdatego build