你家的貓主子也是一打開電腦就跳上來亂打字嗎?😫
貓踩鍵盤、坐在 Backspace 上,一整段就沒了。這篇談 ZingIME 的喵喵守門員怎麼分辨貓和人、為什麼刪除鍵的引信比較短,以及它為什麼需要輔助使用權限。
你離開電腦五秒,回來看到文件變成這樣:
wwwwwwwwgggggggccc,,,,,,;;;;;;;;;;;;;;;;;;;;;;;;;;
前面那幾段是走過去踩出來的,最後那串分號是牠走到一半決定坐下來。
或者更糟,什麼都沒多出來,反而是剛寫完的一段不見了,因為牠坐的那顆是 Backspace。
真正麻煩的不是那串符號,那個看得見、刪得掉。麻煩的是你不確定牠還做了什麼:游標當時在哪個檔案、按到了什麼快捷鍵、刪掉的東西 Cmd+Z 是不是救得回來。
ZingIME 裡有個叫喵喵守門員的功能在處理這件事。偵測到不像人類的輸入就鎖住鍵盤,跳出一個滑動解鎖的視窗,等你回來。
怎麼分辨貓和人
沒有辦法知道鍵盤上的是不是貓。能知道的是這串輸入像不像人打的,而這件事有兩種明顯的樣子。
一種是踩過去:貓從鍵盤上走過,瞬間觸發一串按鍵。守門員維持一個 0.5 秒的滾動視窗,預設設定下只要視窗內落進 15 次按鍵就鎖定。換算是每秒 30 鍵,專業打字員全速也大概在每秒 8 到 10 鍵,沒有人能持續打到這個速度。
一種是坐下來:貓趴在某顆鍵上不動,macOS 的自動重複會一直送同一個字元出來。守門員盯的是「同一顆鍵連續自動重複了多久」,預設超過 3 秒就鎖定。
兩個偵測器各管一種情境,因為它們在資料上長得完全不一樣:一個是很多顆鍵擠在很短的時間裡,一個是一顆鍵拖了很長的時間。
刪除鍵的引信比較短
上面說的 3 秒有個例外。Backspace 和 Delete 這兩顆,預設 1.5 秒就鎖。
理由是損害不對等。貓壓著 a 三秒,你得到一串看得見的 a,刪掉就好;貓壓著 Backspace 三秒,你失去的東西不一定按 Cmd+Z 就回得來,而且你未必記得那段原本寫了什麼。既然回復成本差這麼多,引信就不該一樣長。
同樣的理由讓方向鍵走另一個方向:方向鍵、Home、End、Page Up/Down 永遠不進偵測器,怎麼壓都不會觸發。人本來就會壓著方向鍵捲動文件,而且壓再久也不會弄壞任何東西。
鎖定之後會發生什麼
畫面中央跳出鎖定視窗,後續的鍵盤事件全部被吞掉,你正在編輯的那個 app 收不到任何東西。拖動滑桿到底才解鎖。
用滑動而不是按一個「確定」,是因為貓也會按到按鈕。
為什麼它需要輔助使用權限
這是整件事最違反直覺的部分。
macOS 上的輸入法只能處理「送到它面前」的鍵盤事件,看到之後決定要不要放行。但一顆被壓住的鍵在自動重複時,macOS 是直接把事件送給應用程式的,輸入法根本看不到。也就是說,守門員可以偵測到有一隻貓坐在 Backspace 上,卻沒有辦法讓它停下來。
要真的中斷,ZingIME 需要輔助使用(Accessibility)權限。給了之後,貓壓著的鍵會在鎖定的那一刻被打斷。
不給也還是能用,只是保護力有限:鎖定視窗照樣跳出來、後續按鍵照樣被擋,但那顆已經被壓住的鍵會繼續輸入,直到牠自己起來。選單列的輸入法選單會直接告訴你現在是哪一種狀態,寫著「完整保護」或「受限」。
三檔敏感度
每個人家裡的動物不一樣,自己打字的習慣也不一樣。偏好設定 → 基本設定可以調:
| 敏感度 | 0.5 秒內幾鍵 | 壓住一般鍵 | 壓住刪除鍵 |
|---|---|---|---|
| 敏感 | 10 鍵 | 1.5 秒 | 第一次自動重複就鎖 |
| 平衡(預設) | 15 鍵 | 3 秒 | 1.5 秒 |
| 寬鬆 | 25 鍵 | 5 秒 | 3 秒 |
會誤觸的通常是兩種人:習慣壓著 Backspace 刪掉一整句的,還有打字本來就很快又愛連按的。往下調一檔就好,不需要整個關掉。
如果你是前一種,其實有更快的做法,順便完全繞開這個問題:⌘ + ⌫ 一次刪到行首,⌥ + ⌫ 刪掉前一個字。比壓著 Backspace 等它一個一個吃快得多,而且因為只按一下,守門員根本不會醒過來。
為什麼這是輸入法的功能
聽起來這應該是一個獨立的小工具,不是輸入法該管的事。
但輸入法本來就站在「鍵盤事件」和「螢幕上的文字」中間,這條路上它已經在那裡了,不需要為了看鍵盤而多裝一個常駐程式、多要一組權限。同樣的功能寫成獨立 app,第一件事就是跟你要完整的鍵盤監控權限。
最後
這個功能一年大概只會救你一次。
但那一次通常發生在你剛寫完一段、還沒存檔、起身去倒杯水的時候。