Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした