工欲善其事,必先利其器

效率命令行工具推荐(1)

Posted by ChaosNyaruko on April 18, 2023

防杠声明Disclaimer

  • 工具不是最重要的,最重要的永远是你的idea、核心逻辑和实现(不局限于编程),除非你的工作就是打磨工具本身

  • 但顺手的工具至少可以让你在实现自己的想法时,不会被无关的事项掣肘,甚至形成瓶颈而半途而废

  • GUI也很好,但TUI/CLI也有自己的魅力和优势,本文只是强调后者,并不否定前者

为什么使用纯文本+命令行工具

  • 纯文本方便做版本管理,而且很容易按自己的需求进行批量进行格式化/添加删除内容等,不受专有格式的限制(比如markdown/latex vs word,大家如果是用word写自己的学位论文或者什么其他复杂文档的话是不是会存在V1.0、V2.0、V3.0等诸多相似的副本…)
  • 命令行工具,资源占用一般少(主要指前端资源, 现在的跨端应用很多是electron写的,资源占用比较大),且类UNIX系统一般自带,一般也是跨平台的,易脚本化
  • 命令行工具(尤其是通用命令行工具),一般遵循UNIX的“Do one thing and do it well”的设计哲学(见《UNIX编程艺术》),单个工具易于使用(某种程度上可能比一些产品设计不佳的GUI工具认知成本低得多),多个工具之间也容易相互配合(例如著名的使用“管道”连接stdin/stdout)

所以对于我个人,只要不是使用专属工具才能解决的需求场景,在工具的选择上,会比较倾向于可以纯文本配置的命令行工具,另外:

  • 本文也是仅介绍,不介绍深入使用,按需了解,希望起到抛砖引玉的作用。另外像ls/cp/rm/git/…之类的暂时就不提了
  • 虽然工具这个东西比较个人化,但我做这个分享的初衷是,哪怕有一点点帮助到看到本文的读者也值得了

工具介绍

zsh/fish

  • zsh大约是bash的超集,但是有更强的能力(补全/高亮等),mac默认带,配合oh-my-zsh等全家桶体验较好

  • fish是一个可能更用户友好的shell工具,例如一些oh-my-zsh才有的功能fish都是自带的,且脚本语言更贴近日常使用的编程语言

    tldr

    tldr是一个由社区维护的帮助文档,相比软件自带的help,它旨在提供更“简易”的类cheatsheet式帮助 tldr

    z / autojump

  • z是用shell编写的“智能跳转”脚本,可以实现自适应的跳转文件夹

  • autojump是其用更正统的编程语言写的,功能更强的类似软件,但个人的使用场景和z差不多,但是各大包管理器有,所以安装可能更直白,按需使用即可

    curl

    不多说,超强大的请求发送工具,其实不局限于HTTP/HTTPS,一般我在简易场景下更喜欢用这个而不是Postman之类的图形界面,不是因为curl做不到,而是我懒得查用法了,有ChatGPT或许容易一些🤣

    curl is a tool for transferring data from or to a server. It supports these protocols: DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET or TFTP. The command is designed to work without user interaction.

date(gnu)

date在日期时间操作上非常好用的工具,我最常用的是下面这个,少去用浏览器查询/加载的时间

date --date='@2147483647'

注意mac自带的date与gnu coreutils中date的区别

fd

fd是一个用rust写的find的替代品,具有速度更快、支持更多特性、交互更友好等优点

fd

用户友好

find ~ -iname '*.jpg' -exec ls {} \;
# vs
find ~ -iname '*.jpg' -exec ls {} +
fd ~ -e jpg --exec ls {}
# vs
fd ~ -e jpg --exec-batch ls {}

感受一下两者的区别,看看哪个更容易被记忆和避免混淆…

可与fzf等工具结合,这也是我个人更常使用的方式,见后面fzf的描述

rg

rg是用rust写的基于行的搜索工具,基本是grep的代替品,具有更快、功能更多、默认递归等诸多特性,VSCode的默认搜索引擎就是这个 rg-preview

我的理由主要是两个:

  1. 默认使用方式简单(递归、遵守ignore规则、使用正则等)

    exa

    用rust写的ls的“替代品”,显示结果更友好,特性也更多(–icons, –tree, –git等),坏处是比ls多一个字母🐶,你可以使用alia exa-preview

htop

跨平台的性能监视器,比top更易用 https://htop.dev/

fzf

fzffzf是文件“模糊”搜索工具,如果你经常使用命令行,神器,强烈推荐使用,和vim等工具配合更是体验上佳 fzf-preview

个人使用的最多的功能:

  • vim + fzf: 高效率的导航,其中文件查找功能类似Jetbrain系的cmd+opt+o 或者 vscode的cmd+p
  • ctrl-r 搜索历史指令
  • piping 对输出结果做模糊查找
  • ** expand,有比较好的交互体验,提高定位文件的效率,

tmux (screen)

tmux是一个很有名的“终端复用器”,和screen类似,但功能更丰富,架构更合理。

  • 纯文本配置,.tmux.conf在什么环境都好同步
  • 维持会话和后台任务(ssh时不需要nohup等操作)
  • 一个界面可以分屏/切换布局等,也不受ssh连接影响
  • 可以纯键盘操作,当然也支持一定程度的鼠标操作,实际使用起来并不违和。纯键盘操作至于好不好见仁见智,对我来说键盘操作的好处是很多情况下不需要走“先定位再操作”的流程,可以直接“操作”

当然大家都在使用的iTerm2也很强,但它们并不是竞争关系(一个是终端模拟器、一个是终端复用器),只是在窗口管理上看上去有一部分重合而已,iTerm2甚至有针对tmux的配置项,配合使用效果更佳

vim/neovim

“编辑器之神”

目前我使用的是neovim,vim的一个fork,逐步发展成为一批人对vim的替代品。个人最初是因为它自带lsp的客户端,不需要额外安装而进行了尝试(熟悉vim的同学可能知道,vim下有一个非常有名的补全插件叫到YouCompleteMe,这个插件的一个著名槽点就是想顺利使用全功能的话,在安装上比较麻烦),后来因neovim迭代比较快,社区(可能)更活跃而逐步成为我的个人主力(例如Copilot,除了Jetbrains系和VSCode之外,官方也是提供了neovim插件的,vim/emacs就没有🐶)。实际上,开发工具的使用很大程度上取决于生态(包括功能扩展和问题支持,既有官方的,也包括社区的),而生态又会反过来促进工具本身的改进

  • 纯文本配置,一套vimrc/init.vim/init.lua走天下

  • 基础使用其实并没有想象的那么困难,这图更像个梗 learning-curve

  • 与其他命令行工具配合和谐 vim-read vim-grep

  • 在各个环境下都能用(尤其是纯terminal环境,像websell、跳转板机等,我知道VSCode有remote ssh功能,也知道Jetbrains下的远程同步功能)。其实不止是vim本身,还包括这个键位在很多环境也是通用的,像less、manpage等,包括tmux/zsh等也是提供vi式键位映射的选项的。从这个角度出发,如果你经常使用命令行的话,学习emacs也有类似的理由,比如在类UNIX系统比如mac下,很多emacs的快捷键都是可以用的。

  • 在不直接可用的环境下,各种浏览器、IDE、编辑器等都有vim插件,而这种基于“模式”的键位实际上是一种思想,能够很大程度上解放快捷键的设定,减少冲突。也正是因为这个思想足够经典,经过了时间的考验,所以近十几年涌现出的一些编辑器,像kakoune 、helix都是这种modal editor

  • 至于作为开发环境,大家都是很优秀很有经验的开发者,各有各的爱好习惯和工作流,很多工具也非常好用,所以我就不强行安利了,仅做一些演示。我也不是想说vim能够代替你手上的IDE(或者其他开发工具),只是说明现在的vim借助于lsp(language server protocol),在基本开发这个场景下是完全可以胜任,它可能有一些学习成本,但功能绝对不弱,也没有那么原始(比如这篇文档的原稿也是用vim写的,带预览),我也不是只用这一个工具(比如单步调试的时候,其实是有插件集成了调试功能了,只是我个人用的少)。另外正如我前面所说,这种配置也是配一次都可以到处同步的,要只是想正常用的话折腾起来并没有想象中那么复杂 vim-navi

结尾碎碎念

折腾工具,核心是在不断的工作和实践中改善自己的工作流,提升工作效率

现在AI大发展的阶段,也涌现出了更多的基于AI的智能效率工具,像Fig、Warp、Copilot(X)、Tabnine、ChatGPT等等,但是它是否能真正提升我们的工作效率,还是取决于我们的需求,也许一个工具适合99%的人,但就是不适合你。所以我们既不能固步自封,也不能随波逐流,适合自己的才是最好的。我做这个分享的目的也在这

另外从个人思考拔高一下,我认为通过使用优秀的工具,可以学习如何设计优秀的工具,如良好的交互设计、低认知负担的概念设计等;程序员特定的,软件的设计水平、如何提升扩展性等;更高视角的,如何通过优秀的设计和推广,构建强大的社区,进一步增强影响力,像各类支持插件的工具,如何形成庞大的社区,并和社区互相促进发展。

举个例子,为什么Vim的操作模式会有这么大的影响,这里我引用一段MIT公开课的材料,说明是某一种深刻的洞见或者设计理念是很重要的原因。

写作和写代码其实是两项非常不同的活动。当我们编程的时候,会经常在文件间进行切换、阅读、浏览和修改代码,而不是连续编写一大段的文字。因此代码编辑器和文本编辑器是很不同的两种工具(例如微软的 Word 与 Visual Studio Code)。 在编程的时候,你会把大量时间花在阅读/编辑而不是在写代码上。所以,Vim 是一个多模态编辑 器:它对于插入文字和操纵文字有不同的模式。Vim 是可编程的(可以使用 Vimscript 或者像 Python 一样的其他程序语言),Vim 的接口本身也是一个程序语言:键入操作(以及其助记名) 是命令,这些命令也是可组合的。Vim 避免了使用鼠标,因为那样太慢了;Vim 甚至避免用 上下左右键因为那样需要太多的手指移动。 这样的设计哲学使得 Vim 成为了一个能跟上你思维速度的编辑器。

不只是命令行工具,一些很流行的GUI工具,像Chrome、VSCode何以吸引这么多用户,构建庞大的社区编写插件、解决问题,单纯的只有技术上的扩展性肯定是不够的,更多原因我也还在思考中。