最近更新|軟件分類|單機游戲|軟件專題|手機版|軟件發(fā)布 Mac第三方輸入法中大寫鎖定鍵切換輸入法 Mac大寫鎖定鍵改成輸入法切換鍵
首頁>mac教程>Mac第三方輸入法中大寫鎖定鍵切換輸入法 Mac大寫鎖定鍵改成輸入法切換鍵

Mac第三方輸入法中大寫鎖定鍵切換輸入法 Mac大寫鎖定鍵改成輸入法切換鍵

我要評論2016/12/16 16:47:24來源:9553編輯:

升級 macOS Sierra軟件推出后,使用Mac的用戶就多了起來,用慣了windows的用戶提出在輸入法的切換上面非常的不習慣,大寫鎖定CapsLock鍵實質(zhì)上是沒什么多用處,而且常常被誤點,拖慢效率。那么Mac第三方輸入法中大寫鎖定鍵切換輸入法如何做?Mac大寫鎖定鍵改成輸入法切換鍵如何?

提供第三方輸入法下載

Mac第三方輸入法中大寫鎖定鍵切換輸入法 Mac大寫鎖定鍵改成輸入法切換鍵

根據(jù)個人習慣,我最終決定將大寫鎖定鍵更改為輸入法切換鍵,一是因為作為一個中國人輸入法切換是使用最多的一個快捷鍵之一;另一個原因是因為如此一來鍵上的指示燈還可作為輸入法指示燈,簡直完美。

更改鍵綁定

打開系統(tǒng)偏好設置-鍵盤-鍵盤-修飾鍵,將 Caps Lock 鍵設為“無操作”

下載 Seil(良心軟件,良心作者),打開后將 Caps Lock 鍵映射為 Key Code 80(或者其他一個不存在的鍵,80代表F19)

打開系統(tǒng)偏好設置-鍵盤-快捷鍵-輸入源,將切換輸入法的快捷鍵設置為F19(通過選擇后按一下Caps Lock)

Done! 但是現(xiàn)在問題來了:大寫鎖定的燈永遠不亮,這不優(yōu)美!我們希望指示燈也更改為能夠指示輸入法狀態(tài),即在英文狀態(tài)下不亮,在拼音/五筆等輸入法狀態(tài)下亮。經(jīng)過 Google 發(fā)現(xiàn),OS X 提供了控制鍵盤燈的底層 API,可以手動控制其狀態(tài),詳見 MacLight。這就好辦了,于是我依次嘗試了以下幾種解決方案:

寫一段 Shell 腳本來切換輸入法(通過 AppleScript 模擬 Keystroke)+切換指示燈狀態(tài),通過 Automator 新建一個“服務”然后將大寫鎖定鍵綁定為運行該腳本。但是經(jīng)過測試發(fā)現(xiàn)延時太大(~200ms),放棄。

用 Objective-C 寫一個調(diào)用底層 API 的程序來切換輸入法(通過TISSelectInputSource系列API)+切換指示燈狀態(tài),發(fā)現(xiàn)調(diào)用 API 切換輸入法后需要切換到下一個輸入窗口才會生效,并且延時依然很大,放棄。

用 Objective-C 寫一個后臺應用,通過NSDistributedNotificationCenter接收輸入法變更事件,根據(jù)狀態(tài)改變指示燈??茖W!

最終采用了最后這種科學的方法。當然,這個后臺應用只需要是命令行應用就可以了,通過launchctl等方式開機自動啟動即可。不過由于強迫癥什么的(方便啟動、退出,方便加為登錄啟動項)還是寫成了占領在狀態(tài)欄的應用,并取名為IMLight,如下圖:

Mac第三方輸入法中大寫鎖定鍵切換輸入法 Mac大寫鎖定鍵改成輸入法切換鍵

Update for macOS Sierra

升級 macOS Sierra 后,Seil 無法正常使用了(IMLight 不影響),詳見 Github 上的這個 issue,并且由于是系統(tǒng)接口的大改動,一時半會兒可能不會有修復更新。

Issue 中也有人提到,可以使用作者正在開發(fā)的另一個針對 Sierra 的項目 Karabiner-Elements,但是這個項目對我來說有幾個問題:

與 IMLight 沖突(雖然不一定是他的問題,但是我暫時也不知道怎么修復…)

會使得系統(tǒng)偏好設置中的針對多個鍵盤的修飾鍵設置失效(比如無法把外接鍵盤的 alt 和 ? ?互換),作者表示無法修復

另外的解決方案是在系統(tǒng)偏好設置中把 Caps Lock 設置為 Ctrl(或者其他),然后用其他軟件重映射,比如 Keyboard Maestro(更改 Caps Lock 這件事情比較底層,需要內(nèi)核級別的修改,而監(jiān)聽 Ctrl 等鍵這件事情就很簡單了)。我使用免費的 hammerspoon 來實現(xiàn):

local M = {}

?

local events = hs.eventtap.event.types

M.log = hs.logger.new('caps_remap', 'info')

?

M.last_flags_1 = {}

M.last_flags_0 = {}

M.last_time_1 = 0

M.last_time_0 = 0

?

M.timeout = 0.15

M.key = "ctrl"

M.action = function() hs.eventtap.keyStroke({}, "f19") end

?

local function _dict_has_no_other_key(dic)

for k,v in pairs(dic) do

if k ~= M.key then

return false

end

end

return true

end

?

function M.event_callback(e)

local typ = e:getType()

local code = e:getKeyCode()

local flags = e:getFlags()

local now = hs.timer.secondsSinceEpoch()

?

if _dict_has_no_other_key(flags) and not flags[M.key]

and _dict_has_no_other_key(M.last_flags_0) and M.last_flags_0[M.key]

and _dict_has_no_other_key(M.last_flags_1) and not M.last_flags_1[M.key]

and now - M.last_time_0 < M.timeout

then

M.log.i("Fire caps action")

if M.action then

M.action()

end

end

?

M.last_flags_1 = M.last_flags_0

M.last_flags_0 = flags

?

M.last_time_1 = M.last_time_0

M.last_time_0 = now

?

return false

end

?

function M.init(options)

if options.key then

M.key = options.key

end

if options.timeout then

M.timeout = options.timeout

end

if options.action then

M.action = options.action

end

M.watcher = hs.eventtap.new({events.flagsChanged}, M.event_callback)

M.watcher:start()

end

?

return M

即快速按一下 ctrl(即 Caps Lock)會觸發(fā) F19,而其他包含 ctrl 的組合鍵并不會,可以滿足要求。

關鍵詞: 第三方輸入法 切換輸入法 輸入法