Edited at

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さんは便利だけど、まだまだ、ちょっとしたキー割り当てでも面倒すぎる