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