👋

Divvy on Monterey で、一部のショートカットキーを設定できなくなった問題の解決

2023/03/10に公開

Macで、ウィンドウサイズをすぱっと切り替えてくれるDivvyをこよなく愛しています。Montereyにしてから、困ったことに一部のキーにショートカットを割り当てられなくなりました。

その割り当てできない場合についての対応です。

なぜ、このようなことをするのか

Montereyから、グローバルショートカットキーの影響で、次のキーを利用できなくなりました。そのため、Divvyのショートカットで、これらのキーを利用しようとすると、設定できないと言う罠が仕込まれています。

A   C   F   H   M   N   Q   S   `   \   ←   ↑   ↓   →

plist ファイルから、ショートカットの情報だけを抜き出す

~/Library/Preferences 配下にある Divvyplist ファイルのバックアップをとります。

cd ~/Library/Preferences/
cp -av ./com.mizage.Divvy.plist ./com.mizage.Divvy.plist.bak

次のプログラムソースコードを、Script Editor へ入力します。そのまま⌘Rで実行します。

property bPlistFile : "com.mizage.Divvy.plist"
property bPlistData : missing value
property thePropertyListFilePath : POSIX path of ¬
    ("" & (path to preferences from user domain) & bPlistFile)
property bPlistDataShortcuts : POSIX path of ¬
    ("" & (path to home folder) & "divvy.shortcuts.plist")

tell application "System Events"
    tell property list file thePropertyListFilePath
        set bPlistData to the value of property list item "shortcuts"
    end tell
end tell

writeToFile(bPlistData, bPlistDataShortcuts, true)

--  ## Handler ##

on writeToFile(theData, theFile, overwriteExistingContent)
    try
        set theFile to theFile as string
        if theFile contains "/" then
            set theOpenedFile to open for access theFile with write permission
        else
            set theOpenedFile to open for access file theFile with write permission
        end if
        if overwriteExistingContent is true then set eof of theOpenedFile to 0
        write theData to theOpenedFile starting at eof
        close access theOpenedFile
        return true
    on error
        try
            close access file theFile
        end try
        return false
    end try
end writeToFile

うまくいくと、home ディレクトリに divvy.shortcuts.plist ファイルができ上がります。

ショートカット情報を変更する

plutil を使って、バイナリファイルをXML化します。

plutil -convert xml1 ./divvy.shortcuts.plist

各々のショートカットキーは <key>keyComboCode</key><key>keyComboFlags</key> にて定義されています。<key>keyComboCode</key> には実際に押すキーのキーコードが入っています。こちらを参考に設定します。

個人的には、 と対象のキーなどですでに設定をしておいて、特定のキーの情報を得るようにしたほうが探しやすいと判断しました。

参考情報

MacOS フルキーボードのキーコード一覧 - Qiita

次に <key>keyComboFlags</key> を探します。これが連携するオプション系のキーコードのようです。これらの指示子や計算式が分からないのですが、オプション系のキーを押さずに設定したいだけなので、この情報を 0 に設定するだけです。

元の plist へ戻す

XMLのままでは戻せないので、plutil を使って、バイナリファイルに戻します。その後、defaults コマンドを利用して、現行のショートカット情報を削除し、今回設定し直したショートカット情報を書き込むことでショートカット情報が反映されます。

plutil -convert binary1 divvy.shortcuts.plist
defaults delete com.mizage.Divvy.plist  'shortcuts'
defaults write com.mizage.Divvy.plist 'shortcuts' -data "$(xxd -p 'divvy.shortcuts.plist' | tr -d '\n')"

うまくいきました。ああ、良かった。

元ネタ

Can't assign normal keyboard shortcuts on Monterey because "it's already used by a system-wide keyboard shortcut"

Discussion