Home

Awesome

强迫症的 Mac 设置指南

如何配置一个高效的 Mac 工作环境

English Version

本文的最初版本写于 2015 年,那时候我用的是一台 2013 款的 MacBook Pro,操作系统刚升级到 OS X El Capitan 10.11。想要怀旧的可以点击 2015 Version

后来到了 2019 年,我拿到了 2019 款的 MacBook Pro,操作系统是 macOS Catalina 10.15。我特意没有从 Time Machine 恢复,而选择从头配置。当我按照本文配置时我发现,很多地方都变了。彼时的内容在 2019 Version

现在是 2024 年,我升级到了一台 M3 Max 的 MacBook Pro,操作系统是 macOS Sonoma 14。这次同样增加了很多内容。

Table of Contents

可以点击 GitHub 右上角的菜单图标打开索引。

Why this document

一直想写这么一篇文章,把我从同事那里学到的经验分享出来。市面上有很多类似的文章,写得都非常好,让我受益匪浅。不过我还是有一些自己总结出来的经验想要分享。

在工作中,我一般会在 1 到 10 人的团队中,经常会结对编程,即两个人共用一台 Mac 工作,因此也经常会把 Mac 外接一个大显示器、鼠标和键盘。我的常用开发平台有 Java、Ruby、Node.js、Web 等,使用 JetBrains 的开发工具,比如 IntelliJ IDEA、RubyMine、WebStorm 等。

我深知自己的知识有限,所以写下本文以便和大家切磋交流。同时更有效率的方法和更好的工具也在不断涌现,我也贪心的希望把更好的方法和工具都收集更到到这里,我会不断更新本文,让它尽量不过时。最新内容请访问:https://github.com/macdao/ocds-guide-to-setting-up-mac。欢迎通过 GitHub 的Issues或者直接Pull Requests方式来分享你的经验。期待你的反馈。

我认为“一个高效的 Mac 工作环境”有以下几个特点:

本文对于第三方应用如何安装和使用只有最简单的介绍,具体还请参考官方网站和相关文档。

有些章节标题标注了 [OCD],意思是这些章节带有我强烈的个人色彩,如果你跟我臭味相投,欢迎借鉴,如果你并不认同,请忽略掉好了。

PS:虽然本文名为“强迫症”,但其实并不是真正意义上的强迫症,真正意义上的强迫症是一种会对患者的日常生活产生负面影响的疾病。

1. macOS

本节介绍操作系统本身的一些设置。

设置 Trackpad 轻点来点按

默认情况下按下触摸板才是点按(click)。我喜欢设置成用轻点作为点按:

选择 [System Settings] > [Trackpad],在 [Point & Click] 标签页中选中 [Tap to click]。

三指拖动

我习惯于三指拖动窗口。设置方法:选择 [System Settings] > Accessibility] > [Pointer Control] > [Trackpad Options],选中 [Use trackpad for dragging],并且选择 [Dragging style] > [Three Finger Drag]。

设置完成后,还可以使用三指拖动的方式选择文本。

功能键

默认情况下,F1-F12 都是特殊功能,比如调节屏幕亮度。而当你需要键入 F1-F12 时(比如在使用 IntelliJ IDEA 的快捷键时),需要同时按住 Fn。这对于开发人员来说是非常不方便的。

把 F1-F12 改成标准功能键:选择 [System Settings] > [Keyboard] > [Keyboard Shortcuts] > [Function Keys],选中 [Use F1, F2, etc. keys as standard function keys]。

PS:在带 Touch Bar 的机型上,这个设置貌似没有作用。

全键盘控制

当你在 Code 里关闭文件时,可能会遇到这样的对话框:

dialog-box-without-all-controls

注意这个 [Save] 按钮跟其他两个按钮不太一样,它的底色是蓝的。这种按钮被称为默认按钮,除了用鼠标点击触发外,还可以通过回车键触发。

那么问题来了,如果你不想保存,想点击 [Don't Save],是不是只能用鼠标点击了呢?

并不是这样:选择 [System Settings] > [Keyboard],选中 [Keyboard navigation],之后这个对话框会变成这样:

dialog-box-with-all-controls

这个 [Don't Save] 按钮有了一圈蓝边,这个意味着你可以通过空格键触发。不仅如此,你还可以用Tab键把蓝边转移到其他按钮,来实现全键盘控制。

除了All controls这个方法,你还可以用Command-Delete来选择 [Don't Save]。Command-Delete的作用是在包含“删除”或“不存储”按钮的对话框中选择“删除”或“不存储”。

除了上述两个办法之外,居然还有个方法!就是按Command-D!据说是因为按Command-按钮的大写首字母可以触发该按钮。可是!我按了Command-CCommand-S想取消和保存都没用!但是Command-D真的有用!如果仅仅是这也就算了,可是我又手贱试了下 TextEdit,在关闭未保存的文件时弹出的对话框上有三个按钮 [Delete]、[Cancel] 和 [Save]。然而Command-DCommand-C都没用,但是!Command-S可以保存!我完全不能理解!我整个人几乎都是崩溃的,只好以咆哮体写下这段文字。如果谁能解释请务必告诉我,必有重谢!

Command-C不能用应该是因为它绑定到了复制功能;而Command-D不能用因为它的作用是从“打开”对话框或“存储”对话框中选择“桌面”文件夹。

在这个对话框上,你可以用Esc来执行 [Cancel] 操作。

输入法快捷键

输入法我一直使用系统自带的拼音输入法。

由于 JetBrains 的 IDE,比如 IntelliJ IDEA、WebStorm 等都使用Control-空格键作为自动完成这个最常用功能的快捷键。这和输入法切换的快捷键冲突了。我不建议更改 IDE 的快捷键,因此我建议更改输入法的快捷键。而由于 macOS 已经默认使用Caps Lock键来切换输入法,这个非常方便,所以我建议将Control-空格键快捷键释放。

选择 [System Settings] > [Keyboard] > [Keyboard Shortcuts] > [Input Sources],取消 [Select the previous input source] 和 [Select next source in input menu]。

双拼输入法

从2020年2月,我开始使用双拼输入法,替代使用了多年的全拼输入法。和全拼(也就是最常见的“拼音输入法”)类似,双拼是一种基于拼音的,高效的输入法。它将拼音的声母和韵母分别映射到某个按键上,一个字只需要击键两次,一次声母,一次韵母。和全拼一样,主流的输入法软件都支持双拼。

想了解更多可以参考我写的文章双拼:一天内就能掌握的高效拼音输入法

其他快捷键

让双手尽量多的键盘和快捷键,少使用鼠标和触摸板,可以大大提高效率。

语音

macOS 自带了语音功能,可以用say命令让 Mac 开口说话:

say hello

可以和&&或者;配合使用来提示你某任务已经完成:

brew update && brew upgrade && brew cleanup ; say mission complete

通过命令行来听取发音还是有点麻烦。其实我们几乎可以在任何地方选中单词,然后使用快捷键Option-Esc发音。仅仅需要这样设置一下:选择 [System Settings] > [Accessibility] > [Spoken Content],选中 [Speak selection]。

词典

macOS 自带了词典(Dictionary)。你几乎可以在任何应用中通过重按触摸板来现实对应单词的释义。如果你更喜欢三指轻拍触摸板,可以在 [System Settings] > [Trackpad],在 [Point & Click] 标签页中选择 [Look up & data detectors] > [Tap with Three Fingers]。

也可以打开 Dictionary 应用来查找单词。

可以在 Dictionary 应用中添加英汉汉英词典。

Dock Position

默认 Dock 在屏幕下方。我们的屏幕一般都是 16:10,Dock 在屏幕下方的话会占据本来就不大的垂直空间。建议把 Dock 放到右边或者左边。

选择 [System Settings] > [Desktop & Dock],在 [Position on screen] 中选择不同的位置。我个人喜欢放在右侧。

Keychain Access

钥匙串访问(Keychain Access)是一个 macOS 应用程序,对我来说它最大的功能就是查看已经保存的各种账号和密码,包括 Wi-Fi 密码。

PS:现在可以在 [System Settings] > [Wi-Fi] > [Advanced] 查看 Wi-Fi 密码,可以在 [System Settings] > [Passwords] 里查看保存的网站密码。

高效的光标

默认情况下,光标的闪烁速度和移动速度是相当慢的。当你需要用退格键删除大段文字的时候,会觉得痛不欲生,因为即使长按退格键,光标也移动的很缓慢。

调节光标移动速度:选择 [System Settings] > [Keyboard],把 [Key repeat rate] 以及 [Delay until repeat] 的滑块拉到最右端,分别把持续连续输入和首次连续输入加快,从此享受飞一般的速度。

Safari 打开上次会话的所有窗口

我经常在浏览器里打开多个窗口,这时候如果不小心关闭了(比如浏览器更新)那窗口就丢失了,非常影响工作。可以设置浏览器自动打开关闭前的所有窗口。选择 Safari 的 [Settings] >[General] > [Safari opens with] > [All windows from last session]。

查看充电功率

如果想知道当前的充电功率,可以使用如下命令:

system_profiler SPPowerDataType | grep Wattage -C 5

能看到如下内容:

    AC Charger Information:

      Connected: Yes
      ID: 0x0000
      Wattage (W): 60
      Family: 0xe000400a
      Charging: No

Activity Monitor

Activity Monitor 默认的 Dock 图标是静态的,可以设置为显示 CPU 曲线,实时了解机器负载情况。

右键(双指)点击 Dock 上 Activity Monitor 的图标,选择 [Dock Icon] > [Show CPU History]。

在 Menu Bar 上显示日期

我喜欢让菜单栏上显示日期,这样可以方便的看到当天的日期。现在默认就是这样,不需要额外设置。设置的地方在 [System Settings] > [Control Center] > [Clock Options]。

Spotlight 快捷键

Spotlight 的快捷键(不论是英文版还是中文版)都已经统一成了Command-空格键,此处没有什么修改建议。

创建大小写敏感的工作区

unverified

在多人合作的项目开发时,因为 Mac 文件系统默认是大小写不敏感的,所以经常会出现一些诡异的问题。创建一个大小写敏感的工作区(workspace)来解决避免这些问题:

hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 100g -volname workspace ~/Documents/workspace.dmg.sparseimage

可以通过三种方式挂载镜像:

Remove all Dock icons [OCD]

本条目对于强迫症适用。

默认情况下 Dock 被一堆系统自带的应用占据着,而其中大部分我都很少使用,当我打开几个常用应用后,Dock 上会有很多图标,每个图标都会被挤得很小。所以我会把所有 Dock 上固定的图标都删掉,这样一来 Dock 上只有我打开的应用。

PS:Finder 图标是删不掉的。

除了一个一个删除图标,也可以通过这个命令来删除所有的固定图标:

defaults write com.apple.dock static-only -bool true; killall Dock

PS:Dock 上的Downloads也会被隐藏掉。

如何恢复(之前只改变static-only的方法已经不生效了):

defaults delete com.apple.dock; killall Dock

PS:使用这个方法会让所有的 Dock 配置重置,包括 Dock Position。

重置 Launchpad 上图标位置 [OCD]

本条目对于强迫症适用。

新的应用被安装后,经常会跑到 Launchpad 的第一屏,所以它们的位置跟安装的顺序有关系,而我更希望它们可以按照某种更加稳定的顺序排列,比如按照系统默认的顺序:

defaults write com.apple.dock ResetLaunchPad -bool true; killall Dock

在默认顺序中,Launchpad 第一屏只有 Apple 自家应用。

2. 常用工具

本节介绍一些常用的,跟开发没有直接关系的第三方应用及其设置。

Homebrew

包管理工具,官方称之为The missing package manager for macOS

官网的安装命令:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

PS:安装 Homebrew 的时候会自动下载和安装 Apple 的 Command Line Tools。

安装完成后,Homebrew 建议你加入这样一句话到~/.zprofile中:eval "$(${HOMEBREW_PREFIX}/bin/brew shellenv)。而如果你使用了 Oh My Zsh,你可以直接使用brew插件来代替这一步。修改~/.zshrc,在plugins=(git)的括号中加上brew,例如plugins=(git brew)

有了 Homebrew 以后,要下载工具,比如 Wget、Gradle、Maven 等工具,就不需要单独去网上下载了,只要一行命令就能搞定:

brew install wget gradle maven

执行install的时候经常会执行更新,有时候会比较慢,我们可以设置环境变量HOMEBREW_NO_AUTO_UPDATE关闭更新:

echo export HOMEBREW_NO_AUTO_UPDATE=1 >> ~/.zprofile

想知道世界上其他人喜欢使用哪些工具?可以在这里查看到下载排名,看看哪些应用工具是最热门的。

Homebrew 的替代品有 MacPorts,我没有用过。

使用国内镜像安装 Homebrew

有时候在国内访问 GitHub 非常慢,导致安装 Homebrew 总是失败。之前我提供过一个方法,不过现在 Homebrew 已经支持使用国内的源安装

export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles"
/bin/bash -c "$(curl -fsSL https://mirrors.ustc.edu.cn/misc/brew-install.sh)"

其中HOMEBREW_BOTTLE_DOMAIN的设置可以让安装过程中的ruby下载使用镜像。参考Homebrew 源使用帮助

然后为了让镜像持续生效,请把以下内容添加到~/.zprofile文件中。

export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles"
export HOMEBREW_API_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/api"

其中HOMEBREW_API_DOMAIN会把包安装信息的地址设置成镜像地址。具体参考 brew(1)4.0.0

Homebrew Cask

Homebrew Cask 允许你使用命令行安装 macOS 应用。比如你可以这样安装 Chrome:brew install --cask google-chrome。还有 Evernote evenote、Sublime Text sublime-text、VirtualBox virtualbox、Docker docker、Firefox firefox、Visual Studio Code visual-studio-code 等都可以用 Homebrew Cask 安装。

Homebrew Cask 是社区驱动的,如果你发现 Homebrew Cask 上的应用不是最新版本,或者缺少你某个应用,你可以自己提交 pull request。

目前 Homebrew Cask 已经和 Homebrew 深度集成,不需要单独安装了。

应用也可以通过 App Store 安装,而且有些应用只能通过 App Store 安装,比如 Xcode 等一些 Apple 的应用。App Store 没有对应的命令行工具,并且还需要 Apple ID,相对有些麻烦,倒是更新起来很方便。

几乎所有常用的应用都可以通过 Homebrew Cask 安装,而且是从应用的官网上下载,所以你要安装新的应用时,建议用 Homebrew Cask 安装。如果你不知道应用在 Homebrew Cask 中的 ID,可以先用brew search命令搜索。

使用国内镜像安装 Homebrew Cask

根据上文使用国内镜像安装 Homebrew 讲的方式设置后,Cask 也可以使用镜像。

iTerm2

iTerm2 是最常用的终端应用,是 Terminal 应用的替代品。提供了诸如Split Panes一群实用特性。它默认的黑色背景让我毫不犹豫的抛弃了 Terminal。

安装:

brew install --cask iterm2

感谢 Homebrew Cask,我们可以通过命令行自动安装 iTerm2 了。

至此,Terminal 应用已经出色的完成了其历史使命。后面命令行就交给 iTerm2 啦。

在终端里,除了可以用Control-E等快捷键(详见其他快捷键)之外,还可以使用Option-BOption-F等快捷键(具体可以参考这里)。前提是这样设置一下:

选择 [Settings] > [Profiles],选择你在使用的 Profile(默认是Default),在 [Keys] 标签页中把 [Left Option key:] 和 [Right Option key:] 都设置成 [Esc+]。

在打开新的窗口/标签页的时候,默认情况下新窗口总是$HOME目录,还需要我每次敲命令才能进入工作目录。如果想要这个新窗口在打开的时候就自动进入工作目录,需要如下设置:

选择 [Settings] > [Profiles],选择你在使用的 Profile(默认是Default),在 [General] 标签页中的选择 [Working Directory] > [Reuse previous seesion's directory]。

在 iTerm2 中双击会自动选中对应的词,三击会选中对应的整行。选中的内容会自动进入剪贴板,不需要再按Command-C复制。

我经常使用 iTerm2 自带的密码管理工具管理一些终端用到的密码。在 iTerm2 的 [Window] > [Password Manager](或者快捷键Command-Option-F)打开。

Timestamps 功能,可以在终端里显示每行输出的时间。一次性使用:[View] > [Show Timestamps],默认使用:[Settings] > [Profiles] > [Session] > [Show timestamps] -> [Always]。

Oh My Zsh

默认的 Bash (Catalina 已经默认使用 Zsh)是黑白的,没有色彩。而 Oh My Zsh 可以带你进入彩色时代。Oh My Zsh 同时提供一套插件和工具,可以简化命令行操作。后面我们会看到很多介绍,你会看到我爱死这家伙了。

官网的安装命令:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

对于国内用户可以使用如下方法

sh -c "$(curl -fsSL https://install.ohmyz.sh)"

目前我使用的插件有:git z history brew asdf

Oh My Zsh 使用了 Z shell(Zsh),一个和 Bash 相似的 Shell,而非 Bash。

Oh My Zsh 还有很多有价值的插件

替代品有基于 fish shellOh My Fish,基于 Bash 的 Oh My Bash

命令补全

Z shell 支持命令补全,而 Oh My Zsh 会默认启用它。现在你在终端里里键入curl -然后按Tab键,就可以看到各种候选参数:

--data         -d  -- HTTP POST data
--fail         -f  -- Fail fast with no output on HTTP errors
...

再次按下Tab键还可以通过方向键选择参数。

我们通过 Homebrew 查看工具的信息时,例如brew info colima

==> Caveats
zsh completions have been installed to:
  /usr/local/share/zsh/site-functions
...

说明这个工具自带了命令补全配置,通过 Homebrew 安装后就可以直接使用了。例如在终端里里键入colima 然后按Tab键,就可以看到各种候选参数:

completion  -- Generate completion script
delete      -- delete and teardown Colima
...

然而,如果你使用的是 Apple silicon 电脑,那么这样还不行。具体参考 brew Shell Completion。简而言之,Z shell 通过compinit命令来启用命令补全,compinit会遍历$fpath变量里的目录,加载其中的命令补全配置。对于 Intel 电脑, Homebrew 会把命令补全配置安装到/usr/local/share/zsh/site-functions目录中,这也是 Z shell 默认的$fpath。但是对于 Apple silicon 电脑, Homebrew 的目录变成了/opt/homebrew/share/zsh/site-functions,所以需要我们自己配置一下,把以下内容添加到~/.zprofile文件里:

FPATH="/opt/homebrew/share/zsh/site-functions:${FPATH}"

我看到很多文章建议使用 zsh-completions。其实这不是命令补全必须的,这个仓库包含了很多 Homebrew 的工具没有带的、常用命令的补全配置,例如mvnyarn。如果你需要用到它们,可以安装它。

Git 常用别名

几乎每个人都会使用一些方法比如 Git 别名来提高效率,几乎所有人都会把使用git st来代替git status。然而这需要手动设置,每个人也都不完全一样。

Oh My Zsh 提供了一套系统别名(alias),来达到相同的功能。比如gst作为git status的别名。而且 Git 插件是 Oh My Zsh 默认启用的,相当于你使用了 Oh My Zsh,你就拥有了一套高效率的别名,而且还是全球通用的。是不是棒棒哒?下面是一些我常用的别名:

AliasCommand
gapagit add --patch
gc!git commit --verbose --amend
gclgit clone --recurse-submodules
gcleangit clean --interactive -d
gcmgit checkout $(git_main_branch)
gcmsggit commit --message
gcogit checkout
gdgit diff
gdcagit diff --cached
glolagit log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --all
gpgit push
grbcgit rebase --continue
gstgit status
gprgit pull --rebase
gwipgit add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign --message "--wip-- [skip ci]"

完整列表请参考:https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git/

ShiftIt

该工具在 macOS 12 的某次更新后就无法工作了。根据其作者建议,我更换成了 Hammerspoon ShiftIt

原生 macOS 下只能手动调整窗口大小,所以我们需要窗口管理工具。我用过很多窗口管理工具,可惜大部分工具都存在快捷键冲突的问题(对我来说主要和 IntelliJ IDEA 冲突)。ShiftIt 是少见的没有冲突的窗口管理工具:

brew install --cask shiftit

替代者有 SizeUp,主要快捷键和 ShiftIt 相同。

当然如果喜欢 hacking,Slate 是个不错的 hackable 的窗口管理工具。配置可以参照 http://thume.ca/howto/2012/11/19/using-slate/

最近我又研究了下 Rectangle(在 Homebrew 排行榜上排名很高),很遗憾的发现它默认快捷键和 IntelliJ IDEA 有冲突。

Hammerspoon ShiftIt

一个基于 Hammerspoon,模拟 Shiftit 窗口管理功能的方法。安装步骤稍显繁琐。安装方法见标题链接。

如果 Step 2 中的ShiftIt spoon无法下载,可以使用链接,文件是一模一样的。

z

在打开终端后,你是怎么进入项目的工作目录?是cd xxxControl-R还是用别名?

z 工具可以帮你快速进入目录。比如在我的 Mac 上运行z cask就会进入/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask目录。

这货的安装非常方便,甚至都不需要下载任何东西,因为它已经整合在了 Oh My Zsh 中。编辑~/.zshrc文件,在plugins=(git)这行中加上z变成plugins=(git z),然后运行source ~/.zshrc重新加载配置文件,就可以使用 z 了。

替代品有 autojump。autojump 需要使用 Homebrew 安装。

Vimium

Vimium 是一个浏览器扩展,让你可以纯键盘操作浏览器,把你的浏览器变成“黑客的浏览器”。

安装方法请参考官方网站。支持 Chrome、Edge、Firefox。

安装字体

我经常会使用一些开源字体,比如Open Sans。之前我会从网上寻找并下载字体,后来使用 SkyFonts 安装字体,直到我发现了 homebrew-cask-fonts

brew tap homebrew/cask-fonts
brew install font-open-sans

BCLM

我看到一个研究,说是相比于「放电到 25% 再充电,然后充电到 100%」,「放电到 45% 再充电到 75%」会让电池会有更长的寿命(健康度)。

所以为了避免充电到 75% 以上,我会使用工具 bclm,将充电上限限制到 50 到 100 中的任意整数。对于 Apple silicon 电脑,可以设置为 80 或 100。

brew tap zackelia/formulae
brew install bclm

参考几个月电池健康掉到90%?这样充电电池寿命延长3倍(非标题党)

最近我的 M3 Max Macbook Pro 升级到 macOS 的最新版本(14.7)后, BCLM 不能使用了。我正在尝试使用 batt 替代。batt也可以使用 Homebrew 安装。注意安装好后需要使用sudo brew services start batt来启动服务。

AlDente

AlDente 可以视为 BCLM 的加强版,它会安装一个 Helper,让电量维持在 20-100 之间的任意值,这一点比 BCLM 强大。

使用过一段时候后,我发现 AlDente 会占用我的 Menu Bar,让我的刘海 MacBook Pro 的 Menu Bar 空间更加拙荆见肘。我还是喜欢命令行和开源,所以最近在尝试batt

totp-cli

我经常需要输入一些 2FA 的验证码,这需要打开手机 App 复制 6 位的数字。如果可以直接在笔记本上直接完成,那么就会方便许多。

totp-cli是一款在电脑上运行的 TOTP 工具,可以通过命令行生成验证码。除此之外,他还可以加密保存密钥、管理多组密钥以及导入导出。之前我使用的是oathtool,自己管理密钥(我放到了 Keychain 里),还要写脚本。现在我已经换成了totp-cli

brew install totp-cli

Visual Studio Code

我现在使用 Visual Studio Code 更多一些。Visual Studio Code 同样也有 Homebrew Cask 自动建立code链接,也有 Oh My Zsh 插件支持。

brew install --cask visual-studio-code

Sublime Text 3

unverified

安装:

brew cask install sublime-text

在命令行中指定使用 Sublime Text 打开某文件,是一个非常常用的功能,一般我们会按照 OS X Command Line 中所说执行 ln -s "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" ~/bin/subl 来增加subl链接。但是如果你用 Homebrew Cask 安装的话,恭喜你,你不需要运行这个命令,因为 Homebrew Cask 自动帮你做了这件事情。而且你卸载 Sublime Text 的时候 Homebrew Cask 会自动删掉这个链接。

同时 Oh My Zsh 也提供了 Sublime Text 插件,叫做sublime。参考:https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#sublime,这个插件和通过 Homebrew Cask 安装的 Sublime Text 完美兼容。

替代品有 Atom、TextMate、Sublime Text 2 等,跟 Sublime Text 3 一样,用 Homebrew Cask 安装的话命令行工具会被自动加入$PATH

MacDown

unverified

MacDown 是 Markdown 编辑器。由于 Mou 一直不支持代码高亮,我就转向了 MacDown。完美支持 GFM

我特别喜欢 Markdown,我用 Makdown 来写文章(包括本文),写幻灯片(reveal.js)。Markdown 可以让我专注于内容本身,而无需花精力在排版和样式上。

安装:

brew install --cask macdown

Homebrew Cask 还会增加macdown命令,可以在命令行方便的使用 MacDown 打开文件。

Scroll Reverser

unverified

当你在浏览一个很长的网页时,你看完了当前显示的内容,想要看后续的内容,你可以在 Trackpad 上双指上滑,或者鼠标滚轮向上滚动。这是被称作“自然”的滚动方向。

然而在 Windows 里鼠标滚动的行为是相反的:鼠标滚轮向下滚动才会让浏览器显示后续的内容,向上滚动会达到页面的顶部。你可以在 macOS 的系统偏好设置里修改(选择 [System Settings] > [Trackpad],在 [Scroll & Zoom] 标签页中取消 [Natural scrolling]),但是这样会同时改变 Trackpad 的方向。

要想只改变鼠标滚轮的方向,而保持 Trackpad 依旧是“自然”的,我们需要 Scroll Reverser:

brew install --cask scroll-reverser

PS:这货会让三指点击失效。

LastPass

unverified

LastPass 是管理密码的工具,支持二次验证,提供所有浏览器插件以及 Mac 桌面版本。

最重要的是,它提供命令行的版本,可以直接通过 Homebrew 安装:

brew install lastpass-cli --with-pinentry

之后,只需要命令:

lpass login you@email.com

就可以拷贝密码或者集成到其他命令中了:

lpass show --password gmail.com -c

SourceTree

unverified

SourceTree 是 Atlassian 公司出品的一款优秀的 Git 图形化客户端。如果你发现命令行无法满足你的要求,可以试试 SourceTree。

安装:

brew install --cask sourcetree

用 Homebrew Cask 安装会自动增加命令行工具stree$PATH里。在命令行中输入stree可以快速用 SourceTree 打开当前 Git 仓库。详细用法请参见stree --help

CheatSheet

unverified

CheatSheet 能够显示当前程序的快捷键列表,默认的快捷键是长按Command

安装:

brew install --cask cheatsheet

Alfred

unverified

Mac 用户不用鼠标键盘的必备神器,配合大量 Workflows,习惯之后可以大大减少操作时间。

安装:

brew install --cask alfred

Stow

unverified

GNU Stow 是管理符号链接(symlink)的一个小公举。主要用于 symlink 你的 dotfiles 如 Emacs、Git、fish shell/Zsh 的配置文件。安装只需要:

brew install stow

安装了 stow 之后,我们可以开始 symlink 一些 dotfiles 了。完整使用 stow 和 dotfiles 的流程可以参考 https://github.com/jcouyang/dotfiles

当你的 dotfiles 都妥妥的 symlink 到 ~/dotfiles 后,push 到 GitHub 上就再也不怕换电脑了。

3. 开发工具

asdf-vm

asdf-vm 是一个命令行工具,它可以让你同时安装多个版本的开发工具,版本间可以随时切换,还可以基于全局、目录、和当前 shell session 配置不同的版本。它以插件的形式支持开发工具,目前支持 .NET Core、Clojure、Deno、Groovy、Java、Kotlin、Maven、MySQL、Node.js、PHP、Python、Ruby、Scala、Yarn 等近 200 个,具体参见插件列表。有了 asdf-vm,你就不再需要另外安装gvmnvmrbenvpyenv等工具了。

我现在使用 asdf-vm 来管理我使用的开发工具,包括 Java、Node.js、Gradle、Maven。

brew install asdf

可以使用前缀的方式来安装最新稳定版本:

asdf plugin add java
asdf install java latest:temurin-21

asdf-vm 还需要对环境变量PATH做一些更改。幸好还有asdf for oh-my-zsh插件,可以帮助完成设置。

需要注意的是,这个插件依赖于 Homebrew,所以在插件配置时需要把brew放在asdf前面,例如:

plugins=(git z history brew asdf gradle)

使用 asdf-vm 安装的工具的命令补全可能会有问题。每个命令的补全配置需要额外安装,使用 Homebrew 往往会自动安装补全配置。另外 Oh My Zsh 也可能带了补全配置,例如 Gradle

替代品有 SDKMAN!

Java

macOS 都不会自带 JDK 了,所以进行 Java 开发的话,需要下载 JDK。在 Homebrew Cask 之前,我们需要从 https://developer.apple.com/downloads/ 或者 Oracle 网站上下载。还有更麻烦的--卸载 JDK 和升级 JDK。

JDK 安装文件是 pkg 格式,卸载和.app不一样,且没有自动卸载方式。

可以通过brew install openjdk@17或者brew install --cask temurin直接安装 JDK,不过我现在都改用 asdf-java了。

替代品有 jEnv

国内使用

因为通过asdf-java的时候要访问raw.githubusercontent.com,所以一些命令可能会失败。可以运行以下命令来避免。

对于 Intel 电脑:

cp ~/.asdf/plugins/java/data/jdk-macosx-x86_64-ga.tsv $TMPDIR/asdf-java-$(whoami).cache/releases-macosx-x86_64.tsv

Apple silicon 电脑:

cp ~/.asdf/plugins/java/data/jdk-macosx-aarch64-ga.tsv $TMPDIR/asdf-java-$(whoami).cache/releases-macosx-aarch64.tsv

在 macOS 上,有些应用会通过命令/usr/libexec/java_home来使用 JDK。对此,asdf-java也提供了解决方案

民间使用的 Java 版本切换方法

添加以下脚本到当前 shell 配置文件中:~/.zprofile或者~/.bash_profile

function setjdk() {
    export JAVA_HOME=`/usr/libexec/java_home -v $@`
}

这样我们就可以通过输入一条命令进行版本切换了:

setjdk 1.8

IntelliJ IDEA

Java 开发必备工具 IntelliJ IDEA。可以安装 Ultimate Edition:

brew install --cask intellij-idea

也可以安装开源免费的 Community Edition:

brew install --cask intellij-idea-ce

IntelliJ IDEA 有几套内建的快捷键方案(Keymap)。其中我比较常用的有macOSIntelliJ IDEA Classic两种。区别是:

一个团队使用不同的快捷键会影响效率。可以用 [View] > [Quick Switch Scheme] > [4 Keymap] 快速切换 Keymap。

之前我经常会在 macOS 和 Windows 平台上使用 IDEA,所以我一般使用IntelliJ IDEA Classic方案。最近我都使用默认的macOS方案。

可以从 IDEA 的 [Help] > [Keyboard Shortcuts PDF] 打开快捷键的参考手册。

IntelliJ IDEA 默认的Jetbrains Mono字体支持字体连笔(font ligatures),非常酷。设置方法:[Settings] > [Editor] > [Font],选中 [Enable ligatures]。

Docker

开发中经常需要用到 Docker。因为 Docker Desktop 不再免费,我开始使用 Colima

brew install docker colima

PlantUML

开发中经常需要画图。我的很多同事会用 draw.io 一类的工具来画图,然而我更喜欢基于纯文本的格式,例如 Markdown 来写文档、用 reveal.js 做幻灯片、用 PlantUML 画架构图和类图。使用纯文本,可以方便的比较差异,可以方便的合并,也更加开放可以选择不同的工具。

我之前会使用 Graph-Easy,而现在会使用 PlantUML。 PlantUML 有着繁荣的开放生态。C4 model 已经集成到标准库中。

IntelliJ IDEA、Visual Studio Code 都有插件支持。Visual Studio Code 还可以在 Markdown 里嵌入 PlantUML

除了 GraphViz,PlantUML 还支持了其他布局引擎,包括基于 Java 的 SmetanaEclipse Layout Kernel / ELK。由于 ELK 会用折线来绘制连线,所以布局上会比 GraphViz 和 Smetana 更加清晰一些,所以我最近会更多的使用 ELK。

我喜欢在本地运行,相比于官方的服务,本地运行可以使用更好的中文字体。我使用的是 PlantUML PicoWeb Server 方法,可以方便的加入 ELK。

rbenv

已经使用 asdf-vm 替代

unverified

人人都需要一个 Ruby 版本管理工具。rbenv 就是这样一个轻量级工具,它可以通过 Homebrew 安装。

安装:

brew install rbenv ruby-build

然后在~/.zshrc中加上rbenv插件,否则你需要手动添加eval "$(rbenv init -)"~/zshrc或者~/.zprofile文件里。

有时候项目会依赖一些奇怪的版本号,比如ruby-2.1.0,这个时候你需要 rbenv-aliases 帮忙:

brew install rbenv-aliases

替代品有 RVM、chruby。因为 RVM 不能通过 Homebrew 安装,并且安装的时候会没有节操的修改一堆文件,所以被我早早的弃用了。chruby 也是一个轻量级工具,而且可以完美的和 Oh My Zsh 集成在一起,我看到有些生产环境在用它。

Ruby 常用别名

unverified

几乎所有 Ruby 开发人员都会把bi作为bundle install的别名。Oh My Zsh 提供builder插件,这个插件提供了一套别名,比如bibe。同时还能让你在运行一些常用 gem 的时候直接输入rspec,不需要be rspec这样了。具体包括哪些命令请参考这里

Zsh 对于[]符号有特殊的处理,所以在运行rake task[parameter]的时候会报错,你需要改成rake task\[parameter\]或者noglob rake task[parameter]。然而 Oh My Zsh 已经看穿这一切,自带的 rake 插件已经解决了这个问题:brake task[parameter]

添加插件的时候注意把rake放到bundler后面,例如这样:

plugins=(git z sublime history rbenv bundler rake)

Node 版本管理

已经使用 asdf-vm 替代

unverified

Node 的版本管理工具有很多,常用的会有以下几个:

目前根据 GitHub Stars,这三个管理工具的排名依次是 nvm、n、nodenv。但是个人建议采用 nodenv,原因同 rbenv,尤其已经在使用 rbenv 的伙伴们会觉得 nodenv 更顺手 :smile: 。

Java [OCD]

作为一个强迫症患者,每当我看到 Java 的错误写法就想纠正过来。

当指编程语言时,Java 的正确写法是首字母大写,其余小写。其他写法比如JAVAjava都是不对的。

在其他一些地方会使用小写的java

只有在全大写的标题里使用JAVA或者环境变量JAVA_HOME

参考资料