Trouble Using macOS

因为工作原因, 第一次开始尝试使用 macOS. 这里列一下一些主要的问题, 方便从 GNU/Linux 切换过来的的时候参考. 有了解决方案或新的问题我会继续更新. 这里的问题有一些只是习惯不一致, 我可以通过在 Linux 上配置新的使用习惯来调整自己, 另外一些则是功能缺失.

现在还没决定要不要长期用下去, 因为以下不少问题还解决不好. 当然 macOS 的优点也很明显: 能够使用 outlook 客户端处理公司邮件 / calendar (这是关键原因); UI 好看 (主要是字体渲染); 不容易出硬件问题 (连不上 wifi / 投影之类的). 所以用于日常开会处理邮件到处跑比较方便, 可能不会用来写很多代码.

Chrome

由于在可见的未来仍然会主要使用 Linux, 因此在两边维持尽量一致的 key binding 是很重要的. 这主要是针对核心程序 (浏览器 + 终端) 和窗口管理.

  1. Chrome 的 key modifier 有时候是 cmd, 有时候是 ctrl. 凡是 menu bar 点开能看到的快捷键, 都可以在 System Preference - Keyboard - Shortcuts - App Shortcuts 中进行 override, 所以 ctrl+T, ctrl+W 等等都能用. 目前剩下的主要问题是, 打开新标签页的 cmd+click, 不知道如何改为 ctrl+click.

  2. Linux 可以设置 gtkrc 来统一所有 gtk 程序的 key binding, 因此我可以在 Chrome 的所有输入框里使用 emacs key binding 编辑内容. macOS 上有配置文件可以做到类似的事情.

  3. natural scrolling 的配置会同时 apply 在 trackpad 和外接鼠标上, 想为它们使用独立的配置需要下一个小程序并设为登录自启动..

Terminal

暂时使用 iTerm, 因为不知道什么更好. iTerm 主要遇到如下问题:

  1. zsh key binding 有一些 escape sequence, 对应 Linux 里的 Alt+. 这个可以在 iTerm Preference - Profiles - Keys 里将 Option 设为 Esc.

  2. Alt 和 Meta 的位置与普通键盘不一样. 为了避免影响其他 macOS 原生应用, 不想做全局 remap, 毕竟这一点主要只对终端影响比较大. 在 iTerm Preference - Keys 里 remap cmd 和 option 之后, 会使得 cmd+tab 在 iTerm 里无法使用, 解决方案是禁止授予 iTerm Accessibility 权限.

  3. 要去 System Preference - Keyboard - Shortcuts - App Shortcuts 里禁用一些默认 key binding, 不然经常容易误按. 我的一些 window manager 里习惯了的 key binding 会被默认成 iTerm 里别的功能.

  4. 字体渲染. iTerm Preference - Profiles - Text 里分了 ASCII 和 non-ASCII font, 这是作者设计失误, 擅自假设用户会想要对这两类字符使用不同字体 (而不是其他两类或多类). 带来的一个结果是, 无法在 iTerm 里同时使用好看的中文字体 + Powerline Symbol. 一个可能的解决方案是自己打包一个字体文件, 我有空再试试. 相比之下 X11 的字体渲染虽然视觉上不那么顺滑.. 但是支持 fallback 之类的功能, 不会有这种问题.

  5. CLI 环境. 目前主要就是设一些环境变量来解决. 最重要的是把 gnubin 放到 PATH 里, 避免使用 macOS 的鸡肋 coreutils, 一开始我还愚昧的试图在 zshrc 里写 ls=gls 之类的东西. 然而还是有一些工具缺失 (比如 gnu-top,strace).

    另外就是 tmux 下的各种剪贴板默认不 work, 可以通过配置解决. 由于 neovim 会寻找 pbcopy/pbpaste, 所以只需让 tmux 开 shell 时永远使用 reattach-to-user-namespace, 无需再加入 vim 配置了.

  6. 在 Linux 我通过xset r rate 来改变按住键盘时的事件触发频率. 这个选项对工作的影响是从量变到质变的: 当经过一定时间的习惯, 键盘重复频率足够快时, 就不再需要 vim 的翻页功能了, 只要按住上下键即可. 然而 macOS 在系统设置里设到最大值也仍然有点慢. 可以通过defaults write NSGlobalDomain KeyRepeat -int 1 来设置.

Window Manager

主要的问题都在 WM 里, 本质是因为无论是 windows 还是 macOS 都没有一个像 awesome 或 xmonad 一样足够复杂的 WM, 以至于很多本可以一两个键完成的事情需要多次操作甚至鼠标操作.

spectacle 这个 WM app 带了很少量的功能, 但跟 programmable WM 还是不能比. 另外 macOS 还带了很多 distracting 的动画.

举几个刚需的例子吧:

  1. cmd+tab 切换任务列表过长是很影响效率的. 然而搞不清哪些应用会出现在列表里:

    • 大家的正常使用目的应该都是切换 "活动的窗口", 然而一些未被关闭但没有活动窗口的僵尸程序也会出现在列表里. 另外列表里永远有一个僵尸 Finder, 不知道怎么办.

    • 有很多应用, 我希望它们运行但不要被我切换到 (也即在 systray 里默默运行). 不知道这在 macOS 的 wm 里如何能够统一设置, 反而很多 app (如 wunderlist, dash) 自己内部有一个 "不让自己被切换到" 的选项. 这是权责划分不明确, 而且此选项也 work 的不理想, 比如 dash 打开了此选项之后, menubar 就跟着消失了.

    • 类似的, 我希望放到其他 desktop 的应用不要被我切换到. 比如我在 awesome 里会把若干个聊天工具扔到一个 desktop 里, 把不太常用的 ssh session 扔到一个 desktop 里, 要用的时候手动切过去. 这在 macOS 里很难设置. 最终我估计会寻找其他 switcher 作为替代品.

    这几点都可以通过一个叫 witch 的程序解决, 然而 witch 好像有点卡..

    然而切换确实不是一个特别容易的事情, 比如 awesome 里的切换需要自己手写, 我写了一个 "科学" 的 alt-tab 还是挺麻烦的....

  2. cmd+tab 选择的是 app. 然而正常工作切换的对象应该是窗口. 当一个 app 包含多个窗口时不确定哪个会被切换到, 看上去似乎是 "智能切换": 然而智能一般都有问题.. 比如我 chrome 和 terminal 反复切换的好好的, 按下立刻松开就能完成切换. 这时另一个 chrome 窗口里 hangout 收到条消息后, 下次切换就会跑到那边去..

    一个高效的 interface 的重要特性是可预测, 我要百分百的确定我一个操作后会发生什么, 这样才能提前准备下一个操作. 例如我要从 terminal 复制东西去搜索, 就是 ctrl+shift+C, alt (cmd)+tab, ctrl+T, ctrl+V, Enter, 这期间只输出操作, 不需要任何输入信息, 也就不影响思考. 否则的话, 需要在大脑里处理上一个操作的结果后才能发射下一个操作, 这和 CPU 指令的串行执行和流水执行是一样的. 例如现在 cmd+tab 不保证会切到我想要的窗口, 意味着后面的指令依赖前面的结果, 那么这里就必须加入分支处理, 而且分支预测失败会不爽.

    这也是鼠标在很多时候效率不高的主要原因, 我需要不断看屏幕才能知道自己有没有移到正确的地方.

  3. 我要把几个窗口从一个 display 移到另一个里. spectacle 有移一个窗口的功能, 但是移完 focus 就跟过去了, 要 somehow 改变 focus (通过鼠标或 cmd+tab 找到应用) 才能再移下一个.. 而在 awesome 里我移完一个之后可以立刻用另一个键来改变 focus 所在的 display, 或者即使要实现一个 "转移所有窗口的 display" 的键绑定, 也只需要几行 config.

Comments