macOS Big Sur で 日本語 IM のスペースを常に半角にする

## 目次

<!-- TOC depthFrom:2 -->

- [目次](#目次)
- [⚠️ 注意](#️-注意)
- [環境](#環境)
- [手順](#手順)
  - [1. FileVault をオフにする](#1-filevault-をオフにする)
  - [2. System Integrity Protection (SIP) を無効にする](#2-system-integrity-protection-sip-を無効にする)
  - [3. Signed System Volume (SSV) 認証を無効にする](#3-signed-system-volume-ssv-認証を無効にする)
  - [4. システムファイルを書き込み可能としてマウントする](#4-システムファイルを書き込み可能としてマウントする)
  - [5. 設定ファイルを編集する](#5-設定ファイルを編集する)
  - [6. SSV を更新する](#6-ssv-を更新する)
- [問題](#問題)
- [参考文献](#参考文献)

<!-- /TOC -->

## ⚠️ 注意

Big Sur でも Catalina 以前と同じように `KeySetting_Default.plist` と `KeySetting_Windows.plist` を編集することで、スペースを常に半角にすることができました。
しかし、副作用として SIP と SSV 認証が無効な状態でしか起動できなくな (るのと、恐らく FileVault の有効化をしたらまずいことにな) ります。
なにか続報があったら追記します。
また、情報をご存知の方がいたらコメント頂けると嬉しいです。

## 環境

PC: MacBook Pro (13 インチ, 2019)
CPU: 2.8 GHz クアッドコア Intel Core i7
OS: macOS Big Sur 11.2.3

## 手順

### 1. FileVault をオフにする

1. システム環境設定アプリを起動する
2. `セキュリティとプライバシー > FileVault` に移動する
3. 「FileVaultをオフにする...」 をクリックする
4. 「暗号化をオフにする」をクリックする
5. シャットダウンする

### 2. System Integrity Protection (SIP) を無効にする

1. Command + R キーを押しながら電源を入れ (M1 Mac の場合は[電源ボタンを長押し](https://support.apple.com/ja-jp/guide/mac-help/mchl82829c17/11.0/mac/11.0)し) て macOS復旧を起動する
2. メニューバーの `ユーティリティ > ターミナル` をクリックして、ターミナルを起動する
3. 以下のコマンドを実行して SIP を無効にする

```shell:bash
# csrutil disable
```

### 3. Signed System Volume (SSV) 認証を無効にする

1. 続けてターミナルで以下のコマンドを実行して SSV 認証を無効にする

```shell:bash
# csrutil authenticated-root disable
```

<span>2.</span> Mac を再起動する

### 4. システムファイルを書き込み可能としてマウントする

1. 通常のユーザーでログインする
2. ターミナルを起動する
3. システムボリュームのデバイス ID を確認する (私の場合は `disk1s5` でした)

```shell:zsh
% diskutil list | grep Macintosh
   1:                APFS Volume ⁨Macintosh HD - Data⁩    199.0 GB   disk1s1
   5:                APFS Volume ⁨Macintosh HD⁩           15.1 GB    disk1s5
```

<span>4.</span> マウントポイントを作成する

`$MOUNT_POINT` は任意のパスに置き換えてください。

```shell:zsh
% mkdir $MOUNT_POINT
```

ホームディレクトリに `mount` という名前で作成する場合は以下。

```shell:zsh
% mkdir ~/mount
```

<span>5.</span> システムボリュームをマウントする

`$DEVICE_NODE` は `/dev/システムボリュームのデバイス ID` に、 `$MOUNT_POINT` はマウントポイントのパスに置き換えてください。

```shell:zsh
% sudo mount -o nobrowse -t apfs $DEVICE_NODE $MOUNT_POINT
```

システムボリュームのデバイス ID が `disk1s5` で、マウントポイントを `~/mount` とする場合は以下。

```shell:zsh
% sudo mount -o nobrowse -t apfs /dev/disk1s5 ~/mount
```

### 5. 設定ファイルを編集する

1. ディレクトリごと一応バックアップする

`$MOUNT_POINT` はマウントポイントのパスに置き換えてください。

```shell:zsh
sudo tar acvf ~/Resources.tar.gz $MOUNT_POINT/System/Library/PrivateFrameworks/CoreJapaneseEngine.framework/Versions/A/Resources
```

マウントポイントを `~/mount` とした場合は以下。

```shell:zsh
sudo tar acvf ~/Resources.tar.gz ~/mount/System/Library/PrivateFrameworks/CoreJapaneseEngine.framework/Versions/A/Resources
```

<span>2.</span> `KeySetting_*.plist` ファイルを開く (私は `code` (VSCode) を使用しましたが `vim` でも `nano` でもお好きなエディタでかまわないです)

日本語 IM の設定で「Windows 風のキー操作」にチェックをつけて**いない**場合は以下。

```shell:zsh
sudo code $MOUNT_POINT/System/Library/PrivateFrameworks/CoreJapaneseEngine.framework/Versions/A/Resources/KeySetting_Default.plist
```

日本語 IM の設定で「Windows 風のキー操作」にチェックをつけて**いる**場合は以下。

```shell:zsh
sudo code $MOUNT_POINT/System/Library/PrivateFrameworks/CoreJapaneseEngine.framework/Versions/A/Resources/KeySetting_Windows.plist
```

<span>3.</span> スペースの設定を書き換える

```diff:KeySetting_Default.plist
   <key>&apos; &apos;</key>
   <dict>
            <key>command</key>
-           <string>contextual_space</string>
+           <string>direct_input</string>
+           <key>character</key>
+           <string> </string>
   </dict>
   <key>shift+&apos; &apos;</key>
   <dict>
            <key>command</key>
-           <string>contextual_space_reverse</string>
+           <string>direct_input</string>
+           <key>character</key>
+           <string>　</string>
   </dict>
   <key>delete:</key>
   <dict>
```

<span>4.</span> ファイルを保存して閉じる

### 6. SSV を更新する

1. ターミナルで以下のコマンドを実行して、システムボリュームの新しいスナップショットを取得する

```shell:zsh
sudo bless --folder $MOUNT_POINT/System/Library/CoreServices --bootefi --create-snapshot
```

<span>2.</span> 再起動する

## 問題

以上の手順をすべて行った後に macOS復旧のターミナルで `csrutil enable` と `csrutil authenticated-root enable` を実行し、再起動したところ

Mac 起動 -> リンゴマーク -> 再起動 -> 問題が起きたためコンピュータを再起動しました。このまま起動する場合は、いずれかのキーを押すか、数秒間そのままお待ちください。 -> リンゴマーク -> 再起動 -> 問題が起きたためコンピュータを再起動しました。このまま起動する場合は、いずれかのキーを押すか、数秒間そのままお待ちください。 -> リンゴマーク -> 再起動 -> 問題が起きたためコンピュータを再起動しました。このまま起動する場合は、いずれかのキーを押すか、数秒間そのままお待ちください。 -> リンゴマーク -> ...

というループに陥ってしまいました。
再度 `csrutil disable` と `csrutil authenticated-root disable` を実行すると起動できたので、ひとまず SIP と SSV 認証は無効のまま使うしかなさそうです。
なお、SIP だけ有効で SSV 認証は無効、なども試してみましたが起動できませんでした。

## 参考文献

1. [macOS Catalina (Mojave, High Sierra, Sierra)で日本語入力時に常にスペースを半角に](https://qiita.com/on0z/items/a9b4033cc088627b1728)
2. [macOS 11.0 Big Surの署名済みシステム・ボリュームはセキュリティ保護を強化](https://minatokobe.com/wp/os-x/macos-big-sur/post-67080.html)
3. [Big Sur’s Signed System Volume: added security protection](https://eclecticlight.co/2020/06/25/big-surs-signed-system-volume-added-security-protection/)
4. [macOS High Sierra の JapaneseIM で常に半角スペースを入力する方法](https://beadored.com/macos-high-sierra-japaneseim-half-width-space/)
5. [ビッグサーで書き込み可能なルートとしてマウント](https://qapicks.com/question/395508-c65874dfec0b)
6. [How to make root volume writeable in Big Sur?](https://developer.apple.com/forums/thread/649832)
7. [Can I mount the root (system) filesystem as writable in Big Sur?](https://apple.stackexchange.com/questions/395508/can-i-mount-the-root-system-filesystem-as-writable-in-big-sur)