如何优雅地使用 macOS

6,539 阅读11分钟

当时写这篇文章的时候才接触 mac 没多久,使用快两年之后,再次修订了本文。

0x00 前言

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

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

Win 的优点如下:

  • 优良的兼容性。
  • 由于出自于什么都爱做的微软公司,从整体来说,VS,.NET, 游戏性,兼容性,性能,新手上手速度来说,都是遥遥领先 Mac 的。

Win 的缺点如下:

  • 微软的战线实在是拉的太长,什么都想做,什么都想垄断。于是,与之服务密切相关的公司也就受到了 MS 的牵制。这对大公司来说,几乎是不能够忍受的行为。硅谷的公司使用微软服务的也就接近 5%(可能有误差)。
  • 糟糕的终端环境(DOS)和无法与、*nux 世界的脚本友好相处使得系统的可定制性和进阶操作性大大降低。
  • 虽然有 Everything,TotalCMD,AHK 这种神级辅助工具可以满足定制要求。但由于过高的学习成本(哈哈哈,混乱也是学习成本之一,AHK 语言真的很混乱啊,TC 实在是太不人性化了)。
  • Python 的环境配置实在是太头疼了

Win 的缺点就是我切到 Mac 上面的原因。

macOS 的优点如下:

  • Mac 的好在于终端和美观的图形的结合。适合不是微软技术栈和重度 Office 的用户。
  • *nux 应用的方便以及非常容易与脚本文件配合出强大的组合技能。
  • 反观 Win 上,则这种组合技能则在环境配置上和操作流畅度上差了很多。

macOS 的缺点如下:

  • 娱乐项目实在是少的要死。Metal 和 DirectX 相差不是一点点。
  • 软件和有些少的不只一点点。

本文从下面几处入手,分别从下面几个角度介绍了 macOS

▼ 如何优雅地使用 macOS
    0x00 前言
▼ 0x01 系统内置
    1.1 系统设置
    1.2 自带软件
    1.3 快捷键与触摸板
▼ 0x02 必备软件
    2.1 必备软件 之 日常必备
    ▼ 2.2 必备软件 之 开发必备
        2.2.1 GUI 应用
        2.2.2 CMD 命令
    ▼ 2.3 必备软件 之 编程语言
        2.3.1 Shell
        2.3.2 Python
▼ 0x03 踩坑史
    ▼ 3.1 日常类
        01. 时间机器无法完成备份
        02. 下载站的软件包显示损坏
    ▼ 3.2 编程类
        01. homebrew 的与 Python 的问题
    0xEE 参考链接

0x01 系统内置

1.1 系统设置

General

  • 默认浏览器 : Google Chrome

Decktop & Screen Saver

  • 桌面 / 屏保

Language & Region

  • 语言
  • 地区设置

Security & Privacy

  • 防火墙

Sharing

  • Remote Control - SSH

Trackpad

  • 设置手势
  • 滚轮 Scrool Direction : Natural

1.2 自带软件

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

1.3 快捷键与触摸板

  • 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 必备软件 之 日常必备

  • 启动器

    • Alfred 3
    • SpotLight
  • 网络工具

    • Chrome
  • 社交通讯

    • QQ
    • WeXin
  • 图形图像

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

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

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

2.2 必备软件 之 开发必备

2.2.1 GUI 应用

  • 终端用户

    • 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

2.2.2 CMD 命令

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
brew install binwalk
brew install cifer
brew install dex2jar
brew install dns2tcp
brew install fcrackzip
brew install foremost
brew install hashpump
brew install hydra
brew install john
brew install knock
brew install netpbm
brew install nmap
brew install pngcheck
brew install socat
brew install sqlmap
brew install tcpflow
brew install tcpreplay
brew install tcptrace
brew install ucspi-tcp # `tcpserver` etc.
brew install homebrew/x11/xpdf
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

# 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 必备软件 之 编程语言

2.3.1 Shell

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

而本人喜欢 GNU 系软件。

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

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

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

2.3.1.1 Oh My Zsh

2.3.2 Python

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

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

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

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

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

2.3.2.1 入门级

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

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

2.3.2.2 新手级

  • 面对 Python 版本的管理,使用 pyenv
  • 面对 Python 依赖包管理,使用 pyenv virtualenv 出多个环境,然后切换环境就好了。

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

2.3.2.3 熟手级

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

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

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

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

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

2.3.3 JavaScript 与 Node 环境

nvm && npm && yarn

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

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

npm install cnpm
cnpm install yarn -g
# 查看下载源
# yarn config get registry
yarn config set registry https://registry.npm.taobao.org

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

2.3.4 Java

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

TODO: 以后补充 JAVA 环境安装

2.4 必备配置 之 dotfiles

详细内容请见 yadotfiles

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

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

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

0x03 踩坑史

3.1 日常类

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

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

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

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

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

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

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

sudo spctl --master-disable

3.2 编程类

01. homebrew 的与 Python 的问题

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

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
的问题,执行下面命令即可暂时屏蔽这个问题,但是没有隐患则不清楚。

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

02. Homebrew 安装过去的文件

0xEE 参考链接

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

ChangeLog:

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