From 2b5888b23dd2f313970d70d48055200c268110f2 Mon Sep 17 00:00:00 2001 From: Naoki Takahashi Date: Sat, 18 Apr 2026 14:59:40 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20=E8=8B=B1=E8=AA=9E=E5=85=A5?= =?UTF-8?q?=E5=8A=9B=E3=83=A2=E3=83=BC=E3=83=89=E3=81=B8=E3=81=AE=E5=88=87?= =?UTF-8?q?=E3=82=8A=E6=9B=BF=E3=81=88=E3=82=B7=E3=83=A7=E3=83=BC=E3=83=88?= =?UTF-8?q?=E3=82=AB=E3=83=83=E3=83=88(Ctrl+Shift+;)=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Info.plistのcom.apple.inputmethod.RomanにtsInputModeKeyEquivalentModifiersKey /Keyを追加し、Google日本語入力と同じCtrl+Shift+;で英語入力に切り替えられる ようにする。日本語モード側のCtrl+Shift+Jと対になるショートカット。 Closes #313 Co-Authored-By: Claude Opus 4.7 (1M context) --- azooKeyMac/Info.plist | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/azooKeyMac/Info.plist b/azooKeyMac/Info.plist index 6633ce84..444ed883 100644 --- a/azooKeyMac/Info.plist +++ b/azooKeyMac/Info.plist @@ -15,6 +15,10 @@ com.apple.inputmethod.Roman + tsInputModeKeyEquivalentModifiersKey + 4608 + tsInputModeKeyEquivalentKey + ; TISInputSourceID dev.ensan.inputmethod.azooKeyMac.Roman tsInputModePrimaryInScriptKey From ff305188e8802c2a357a52baf587f3f305160031 Mon Sep 17 00:00:00 2001 From: Naoki Takahashi Date: Sat, 18 Apr 2026 15:13:32 +0900 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20=E8=8B=B1=E8=AA=9E=E3=83=A2=E3=83=BC?= =?UTF-8?q?=E3=83=89=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=BC=E3=83=88=E3=82=AB=E3=83=83=E3=83=88=E3=81=AE=E3=82=AD?= =?UTF-8?q?=E3=83=BC=E8=A1=A8=E8=A8=98=E3=82=92shift=E9=81=A9=E7=94=A8?= =?UTF-8?q?=E5=BE=8C=E3=81=AE=E6=96=87=E5=AD=97=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 日本語モードのtsInputModeKeyEquivalentKeyが"J"(shift+jの結果)であるのに 合わせて、英語モードも";"から":"(shift+;の結果)に修正。 Co-Authored-By: Claude Opus 4.7 (1M context) --- azooKeyMac/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azooKeyMac/Info.plist b/azooKeyMac/Info.plist index 444ed883..9f0083aa 100644 --- a/azooKeyMac/Info.plist +++ b/azooKeyMac/Info.plist @@ -18,7 +18,7 @@ tsInputModeKeyEquivalentModifiersKey 4608 tsInputModeKeyEquivalentKey - ; + : TISInputSourceID dev.ensan.inputmethod.azooKeyMac.Roman tsInputModePrimaryInScriptKey From 5f6b0731d1ff13b86a4fb01985ce4200ec1cbacf Mon Sep 17 00:00:00 2001 From: Naoki Takahashi Date: Sat, 18 Apr 2026 15:27:44 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20Ctrl+Shift+;=E3=82=92=E8=87=AA?= =?UTF-8?q?=E5=89=8D=E3=81=A7=E3=83=8F=E3=83=B3=E3=83=89=E3=83=AB=E3=81=97?= =?UTF-8?q?=E3=81=A6=E8=8B=B1=E8=AA=9E=E3=83=A2=E3=83=BC=E3=83=89=E3=81=AB?= =?UTF-8?q?=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit macOSのsmJapanese scriptにはCtrl+Shift+Jが自動割り当てされているが、 smRoman scriptには同様の自動割り当てがないため、Info.plistでの tsInputModeKeyEquivalent設定だけでは英語モードへの切り替えが効かない。 azooKeyMacInputController.handle(_:client:)内でkeyCode 41(; キー)と Ctrl+Shiftの組み合わせを検出し、明示的にswitchInputLanguage(.english)を 呼び出す形で対処する。JIS/ANSIキーボードいずれでも物理キー位置で動作する。 Co-Authored-By: Claude Opus 4.7 (1M context) --- .../azooKeyMacInputController.swift | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/azooKeyMac/InputController/azooKeyMacInputController.swift b/azooKeyMac/InputController/azooKeyMacInputController.swift index 9f9bb91d..289b3e9e 100644 --- a/azooKeyMac/InputController/azooKeyMacInputController.swift +++ b/azooKeyMac/InputController/azooKeyMacInputController.swift @@ -264,6 +264,24 @@ class azooKeyMacInputController: IMKInputController, NSMenuItemValidation { // s return false } + // 英語モード切り替えショートカット: Ctrl+Shift+;(keyCode 41) + // 日本語モードのCtrl+Shift+J(macOSのsmJapanese scriptに自動割り当て)と対になるショートカット + // smRoman scriptには自動割り当てがないため、自前でハンドルする必要がある + if event.keyCode == 41, + self.inputLanguage == .japanese, + event.modifierFlags.intersection([.control, .shift, .option, .command]) == [.control, .shift] { + if !self.segmentsManager.isEmpty { + let text = self.segmentsManager.commitMarkedText(inputState: self.inputState) + client.insertText(text, replacementRange: NSRange(location: NSNotFound, length: 0)) + self.inputState = .none + self.refreshMarkedText() + self.refreshCandidateWindow() + self.refreshPredictionWindow() + } + self.switchInputLanguage(.english, client: client) + return true + } + // カスタムプロンプトショートカットのチェック if let matchedPrompt = checkCustomPromptShortcut(event: event) { let aiBackendEnabled = Config.AIBackendPreference().value != .off From 00acd7cb15aecf84c5d90b3a9bdb14f118fb5269 Mon Sep 17 00:00:00 2001 From: Naoki Takahashi Date: Sat, 18 Apr 2026 15:29:09 +0900 Subject: [PATCH 4/6] =?UTF-8?q?revert:=20Info.plist=E3=81=AEtsInputModeKey?= =?UTF-8?q?Equivalent=E8=A8=AD=E5=AE=9A=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit smRoman scriptには macOS 側にショートカット自動割り当ての仕組みが なく、Info.plistで宣言してもショートカットが有効にならないことを 実機で確認したため削除する。英語モードへの切り替えは azooKeyMacInputController.handle(_:client:) 内の自前実装で行う。 Co-Authored-By: Claude Opus 4.7 (1M context) --- azooKeyMac/Info.plist | 4 ---- 1 file changed, 4 deletions(-) diff --git a/azooKeyMac/Info.plist b/azooKeyMac/Info.plist index 9f0083aa..6633ce84 100644 --- a/azooKeyMac/Info.plist +++ b/azooKeyMac/Info.plist @@ -15,10 +15,6 @@ com.apple.inputmethod.Roman - tsInputModeKeyEquivalentModifiersKey - 4608 - tsInputModeKeyEquivalentKey - : TISInputSourceID dev.ensan.inputmethod.azooKeyMac.Roman tsInputModePrimaryInScriptKey From 11ec5825f17f4012b08a0bd37cbae62188c4fb87 Mon Sep 17 00:00:00 2001 From: Naoki Takahashi Date: Mon, 20 Apr 2026 01:10:47 +0900 Subject: [PATCH 5/6] =?UTF-8?q?refactor:=20Ctrl+Shift+;=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=BC=E3=83=88=E3=82=AB=E3=83=83=E3=83=88=E3=82=92Info.plis?= =?UTF-8?q?t=E3=81=A7=E5=AE=A3=E8=A8=80=E3=81=99=E3=82=8B=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- azooKeyMac/Info.plist | 4 ++++ .../azooKeyMacInputController.swift | 18 ------------------ 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/azooKeyMac/Info.plist b/azooKeyMac/Info.plist index 6633ce84..27b5e671 100644 --- a/azooKeyMac/Info.plist +++ b/azooKeyMac/Info.plist @@ -21,6 +21,10 @@ tsInputModeScriptKey smRoman + tsInputModeKeyEquivalentModifiersKey + 4608 + tsInputModeKeyEquivalentKey + ; tsInputModeJISKeyboardShortcutKey 3 tsInputModeDefaultStateKey diff --git a/azooKeyMac/InputController/azooKeyMacInputController.swift b/azooKeyMac/InputController/azooKeyMacInputController.swift index 289b3e9e..9f9bb91d 100644 --- a/azooKeyMac/InputController/azooKeyMacInputController.swift +++ b/azooKeyMac/InputController/azooKeyMacInputController.swift @@ -264,24 +264,6 @@ class azooKeyMacInputController: IMKInputController, NSMenuItemValidation { // s return false } - // 英語モード切り替えショートカット: Ctrl+Shift+;(keyCode 41) - // 日本語モードのCtrl+Shift+J(macOSのsmJapanese scriptに自動割り当て)と対になるショートカット - // smRoman scriptには自動割り当てがないため、自前でハンドルする必要がある - if event.keyCode == 41, - self.inputLanguage == .japanese, - event.modifierFlags.intersection([.control, .shift, .option, .command]) == [.control, .shift] { - if !self.segmentsManager.isEmpty { - let text = self.segmentsManager.commitMarkedText(inputState: self.inputState) - client.insertText(text, replacementRange: NSRange(location: NSNotFound, length: 0)) - self.inputState = .none - self.refreshMarkedText() - self.refreshCandidateWindow() - self.refreshPredictionWindow() - } - self.switchInputLanguage(.english, client: client) - return true - } - // カスタムプロンプトショートカットのチェック if let matchedPrompt = checkCustomPromptShortcut(event: event) { let aiBackendEnabled = Config.AIBackendPreference().value != .off From 098e3bee669b3cb594dadc04da72ca542ab76869 Mon Sep 17 00:00:00 2001 From: Naoki Takahashi Date: Tue, 21 Apr 2026 08:10:34 +0900 Subject: [PATCH 6/6] =?UTF-8?q?chore:=20PR=E3=82=B9=E3=82=B3=E3=83=BC?= =?UTF-8?q?=E3=83=97=E5=A4=96=E3=81=AEREADME=E5=A4=89=E6=9B=B4=E3=82=92?= =?UTF-8?q?=E5=B7=AE=E3=81=97=E6=88=BB=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- README.md | 50 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index b15c7105..e710c7a7 100644 --- a/README.md +++ b/README.md @@ -57,47 +57,71 @@ GitHub Sponsorsをご利用ください。 コントリビュート歓迎です!! -### 推奨環境 +### 必要な環境 * macOS 15+ * Xcode 26.1+ -* Git LFS導入済み -* SwiftLint導入済み +* Git LFS(必須。Hugging Face上のsubmoduleがLFSを利用しているため、未導入だとモデル重みが取得できません) +* SwiftLint + +```bash +brew install git-lfs swiftlint +git lfs install +``` ### 開発版のビルド・デバッグ -まず、想定環境が整っていることを確認してください。 git-lfs のない状態では正しく clone できません。 +#### 1. クローン -cloneする際には`--recursive`をつけてサブモジュールまでローカルに落としてください。 +submoduleにzenzのgguf重みと言語モデル(`.marisa`)が含まれるため、`--recursive`と Git LFS の有効化が必須です。 ```bash +git lfs install # 未実行の場合のみ git clone https://github.com/azooKey/azooKey-Desktop --recursive +cd azooKey-Desktop ``` -以下のスクリプトを用いて最新のコードをビルドしてください。`.pkg`によるインストールと同等になります。その後、上記の手順を行ってください。また、submoduleが更新されている場合は `git submodule update --init` を行ってください。 +既にcloneしていてsubmoduleやLFSが揃っていない場合は以下を実行してください。 ```bash -# submoduleを更新 git submodule update --init +git -C azooKeyMac/Resources/zenz-v3.1-small-gguf lfs pull +git -C azooKeyMac/Resources/base_n5_lm lfs pull +``` + +重みファイルが正しく取得できているか、サイズで確認できます(数十MB以上あればLFSの実体、134B程度ならポインタのままです)。 + +```bash +ls -lh azooKeyMac/Resources/zenz-v3.1-small-gguf/ggml-model-Q5_K_M.gguf +``` + +#### 2. 署名の設定(初回のみ) + +`install.sh` はアーカイブビルドを行うため、Xcode上で署名設定が通っている必要があります。Apple Developer Programに加入していない場合は、Personal Teamでの署名に切り替えてください。 + +* `azooKeyMac.xcodeproj` を Xcode で開く +* azooKeyMac ターゲット → Signing & Capabilities で Team を自身の Personal Team に変更 +* リポジトリ内のバンドルID(`dev.ensan.inputmethod.azooKeyMac` など)を、自身の所有するプレフィックスに一括置換(例: `dev.yourname.inputmethod.azooKeyMac`) -# ビルド&インストール +#### 3. ビルド&インストール + +```bash ./install.sh ``` +`.pkg`によるインストールと同等の状態になります。その後、上記の「リリース版インストール」の手順(ログアウト→入力ソース追加)を行ってください。 + 開発中はazooKeyのプロセスをkillすることで最新版を反映することが出来ます。また、必要に応じて入力ソースからazooKeyを削除して再度追加する、macOSからログアウトして再ログインするなど、リセットが必要になる場合があります。 ### 開発時のトラブルシューティング `install.sh`でビルドが成功しない場合、以下をご確認ください。 -* XcodeのGUI上で「Team ID」を変更する必要がある場合があります - * `azooKeyMac.xcodeproj` を Xcode で開く - * azooKeyMac -> Signing & Capabilities から、 Team を Personal Team に変更する - * リポジトリ内に存在する全てのバンドルID文字列を、適当な文字列に置換 (ex: `dev.ensan.inputmethod.azooKeyMac` -> `dev.yourname.inputmethod.azooKeyMac`) +* 署名エラーで失敗する場合は、上記「署名の設定」が完了しているかを確認してください(Team変更とバンドルID置換の両方が必要です) * 「Packages are not supported when using legacy build locations, but the current project has them enabled.」と表示される場合は[https://qiita.com/glassmonkey/items/3e8203900b516878ff2c](https://qiita.com/glassmonkey/items/3e8203900b516878ff2c)を参考に、Xcodeの設定をご確認ください * Xcode 26.0ではビルドできない可能性があります。Xcode 16系または26.1以降をご利用ください。 変換精度がリリース版に比べて悪いと感じた場合、以下をご確認ください。 -* Git LFSが導入されていない環境では、重みファイルがローカル環境に落とせていない場合があります。`azooKey-Desktop/azooKeyMac/Resources/zenz-v3-small-gguf/ggml-model-Q5_K_M.gguf`が70MB程度のファイルとなっているかを確認してください +* Git LFSが導入されていない環境では、重みファイルがローカル環境に落とせていない場合があります。`azooKeyMac/Resources/zenz-v3.1-small-gguf/ggml-model-Q5_K_M.gguf` が数十MB以上あるかを確認し、ポインタのままであれば `git -C azooKeyMac/Resources/zenz-v3.1-small-gguf lfs pull` を実行してください ### pkgファイルの作成 `pkgbuild.sh`によって配布用のdmgファイルを作成できます。`build/azooKeyMac.app` としてDeveloper IDで署名済みの.appを配置してください。