第 1 章 序言
本书已被字节跳动收录为公司级别的,新员工入职培训的通用基础课程,帮助近千名员工更加深入全面的了解他们最亲密的工作伙伴。
对于程序员来说,每天陪女朋友和枕头的时间可能加起来还不如使用 Mac 久,但大多数人对朝夕相处的生产力工具并不了解,并不知道很多重复且复杂的操作,是有办法简化、甚至自动化完成的。
从我走上工作岗位来,就一直致力于解决各种 Mac 使用过程中常见的痛点,提高程序员的工作效率。在探索的过程中,查找、学习、尝试并比较了大量的方案,最终总结整理出一套相对比较优秀的实践指南,方便读者直接拿来使用,而不用再花费同样的时间,重新走一次我走过的老路。考虑到很多知识和技巧无法用文字简单的描述,本书还录制了几十个屏幕操作,用于更直观的向读者演示。
经过两年多的准备,我觉得已经等到了成熟的时机,因此抱着忐忑和学习的心态将这几年的所学整理成文字,介绍给广大 Mac 使用者。通过对本书知识的学习,相信每位读者都可以每年轻松省出一个年假,在别人熬夜加班的时候享受空余时间。
仅靠一本书无法覆盖所有的使用场景,并且由于能力所限,我也不敢保证提供的方案就一定是最佳实践。像 spc13 这样单独的 Vim 配置能拿到 12k+ 的星星,足以证明它在 Vim 领域的研究比我深入得多。但我希望说清楚这些配置做了什么,而不是简单的丢给读者一个脚本。虽然站在应该巨人的肩膀上,但起码要知道巨人是怎么长成的,毕竟我相信:授人以鱼不如授人以渔,只有掌握了一些核心概念,后面才能随心所欲的定制
本书共分为五章,从系统配置、Mac 工作流、编辑器之神:Vim、Git 从入门到进阶、终极武器 Zsh等方面去打造一个高效的工作流,致力于提高 Mac 工作效率的实用手册。
第一章先从 Mac 系统说起,虽然大部分程序员都使用 Mac 电脑,但这个系统并不是为程序员量身定制的,为了考虑大多数用户,必然做出妥协。因此我们有必要做一些定制,让 Mac 系统对开发者更加友好。
第二章会介绍各种神级软件,比如虽然颜值略低但功能爆表的邮件应用、完全可以替代系统终端的 iTerm2、Mac 上的最强应用(没有之一)Alfred、Chrome 的优秀插件,以及老生常谈的爱国上网最佳实践。
第三章会介绍 VSCode 和 Vim 的使用,包括 Vim 的基本操作,快到超乎你想象的光标移动方式,让写代码变成一种享受的编辑技巧,以及各种 Life-Chaging 系列的插件。最后会介绍 VSCode + Vim 的最佳实践,从此忘掉老旧的 Sublime,抛弃慢到爆炸的 Atom 并且卸载掉 JetBrains 全家桶。
第四章重点介绍 git 的进阶使用,首先会深入浅出的科普 git 的底层原理,让读者能对 git 有正确的认识,彻底摆脱只会 pull/add/commit/push 的小白状态。本章会对几乎所有常用的 git 命令做介绍,包括进阶命令的使用,以及常用参数的解释,结合 log 和 diff 两大工具,充分发挥 git 的版本控制能力。
第五章是本书的精华所在,从实用角度出发,结合我近三年的 shell 经验,向读者展示一个奇妙的 shell 世界,挖掘前人大牛们留下来的宝藏。包含了 shell 模型的科普,系统常用命令的介绍,sed/awk 等进阶命令的使用,以及用大量用 shell 提高研发效率的例子。
感谢我的前同事、上级,百度资深工程师汪双权老师带领我入门,没有他就没有这本书。感谢小专栏的负责人给予我的建议,让本书条理更加清晰。感谢我博客的所有读者提出的反馈建议,让本书更好。最后还要感谢我的女朋友给我的支持理解和帮助。
张星宇
2018 年 9 月于北京
第 1.1 章 写在阅读本书前
为什么强调效率
写下此书的目的是为了帮助 Mac 的使用者更加高效的使用他们手中的开发工具。在理想化的工作中,程序员的工作就是通过编写代码,让软件能够正常运行。
但在工作中,我们难免要处理与本职编程工作无关的事务,占用了大量的工作时间。因此提高工作效率,本质上就是一个很简单的算术题:
净节省时间 = 每天剩下的时间 * 工作天数 - 一次性学习时间
很明显净节省时间越多,提高效率就越值得、也越有必要。从公式里可以看出,想要提高净节省时间,有两个方案。
其一是减少学习时间,尽量少走弯路,这也是写作本书的目的。
其二是尽早开始学习,越早掌握这些技巧, 节省下来的时间就越多。
我的价值观
在开始正文的介绍前,我还想推广一下自己的价值观,正是这样的价值观,指导我做出了后面五章中的各种方案选型。
我坚持认为没有最好的方案,只有最适合自己的方案。每个人都有不同的工作方式和需求,因此很难找到一套放之四海而皆准的方案。也许一个人绞尽脑汁想要解决的问题,别人永远也遇不到。因此比具体方案更重要的,是对原理的了解,和一颗好奇并且追求极致的心。
我相信简单即是最美,简单即是最有效。奥卡姆剃刀原理告诉我们:“如非必要,勿增实体”。我见过很多人,系统里装满了应用,桌面乱七八糟,菜单栏显示各种插件,Dock 栏里面打开了各种软件,把 Mac 武装得像一艘航空母舰一样,但实际上得到了什么呢?无非是几个月也不打开一次,沦为收藏品的应用,和一堆乱七八糟的应用和文件,真的要用到的反而半天都找不到。这样的电脑其实就是外强中干的纸老虎,庞大的复杂度会悄悄的消耗掉程序员宝贵的时间,降低工作效率。
我更愿意选择正确的方式,而不是最习惯的方式。习惯的方式并不一定适合自己,它不是懒于学习和改进的挡箭牌。要知道对于个体来说,方案一定有高下之分,而且优秀的方案永远是优秀的,甚至越来越优秀,而习惯是可以培养的。我们不能用战术上的勤奋来掩盖战略上的懒惰。
常见误区
写作本书的另一目的是希望通过具体的例子,纠正一些流传甚广的错误和误区。比如一说到键盘党,极客,人们往往有两种极端的误区。
一种人会觉得键盘党是在装逼炫技,认为这样的操作过于复杂,毫无学习记忆的必要。其实不然, 有些快捷键或者命令行的使用确实学习成本不低,但一旦熟练使用,就很容易形成肌肉记忆。但鼠标的点击操作速度是存在上限的,因此我们应该尽可能选择快速、可自动化的方式去完成某个操作。
而另一类人又容易陷入对键盘流的盲目崇拜中,觉得这样很极客,很酷炫,总想着用类似的方式完成所有任务。因此工作中我们也会见到一类同事,对任何操作都想尽办法做优化,花费了大量时间和精力,却没有意识到同类的事情并不很复杂,或者一年也发生不了几次,而程序员的最终目标是产出代码, 一切优化和努力的最终目标都应该是更快的产出代码,而不是酷炫的工作方式。因此,我们凡事都应该计算净收益,如果学习成本高,使用成本低,节省时间又不明显,那么就不值得去做。比较典型的例子就是试图把 Vim 打造成 IDE。
因此在我看来,真正的极客并不关注完成操作的方式,而是理性计算成本和收益。不断的找到当下的痛点,选择学习成本最低,效率最高的方式去完成。
准备工作
阅读本书不需要太多的知识背景,唯一需要了解的就是 HomeBrew。HomeBrew 是 Mac 系统的包管理工具,类似于 Node 的 npm,或者 iOS 的 Cocoapods,或者 Python 的 pip,亦或者 Ruby 的 gem。
如果还没有安装 HomeBrew,安装起来也很简单,只要打开终端,输入以下命令即可:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后通过 brew 命令,就可以安装绝大多数系统依赖的工具和应用了:
brew install wget # 安装 wget 工具
brew cask install wechat # 安装微信
第 1.2 章 本书解决什么问题
我希望通过这本书,介绍一些常见的,Mac 使用过程中容易遇到的痛点,不仅仅告诉读者如何解决,还介绍背后的原理,从而起到举一反三的作用。因为痛点永远解决不完,只有学会了解决方案和原理,才能根据自己的实际情况量身定制。
一方面,Mac 系统虽然适合程序员,但毕竟不是为程序员量身定制的,还是要考虑所有用户的体验。因此作为程序员,我们可以通过配置,让 Mac 用起来更加得心应手,更适合写程序。
另一方面,这么多年的演化过程中,很多先人前辈已经踩过了大量的坑,整理了很多最佳实践,也提供了大量的第三方工具可供选择。本书希望能把其中优秀的方案介绍给读者。
我临时回忆了一些 Mac 使用过程中经常遇到的痛点,如果你发现这些问题和场景自己都没有了解,没有很高效的办法解决,本书一定非常值得一读。
不了解 Mac 上的包管理神器 Homebrew,或者每次换新电脑后都要重新配置一遍环境
HomeBrew 的源托管在官网,每次更新都慢如蜗牛
安装完 HomeBrew 以后,很多库还要手动安装一遍,无法自动同步
不知道(如何)配置 Tab 键切换系统的对话框选项,用空格键确认,每次用鼠标或触摸板点击比较慢
不知道(如何)配置触摸板的轻按点击,每次都重按触摸板很累
不知道(如何)配置三指拖动窗口,每次移动窗口位置都很慢
有些常见的软件,比如 SourceTree,Chrome,iTerm 等需要手动下载安装包
不知道如何在浏览器地址栏或任何其他输入框中,以单词为单位移动光标或删除单词
还在拖拽光标来选择一段内容,如果选中的内容有偏差,还得重新选择
不知道系统的预览程序可以被拓展,从而更快更好的预览更多类型的文件
还在各种邮件软件中切换,公司邮箱里的邮件特别多,无法快速分类整理
还在使用系统自带的终端,不了解神奇 iTerm2 的各种技巧
想在终端科学上网,解决 npm 等命令慢的问题
想要查看磁盘的剩余空间,每次都要点击屏幕左上角的苹果图标并选择存储那一列
想要查看某个目录下,所有子目录和文件的大小,以及它们的总大小,但不知道如何查看
记得以前复制过一段内容,想通过的搜索关键字的方式找回来
地址,手机号,身份证号,邮箱等常用信息总是一遍又一遍的输入
不了解能大幅度提高浏览器使用效率的插件,或者装了太多插件找不到想用的
想知道某个目录(或者子目录)中是否包含特定名称的文件,甚至想用正则去搜索
想知道当前的 ip 地址但每次点击 WiFi 图标又太麻烦
想知道或切换当前系统的代理但每次点击 WiFi 图标又太麻烦
不了解 Vim 的强大之处和神级插件
在诸多 IDE 中举棋不定,不知道什么是最佳实践
Git 还只会使用基本的 add/commit 命令
想快速查看本地、远程都有哪些分支
记得某次提交的 log 中有一些关键字,还搜出这次提交
记得某次提交的内容中有一些关键字,想搜出这次提交
想快速系统的隐藏文件或者隐藏他们
每次调用 ssh 命令都记不得端口、主机和密码
想知道某个文件夹内,是否有某个文件包含特定的字符串,系统的 Finder 搜索非常低效
想知道当前哪个软件最占用 CPU,内存和网速
每次去百度搜索 urlencode 或者 base64 解码,然后跳到站长之家
项目文件特别多,找到 .xcproj 文件特别费力,然后双击打开它
想知道某个进程占用了那些端口,或者某个端口被哪个进程占用
还需要在线的 JSON 美化、校验工具甚至是 GUI 版本的,每次格式化 JSON 都需要打开好几个网站,Chrome 一堆无用标签
只想看到命令行输出结果的前(后)几行(列)
有翻译(英译中或者中译英)的需求,但是不想单独装一个 App 或者每次都打开翻译网站
第 2 章 系统配置
本章主要介绍对原生操作系统的配置和优化,基本不依赖其它第三方软件。
第一节主要通过 default writes
命令来修改系统的配置,让键盘,触摸板等硬件用起来更加得心应手。以及一些常用的软件方面的优化。
第二节介绍很简单,但是大部分人不知道的快捷键使用,比如 Option 键和 Ctrl 键的用法, 帮助读者快速移动光标和编辑文字。
第三节介绍如何增强系统自带的预览程序的功能,支持更好的显示效果和更多文件格式。这样就可以在不打开文件的前提下快速浏览了。
第四节主要介绍对 Dock 栏的优化方案,还读者一个干净整洁,而且不打扰人的工作环境
第 2.1 章 系统配置优化
大小写键和 Ctrl 键交换
首先说两个我的主观看法,当然读者可以选择不接受,那样就不用浪费时间读下去了。如果你表示认可,并且希望解决这个问题,相信本文会帮到你。
1. 用 Caps Lock(也就是大小写切换键)来切换大小写是非常低效的。以输入文字 aBc 为例,我们需要按下 Caps Lock 键进入大写模式,输入 B,再按一次键回到小写模式,输入 c。正确的做法是使用 shift 键,我们按住 shift 键输入 b 就会得到大写的字母,再松开就回到了小写模式。和 Caps Lock 键相比,少了一次按键。
2. 键盘上的 Ctrl 键位置很差,如果你是用标准的打字手势,你会发现这个键刚好在左手的手心,无论哪个手指都不方便去按它。而 Caps Lock 键则占据了左手小拇指左侧的黄金位置。更重要的是,Ctrl 键的用途非常广,无论是作为 Vim 或者 Emacs 的功能键,还是各种快捷键的修饰键,都是一个非常常用的按键,比如在下一章中就会介绍 Ctrl 键的妙用
简单总结一下就是:
Caps Lock 键效率低,自身毫无用处
Caps Lock 键占据了黄金的位置
Ctrl 键用处多,使用频率高
Ctrl 键位置差,很不方便按
当这四个理由合在一起时,你很难否认,最好的做法就是:交换 Caps Lock 键和 Ctrl 键。实际上系统的键盘设置里面已经支持了这个操作,但本文会从命令行的角度来聊聊,这样可以方便我们快速搭建 Mac 的工作环境。
踩了无数坑以后,终于发现了一个可用的脚本,原理啥的就不说了,因为基本上没有别的用途:
hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000039,"HIDKeyboardModifierMappingDst":0x7000000E0},{"HIDKeyboardModifierMappingSrc":0x7000000E0,"HIDKeyboardModifierMappingDst":0x700000039}]}'
不过这个脚本有一个大坑,就是虽然立刻就会生效,但是重启后就失效了,所以我们需要在每次启动时都执行一次这个命令。
添加开机任务
很多程序的设置中都可以选择是否开机自动启动,其实除了启动 App,我们可以编写自己的 shell 脚本,并将它设置为启动时自动执行,这样就获得了更大的灵活性,可以完成任何自己想做的操作。
首先我们需要一个配置文件,先给它随便去个名字,比如叫做 com.bestswifter.onlogin.plist
。内容如下所示,虽然很多,但绝大多数地方都是模板,我们只需要修改其中一处即可:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LaunchOnlyOnce</key>
<true/>
<key>Label</key>
<string>com.bestswifter.onlogin</string>
<key>ProgramArguments</key>
<array>
<string>zsh</string>
<string>-c</string>
<string>"$HOME/.macbootstrap/onlogin.sh"</string>
</array>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
注意这里的几个键,LaunchOnlyOnce
表示脚本只会执行一次,否则可能会每隔 10s 就执行一次。Label
是自定义的名字,理论上来说随便写,不过我建议和文件名保持一致即可,一定不会出错。
array
标签里面就是自己要执行的命令了,前两行zsh -c
不要动,表示用 zsh
来执行脚本,然后后面写脚本的路径。比如在这个例子里面我就把入口收敛到了自己的onlogin.sh
里面,然后再执行任何事情就很方便了。
对于普通用户来说,上述 plist 文件唯一需要修改的就是执行脚本的位置了。修改后后把这个文件拷贝到 ~/Library/LaunchAgents
目录下,表示仅对当前用户生效,然后执行:
sudo launchctl load ~/Library/LaunchAgents/com.bestswifter.onlogin.plist
将这个文件注册到系统中。
触摸板优化
首先可以开启轻按点击功能,这样只要轻轻的触碰触摸板,不用真的按下去,就可以点击了,这样真的很轻松:
defaults write com.apple.AppleMultitouchTrackpad Clicking -int 1
defaults -currentHost write NSGlobalDomain com.apple.mouse.tapBehavior -int 1
defaults write NSGlobalDomain com.apple.mouse.tapBehavior -int 1
除此以外我们还可以开启三指拖拽功能,这样想移动窗口位置时,只要用三个手指即可拖拽,而不用先点击选中窗口,再拖拽:
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadThreeFingerDrag -bool true
defaults write com.apple.AppleMultitouchTrackpad TrackpadThreeFingerDrag -bool true
用好 F1-F12
默认情况下,键盘最上面一排的 F1- F12 都有各自的作用,从图标上就能看出。比如 F1 和 F2 用来调节屏幕亮度,F5 和 F6 调节键盘灯亮度灯。此时他们可以被理解为特殊按键,更偏向与娱乐,而不是普通的 F1 - F12。
对于工作重心在编程的码农来说,这些特殊按键有些浪费,而很多 IDE 提供的快捷键都需要 F1 - F12,尤其在断点调试时格外有用,以 Xcode 为例说明下:
F6:执行下一行代码
F7:跳到代码内部执行,比如当前停在一个函数上,F6 会直接执行这个函数,F7 会跳到函数内部的第一行去执行
F8:跳出当前代码块,和 F7 的作用恰好相反
这里的 F6 是标准按键,需要我们同时按下键盘左下角的 fn 键和顶部的 F6 键才能触发,效率极其低下。然而,作为程序员,我们并不太需要那些花哨的娱乐功能,因此我建议在设置中把 F1 - F12 改为标准按键,如下图所示:
[图片上传失败...(image-2b768e-1598398259551)]
或者更高效的做法是使用命令行:
defaults write -globalDomain com.apple.keyboard.fnState -int 1
关闭第三方程序验证
有时候,或许是囊中羞涩,或许是国外厂商定价不合理,我们或多或少会下载某些破解版的应用,此时直接打开很可能被系统拒绝,或者报错:无法打开已损坏的安装包。我们可以通过命令行关闭这一保(限)护(制):
sudo spctl --master-disable
defaults write com.apple.LaunchServices LSQuarantine -bool false
关闭镜像验证
在打开 .dmg 格式的安装文件时,默认会先验证镜像,如果文件本身很大,验证的时间会很长,可以输入以下命令关闭验证:
defaults write com.apple.frameworks.diskimages skip-verify -bool true
defaults write com.apple.frameworks.diskimages skip-verify-locked -bool true
defaults write com.apple.frameworks.diskimages skip-verify-remote -bool true
完全键盘控制
很多操作都会弹出系统的对话框,要求我们确认或者取消
[图片上传失败...(image-4a998c-1598398259551)]
如果没有开启完全键盘控制,我们只能按回车键确认,或者移动鼠标选择取消。如果开启了完全键盘控制,只要按下空格键,就相当于选中蓝色边框的按钮,也就是这里的取消键。按下 Tab 键可以在多个按钮之间切换。
完全键盘控制可以在系统的设置界面开启,也可以直接通过命令行开启:
defaults write NSGlobalDomain AppleKeyboardUIMode -int 3
第 2.2 章 系统快捷键进阶
除了 Command + C/V 这种入门必备的快捷键,还有一些系统级的常用快捷键是有必要掌握一下的。
光标移动
这里比较推荐使用 Emacs 系的快捷键而不是传统的 Command + ←/→/Delete之类的。因为后者并不通用,比如在终端中就无法使用,而 Emacs 系的快捷键则在几乎所有系统级别的输入框内都通用。
常见的几个行级别操作有:
Ctrl + A:移动到行首
Ctrl + E:移动到行尾
Ctrl + K:删除到行尾
Ctrl + N:移动到下一行
Ctrl + P:移动到上一行
前三个命令在终端中非常常用,能大幅度提高工作效率。后两个命令则在 Vim 系列中很常见,多用于上下切换列表中的选项。
几个比较常见的字母级别操作有:
Ctrl + F:向右(Forward)移动一个字母,等价于方向键 →
Ctrl + B:向左(Backward)移动一个字母,等价于方向键 ←
Ctrl + D:向右删除一个字母,等价于 → + Delete这个快捷键也很常用
Ctrl + H:向左删除一个字母,等价于 Delete
使用 Option 键
如果觉得按字母操作太过于细粒度,按行操作又太粗粒度,那么 Option 键绝对算得上神器,因为它可以按单词操作。
Option + ←:光标向左移动一个单词
Option + →:光标向右移动一个单词
Option + Delete:删除一个单词
使用 Shift 键
Shift 键类似于可视模式,比如在某个位置点击光标并按住 shift 键不松开,再去另一个位置点击一次,就可以选中两次点击位置之间的文本内容。
注意,shift 键可视模式还可以和 Option 键一起合用,感兴趣的读者可以自行尝试。
第 2.3 章 拓展预览程序
对于一些文本文件,按下空格键就可以调用系统的预览程序,快速浏览文件内容。但如果想获得更好的阅读体验,或支持更多类型文件的快速浏览,就需要通过插件来完成。
可以输入以下命令来安装拓展,下面会逐个介绍:
brew cask install qlcolorcode qlstephen qlmarkdown quicklook-json qlimagesize webpquicklook qlvideo provisionql quicklookapk
qlcolorcode
顾名思义,这是一个代码高亮的插件,效果如图所示:
[图片上传失败...(image-13f798-1598398259551)]
qlstephen
这个插件能让我们预览没有后缀的文本文件,效果如图所示:
[图片上传失败...(image-3563e4-1598398259551)]
qlmarkdown
这个插件能让我们预览 markdown 文件的渲染效果:
[图片上传失败...(image-cd93bb-1598398259551)]
quicklook-json
这个插件也很容易理解,提供对 JSON 文件的格式化和高亮支持:
[图片上传失败...(image-4f51cd-1598398259551)]
betterzip
这个插件我没有安装,因为它需要付费,它可以预览压缩文件内部的内容,还支持自定义各种解压缩时的行为(比如解压缩后自动删除压缩包)。下图是安装前的压缩文件预览图:
[图片上传失败...(image-823fc6-1598398259551)]
[图片上传失败...(image-81fa74-1598398259551)]
qlimagesize
这个拓展可以展示图片的分辨率和大小:
[图片上传失败...(image-fcd9c3-1598398259551)]
webpquicklook
这个拓展可以让我们预览 WebP 格式的图片:
[图片上传失败...(image-784b6a-1598398259551)]
qlvideo
预览更多格式的视频文件:
[图片上传失败...(image-3782bd-1598398259551)]
provisionql
这个插件可以预览 .app 或者 .ipa 后缀的程序:
[图片上传失败...(image-e52173-1598398259551)]
quicklookapk
预览安卓的 .apk文件:
[图片上传失败...(image-adcbca-1598398259551)]
以上就是和程序员相关的常用插件,还有一些设计师可能用到的插件,可以访问这个网址自行查看。
第 2.4 章 Dock 栏优化
自动隐藏 Dock
我们知道 Dock 默认位于屏幕底部,而且屏幕本身是 16 : 9 的,这就导致屏幕的可视部分更加扁平。所以我的习惯是把它放在屏幕左侧(右侧也是同理),这样会使屏幕的宽高比更加自然一些。
长期展示 Dock 对并不大的屏幕空间来说是一种浪费,我们可以把它设置为自动隐藏,当鼠标滑过去以后再显示:
defaults write com.apple.dock autohide -bool true
在后面的章节中我会介绍如何快速唤起应用,所以大多数时候 Dock 栏其实是没用的,大可不必担心看不到 Dock 栏。
定制你的 Dock
同时,系统默认会添加很多程序在 Dock 中,很多程序基本上用不到(比如地图、通讯录等等),我的做法是先把它们都移除出去,对于常用的程序,再保留在 Dock 中。
为了完成上述目的,命令行看起来就不太够了,我们可以直接用 OC 来编辑对应的 plist 文件来达到目的,代码比较冗长,感兴趣的读者可以去 我的 MacBootstrap 上查看。
然后用 clang 编译源码并执行:
clang -framework Foundation path-to-file.m -o DockIconHider
./DockIconHider
第 3 章 Mac 工作流
本章主要介绍各种好用的工具来进一步提升 Mac 的使用效率。
第一节会介绍系统自带的邮件应用,通过添加各种规则,实现邮件的过滤与分类,让自己的邮箱更加整洁。
第二节会介绍系统终端应用的替代品:iTerm2。虽然它并没有什么值得单独拿出来大说特说的优点,但在使用过程中就会感受到这款软件的强大之处,似乎每个细节上都比原生的终端更加优秀一点。绝对是必装应用之一。
第三节主要介绍 SSH 的配置管理。有多台远程设备的同学一定有过记不住 ip 地址,密码和端口的尴尬经历,本节会介绍管理这些设备的最佳实践。
第四到六节是一个正常程序员必备的,科学上网的知识,也是最容易在各个群里被问到的问题之一。我会分别从原理,Mac 上的最佳实践和移动端最佳实践三个方向来介绍。
第七、八节则是 Alfred 从入门到进阶,会介绍软件自身的功能,以及优秀的第三方插件,还会教大家如何自己写一个简单的插件。
最后一节则是 Chrome 的插件介绍和管理,这些插件能帮助我们的浏览器变得更加强大易用。
第 3.1 章 邮件规则
无论是公司邮箱还是个人邮箱,经常会收到具备某些固定特征的邮件。比如银行信用卡的邮件,某个网站订阅后的邮件,或者公司内特定部门、发件人的邮件等等。
对于这类具备固定特征的邮件,我们可以利用系统自带的邮件应用,给他们添加分类、过滤规则。
以个人邮箱为例,假设我想整理所有谷歌账号相关的通知邮件,首先在邮箱列表找到它,然后点击右侧的加号,添加某个子文件夹:
[图片上传失败...(image-80e2f7-1598398259551)]
然后输入子文件夹的名字:
[图片上传失败...(image-14fe84-1598398259551)]
接下来在邮件列表中选中来自谷歌的账号提醒邮件,按下 Command +
, 打开邮件设置,找到最后一列的规则,选择添加规则。注意:也可以不选中邮件直接添加规则,这样的缺点是不能识别邮件的特征,需要自己手动填写。
点击添加规则:
[图片上传失败...(image-d284d6-1598398259551)]
首先填写规则描述,这个只要能让自己以后看得懂即可。可以给规则添加多个条件,并且指定同时满足或满足任一条件。
每个条件可以在邮件的发件人、主题、收件人等各种特征之间选择,如果当初选中了邮件再打开规则列表,就会自动那条邮件的特征,否则只有自行填写了。
最后的操作可以有多个,比如先标记为已读/星标再移动到刚刚创建的子文件夹下,或者对于公司里特别烦人的全员邮件,可以直接删除。
最后点击确定,然后应用到所有邮件即可。
第 3.2 章 终端神器 iTerm2
iTerm2 是一个用来取代系统终端的命令行工具,功能比原生的终端程序强大很多,可以一行命令安装:
brew cask install iterm2
光标移动
上一章 系统快捷键进阶 一节中曾经介绍过光标移动的快捷键,其中以 Ctrl 键开头的快捷键依然可用,比如移动到行首、行尾,向左/右移动或删除字符等等。
但在 iTerm2 中无法使用 Option 键进行单词跳转,因此需要自行配置快捷键,我选择用 Command + ← 来表示光标向左移动一个单词。对应的,向右移动一个单词就是 Command + →。打开设置,添加这两个快捷键:
[图片上传失败...(image-d7e4d6-1598398259551)]
选择文本
iTerm2 中选择文本有三种方式,分别是:
双击:选中单词
三击:选中整行
四击:智能选择
智能选择是一个比较有意思的功能,完整的介绍可以参考官方文档。对于我来说,以下几种情况下用智能选择是非常棒的:
代码片段,比如智能选择会自动选中 namespace::identifier以及 foo.bar.baz 这种语法
双引号内的字符,比如 "this is a quoted string"
电子邮件,智能选择会选中整个邮件地址
完整的 URL,智能选择会选中 scheme
另外,iTerm2 默认选中即复制,所以不用额外的 Command + C 这一步了。
Command 键
Command 主要用来打开文件或者 URL。对于输出到终端的文件名或者 URL,我们可以按住 Command 键点击它,就可以直接打开了。
此外,按下 Command + Option 还可以选中矩形范围内的文本。
Tab 和 Pane
按下 Command + T 可以新建一个 Tab,每个标签页的后面都会标记一个序号,通过 Command + 序号 就可以在多个页面之间切换了,或者用 Command + [ 和 Command + ] 来切换到左侧或者右侧的标签页。
同一个 Tab 内,还可以切分出多个 Pane,有两种切分方式:
Command + D:水平切分,切分出一左一右两个 Pane
Command + Shift + D:垂直切分,切分出一上一下两个 Pane
通过 Command + Ctrl + 方向键 可以调整每个 Pane 的大小,通过 Command + Option + 方向键 可以切换 Pane。
快速编辑
有时候,如果上一条命令出现了某个小错误,其实不必重新打一遍,可以使用 oldnew 的写法进行替换,它表示把原来命令中匹配 old 的部分替换成 new,如下图所示:
[图片上传失败...(image-54f41a-1598398259551)]
对于特别长的命令,可以使用 zsh 提供的快捷键 Ctrl-x + Ctrl-e 进入 vim 编辑:
[图片上传失败...(image-a438b6-1598398259551)]
背景图
打开设置,选择背景图案并设置好透明度:
[图片上传失败...(image-6b5189-1598398259551)]
最终效果图如下:
[图片上传失败...(image-b6c77a-1598398259551)]
第 3.3 章 SSH 的配置与管理
SSH 是 Secure Shell 的缩写,其实就是远程 Shell 登陆。只要能远程登录到某台机器的 Shell 上,大到 Mac 笔记本,小到树莓派和智能路由器,我们就可以上传或下载文件、执行脚本等等,几乎掌握了设备的控制权。
一般来说,如果想配置自己的云服务器或者树莓派,都需要通过 SSH 登陆。登陆时一般需要指定地址和用户名,比如我们想登陆 IP 地址为 1.2.3.4 的主机上的 root 用户,需要这样写:
ssh root@1.2.3.4
默认的 SSH 协议端口号是 22,所以无需填写,但有些设备为了安全起见,会更改 SSH 的端口号,比如改成 54321,我们就需要这样写:
ssh -p 54321 root@1.2.3.4
接下来写上 root 账户的密码就可以登录了。
免密登陆
记忆密码是一件很麻烦的事,好在 SSH 支持利用 RSA 的公钥和私钥体系来验证身份。执行以下命令:
brew install ssh-copy-id
ssh-copy-id root@1.2.3.4
# 等价于下面这个命令,省掉了两个默认参数
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@100.100.100.100 -p 22
这里我们利用了 ssh-copy-id 这个工具,它的原理其实是把自己的公钥(默认使用 ~/.ssh/id_rsa.pub
这个文件中的内容)复制到目标服务器的 ~/.ssh/authorized_keys
文件内。所以完全可以手动完成,不过用工具来实现的话,速度快,而且可以自动设置文件权限。
别名
即使配置了免密登陆,但用户名、IP 地址和端口号还是不想记忆,此时可以利用 SSH 的配置文件来实现。
编辑~/.ssh/config
文件,添加以下内容:
Host testhost
HostName 1.2.3.4
User root
Port 54321
IdentityFile ~/.ssh/id_rsa
这个配置文件还是很容易理解的,我们给地址为 1.2.3.4,端口为 54321,用户名为 root 的远程主机起了一个别名,然后就可以这样连接了:
ssh testhost
再也不用担心自己记不住那么多远程主机了,更神奇的是,iTerm2 还支持自动补全:
全局 SSH 配置
ssh 还可以添加一些全局配置,让它变得更好用,我的配置如下:
Host *
ForwardAgent yes
ServerAliveInterval 10
ServerAliveCountMax 10000
TCPKeepAlive no
ControlMaster auto
ControlPath ~/.ssh/%h-%p-%r
ControlPersist 4h
Compression yes
逐个解释下:
ForwardAgent:假设我通过 SSH 连接上了服务器 A(通常在公司内部有跳板机时格外有用),又从服务器 A 连接到服务器 B,如果将 ForwardAgent 配置为 YES,在两台服务器之间传输数据就不会经过本机。
ServerAliveInterval 和 ServerAliveCountMax:表示客户端定期向服务端发送心跳包,使得服务端不会断开 SSH 的连接。这里表示 10 秒发一次,发 1W 次。
Contro***:每次建立远程连接,在 ~/.ssh 目录下都会建立一个 socket 文件。这三个配置连用,表示缓存 socket 文件,并保留 4 小时,这样可以加快下次连接的速度。
第 3.4 章 VPN 与 shadowsocks 科普扫盲
很多人一提到 VPN 和 Shadowsocks,只是大概知道它们可以爱国上网,对于背后的原理并不太了解。本文也不会讲太多底层协议,主要是概述一下两者的区别,以及相关名词。
首先说结论,如果你租了一台境外的主机,能用 Shadowsocks 就绝对不要用 VPN,当然直接选购爱国上网的软件时也是如此,因为 VPN 不方便配置规则,也更容易被封。
所谓的配置规则是指,使用 Shadowsocks 时可以配置一个规则列表,只有满足规则的特定网址才走代理,对于百度/淘宝等一系列国内网站则直接连接。这样可以节省流量,加快访问速度,对用户完全透明。为什么 Shadowsocks 可以配置规则,VPN 就无法配置呢?带着这样问题,本文简单解释一下。
首先 VPN 的含义是指虚拟专用网络,一般来说如果我们在公网,需要访问企业内网,就需要一个 VPN 服务器做代理,所有指向企业内网的请求都由这台 VPN 服务器负责代理转发,这样无需我们的电脑能访问内网,只要 VPN 服务器可以访问内网即可。如果把这里的内网换成境外网站,就是 VPN 能用于爱国上网的原理。
VPN 只是一个概念,它的本意是建立虚拟私有网络,它可以通过多种协议来实现,比如 L2TP 协议或者 IPSec 协议,但在爱国上网范畴内,这些协议则是扮演了代理的作用。至于另一个很有名的协议,socks 协议(没错,就是 Shadowsocks 最后的 socks,因为是先有 socks 协议才有 Shadowsocks)则是一个标准的代理协议,它和前两者的区别在于,它是一个传输层的协议,能够利用 TCP/IP 协议。而 L2TP 和 IPSec 协议则是非常底层的协议,前者在数据链路层,后者在 IP 层。
接下来聊聊 Shadowsocks 协议,从它的名字就能看出来它是基于 socks 协议实现的,这里盗用冬瓜大神博客里的一张图来简单说明 Shadowsocks 协议的工作原理:
[图片上传失败...(image-686d85-1598398259551)]
当我们在本地打开 GoAgentX 等应用时,实际上是启动了一个名为 sslocal 的本地进程,左侧绿色的 Socks5 Client 可以是浏览器,也可以是 git 或者 curl 命令等,它们之间的传输通过 socks 协议实现。sslocal 是一个实现了 socks 协议的代理服务器,并对标准 socks 协议做了一些改造:当 sslocal 进程获取请求后,它会将请求加密,发送到 ssserver 上,这样就不会被防火墙识别。ssserver 拿到数据后会解密,发送原始请求到目的地址,再将请求结果加密返回。
因此,整个 Shadowsocks 方案由 socks 代理 加上 sslocal 到 ssserver 加密通信 以及 ssserver 还原请求这三部分组成。注意 Shadowsocks 是没有配置规则这个概念的,它对于 Client 来说是透明的,只要 Client 选择了使用 socks 代理,并把地址指向本地的 sslocal 进程,就会走到 Shadowsocks 的这套流程(当然 Client 还是以为自己只用了 socks 协议)。
我们平时接触到的带规则配置一般只有两种场景,一个是系统的 PAC 文件,另一类则是 Chrome 之类的 App。
先说说 PAC 文件,它的全名叫 Proxy Auto Config,是一个系统级别的代理规则配置表,本质上就是一段用 JavaScript 写成的脚本,脚本中会列出一堆网址,并且指定这些网址的请求方式,比如:
var proxy = "SOCKS5 127.0.0.1:1080; DIRECT;";
这里的 proxy 就表示先尝试用 SOCKS5 协议代理到 127.0.0.1:1080,不行再直接连接。一旦给系统配置了 PAC 文件,对于任意网络请求,系统都会调用 PAC 里的脚本,得到它的请求方式。
Chrome 之类的浏览器也是类似的原理,通过插件来判断请求的地址,然后选择代理方式。
再次强调,Shadowsocks 并不存在配置规则的概念,它只是一种对应用层透明,但进行过改造的 socks 协议,只有操作系统或应用程序能够支持配置规则,其实就是自行选择是否使用 socks 代理。
那么按照这个分析,理论上讲 VPN 也是可以配置的,只要应用程序可以选择是否使用 L2TP/IPSec 之类的协议就行了。然而,前文已经说过,这类协议非常底层,以 IPSec 为例,如果想用它,就得自己实现传输层的协议(TCP 或者 UDP),这个难度难如登天。在一个操作系统中,TCP/UDP 协议的实现都是系统自带的,因此对于运行在更底层的 L2TP/IPSec 这类协议而言,只有操作系统会提供默认实现,没有任何一个 App 会提供对它的支持。
打开网络设置我们就会看到,VPN 是独立于 Wi-Fi/有线连接的另外一种连接方式,而 socks 代理仅仅是诸多代理方式的一种。
希望通过本文,读者能了解 VPN、Shadowsocks、socks 等名词的含义以及简单的工作原理,下面两章会介绍如何在移动端和 Mac 平台上搭建完全透明的网络代理,享受最优雅的爱国上网体验。
第 3.5 章 Mac 端爱国上网最佳实践
背景
最优秀的配置就是在使用时感觉不到配置的存在,然而复杂的应用场景决定了我们需要多种代理配置。虽然最终的目的是摆脱繁琐的配置切换,但在此之前,我们有必要梳理一下日常使用中常见的痛点。
模拟器需要连代理,因此电脑必须设置 HTTP/HTTPS 代理
终端无法使用 Shadowsocks 代理,即使设置了全局代理也不行
某些应用,比如 Telegram,需要科学上网
访问墙外网站需要连 VPS,墙内网站不需要连接,代理会让国内网站访问速度降低
本质
复杂的需求导致了代理场景的多样化,一般来说有三种:
Charles 的 HTTP\(s\) 代理
VPS 的 socks5 代理或 PAC
直接连接
上述问题的本质都来源于这三种代理是互斥的,而且切换起来比较麻烦。在 Mac 上有脚本可以切换,但有时依然无法人工区分改用哪种代理,在 iOS 上,就连设置代理都会非常耗时。
目标与解决思路
明确了问题与问题背后的复杂度以后,我们需要确定一个目标,以目标为导向,来指导自己的行动。
目标其实非常简单:
经过有限次的配置,彻底避免切换代理
换句话说,就是希望代理的切换是自动进行的,全程不再需要人工干预。
这似乎有悖于目前的工作模式,不过没关系,既然系统代理不方便,我们就需要一个全局代理,起到 路由 作用,根据一定的规则把请求转发到合适的代理上去。这样就把代理的切换简化成了规则的配置,规则永远存在,只要不断维护完善就行。
Mac 配置
Mac 上用到四个工具:
Proxifier: 全局控制工具,负责应用层面的请求转发
Charles:一种代理,负责处理那些需要被抓包的请求
sslocal: ss 代理的客户端,负责处理那些需要走 Shadowsocks 协议的请求
SwitchyOmega:Chrome 拓展工具,负责对 Chrome 中的网页进行智能代理选择
sslocal
首先我们要租一台境外的服务器,用来运行 shadowsocks 的服务端。如果还没有租用服务器,可以购买搬瓦工的服务,便宜且稳定,这个链接 年费 20 美元,每月 500G 流量,这个链接 年费 50 美元,每月 1000G 流量,
首先运行:
pip install shadowsocks
然后运行:
ssserver -p port -k password -m method
# port 指定 ssserver 运行在服务端的哪个端口
# password 是客户端用来连接的密码
# method 是加密方式,比如 rc-md5 或 aes-256-cfb 等
注意:如果你通过 ssh 连接到服务器, 在 ssh 断开后,你执行的进程也会随之被杀死。要想让 ssserver 长久运行,需要下面这个命令:
nohup ssserver -p port -k password -m method &
简单两行代码,一个 shadowsocks 的服务就搭建完成了。
在 Mac 上运行 Shadowsocks 客户端一样容易,根本不需要那些乱七八糟的 GUI 工具,同样先安装 shadowsocks 工具:
pip install shadowsocks
如果你还没有安装 pip3,则先输入:
brew install python3
接下来填写一下 sslocal 的配置,按照 JSON 格式填写即可:
{
"server":"ip",
"server_port":443, // 填写服务端的 port
"local_port":14179,
"password":"password", // 填写服务端的 password
"timeout":600,
"method":"aes-256-cfb" // 填写服务端的 method
}
然后就可以运行 sslocal 了:
nohup sslocal -q -c shadowsocks.json &
这样就在后台运行了 sslocal 进程,任何应用都可以使用 socks 协议代理到本机的 14179 端口,从而实现科学上网。
Proxifier
Proxifer 是一个控制 app 代理方式的软件,有了它,我们就可以控制某个 app,比如 Telegram 使用哪种代理。首先在 Proxifier 中建立一个 Shadowsocks 代理:
[图片上传失败...(image-2a562f-1598398259551)]
依次选择 Proxies、Add 并填写本机的端口。接下来就可以把某些特定应用的流量转到代理上了:
[图片上传失败...(image-665d8c-1598398259551)]
终端科学上网 {#终端科学上网}
有些时候,安装一些软件包会非常慢,这是因为数据源存在国外的服务器上,但终端默认不会走代理,即使设置了全局代理也无效。
最简单的方式是使用如下命令:
export ALL_PROXY=socks5://127.0.0.1:1080
# 取消代理可以用下面命令
# unset ALL_PROXY
不过根据个人实践,偶尔这个命令会有抽风的时候,更复杂,也更靠谱的做法是安装 polipo。完整教程可以参考这篇文章:为终端设置 Shadowsocks 代理。
当然,如果你能用路由器翻墙,那么就不存在终端翻墙的问题了。
Charles
Charles 作为一个大名鼎鼎的抓包工具,具体使用方法就不用我细说了,可以参考巧哥的这篇文章:iOS 开发工具-网络封包分析工具 Charles。
虽然 Charles 的抓包功能足够强大,但美中不足的是,它的数据处理能力极为孱弱。虽然有 Map Local/Remote 和 Rewrite 功能,但终究不是图灵完备的语言, 灵活性和可拓展性还不够强大,比如如果数据是使用 protobuf 的形式传输,Charles 就无能为力了。
通常情况下,为了搭建一个多端统一、长期可维护的测试环境,我们需要一个中间人服务器,经过一段时间的尝试和技术选型,最终我们选择了 MITM,详细内容可以参考我的这篇博客:HTTP 代理服务器技术选型之旅。
有了 MITM 工具以后,iOS 模拟器的调试问题就迎刃而解了。注意,此时不要直接修改系统的代理,因为来回切换代理比较麻烦,Charles 提供了一个非常好用的功能,叫 External Proxy。顾名思义,Charles 可以把自己视为一个中转站,把经过自己的数据发送到下一个代理服务器上去。
因此,日常工作中,我采用的方案是系统代理长期设置为 Charles,且 Charles 长期将外部代理设置为 MITM,两者要么同时生效,要么同时失效,经过 Charles 数据一定会经过 MITM 。
[图片上传失败...(image-8be723-1598398259551)]
[图片上传失败...(image-ae90d2-1598398259551)]
快速切换系统代理
上述配置虽然大部分时候都能 work,但万一出现 Proxifier 不能指定代理,而且这个网络流量又不能走代理服务器时,我们还需要一个终极方案——快速把系统代理还原为默认。虽然我至今只在某次更新 App Store 时遇到过上述问题,但做好技术储备还是没有坏处的。
使用 networksetup 配合各种参数即可实现上述需求,我写了一个可以自动切换 Charles 和 GoAgentX 代理的脚本,在这里 可以下载并根据自己的需求自行修改。
效果如图所示:
[图片上传失败...(image-3cdc72-1598398259551)]
SwitchyOmega
最后一个要用到的工具是 Chrome 的一个插件:SwitchyOmega,它可以给不同的 URL 配置不同的访问策略。
首先我们新建一个情景,用来处理需要科学上网的网站。
[图片上传失败...(image-fd68da-1598398259551)]
如果是前端开发,那些需要抓包调试的网站可以代理到 Charles 上,过程类似就不赘述了。
然后需要配置下 auto switch
场景,在绝大多数时候,我们都将使用这个场景:
[图片上传失败...(image-182db3-1598398259551)]
第一个区域内是一些自己制定的规则,如果自动配置中某些网站的访问方式不符合我们的要求,可以单独列在这里。第二个区域表示如果命中规则列表,则使用 socks 代理,否则就直接连接。第三个区域则使用了一个开源的网址列表,列出了那些需要科学上网的网站。
有了这样的配置,我们就可以实现 百度、淘宝、京东等网站直接连接,YouTube、Google、草榴等网站科学上网了。
Mac 配置小结
Mac 上需要用到的软件较多,但每个软件的使用都不太复杂,回忆一下之前的几个痛点:
模拟器需要连接代理,因此电脑需要设置 HTTP/HTTPS 代理。
这一点我们其实是通过长期设置代理为 Charles -> MITM 实现的,并且利用脚本来快速切换代理。
终端无法使用 SS 代理,即使是全局代理也不行。这个问题通过 polipo 工具解决,并且编写了脚本。
某些应用,比如 Telegram,需要科学上网。这个问题通过 Proxifier 来设置某个 app 使用的代理方式。
按需代理,只有需要科学上网的网站才用代理。这个需求通过 Chrome 的插件 SwitchyOmega 完成。
第 3.6 章 移动端爱国上网最佳实践
如果说 Mac 上有各种需求,难以找到通用解决方案的话,手机端就很简单了,我想绝大多数人都只有这几个需求:
对于移动端开发者,需要代理到 Mac 上,抓取应用的网络数据
某些应用会对客户端证书做校验, 比如 iTunes、微信支付等安全性较高的场景,无法通过代理打开
如果想科学上网,需要连接 VPN,这与 HTTP 代理冲突
系统默认只支持 VPN 连接,无法配置规则
以 iOS 系统为例,这些问题可以交给一个应用:Shadowrocket(又叫小火箭)来解决,这类应用已经在国内的 App Store 下架,需要使用美国账号购买。
打开 shadowrocket 以后,在首页点击右上角的加号,可以新建一个节点,也就是我们的代理服务器:
[图片上传失败...(image-798697-1598398259551)]
这里强烈建议给节点添加备注,原因稍后会讲。
自动选择代理
image接下来,我们需要选择路由模式,一共有四种。直连的意思很好理解,就是不走任何代理,相当于没用上 shadowrocket,可以理解为一种回滚方案。全局则表示 app 所有网络流量都走代理服务器,相当于使用了系统的 VPN。这两者功能都太单一,基本上不会使用。
配置模式和上文说过的 auto switch
差不多,都是实现了黑名单 + 广告屏蔽的功能:
广告屏蔽:对于某些专门用于投放广告的域名,直接屏蔽掉网络请求,从而起到去除广告的效果。
黑名单:列出需要科学上网的网址,走代理服务器。
其它:默认是直接连接。
我使用的是这份配置:https://raw.githubusercontent.com/lhie1/Surge/master/Shadowrocket.conf
它的主体结构可以分为三部分:
// 屏蔽广告
// 爱奇艺
DOMAIN-SUFFIX,ad.m.iqiyi.com,REJECT
DOMAIN-SUFFIX,afp.iqiyi.com,REJECT
DOMAIN-SUFFIX,api.cupid.iqiyi.com,REJECT
.......
// 优酷
......
// 科学上网
// 以 gmail.com 结尾的网址要求走代理,并且要求代理服务器做 DNS 解析
DOMAIN-SUFFIX,gmail.com,PROXY,force-remote-dns
// 直连
// BAT 等首页直连
DOMAIN-SUFFIX,baidu.com,DIRECT
DOMAIN-SUFFIX,qq.com,DIRECT
DOMAIN-SUFFIX,alipay.com,DIRECT
这套配置绝大多数情况下足够使用了,奈何客户端开发者经常需要对 APP 抓包,以前是通过修改系统代理实现的,现在直接修改配置文件就行了。
自定义配置
现在我们的需求变成了:
检查是否是广告,如果是广告则拒绝连接
检查是否需要科学上网,如果需要的话,走代理服务器
检查是否需要抓包,如果需要的话,走 Mac 的 Charles 代理代理代理
剩下的请求默认直连
其中第三四步的逻辑可以颠倒,也就是说可以默认走抓包模式,只有那些不能抓包的连接才直连。然而这种模式问题比较多,因为很多对安全性比较高的 app 或者网页,比如支付模块等等,都会检查客户端证书, 这种情况下通过 Charles 代理就无法访问了。
这种需求是无法使用默认的配置模式实现的, 因为它只能选择代理 or 直连,而我们的需求实际上是有两种代理,即 Shadowsocks 代理和 Charles 代理,这需要我们对配置文件做一些手动编辑。
注意到之前的每一条配置都是三段式:
规则类型,规则特征,连接方式
其中连接方式可以是 DIRECT(直连)、PROXY(代理)和 REJECT(拒绝),实际上这里还可以填写前文所说的节点标签。比如我把 VPS 的标签设置为 DigitalOcean,这里就可以改成 DigitalOcean,效果和 PROXY 一致。
有了这个大前提,我们可以新建一个 HTTP 代理,标记为 Mac Pro,然后把需要抓包的连接的代理方式设置为 Mac Pro 即可:
image配置文件更新为:
// 需要抓包的地址走 Charles 代理
DOMAIN-SUFFIX,api.example.com,MAC PRO// 屏蔽广告DOMAIN-SUFFIX,ad.m.iqiyi.com,REJECT// 以 gmail.com 结尾的网址要求走代理,并且要求代理服务器做 DNS 解析DOMAIN-SUFFIX,gmail.com,DigitalOcean,force-remote-dns// BAT 等首页直连DOMAIN-SUFFIX,baidu.com,DIRECT
场景模式 与 Widget
真正让我下定决心使用 shadowrocket 而不是其它应用的原因是它的场景模式。有时候,在 WiFi 模式和 4G 模式,甚至是不同的 WiFi 下,我们使用的配置文件并不相同。比如我在家的 WiFi 和外出 4G 模式下,并不需要抓包。一个场景就是一种数据接入方式和配置文件的集合,最神奇的是,场景可以自动切换。
比如我创建了三个场景,分别表示 4G、家庭 WiFi 和公司 WiFi,每个场景有自己的配置文件,通过 WiFi 名称来区分:
image这样当我回家以后,shadowrocket 切换场景,自然也就会切换配置文件,从而避免了手动切换。
iOS 配置总结
在 iOS 平台上,我们也遵循了不用系统代理,利用全局代理软件来控制代理的原则,通过 shadowrocket 提供的配置文件和规则实现了需求。同时 Widget、场景模式、iCloud 备份与二维码导出提高了软件的使用效率。另一个好用的工具就是 Widget,除了全局开关以外,可以快速在场景、代理、直连、配置四种路由方式中快速选择,这个相当于之前我们编写的切换系统代理的脚本。虽然用到的场景不多,但作为一种备用方案,还是不可或缺的。
image除此以外,shadowrocket 导入导出配置也很容易,默认使用 iCloud 同步数据,自己的节点和配置还可以用二维码的方式分享给别人,别人在使用时只要扫码即可导入。
总结
在 iOS 平台上,我们也遵循了不用系统代理,利用全局代理软件来控制代理的原则,通过 shadowrocket 提供的配置文件和规则实现了需求。同时 Widget、场景模式、iCloud 备份与二维码导出提高了软件的使用效率。
有了这些配置以后,各个软件的存在感反而不强了,因为几乎都会保持打开状态,交给配置文件去决定代理方式,大大提升了工作效率。
由于我没有使用安卓手机,所以暂时没有安卓平台的教程,读者可以自行搜索类似的代理软件并进行配置。
第 3.7 章 Alfred 简介
Alfred 绝对是让 Mac 更加好用的神器之一,如果 Mac 上只能安装一款三方软件,那非 Alfred 莫选。我把 Alfred 拔高到如此地位绝非是为了捧杀它,而是确实实至名归,本文主要会介绍 Alfred 原生的用法。
除了 Alfred 软件自带的功能外,它还允许用户自己开发 workflow 并分享出来,正是这些 workflow,彻底奠定了 Alfred 的神器地位,下一章将会详细介绍它们的详细使用方式。
Alfred 简介
打开程序,首页中可以编辑 Alfred 的启动快捷键,这里我把它设置为 双击 Command 键,最好用的 App 当让要配备最好按的快捷键。
[图片上传失败...(image-ff4675-1598398259551)]
Alfred 使用的是免费 App + 付费高级功能的模式,本文所介绍的所有内容都是 Alfred 免费提供的。
文件/程序搜索
文件搜索是 Alfred 最基础的功能,类似于系统的 Spotlight,直接双击 Command 打开 Alfred 的窗口,然后输入文件名即可。
[图片上传失败...(image-ea0f4e-1598398259551)]
这也是为什么我会设置 Dock 栏隐藏的原因,毕竟有了 Alfred,谁会去 Dock 里面找 App 呢。
关于文件的搜索,我们还可以配置搜索的范围,搜索哪些类型的文件等等,读者可以在 Features -> Default Results
中配置。
网络搜索
如果我们想通过 Google 搜索东西,常规步骤是:
打开 Chrome
在地址栏输入 google.com
打开谷歌主页,输入搜索内容
然而有了 Alfred,搜索步骤变成了:
唤起 Alfred(显然比打开 Chrome 再进入 google.com 快得多)
输入搜索内容,回车
如图所示,先输入字母 g,大概率你会看到这个场景:
[图片上传失败...(image-a61c2d-1598398259551)]
这说明 Alfred 目前认为,你最有可能的行为是搜索 Chrome 这个应用并打开,所以把它排在第一位,第二个选项才是使用 Google 搜索。
没关系,我们 按照提示,按下 Command + 2,效果等同于点击第二个选项。Alfred 很聪明,会智能记忆,只要多重复几次,使用 Google 搜索就变成默认选项了。
[图片上传失败...(image-32b4ce-1598398259551)]
此时按下 Tab 键或者回车键都可以快速补全命令:
[图片上传失败...(image-5b5657-1598398259551)]
输入想要搜索的内容按下回车,Alfred 就会自动帮我们打开浏览器,并且拼接好地址,直接跳转过去。
PS:如果你觉得 Google 搜索非常高频,不想每次把 g 补全为 google,可以在Features -> Web Search
中修改 Google 搜索的 keyword。在 Web Search 的配置中,你还会看到除了 Google 搜索外,更多的搜索方式,比如搜索 Wikipedia、YouTube 和 Gmail 等等。
计算器
有了 Alfred,我们就不需要找到系统的计算器并打开了,可以直接在 Alfred 中做基本的运算:
[图片上传失败...(image-a90f73-1598398259551)]
剪贴板历史
考虑下面几种场景,你的做法是什么?
不知道现在剪贴板中的内容是什么,需要先粘贴出来,如果不满意再删除?
想要拿到上上次复制的内容,但是剪贴板里面已经被覆盖了
上周复制过一段话,依稀只记得某些关键字,想要再把内容找出来
有了 Alfred 的剪贴板增强,以上场景都不是问题,首先要在 Features ->; Clipboard 中打开剪贴板历史:
[图片上传失败...(image-7346d5-1598398259551)]
这里我把它们都设置为存储三个月,同时把打开剪贴板的快捷键设置为 Command + Shift + C,按下快捷键我们会看到:
[图片上传失败...(image-2295e9-1598398259551)]
所有的复制历史,包括图片的预览都一目了然,我们还可以搜索剪贴板历史:
[图片上传失败...(image-bad607-1598398259551)]
同样通过 Command + 数字键,就可以把它粘贴出来。同时被粘贴出来的内容会移动到剪贴板历史的最前方。
文本片段
有一些文本是需要反复输入的,比如你的邮箱、QQ号、地址、手机号码、某个网址等信息,亦或者聊天常用语句、表情等等,这些都可以通过 Alfred 来管理,节省输入时间。打开Features ->
; Snippets:
[图片上传失败...(image-2cf3d9-1598398259551)]
首先勾选右上角的 Automatically expand,它表示只要你输入关键字,就会自动展开成文本内容。
[图片上传失败...(image-42e96f-1598398259551)]
建议根据文本的使用场景,建立多个 Collection,比如开发相关的,个人信息相关的,聊天相关的等。
网友评论