MacBook 兼具命令行的高效与图形界面的酷炫,实在是程序员必备利器。本文主要介绍我在两年的使用过程中总结出的一些最佳实践,供大家参考、借鉴。

MacBook 你值得拥有

Mac OS 简介

Mac OS可以被分成操作系统的两个系列:

  • 一个是老旧且已不被支持的“Classic”Mac OS(系统搭载在1984年销售的首部Mac与其后代上,终极版本是Mac OS 9)。采用Mach作为內核,在Mac OS 7.6.1以前用“System vX.X”来称呼。
  • 新的OS X结合BSD Unix、OpenStep和Mac OS 9的元素。它的最底层建基于Unix基础,其代码被称为Darwin,实行的是部分开放源代码。

关于为什么Mac系统没有采用Linux内核,而是采用了BSD还有个小故事,感兴趣的大家可以看Mac OS X 背后的故事(二)——Linus Torvalds的短视这篇文章。

尽管 Mac 的文件系统目录和 Linux 差不多,但还是有些差距,可参考下面的表格:

Mac-FileSystem

Mac 开发环境部署

包管理器 Homebrew

The missing package manager for macOS

brew相当于Ubuntu下的apt-getCentOS中的yum。非常方便实用,一条命令即可安装:

1
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • brew install <cli-program>,安装命令行工具
  • brew cask install <gui-program>,安装图形界面软件,这得益于Homebrew-Cask扩展

文本编辑器 VSCode

1
2
# 安装命令
brew cask install visual-studio-code

新时代的文本编辑器,功能和 Atom/Sublime 差不多,但是不会出现卡顿现象,而且官方提供了 Sublime Text Keymap 插件,如果之前熟悉 Sublime,推荐安装。下面是我非常依赖的快捷键:

  • Multiple Selection: Control+Command+G(在 Linux/Windows 下,是 Alt+F3)
  • 选中多行 Shift+Command+L
  • 多行合并为一行Command+J

神之编辑器 Emacs

1
2
3
# 安装命令
brew install --with-cocoa --srgb emacs
brew install sbcl # 顺便把 common lisp 也装上

其实 Mac 是有自带 Emacs 的,位置是/usr/bin/emacs,只是版本非常旧,通过brew安装的位置在/usr/local/bin/emacs,可以通过下面的命令删除 Mac 自带的 Emacs:

1
2
sudo rm /usr/bin/emacs
sudo rm -rf /usr/share/emacs

为了能在 git,终端中默认使用 Emacs,需要做以下配置:

1
2
3
4
5
6
7
# ~/.bashrc
export EDITOR="emacsclient -t -a=\"\""
export ALTERNATE_EDITOR=""
# ~/.gitconfig
[core]
editor = emacsclient -t -a=\\\"\\\"

上面的配置会调用 emacsclient 去连接 emacs daemon服务,如果服务没启,就先启动服务再去连接。

API 查阅工具Dash

1
2
# 安装命令
brew cask install dash

Dash gives your Mac instant offline access to 150+ API documentation sets.

安装 Dash 后,就可以离线查各种语言/框架的 API 文档了。🍺

抓包工具 Wireshark

1
2
# 安装命令
brew cask install wireshark

也许是最强大的抓包工具,从其名字上就能体现出:wire(线路)+ shark(鲨鱼)。但这个软件初次使用时有些难度,最重要的是区分两个概念:

  • capture filter,在抓包开始时指定。
    capture filter
    常见表达式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Capture only traffic to or from IP address 172.18.5.4:
host 172.18.5.4
# Capture traffic to or from a range of IP addresses:
net 192.168.0.0/24
# Capture non-HTTP and non-SMTP traffic on your server (both are equivalent):
host www.example.com and not (port 80 or port 25)
host www.example.com and not port 80 and not port 25
# Capture traffic within a range of ports with newer versions of libpcap (0.9.1 and later):
tcp portrange 1501-1549
#Capture only IPv4 traffic - the shortest filter, but sometimes very useful to get rid of lower layer protocols like ARP and STP:
ip
# Capture only unicast traffic - useful to get rid of noise on the network if you only want to see traffic to and from your machine, not, for example, broadcast and multicast announcements:
not broadcast and not multicast
  • display filter,在抓取一定包后进行过滤。
    display filter
    常见表达式
1
2
3
4
5
ip.dst_host == 192.168.30.103 and tcp.dstport == 80
ip.addr == 10.43.54.65
# is equivalent to
ip.src == 10.43.54.65 or ip.dst == 10.43.54.65

终端 iTerm 2

1
2
# 安装命令
brew cask install iterm2

Mac自带的终端不是很强,程序员们需要一个强劲的终端来工作,于是有了 iTerm2。需要设置一项:Left Option act as +Esc(Preferences–>Profiles–>Keys),这样 Option 就可以用作 Meta 键了。

当然,说到了 iTerm2,不得不提到终端复用软件 tmux,tmux 默认配置文件在 Mac 上很别扭,你可以参考我这里的配置文件,这样 tmux 就可以像 vim 一样实现各种分屏的效果了。如果你还不知道 tmux 为何物,强烈推荐你看这个13分钟的视频,绝对物超所值,感谢 happypeter 的分享。

~/.bashrc

Linux 一般通过~/.bashrc进行环境变量的配置,但是在 Mac 下配置后,发现根本没有效果,这是为什么呢?
其实这是个比较基础的问题,shell有两种:登录式shell与非登录式shell,直观理解,登录(login)式shell就是在你打开shell要求你输入用户名与密码的shell,我们在使用桌面Linux时一般只在登录时接触到这种shell,等我们进入系统后,再打开的Terminal就是非登录式shell了。这两种 shell 读取配置的文件是不同的:

  • 登录式Shell启动时会去读取~/.profile文件(Redhat、Mac上为 ~/.bash_profile
  • 非登录式Shell会去读取~/.bashrc文件

这也就解释了为什么在 Linux 系统上只需要修改 ~/.bashrc 后即可生效的原因。但在 Mac 上有些不同,开机后再通过 Terminal.app(或iTerm.app) 打开终端时,这时的 shell 是登录式shell,因为Terminal.app(或iTerm.app)这个应用程序是通过/usr/bin/login这个命令打开终端的,所以不会去source ~/.bashrc了。
解决方法也很简单,在~/.bash_profile加上下面一句代码就ok了

1
[ -r ~/.bashrc ] && source ~/.bashrc

Mac下ls命令默认是没有颜色的,不是很直观,可以自己设置一个alias,参考链接

1
2
3
export LSCOLORS=gxBxhxDxfxhxhxhxhxcxcx
alias ls='ls -FG'
alias ll='ls -l'

为了在命令行提示符中显示时间,可以设置PS1变量

1
2
3
4
export PS1="\n\e[1;37m[\e[m\e[1;35m\u\e[m\e[1;36m@\e[m\e[1;37m\h\e[m \e[1;33m\t\e[m \w\e[m\e[1;37m]\e[m\e[1;36m\e[m\n\$ "
# 效果如下
[liujiacai@macbook 22:02:13 ~]

~/.ssh/config

在 macOS/OS X 截止到 Yosemite,ssh-agent 会一直记住 ssh-add -K 添加的 key,即使重启 keychain,ssh-agent 也会自动去读取保存在 keychain 中的密码(passphrase)。但在 Sierra 中,重启 keychain 后,ssh-agent 就不会去读取了。Apple 开发者也对这一现象作出回应

That’s expected. We re-aligned our behavior with the mainstream OpenSSH in this area.

解决办法也很简单,将ssh-add -A 放到 ~/.bashrc 里面就可以了。除了这种方式,还可以在~/.ssh/config里面加入如下配置:

1
2
3
4
Host * (asterisk for all hosts or add specific host)
AddKeysToAgent yes
UseKeychain yes
IdentityFile <key> (e.g. ~/.ssh/userKey)

参考:

除此之外,对于 OpenSSH 4.0 以及之后的版本,引入一新功能 ControlMaster,可以复用之前已经登录的连接,建议开启:

1
2
3
4
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
ControlPersist 60m

参考:

系统快捷键

  • 查看桌面F11
  • HOME Command + <-
  • END Command + ->
  • 锁屏 Shift + Control + 电源键 (Windows 下为Win+L
  • 强制关闭程序 Command + Option + esc(Windows 下为Ctrl+Alt+Delete

Finder

Finder是Mac上的文件浏览器,其中有个比较严重的问题时,没有“剪贴(cut)”功能,当我们选中一个文件后,菜单中的“Edit”->“Cut”是灰色的,也就是无法使用,这是因为Finder中的“Cut”只适用于文本,对于文件就无能为力了。
我们当然可以通过打开两个Finder窗口,然后“拖”过去。但是这样未免太麻烦了,其实我们可以这么做:

  1. 首先Cmd + C复制文件
  2. 然后找到你想要放到文件夹
  3. 最后Cmd + Option + V就能实现“剪贴”的效果了。

参考:Why is it not possible to use the “cut” command to manipulate a file in the Finder?

Java

1
2
3
4
# 安装命令
brew cask install java
brew install maven
brew cask install intellij-idea-ce # IDE,不要告诉我你还在用 eclipse

通过brew cask安装后,可以通过执行/usr/libexec/java_home这个命令来获取JAVA_HOME

1
export JAVA_HOME="$(/usr/libexec/java_home)"

Docker

1
2
# 安装命令
brew cask install docker

国内访问 Docker Hub 有时会遇到困难,最好可以配置镜像加速器

数据库 GUI 客户端

1
2
3
4
# 安装命令
brew cask install sequel-pro # mysql
brew cask install robo-3t # mongodb
brew cask install rdm # redis

实用命令

1
2
3
4
# 修改hostname
sudo scutil --set HostName <name>
# 查看USB设备
system_profiler SPUSBDataType

下面的命令需要通过brew进行安装后在使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 查看网络请求
brew install httpstat
$ httpstat baidu.com
Connected to 180.149.132.47:80 from 172.17.10.80:54727
HTTP/1.1 200 OK
Date: Sat, 14 Jan 2017 13:49:16 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sun, 15 Jan 2017 13:49:16 GMT
Connection: Keep-Alive
Content-Type: text/html
Body stored in: /var/folders/2g/fxz_98ks0lgc79sjp5vn5cxc0000gn/T/tmpsawHq4
DNS Lookup TCP Connection Server Processing Content Transfer
[ 69ms | 37ms | 33ms | 0ms ]
| | | |
namelookup:69ms | | |
connect:106ms | |
starttransfer:139ms |
total:139ms
# Swiss Army Knife for macOS !
brew install m-cli
$ m trash status
Size: 51G
Number of files: 252172

常用软件

日常使用的软件首选通过App Store进行安装,默认安装在/Applications下,个人从互联网上单独下载的软件放在这里面即可出现在Launchpad中找到。
对于通过App Store安装的软件,在Launchpad界面,按住Option键可进行删除。但是需要注意一点的时,应用程序一般都会有些历史文件,存放的位置有如下三处

  • ~/Library/Application Support/<Application name>
  • ~/Library/Cache/<Application name>
  • ~/Library/Preferences/<Application name>.plist

使用find + grep的方式就能轻松找出来了。网上也有诸如AppCleanerAppZapper的小软件,大家可以根据需要自取之。

下面介绍下我日常使用的一些免费软件,供大家参考。

PS: Mac 下有很多非常实用的收费软件,我个人用的并不多,这里就不在列举了。
大家可以参考知乎上的 macOS (OS X) 平台上有哪些值得推荐的常用软件?

浏览器

Mac 上自带的 Safari 比较轻量,虽然比较省电,但扩展性远不如 Chrome、Firefox,所以这两个是必须的。

1
2
brew cask install firefox
brew cask install google-chrome

科学上网 Shadowsocks

1
brew install shadowsocks-libev

Mac 下不推荐安装 GUI 版本,已经很久没人维护了。安装之后编辑/usr/local/etc/shadowsocks-libev.json,填入 server 地址即可。

1
2
3
4
# 测试
ss-local -v -c /usr/local/etc/shadowsocks-libev.json
# 开机启动
brew services start shadowsocks-libev

为了让终端可以使用代理,需要将 http(s) 转为 socks 流量。ss 官方推荐的的是proxychains,但是在OS X 10.11 以后引入了SIP安全机制,导致无法直接使用,关闭 SIP 貌似也不可取,可以选用 privoxy 来替代 proxychains。(参考

1
2
3
4
5
6
7
brew install privoxy
# privoxy 使用 8118 端口, ss 使用 1080
echo 'listen-address 0.0.0.0:8118\nforward-socks5 / localhost:1080 .' >> /usr/local/etc/privoxy/config
# 测试,查看 8118 有没有在监听, netstat -an | grep 8118
/usr/local/sbin/privoxy /usr/local/etc/privoxy/config
# 开机启动
brew services start privoxy

经过上面这几步 http(s)->socks5 就完成,下面只需要让终端走这个代理即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
export http_proxy='http://localhost:8118'
export https_proxy='http://localhost:8118'
# 可以将以下函数放入 ~/.bashrc 中,方便开启/关闭代理
function proxy_off(){
unset http_proxy
unset https_proxy
echo -e "已关闭代理"
}
function proxy_on() {
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"
export http_proxy="http://127.0.0.1:8118"
export https_proxy=$http_proxy
echo -e "已开启代理"
}

图片截屏、合并

Mac上的截图工具已经很好了,Cmd + Shift + 3/4就够用了,但是如果想在图片上写些文字,马赛克某部分,就不行了,推荐用 Snip,才 2M 大小,虽说是腾讯开发的,但是不流氓。可以设置快捷键,我设定的是Cmd + Shift + 6
更重要的一点是,Snip 可以解决Retina下截屏2x问题(就是截出来的图超大),就光这个特点就足以让你使用snip。


我的snip配置

Mac自带的 Preview 可以对图片进行旋转、调整大小、添加文字,不需要在额外安装软件。

Preview工具栏

此外,如果要对两张图片进行合并,需要通过安装 ImageMagick,并且通过以下命令操作:出处

1
2
3
4
5
6
brew install ImageMagick
# 下面两条命令都会把 left.png right.png 合并到 merged.png 里面
convert +append left.png right.png merged.png
montage -geometry 100% left.jpg right.jpg merged.jpg

如果你依赖于Evernote,可以试试圈点,洋名skitch,同样很好很强大。

录屏 gif

1
2
# 安装命令
brew cask install licecap

很多时候我们需要把自己的操作展示给别人看,比较好的做法是通过录屏软件将自己的操作保存成 gif 格式的图片。
开源免费licecap 很好的解决了这个问题。

使用 licecap 制作的例子

流程图制作工具

对于程序员来说,流程图应该是再亲切不过的了,一张图胜过千言万语。之前我都是用 Keynote 来画,但是实在是不好用,后来在知乎上发现了在线版的ProcessOn,大大减少了我画流程图的时间,上手也比较快。现在 ProcessOn 有了限制,只能保留 9 张流程图。我又找到了新的工具,draw.io,时序图、状态图统统不在话下。

其次,国外很多项目的图是用纯文本画的,比较好用的在线工具是:asciiflow

Calibre mobi 转化器

如果你有 Kinder 阅读器,那么这个应该适合你!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 安装命令
brew cask install calibre
==> Installing Cask calibre
==> Moving App 'calibre.app' to '/Applications/calibre.app'.
==> Linking Binary 'calibre' to '/usr/local/bin/calibre'.
==> Linking Binary 'calibre-complete' to '/usr/local/bin/calibre-complete'.
==> Linking Binary 'calibre-customize' to '/usr/local/bin/calibre-customize'.
==> Linking Binary 'calibre-debug' to '/usr/local/bin/calibre-debug'.
==> Linking Binary 'calibre-parallel' to '/usr/local/bin/calibre-parallel'.
==> Linking Binary 'calibre-server' to '/usr/local/bin/calibre-server'.
==> Linking Binary 'calibre-smtp' to '/usr/local/bin/calibre-smtp'.
==> Linking Binary 'calibredb' to '/usr/local/bin/calibredb'.
==> Linking Binary 'ebook-convert' to '/usr/local/bin/ebook-convert'.
==> Linking Binary 'ebook-device' to '/usr/local/bin/ebook-device'.
==> Linking Binary 'ebook-edit' to '/usr/local/bin/ebook-edit'.
==> Linking Binary 'ebook-meta' to '/usr/local/bin/ebook-meta'.
==> Linking Binary 'ebook-polish' to '/usr/local/bin/ebook-polish'.
==> Linking Binary 'ebook-viewer' to '/usr/local/bin/ebook-viewer'.
==> Linking Binary 'fetch-ebook-metadata' to '/usr/local/bin/fetch-ebook-metadata'.
==> Linking Binary 'lrf2lrs' to '/usr/local/bin/lrf2lrs'.
==> Linking Binary 'lrfviewer' to '/usr/local/bin/lrfviewer'.
==> Linking Binary 'lrs2lrf' to '/usr/local/bin/lrs2lrf'.
==> Linking Binary 'markdown-calibre' to '/usr/local/bin/markdown-calibre'.
==> Linking Binary 'web2disk' to '/usr/local/bin/web2disk'.

视频播放器、截取

1
2
# 安装命令
brew cask install vlc

Mac下的自带的播放器QuickTime,功能实在是太弱了,支持的格式既少又难用,快进什么的貌似都没快捷键,只能手动点击进度条,试用了一段时间的Mplayer,发现效果也不好,会有视频卡顿的现象,最终选择了 VLC,一直用的还不错。
此外, 有网友补充道 mpv 才是程序员最佳播放器,大家也可以尝试下。

很多时候,我们只需要截取视频中的某一段视频,或者简单的进行格式转换,这时候就需要 ffmpeg 出马了。

1
2
3
4
5
6
7
# 安装命令
brew install ffmpeg
# 将 mov 格式的视频转为 mp4,ffmpeg 能根据文件后缀名自动识别
ffmpeg -i foo.mov foo.mp4
# 从第 6 秒开始,截取10s 视频,并且转为 mp4 格式
ffmpeg -t 10 -ss 00:00:06 -i foo.mov smaller.mp4

音乐频播放器

1
2
# 安装命令
brew cask install vox

官方的 iTunes 实在是不适应,喜欢简洁清爽的朋友可以试试 VOX

*.webarchive

在windows下保存网页时,如果想把网页上的资源,比如css、js、image等一起下载下来,会单独生成个文件夹,但是用 Mac 上的 Safari 保存整个网页时,是以webarchive为后缀名的文件进行保存的,如何把打开这种文件呢?推荐:

http://sourceforge.net/projects/webarchivext/

虚拟机 Virtualbox

1
2
# 安装命令
brew cask install virtualbox

在天朝,很多网站是只支持 IE 的,Mac 下的 Firefox, Chrome, Safari 这时候都显得心有力而不足了,而且很多软件也只有 Windows 版,所以装个虚拟机是非常有必要的。 Virtualbox 是我自用 Ubuntu 以来一直用的虚拟机,开源免费。

Virtualbox

常见问题

不能写 NTFS

用惯了 Windows 的大家都习惯用 NTFS 文件系统格式,但是很遗憾,这个文件系统是微软自己搞得,不是开放的,所以 Mac 是不支持的,如果你以前的 NTFS 格式的硬盘放到 Mac 上,会发现只能进行读操作,不能写入,这属于正常现象,不要惊慌。

解决的方法也很简单,把移动硬盘格式化成FAT32(单个文件大小不能超过4G)或FAText 格式都可以,Mac 自带的磁盘工具就可以进行格式转化,当然你需要先把移动硬盘上的数据拷贝出来。

Wi-Fi 时常中断

Mac 生于乔帮主之手时,为了凸显尊贵,接口与一般的电脑有很大不同。常见的网线没办法直接连接 Mac 电脑,需要单独购买一个以太网转接器,所以大部分同学都是使用无线连接,但 Mac 这里应该是有个 bug,而且是很久的 bug,我用 Mac 两年了,偶尔会遇到几次,网上解决的方法有如下几种:

  1. 修改网络位置,不是其默认的“自动”就好
  2. 修改路由器,把无线信道改为6或9
  3. 关闭蓝牙,Mac 中,同时打开蓝牙与 Wi-Fi 会冲突。详情

如果你的 Mac 也遇到了 Wi-Fi 问题,可以试试上面三个解决方法。

总结

Once you get Mac, you never come back!

参考

更新日志

  • 2017/01/14,增加 emacs、dash、brew caskhttpstatm-cli
  • 2017/06/03,增加 ffmpeg、asciiflow
  • 2017/07/06,修改 iTerm2 部分,增加 docker