如何优雅地使用 macOS

当时写这篇文章的时候才接触 mac 没多久,在使用的第二年的时候,修订了这篇文章,今年
是第三年,再次修订了本文。

0x00 前言

谈及 macOS , 很多人喜欢和 Win 比个高下。在我看来, Win 虽在非编程类(除了.NET) 生态和易用性比 Mac 要好很多,可专业人士之所以专业是因为他能挑选适合的武器发挥最大的效用,不是吗?

适合自己的,能让自己用最大效率生产或者是娱乐的,才是更好的工具。

由于笔者已经更换了苹果全家桶 (RMBP/IPAD/IPHONE/IWATCH),所以本文中很多工具的挑选和调教都是为了让我全家桶用的更舒服。

0x01 系统快捷键

快捷键与触摸板

  • cmd 为 command 按键,通常情况下为所有桌面程序通用性的快捷键。
  • ctrl ,通常情况下是针对程序的功能进行加强,并且此功能往往是非 cmd 类(窗口操作,选择,复制粘贴等等)操作。
  • shift 按键通常用于加强操作。一般会让操作更进一步 or 相反操作。

  • cmd+tab =~ alt+tab 程序之间的切换

  • cmd+` 应用内窗口切换

  • cmd+h 窗口 hide

  • cmd+m 窗口 minimize
  • cmd+n 新建窗口
  • cmd+o 打开
  • cmd+s 保存
  • cmd+shift+s 另存为
  • cmd+p 打印 print
  • cmd+w 关闭
  • cmd+q quit

  • cmd+a select all

  • cmd+i show info
  • cmd+n create a new folder
  • cmd+f search
  • cmd+c copy
  • cmd+v paste
  • cmd+delete 删除选中文件
  • cmd+shift+delete 清空回收站

  • cmd+= 放大

  • cmd+- 缩小
  • cmd+t 新建选项卡
  • cmd+r 刷新

  • cmd+shift+3 截取整个屏幕

  • cmd+shift+4 截取选择区域
  • cmd+shift+4+SPACE 截取选择窗口
  • cmd+ 鼠标点击 -> 选中不连续文件
  • control+ 鼠标点击 -> 相当于 win 中右键点击

  • fn+left home

  • fn+right end
  • fn+up pageup
  • fn+down pagedown

触摸板手势:

  • 点击

    • 单指点击 - 单击
    • 单指滑动 - 滑动鼠标光标
    • 双指点击 - 相当于 Windows 的鼠标右键
    • 三指点击 - 划词查找
  • 滑动与缩放

    • 双指上下滑动 - 滚动
    • 双指缩放 - 与 Android 上图片缩放一致
    • 双指双击 - 只能缩放
    • 双指旋转 - 旋转
    • 双指左右滑动 - 应用内切换网页
    • 双指头从右往左
    • 三指头左右滑动 - 全屏幕 App 切换
    • 大拇指和食中无名缩放 - launchpad

0x02 必备软件

2.1 必备软件 之 日常必备

  • iTunes
  • iPhoto
  • iMessage
  • SpotLight -> Alfred 3

  • Google Chrome

  • Safari

  • 启动器

    • Alfred 3
  • 网络工具

    • Chrome
  • 社交通讯

    • QQ
    • WeXin
  • 图形图像

    • Adobe PhotoShop CC
    • Adobe PhotoShop LightRoom
    • Adobe After Effect
    • Final Cut Pro
    • Sketch
    • Annotate
    • Camtasia 2
    • Snagit
    • ScreenFlow
    • MPlayerX
    • QuickTime
    • iQiyi
    • NeteaseMusic
    • IINA
  • 办公软件

    • 欧陆词典
    • Calibre
    • Wiznote
    • PDF Reader
    • iBook
    • Microsoft Office
    • Work 套件:包括 pages, numbers, keynote
    • XMind
    • Spark
    • TeamViewer - 远程管理
    • OmniFocus
    • OmniGraffle
    • OmniOutline
    • OmniPlan
  • 系统软件

    • 搜狗输入法
    • AppCleaner
    • CleanMyMac
    • VMWare
    • BetterZip
    • Caffeine / Amphetamine
    • PopClip

2.2 必备软件 之 开发必备

  • 终端用户

    • iTerm2
  • IDE

    • PyCharm
    • IntellijIDEA
    • WebStorm
  • 编辑器

    • MacVim 配合 C-VIM
    • Sublime Text 3
  • 后台组件

    • MySQL
    • PostgreSQL
    • Redis
    • MongoDB
  • 数据库管理软件

    • Navicat
    • Datagrip
    • RoboMongo
    • RDM
    • Dash
  • 网络工具

    • SS QT
    • Charles
    • Wireshark
  • Chrome

    • Exporter : 百度云,需要离线安装
    • AdBlock : 广告拦截
    • AutoPatchWork : 链接下一页
    • Axure RP Extension : Axure
    • CSSViewer
    • Dream Afar New Tab
    • JSON Editor
    • JSON View
    • Octotree
    • One-Click Extensions Manager
    • Proxy SwitchyOmega
    • React Developer Tools
    • Redux DevTools
    • Vue.js devtools
    • Vimium
  • 代码仓库

    • Github Desktop
    • SourceTree
  • GIS 相关

    • ArcGIS
    • QGIS
    • PostgreSQL + PostGIS

CMD 命令

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
if test ! $(which brew); then
echo "Installing homebrew..."
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
fi
# Make sure we’re using the latest Homebrew.
brew update
# Upgrade any already-installed formulae.
brew upgrade --all
# Install GNU core utilities (those that come with OS X are outdated).
# Don’t forget to add `$(brew --prefix coreutils)/libexec/gnubin` to `$PATH`.
brew install coreutils
sudo ln -s /usr/local/bin/gsha256sum /usr/local/bin/sha256sum
# Install some other useful utilities like `sponge`.
brew install moreutils
# Install GNU `find`, `locate`, `updatedb`, and `xargs`, `g`-prefixed.
brew install findutils
# Install GNU `sed`, overwriting the built-in `sed`.
brew install gnu-sed --with-default-names
# Install Bash 4.
brew install bash
brew tap homebrew/versions
brew install bash-completion2
# We installed the new shell, now we have to activate it
echo "Adding the newly installed shell to the list of allowed shells"
# Prompts for password
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'
# Change to the new shell, prompts for password
chsh -s /usr/local/bin/bash
# Install `wget` with IRI support.
brew install wget --with-iri
# Install RingoJS and Narwhal.
# Note that the order in which these are installed is important;
# see http://git.io/brew-narwhal-ringo.
brew install ringojs
brew install narwhal
# Install Python
brew install python
brew install python3
# Install ruby-build and rbenv
brew install ruby-build
brew install rbenv
LINE='eval "$(rbenv init -)"'
grep -q "$LINE" ~/.extra || echo "$LINE" >> ~/.extra
# Install more recent versions of some OS X tools.
brew install vim --override-system-vi
brew install homebrew/dupes/grep
brew install homebrew/dupes/openssh
brew install homebrew/dupes/screen
brew install homebrew/php/php55 --with-gmp
# Install font tools.
brew tap bramstein/webfonttools
brew install sfnt2woff
brew install sfnt2woff-zopfli
brew install woff2
# Install some CTF tools; see https://github.com/ctfs/write-ups.
brew install aircrack-ng
brew install bfg
brew install binutils --with-default-names
brew install binwalk
brew install cifer
brew install dex2jar
brew install diffutils
brew install dns2tcp
brew install ed --with-default-names
brew install fcrackzip
brew install findutils --with-default-names
brew install foremost
brew install gawk
brew install gnu-indent --with-default-names
brew install gnu-sed --with-default-names
brew install gnu-tar --with-default-names
brew install gnu-which --with-default-names
brew install gnutls
brew install grep --with-default-names
brew install gzip
brew install hashpump
brew install homebrew/x11/xpdf
brew install hydra
brew install john
brew install knock
brew install netpbm
brew install nmap
brew install pngcheck
brew install screen
brew install socat
brew install sqlmap
brew install tcpflow
brew install tcpreplay
brew install tcptrace
brew install tmux
brew install ucspi-tcp # `tcpserver` etc.
brew install watch
brew install wdiff --with-gettext
brew install wget
brew install xz
# Install other useful binaries.
brew install ack
brew install dark-mode
#brew install exiv2
brew install git
brew install git-lfs
brew install git-flow
brew install git-extras
brew install hub
brew install imagemagick --with-webp
brew install lua
brew install lynx
brew install p7zip
brew install pigz
brew install pv
brew install rename
brew install rhino
brew install speedtest_cli
brew install ssh-copy-id
brew install tree
brew install webkit2png
brew install zopfli
brew install pkg-config libffi
brew install pandoc
brew install gtk-doc
brew install swig
# Lxml and Libxslt
brew install libxml2
brew install libxslt
brew link libxml2 --force
brew link libxslt --force
# gitbook autocover
brew install pkg-config cairo pango libpng jpeg giflib
# Install Cask
brew install caskroom/cask/brew-cask
brew tap caskroom/versions
# aerial 屏保
# https://github.com/JohnCoates/Aerial
brew cask install aerial
# https://github.com/sindresorhus/quick-look-plugins
brew cask install qlcolorcode qlstephen qlmarkdown quicklook-json qlprettypatch quicklook-csv betterzipql qlimagesize webpquicklook suspicious-package quicklookase qlvideo
brew update && brew upgrade --all && brew cleanup && brew prune

2.3 必备软件 之 编程语言

Shell

MAC 使用的大多命令行工具来自于 FreeBSD , 并不是来自 GNU , 所以很多命令会与常规的 linux 命令大同小异。

而本人喜欢 GNU 系软件。

Shell 脚本可参考我的笔记。 第九节如何优雅的使用 Shell_

说到 shell, 除了要使用 bash 的 shell 之外,zsh 的 shell 也值得一试。(不过大神 kennethreitz 最喜欢 fish shell )

1
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

Python

笔者虽然也接触过很多语言,都是粗浅一过,但无一精通,唯一可以稍微谈谈的就是 Python 语言。

当然,安装完毕自然是可以参考一下我的 第三节 Pythonista 的工具集_

国内外网络环境不通畅,安装与配置环境这件小事也就成了一个大事情。

我对于 Python 版本的安装 和 Python 依赖包管理有三个阶段:

  • 入门级
  • 新手级
  • 熟手级

最初是入门级,我配置环境和大部分的 Pythonista 一样,最初版:

  • 面对 Python 版本的管理,干脆就是不管理,brew 安装一个 Python2 用于开发 Python2 的代码,brew install 一个 Python3 用于 Python3 的代码开发。
  • 面对 Python 依赖包管理,干脆就是直接使用 virualenv 或者他的 wrapper 直接 venv 一个环境,然后 active 一下,接着 PIP install -r req.txt

  • 面对 Python 版本的管理,使用 pyenv

  • 面对 Python 依赖包管理,使用 pyenv virtualenv 出多个环境,然后切换环境就好了。
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
33
34
35
36
37
38
39
40
41
42
43
brew install pipenv
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc
# 接着另开终端
# 不喜写兼容代码,所有代码均向 3.5+ 靠拢
v=3.5.2;wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v
v=3.6.0;wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v
v=2.7.11;wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v
# 可以先用迅雷把 官网的 Anaconda3-4.4.0-MacOSX-x86_64.sh 下载下来,然后
mv Anaconda3-4.4.0-MacOSX-x86_64.sh ~/.pyenv/cache/ && pyenv install anaconda3-4.4.0
# 设置 Global Python 为 2.7.11, 备注:尽量不要把 Py3 设置为全局,否则由于 Homebrew 本身有一些依赖是依赖于 Py2 的,这样容易出现一些奇怪的问题。
pyenv global 2.7.11
pip install -i https://pypi.doubanio.com/simple requests
# 下面这个是用于安装基本的代码补全功能
pip install -i https://pypi.doubanio.com/simple --upgrade "jedi>=0.9.0" "json-rpc>=1.8.1" "service_factory>=0.1.5" flake8 pytest autoflake hy
# 创建最常用 Py3 虚拟环境
pyenv virtualenv 3.5.2 py3-daily
pyenv activate py3-daily
pip install -i https://pypi.doubanio.com/simple requests
pip install -i https://pypi.doubanio.com/simple beatutifulsoup4
pip install -i https://pypi.doubanio.com/simple ipython[notebook]
pip install -i https://pypi.doubanio.com/simple jupyter
# 下面这个是用于安装基本的代码补全功能
pip install -i https://pypi.doubanio.com/simple --upgrade "jedi>=0.9.0" "json-rpc>=1.8.1" "service_factory>=0.1.5" flake8 pytest autoflake hy
# 创建 Anaconda 的数据科学 AI 环境
pyenv virtualenv anaconda3-4.4.0 py3-ai
pyenv activate anaconda3-4.4.0/envs/py3-ai
pyenv deactivate
# 进入一个项目之后
pyenv activate py3-proj
pip install -r requirements/local.txt
pip install -r requirements/prod.txt
# requirements/local.txt 与 requirements/prod.txt 依赖于 requirements/base.txt

其实,第一种入门级管理方式弊病在于,python 版本太粗糙,之前遇到一个 python3.3 的问题,python3.4 就解决了。而为了避免这种奇葩的版本差异带来的潜在风险,开发与部署一般要锁死 Python 版本。

即便是解决了入门级管理方式带来的版本管理粗糙的问题,同样的,依赖也要锁死。一个项目对应一种环境该多好 通过 PIP 的确可以用 freeze 输出为 txt 达到锁死的目的。但个人认为,这个还不够,至少要知道依赖树之类的吧?还要知道哪些东西是可以更新的吧?

而且,就应该像 node 项目里面的 package.json 一样,把依赖什么乱七八糟的东西都放进去才好。

  • 面对 Python 版本和依赖包管理,使用 pipenv

这代表着,只要一个就行了。

JavaScript 与 Node 环境

Nvm && Npm && Yarn

nvm 主要用户管理 node 的版本,linux / mac only ,windower 最好下载 node 版本安装,记得配置环境变量。

npm 主要用户管理包,国内人喜欢使用 cnpm, 但是 cnpm 包管理比较渣,所以一般情况下选择 Yarn 配合管理

1
2
3
4
5
npm install cnpm
cnpm install yarn -g
# 查看下载源
# yarn config get registry
yarn config set registry https://registry.npm.taobao.org
1
2
3
4
5
6
7
8
9
$ cat ~/.npmrc
registry=https://registry.npm.taobao.org/
chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver
disturl=https://npm.taobao.org/dist
operadriver_cdnurl=http://cdn.npm.taobao.org/dist/operadriver
phantomjs_cdnurl=http://cdn.npm.taobao.org/dist/phantomjs
fse_binary_host_mirror=https://npm.taobao.org/mirrors/fsevents
sass_binary_site=http://cdn.npm.taobao.org/dist/node-sass
electron_mirror=http://cdn.npm.taobao.org/dist/electron/

yarn 在使用包管理的时候会分析依赖,这对总是 BUG 不断的 node_module 简直是福音。

Java

Java 环境安装稍微有一丢丢蛋疼。特别是多版本管理。

1
TODO: 以后补充 JAVA 环境安装

Ruby

两年前写过几个月的 Ruby, 现在安装 Ruby 环境更多是因为 Ruby 还有一些 Gem 质量挺高的。

1
2
3
curl -sSL https://get.rvm.io | bash -s stable
rvm install 2.3.0
gem install tmuxinator

2.4 必备配置 之 dotfiles

详细内容请见 yadotfiles

  • 依照我个人的习惯,在 OhMyZsh 基础上增加了个人习惯的环境变量的配置,一些函数的封装。

比如,当我在写本文的目录中输入 todos, 就可以查看该我在写文章的时候里面挖了多少个还没有填上去的 TODO(坑)。如下

1
2
3
4
3e383c54 (Micheal Gardner 2017-11-18 12:40:38 +0800 422) ## 0xEE TODO TO LIST
ae86b7cb (Micheal Gardner 2017-11-19 21:39:49 +0800 245) ### 5. TODO
c0d51990 (Micheal Gardner 2017-11-22 16:42:08 +0800 552) TODO: 以后补充 JAVA 环境安装
c0d51990 (Micheal Gardner 2017-11-22 16:42:08 +0800 561) 比如,当我在写本文的目录中输入 todos, 就可以查看该我在写文章的时候里面挖了多少个还没有填上去的 TODO(坑)。

详细请参考 yadotfiles

0x08 踩坑史

8.1 日常类

01. 时间机器无法完成备份

我有定期备份的习惯,在一次备份中,意外的发现怎么备份都无法备份完毕,经过几次测试:

  1. 我首先猜测是硬盘问题,换了一块硬盘,问题依旧。
  2. 复制了几个大文件,感觉也不太像是接口接触不良的问题。
  3. 我认为可能是文件数量过多导致的问题。于是删除掉 node_module 后再次备份,备份成功。当然,这也有一定概率是误打误撞。毕竟从概率学上讲,坏掉的钟还能一天有两次时间是对的呢。

外接硬盘的时候,将网络关闭即可。

02. 下载站的软件包显示损坏

有的时候并不是软件损坏,而是 macOS 的安全配置中配置关掉了未识别出的 App

在终端中开启这个选项,并在安全与隐私处点上 anywhere 即可。

1
sudo spctl --master-disable

8.2 编程类

01. homebrew 的与 Python 的问题

在 Python 中执行下面的代码的时候总是报错:

1
2
3
4
5
6
7
8
9
ip = socket.gethostbyname(socket.gethostname())
# socket.gaierror: [Errno 8] nodename nor servname provided, or not known
# 最后发现是因为设置主机名没有设置好
sudo scutil --set ComputerName "newname"
sudo scutil --set LocalHostName "newname"
sudo scutil --set HostName "newname"
dscacheutil -flushcache
# 然后重启电脑即可

如果本机安装了 Homebrew 如果后面使用 PyEnv 或者 Anaconda 并且设置当前环境为默认 Python 为 Python3(不建议这么搞), 但是如果偏偏要把默认的 Python 版本换成 Python3, 会弹出一些 pythonpath
的问题,执行下面命令即可暂时屏蔽这个问题,但是没有隐患则不清楚。

1
mv /usr/local/lib/python2.7/site-packages/sitecustomize.py /usr/local/lib/python2.7/site-packages/sitecustomize.py.back

02. Homebrew 安装过去的文件

8.3 存储与文件系统

笔者在自己的电脑上使用的是 APFS, 毕竟苹果官方出的,多多少少在系统上做很多优化的工作。

一般的存储设备(移动硬盘或者是 USB 存储)的话,我们常常会在下面几个里面纠结

  • FAT32
  • NTFS
  • HFS
  • exFAT

一般原则是

  1. 存放东西用 exFAT
  2. Win 上的启动盘 FAT32

但也要注意的是,exFat 不能很自由的 resize 或者分区合并。

0xEE 参考链接

  • 本文部分命令行安装借鉴了 dev-setup

ChangeLog:

  • 2016-02 确定大致内容
  • 2017-06-28 重修文字,调整文章结构,Python 环境 和 Homebrew 安装环境
  • 2017-10-05 再次重修文字,不定期更新
  • 2018-09-20 重新修订文字