DefaultKeyBinding.dictを使って、macOSのキーバインドを変更



久しぶりにキーバインドをいろいろと見直したので、ついでに作成したメモです。

DefaultKeyBinding.dictを編集して、macOS全体で使えるキーバインドを変更してしまいます。主に、カーソルキー周りのキーバインドを変更しています。


## 情報を確認した環境

|環境	|情報					|
|-------|---------------		|
|OS		|macOS Mojave(10.14.4)	|
|Date	|2019/04/24				|


## 何をやっているのか？

簡単に言うと『~/Library/KeyBindings/DefaultKeyBinding.dict』を編集することで、キーバインドを変更しています。詳しい話はこちらのサイトを参考に。

テキスト編集のキー操作を自在にコントロールする - ザリガニが見ていた...。
http://d.hatena.ne.jp/zariganitosh/20101026/text_key_binding


## 変更内容

### control + up / down

元々はスクロールだったのを、実際にカーソルも移動するように変更。

* 元々の設定

```
	"^\Uf700" = "scrollPageUp:";
	"^\Uf701" = "scrollPageDown:";
	"$\Uf700" = "moveUpAndModifySelection:";
	"$\Uf701" = "moveDownAndModifySelection:";
```

* 変更後

```
	"^\Uf700" = "pageUp:";
	"^\Uf701" = "pageDown:";
	"$^\Uf700" = "pageUpAndModifySelection:";
	"$^\Uf701" = "pageDownAndModifySelection:";
```


### command + up / down

ドキュメントの先頭／最後への移動はあまり使わないので、1行単位のスクロールに変更。

* 元々の設定

```
	"@\Uf700" = "moveToBeginningOfDocument:";
	"@\Uf701" = "moveToEndOfDocument:";
	"@$\Uf700" = "moveToBeginningOfDocumentAndModifySelection:";
	"@$\Uf701" = "moveToEndOfDocumentAndModifySelection:";
```

* 変更後

```
	"@\Uf700" = "scrollLineUp:";
	"@\Uf701" = "scrollLineDown:";
	"@$\Uf700" = "scrollLineUp:";
	"@$\Uf701" = "scrollLineDown:";
```


### option + up / down

行頭／行末をたどる上下移動は使わないので、これをドキュメントの先頭／最後への移動に割り当て。

* 元々の設定

```
	"~\Uf700" = (
		"moveBackward:",
		"moveToBeginningOfParagraph:",
	);
	"~\Uf701" = (
		"moveForward:",
		"moveToEndOfParagraph:",
	);
	"~$\Uf700" = "moveParagraphBackwardAndModifySelection:";
	"~$\Uf701" = "moveParagraphForwardAndModifySelection:";
```

* 変更後

```
	"~\Uf700" = "moveToBeginningOfDocument:";
	"~\Uf701" = "moveToEndOfDocument:";
	"~$\Uf700" = "moveToBeginningOfDocumentAndModifySelection:";
	"~$\Uf701" = "moveToEndOfDocumentAndModifySelection:";
```


### control + left / right

行頭／行末への移動はcommandのコンビネーションで出来るので、controlは単語単位の移動に割り当て。ある意味、この変更がしたくてキーバインドをいじったようなもの。

* 元々の設定

```
	"^\Uf702" = "moveToLeftEndOfLine:";
	"^\Uf703" = "moveToRightEndOfLine:";
	"^$\Uf702" = "moveToLeftEndOfLineAndModifySelection:";
	"^$\Uf703" = "moveToRightEndOfLineAndModifySelection:";
```

* 変更後

```
	"^\Uf702" = "moveWordLeft:";
	"^\Uf703" = "moveWordRight:";
	"^$\Uf702" = "moveWordLeftAndModifySelection:";
	"^$\Uf703" = "moveWordRightAndModifySelection:";
```


### home / end

外付けのキーボードでHome/Endの動作が気になったので、行頭／行末への移動を割り当ててみました。問題があるようだったら、これはOFFで。

* 変更後

```
	"\Uf729" = "moveToLeftEndOfLine:";
	"\Uf72b" = "moveToRightEndOfLine:";
	"$\Uf729" = "moveToLeftEndOfLineAndModifySelection:";
	"$\Uf72b" = "moveToRightEndOfLineAndModifySelection:";
```

### その他

あると便利な単語選択を、余ってるキーに割り当て。

* 追加

```
	"^r" = "selectWord:";
```


## DefaultKeyBinding.dict

最終的に、DefaultKeyBinding.dictはこんな感じになりました。

```
{
	// /////////////////////////////////////////////////////////////
	// MARK: - up / down

	// ctrl + up/downでページ単位の移動
	"^\Uf700" = "pageUp:";
	"^\Uf701" = "pageDown:";
	"$^\Uf700" = "pageUpAndModifySelection:";
	"$^\Uf701" = "pageDownAndModifySelection:";

	// cmd + up/downで行単位のスクロール
	"@\Uf700" = "scrollLineUp:";
	"@\Uf701" = "scrollLineDown:";
	"@$\Uf700" = "scrollLineUp:";
	"@$\Uf701" = "scrollLineDown:";

	// opt + up/downで全体の先頭・最後へ移動
	"~\Uf700" = "moveToBeginningOfDocument:";
	"~\Uf701" = "moveToEndOfDocument:";
	"~$\Uf700" = "moveToBeginningOfDocumentAndModifySelection:";
	"~$\Uf701" = "moveToEndOfDocumentAndModifySelection:";

	// /////////////////////////////////////////////////////////////
	// MARK: - left / right

	 // ctrl + left/rightで単語単位の移動
	"^\Uf702" = "moveWordLeft:";
	"^\Uf703" = "moveWordRight:";
	"^$\Uf702" = "moveWordLeftAndModifySelection:";
	"^$\Uf703" = "moveWordRightAndModifySelection:";

	// /////////////////////////////////////////////////////////////
	// MARK: - home / end

	// home / endで行頭・行末へ移動
	"\Uf729" = "moveToLeftEndOfLine:";
	"\Uf72b" = "moveToRightEndOfLine:";

	// shift + home / endで行頭・行末まで選択
	"$\Uf729" = "moveToLeftEndOfLineAndModifySelection:";
	"$\Uf72b" = "moveToRightEndOfLineAndModifySelection:";

	// /////////////////////////////////////////////////////////////
	// MARK: - その他

	// ctrl + rで単語選択
	"^r" = "selectWord:";
}
```


## 感想（？）

* 『command + .』がcancelOperationに割り当てられてるのを発見
* クリップボード関係の割り当ては、アプリによってはうまく動作しないのであきらめた
* →　仕方が無いので、行単位の編集を標準にしたかったのも断念
* 行単位のスクロールもアプリによってはうまく動かないけど、これは使えるときだけ使う

* Karabiner-Elementsさんは便利だけど、まだまだ、ちょっとしたキー割り当てでも面倒すぎる