Mac OS X: 滑鼠中鍵變成切換應用程式的解法

前幾天我從強者我朋友手中借來一台 MacBook ,接上一般的滑鼠之後,發現滑鼠中鍵失效了,變成切換應用程式,也就是 Command + Tab 會出現的畫面。滑鼠中鍵對我來說是非常重要的一個按鍵,我用來在終端機貼上、開啟新分頁,沒有它我就像少了一隻手指頭。

所以我花了兩個小時找答案。

答案就在 ~/Library/Preferences/com.apple.symbolichotkeys.plist 裡面,打開它(用 Xcode),在 AppleSymbolicHotKeys 這個 Dictionary 中,刪除編號為 71 的項目,再登入,就好了。

那為什麼這樣會好呢?以下是 trouble-shooting 的過程。


為了確認是軟體或硬體問題,我開了一個新的帳號,結果該帳號的中鍵運作正常,可見是帳號的偏好設定。

於是就跑去滑鼠偏好設定找,發現沒有可以指定中鍵按下去的行為的設定。但是 Google 了一下,在 Mighty Mouse 的偏好設定面板裡面有,可見這台 MacBook 之前應該是接了 Mighty Mouse 並設定中鍵 = 切換應用程式,才會有這個問題。

那簡單啦,就是把 Mighty Mouse 接回來然後改設定。可是我又沒有 Mighty Mouse ,那只好自己 trace 了。但是我翻遍了 ~/Library/Preferences/Library/Preferences 關於滑鼠的設定檔 (.plist) ,都沒有指定 Mouse Button 3 的行為。甚至隱藏檔 ~/Library/Preferences/.GlobalPreferences.plist (個人的系統偏好設定)也沒有。怎麼辦呢?

於是我想,每次 Dock 當掉都會導致 Command + Tab 失效,所以它應該也是 Dock 管的,而 Dock 跟 Exposé 是神聖不可分割的,所以我到 Exposé & Spaces (那部 MacBook 執行 Mac OS X 10.6)偏好設定,把 Exposé 的所有視窗指定給 Mouse Button 3 ,馬上就出現黃色三角形,表示有衝突。再按下中鍵,的確變成 Exposé 的所有視窗。那是跟誰衝突呢?找不到呀。

於是去看了 ~/Library/Preferences ,根據「修改日期」降冪排序,發現有一個檔案 com.apple.symbolichotkeys.plist ,每當我改變 Exposé 的滑鼠觸發鍵時,就會被修改,那應該跟他有關。

於是去 Google 關於這個檔案的資料,原來是跟快速鍵設定有關。到這裡我以為它只跟鍵盤有關,懷疑了很久,還試著找 Apple 官方的開發者文件,但不曉得是關鍵字下錯還是怎樣,總之就是找不到。

那就土法煉鋼,既然是 plist ,它好歹是 XML 檔案,用 diff 總行了吧?不過因為它是 binary XML ,不能 diff ,要使用 Xcode 的 Property List Editor ,另存新檔成 plain-text XML 就可以了(如果是 Xcode 4.x ,就得使用 plutil -convert xml1 xxxx.plist 這個指令來轉成 XML)。

我先把右鍵設成「所有視窗」,另存新檔。接著設為中鍵,再另存新檔。接著再設為第四鍵(這滑鼠就是有五鍵),再另存新檔。拿 Xcode 內建的 FileMerge 來看,三個檔案交叉比較,有兩個項目,分別是 38 和 40 ,裡面的值會隨著我更改 Exposé 設定而變動,大概像這樣:

<key>38</key>
<dict>
  <key>enabled</key>
  <true/>
  <key>value</key>
  <dict>
    <key>parameters</key>
    <array>
      <integer>2</integer><!-- ☆ -->
      <integer>2</integer><!-- ☆ -->
      <integer>0</integer>
    </array>
    <key>type</key>
    <string>button</string>
  </dict>
</dict>
<key>40</key>
<dict>
  <key>enabled</key>
  <true/>
  <key>value</key>
  <dict>
    <key>parameters</key>
    <array>
      <integer>2</integer><!-- ☆ -->
      <integer>2</integer><!-- ☆ -->
      <integer>131072</integer>
    </array>
    <key>type</key>
    <string>button</string>
  </dict>
</dict>

打☆的那 4 行,當設為右鍵(第二鍵)時是 2,設為中鍵(第三鍵)時是 4 ,設為第四鍵時是 8 。至於第 40 項的 131072 , Google 告訴我這個代表 Shift ,我想應該就是慢動作 Exposé 吧。

到這裡就明白了,中鍵的號碼是 4 ,會衝突就代表還有另一個項目也是設為 4 。那怎麼找呢?我使用一般的文字編輯器,在設為中鍵(提示有衝突)的檔案裡,找 <integer>4</integer> 這個字串,果然在第 71 項裡面發現了一樣的陣列,裡面也是三個整數 4, 4, 0 ,在其他地方都沒找到。就是他了。刪掉他,登出再登入,解決。

以上就是整個流程。我 Google 了很久都沒有答案,寫下來給以後遇到相同問題的人參考。有空我再翻譯成英文吧~