坑边闲话:我曾经看到无数人对 Linux 图形化桌面十分地依赖,哪怕是跑编辑器应用都愿意在 Ubuntu 桌面里,而不愿意使用 VSCode Remote Dev. 我甚至这一切只是形式,但是我更愿意相信,优雅简单、贴近底层的方法才是美妙的。

Linux 和 macOS 本质上都是 Unix,只不过前者是净室实现,后者是一脉相承。至于 Solaris 等小型机系统我没有使用过,FreeBSD 等系统因为驱动匮乏也没有进入我的参考列表。所以,本文以

  • macOS
  • Debian 12

为例,简单介绍如何使用 Terminal 搭建良好的开发环境。

1. 个人电脑的选择·

1.1 硬件选择·

在 2023 年十月这个档口,我个人认为,个人计算机相较 2015 年(也就是我读大一的时候)已经有了长足的进步。当年只有权贵才能拥有的 8 核心 i7 5960X 处理器,其性能竟然能被 miniPC 轻松吊打。

图 1. 零刻基于 AMD Ryzen 7840HS 芯片打造的小主机,得益于 TSMC 4nm FinFET 技术,该机器的能效非常好。

最佳实践

经过测试,零刻 GTR7 32GB 内存加 1TB 固态硬盘版本,可以轻松完成我以下任务:

  • 使用 Acrobat DC Pro 阅读 20 页以内的 PDF 格式的论文;
  • 畅玩 Don’t Starve 游戏,分辨率 5120x2880
  • 被远程桌面控制时,提供流畅的反馈。这一点有别于低频率的 Skylake CPU,比如 Xeon Gold 5117;
  • 使用 Windows Terminal 远程连接各种 Linux 服务器;
  • 使用 VMware Workstation Pro 17 运行 Debian 12 虚拟机。虚拟机待机期间能保持较低的 CPU 占用,风扇没有噪音;
  • 流畅使用 Microsoft Office 365 编辑文档、幻灯片;
  • 流畅使用 Google Chrome 浏览器开几十个 Tab 不卡顿。

在此,我并非是要给 GTR7 做私人的软件认证,我主要的目的是表达自己对该机器的认可,以及对这几年来半导体技术进步的认可。

对于个人用户,个人计算机应该轻便。此外,高性能也是很多人追求的,毕竟不是所有人都拥有自己的高性能服务器,大部分人只有一台个人电脑。目前,还没有任何个人计算机兼具便携、高性能于一身,哪怕是以高能效著称的 Apple Silicon 笔记本,也因为游戏性能孱弱而被很多人嫌弃。

个人用户看中的无非是以下几个需求:

  • 便携:如果你能把个人计算机随身携带,对你而言将有更高的社会自由度。在现代社会,脱离了计算机,很多工作无法处理。
  • 游戏:现在游戏产业非常发达,游戏能带给人快乐,如果一点游戏都不玩,人生是多么无趣!
  • 工作:对工作而言,我认为分为以下几个领域
    • 影音剪辑、艺术创作
    • 程序开发
    • 普通事务性处理,如办公文档处理

由于计算机平台的限制,用户可以选择笔记本、台式机或者“全都要”。如此看来,如果要选择一台尽可能满足上述需求的笔记本,游戏本可能是唯一的选择,只是牺牲了一点便携性。如果选择彻底牺牲便携性,那么台式机无疑是更好的选择,毕竟价格便宜,散热良好。

  • 对我个人而言,因为我可以通过网络连接到性能强大的服务器,因此性能对我来说不是太大的考虑因素。此外,我很少玩 3A 游戏,我喜欢的 Don’t Starve 只需要一般的硬件就可以流畅运行。最后,我更看重在线会议、影视后期,因此良好的麦克风以及对剪辑软件的良好兼容都是必要的。如此看来,选择 MacBook Pro 加一台迷你主机就是最佳的组合。
  • 对于没有服务器但是对性能、便携性都有要求的普通用户,我建议台式机和轻薄本双持。台式机可以添加 GPU、内存,实现较高的性能,而轻薄本可以实现长续航、高便携性。
    • 台式机还可以安装双系统,在必要时可以充当 Linux 服务器使用
    • 轻薄本充分利用 Windows 11 的现代化生态,使用 Windows Terminal 做终端。

讨论了这么多与个人电脑相关的思考题,笔者想传达一个观点:个人电脑应该偏向社会化、生活化,而非偏向工业化。具有超高性能但是几乎没有便携性的笔记本,我基本上不会做任何考虑,因为它既没有台式机的性价比,又没有笔记本的便携性。

1.2 操作系统选择·

操作系统类型决定了工作流,我认为个人电脑应该使用 Windows 10/11 或者 macOS,不应该考虑 Linux,因为 Linux 的个人 PC 软件生态非常糟糕,常用的视频会议、通讯软件都没有适配,哪怕能用也一般会存在好多问题。必须承认,Linux 不适合个人日常使用,只适合服务器部署。

这听上去是个暴论,但是真正愿意做事情而非折腾的实用主义者一定会同意我的说法。

如果日常使用 Linux 开发程序,用 Windows 做日常系统也毫无问题。使用本文推荐的 Terminal 环境,可以完美解决所有问题。从代码编写到程序调试(哪怕是调试 flutter UI 程序)都毫无压力。

  • 有台式机或者服务器的用户,可以在这些平台上安装 Linux 物理机或虚拟机使用
  • 有高性能笔记本的用户,可以在笔记本上安装没有 GUI 的 Linux,性能开销相对较小
  • 只有轻薄本的用户,可以使用云服务器或者 WSL2 (不推荐)

唯一值得担心的是 macOS,考虑到现在苹果全面转向 Apple Silicon,在苹果机器上执行虚拟机就是个严峻的挑战。目前笔者没有丰富的经验,只能暂时搁置讨论。说不定真是大坑!

说明

本节并非是为了说明应该如何买电脑、装系统,而是要给用户指明一个道理:要按照需求买计算机,要按照实际情况安装系统。并没有适配所有场景的计算机,也没有适配所有场合的操作系统。

2. 终端配置·

此前在 Vim 教程里,笔者已经反复提及终端编程的重要性。终端响应速度极快,没有 VSCode Remote Dev 冗长的协议开销,同时能在任何计算机上做到零配置。

然而,许多用户对终端环境望而生畏,我猜测这些用户主要是害怕终端的低效率、难上手。然而,选择完合适的开发工具,终端就变成了你最友好的伙伴。本文推荐一套组合,帮助你快速适应终端环境。

2.1 Joshuto·

GitHub 官方仓库 我的 Joshuto 配置
1
2
3
4
5
cd /tmp && mkdir -p /tmp/joshuto_tmp && cd /tmp/joshuto_tmp
curl -LO https://github.com/kamiyaa/joshuto/releases/download/v0.9.5/joshuto-v0.9.5-x86_64-unknown-linux-gnu.tar.gz
tar xvf joshuto-v*-x86_64-unknown-linux-gnu.tar.gz
sudo cp /tmp/joshuto_tmp/joshuto-v*-x86_64-unknown-linux-gnu/joshuto /usr/local/bin/
cd ~ && rm -fr /tmp/joshuto_tmp

ChatGPT 版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

# 定义变量
TMP_DIR="/tmp/joshuto_tmp"
DOWNLOAD_URL="https://github.com/kamiyaa/joshuto/releases/download/v0.9.5/joshuto-v0.9.5-x86_64-unknown-linux-gnu.tar.gz"
BINARY_NAME="joshuto"
VERSION="v0.9.5"
ARCH="x86_64-unknown-linux-gnu"

# 创建临时目录并进入
mkdir -p "$TMP_DIR" && cd "$TMP_DIR" || { echo "创建或进入临时目录失败"; exit 1; }

# 下载并解压
curl -LO "$DOWNLOAD_URL" || { echo "下载失败"; exit 1; }
tar xvf "${BINARY_NAME}-${VERSION}-${ARCH}.tar.gz" || { echo "解压缩失败"; exit 1; }

# 复制二进制文件到/usr/local/bin
sudo cp "${BINARY_NAME}-${VERSION}-${ARCH}/${BINARY_NAME}" /usr/local/bin/ || { echo "复制文件失败"; exit 1; }

# 清理临时文件和目录
cd ~ && rm -rf "$TMP_DIR"

echo "joshuto 安装成功"

Joshuto 是一个用 Rust 构建的类 Ranger 的终端文件浏览器。

h j k l 可以用来做导航,效率非常之高。

  • 对于文件,l 是打开文件
  • 对于目录,l 是进入目录

这套快捷键非常符合 Vim 用户的逻辑。

下载 Joshuto 0.9.5 amd64 Glibc

2.2 NeoVim·

我的 NeoVim 配置

此前已经介绍过很多次 Vim,因此这里就不展开介绍了。

2.3 Lazygit·

GitHub 仓库 我的 Lazygit 配置
1
2
3
4
5
cd /tmp && mkdir -p /tmp/lazygit_tmp && cd /tmp/lazygit_tmp
curl -LO https://github.com/jesseduffield/lazygit/releases/download/v0.40.2/lazygit_0.40.2_Linux_x86_64.tar.gz
tar xvf lazygit_*_Linux_x86_64.tar.gz
sudo cp lazygit /usr/local/bin
cd ~ && rm -fr /tmp/lazygit_tmp

ChatGPT 版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash

# 设置变量
TMP_DIR="/tmp/lazygit_tmp"
DOWNLOAD_URL="https://github.com/jesseduffield/lazygit/releases/download/v0.40.2/lazygit_0.40.2_Linux_x86_64.tar.gz"
BINARY_NAME="lazygit"

# 创建临时目录并进入
mkdir -p "$TMP_DIR" && cd "$TMP_DIR" || { echo "创建或进入临时目录失败"; exit 1; }

# 下载并解压
curl -LO "$DOWNLOAD_URL" || { echo "下载失败"; exit 1; }
tar xvf "${BINARY_NAME}*" || { echo "解压缩失败"; exit 1; }

# 复制二进制文件到/usr/local/bin
sudo cp "$BINARY_NAME" /usr/local/bin/ || { echo "复制文件失败"; exit 1; }

# 清理临时文件和目录
rm -f "$BINARY_NAME"
cd ~ && rm -rf "$TMP_DIR"

echo "lazygit 安装成功"

Lazygit 是一个用 Go 构建的终端软件,它将 git 的复杂操作映射为一组快捷键,而且提供了一个多面板的 TUI,方便用户了解项目状态。

Lazygit 的快捷键非常多,而且与 Git 紧密集成。因此如果对 Git 的常规操作、高级操作不熟练,可能很难将这些快捷键利用起来。建议将 Lazygit

注意

Lazygit 的工作面板分为多个区域,当光标处于不同区域时,同一个快捷键的意义是不同的。比如 n 有时候是创建分支,有时候是创建远程索引。因此,对于快捷键的讲解,需要以面板为区分。

  • Pane 1,status 面板,指示状态
    • 显示当前的本地分支、本地目录的名字,一般是 <dir_name> -> <local_branch>
  • Pane 2,显示本地相关的内容
    • Files 显示与文件相关,如本地那些文件做了修改,哪些文件做了更新,可通过空格键 SPACE 对文件更改进行 git add 和取消 git add,这在日常操作中非常频繁。
    • 使用快捷键 c 可以将已经 stage 的更改提交,即 git commit,而且输入 Commit Message 的方式更加直观。
    • 添加修改时可以进入文件更改的预览界面直接逐行添加(还是使用空格 SPACE
  • Pane 3,显示分支信息,包括本地分支 Local branches,远程信息 Remotes 和标签信息 Tags
    • 本地分支可以通过方向键 或者 k j 进行浏览,使用空格键 SPACE 进行选中。
    • 若在 fork 仓库里进行工作,GitHub 一般会给与两个远程,一是 upstream,另一个是 origin. 前者是原始仓库,后者你是 fork 的 GitHub 仓库。
      • f git fetch 是对远程仓库进行操作,因此需要使用 u 进行上游选取,随后进行 fetch 操作。
      • Remotes 子选项卡只能对远程进行操作,比如创建、删除等,无法选中远程作为本地的上游。
  • Pane 4,Commits 面板
    • 该面板可以查看提交记录
    • 最重要的是,可以使用该面板快速地 git rebase,而且 Lazygit 的 Rebase 交互非常优秀,可以说是命令行环境人机交互的典范。
    • 使用快捷键 g 可以快速地基于某个提交执行 git reset,随后可选 --soft--hard 等。
    • 使用快捷键 e 可以快速的基于某个提交执行 git rebase,随后可以对该提交之后的所有提交进行 p picks squashd drop
    • 使用快捷键 Shift + r 可以修改提交
    • 使用快捷键 r 可以修改提交的 log
    • 使用快捷键 a 可以快速呼出 amend 命令菜单,可以对提交时采用的用户名、邮箱进行修改。
  • cherry-pick
  • rebase
  • commit

等操作好好研究一下,等研究透彻,Lazygit 将会极大提升效率。

亮点

Lazygit 能用可视化方法对改动行进行 stage 操作,这无疑可以让 Commit 历史更加简练。

千万不要无脑 git add -A,要让每次提交都遵循最小化原理。

下载 Lazygit 0.40.2 amd64 Linux

2.4 Tmux·

GitHub 仓库 我的 Tmux 配置

Tmux 是一个强大的终端工具,它支持多窗口、多会话,功能非常复杂,而且上手非常容易。

可通过各大 Linux 发行版的包管理器直接下载。Tmux 从高到低支持 Session、Window、Pane 三个级别交互。相关概念比较明晰,这里就暂不介绍了,但是所有的设计都是为了更好地进行日常作业,所以我将介绍一下三者存在的意义。

  • Session:即会话,可以理解为工作空间
    • prefix + $:修改当前 Session 的名字。
  • Window:即某个会话里的窗口,可以用来跑一些单独的软件,比如一个 Window 跑 Vim 编辑,一个 Window 跑 htop 查看系统占用,一个窗口跑编译。
    • prefix + &:关闭窗口
    • prefix + p:查看前一个窗口
    • prefix + n:查看后一个窗口
  • Pane:即某个窗口里的子面板。
    • prefix + x:关闭面板。如果你不知道如何关闭 Vim,那么通过直接关闭 Pane 的方法杀死 Vim 是个好方法。
    • prefix + %:创建左右分屏的 Pane.(可以想一下 % 的象形意义)
    • prefix + ":创建上下分屏的 Pane.

prefix 是一个很重要的按键,不要和 Vim 的 leader 冲突!

这里简单给出 Tmux 的配置过程:

  1. 首先还是要设置 .zshenv 环境变量 XDG_CONFIG_HOME
  2. 将 Tmux 的配置文件放置在 ${XDG_CONFIG_HOME}/tmux/tmux.conf
  3. 在上述配置文件末尾,添加一行:run '~/.config/tmux/plugins/tpm/tpm'
  4. 安装 tpm (Tmux Package Manager): git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

最佳实践

这一部分是写给我自己的,因为我确信我自己已经设置了最佳实践。

  1. 获得 Tmux 配置:git clone [email protected]:LittleNewton/tmux-config.git ~/.config/tmux
  2. 杀死 Tmux 进程:tmux kill-server
  3. 进入 Tmux 会话,稍等片刻,直接 prefix + I (即 prefix + Shift + i) 安装插件即可。

因为笔者已经做了 tpm 的存在性检查,可根据检查结果判断是否要自动安装 tpm. 如此,基本可以实现全部自动化。

2.5 Zsh 配置·

最佳实践

1
git clone [email protected]:LittleNewton/zsh-config.git ~/.config/zsh

随后直接运行 zsh 即可。该脚本全部自动化执行,只要网络通畅,可保证配置成功。

2.6 总结·

常用的开发工具已经基本介绍完毕,其中涉及到:

  • 用来做版本管理的 Lazygit
  • 用来浏览文件、管理文件的 Joshuto
  • 用来编辑文本、调试代码的 NeoVim
  • 用来保持会话、管理窗口的 Tmux

除了 Tmux,其他软件已经实现了全部自动化配置。

有了上述这些终端工具,可以非常舒服地实现

  • 终端编程、文本编辑
  • 终端内的文件浏览、批量重命名
  • 终端内的 git 快捷使用
  • 终端的持久化与多样化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
echo '# XDG 规范的路径
export XDG_CONFIG_HOME="$HOME/.config"
export XDG_DATA_HOME="$HOME/.local/share"
export XDG_CACHE_HOME="$HOME/.cache"

# Zsh related config file.
export ZDOTDIR="$XDG_CONFIG_HOME/zsh"
export HISTFILE="$ZDOTDIR/.zhistory" # History filepath
export HISTSIZE=10000 # Maximum events for internal history
export SAVEHIST=10000 # Maximum events in history file

# Zim related config file.
export ZIM_HOME="$XDG_DATA_HOME/zim"' > ~/.zshenv && source ~/.zshenv

git clone [email protected]:LittleNewton/lazygit-config.git ~/.config/lazygit
git clone [email protected]:LittleNewton/nvim-config.git ~/.config/nvim
git clone [email protected]:LittleNewton/tmux-config.git ~/.config/tmux
git clone [email protected]:LittleNewton/zsh-config.git ~/.config/zsh
git clone [email protected]:LittleNewton/joshuto-config.git ~/.config/joshuto

3. 各个平台的 Terminal·

3.1 macOS 的 iTerm2·

macOS 作为真正的 Unix,自然不缺良好的终端工具。

iTerm2 官网

3.2 Windows 的 Windows Terminal·

Windows Terminal 对笔者而言是非常重要的核心工具,没有了 Windows Terminal 就可以抛弃 Windows 操作系统了。

点此下载 v1.18.3181.0

目前 Windows Terminal 早已是正式版,功能比较齐全。但是与 iTerm2 相比,Windows Terminal 尚显稚嫩。直到 v1.18 版本才解决之前字体渲染的一个恶性 bug,微软你说你丢不丢人!

总结·

本文论证了个人电脑购买的方向,坚决抵制厚重的笔记本。

同时,Windows 和 macOS 都有完善的终端环境,因此可以用来进行远程开发。