ALGOBIT

2010/06/18

MacOS X のキーボードショートカット

Filed under: 離散的な気まぐれ — タグ: — Kohyama @ 01:44

Windows には, 修飾キーとアルファベットキーを組み合わせてカーソルを動かそうという考えは無い.
従って UNIX 生活では必要の無い, 四つの矢印キー, Home, End, PageUp および PageDown などによるカーソル移動, Shift を押しながらこれらの移動を行うことによる選択範囲の調整, を頻繁に行うことになる.
(といっても常用しているのが HHK なので, Fn キーを押しながら某なのだが,)

iPhone 開発のために Macintosh を購入し, XCode と iPhone SDK のインストールの次にやったことは, XCode のキーボードショートカットを変更し, PageUp キーと PageDown キーをページアップ, ページダウン機能に割り当て直すことだった.

さて, その後 Windows7 / Parallels が実用に耐えそうなので, 基本生活を MacOS X に移行してしばらく.
各アプリケーションで, ではなく, システムデフォルトでテキストを入力する際のキーボードショートカットがある程度定義されている(もちろんアプリケーションあたりで上書き定義できる)ことが分かってきた.
これを変更するにはどうしたら良いか.
Translations/Mac OS X Key Bindings
にすべて書いてあった. 著者さんありがとう.

一番困るのは, システムデフォルトで

Home 文書の先頭にスクロール(カーソルは移動しない)
End 文書の末尾にスクロール(カーソルは移動しない)
PageUp 1画面前へ(カーソルは移動しない)
PageDown  1画面後へ(カーソルは移動しない)

となっていること. これらは Windows 環境では

Home 行頭へカーソル移動
End 行末へカーソル移動
PageUp 1画面前へ(カーソル移動)
PageDown  1画面後へ(カーソル移動)

に割り当てられていることが多く, 非常に頻繁に利用するので, MacOS X で作業中に無意識に押下すると, 予想とまったく異なる機能が呼び出され, プチパニックになる.

そこでこれらのキーは取り敢えず Windows と同じ機能を割り当てておく.
ただし, デフォルト状態の MacOS X を触ったときに困らないように, なるべく別のキーバインドでこれらの機能を呼び出すよう気をつける.
Shift-Home, Shift-End も同様.

システムデフォルトで部分的に Emacs 風のキーバインドが採用されているので, 定義を追加し, 移動系のキーバインドは Emacs 風にしておく.
もちろん vi を使っているとき以外の話だけど.
以下は(自分が)よく使う Emacs バインドのうち, ‘○’ は MacOS X システムデフォルトで採用されているもの, ‘×’ はされていないもの.

○  C-f 1文字進む
C-b 1文字戻る
C-a 行頭へ
C-e 行末へ
C-n 次の行へ
C-p 前の行へ
C-v 1画面分進む(ページダウン)
× M-v 1画面分戻る(ページアップ)
× M-< 文書の先頭へ
× M-> 文書の末尾へ
× C-Space  現在のカーソル位置をマーク
C-k 行末まで削除
C-y 現在のカーソル位置に記憶した内容を書き出す
× C-w 現在のカーソル位置からマーク位置までの内容を削除して記憶
× M-w 現在のカーソル位置からマーク位置までの内容を記憶
× C-x C-x 現在のカーソル位置をマークし, カーソルはマークされていた位置へ移動
× C-x C-m マークまでを選択

上記の採用されていない定義を追加する.
また, M- については Emacs 風に, Meta(Alt, Opt)を押しながらでも, Escape を押してからというのでも機能するように定義を追加する.

というわけで, ~/Library/KeyBindings ディレクトリが無いので作り,
~/Library/KeyBindings/DefaultKeyBinding.dict として以下を作成.

{
    "\UF729" = "moveToBeginningOfLine:";    /* Home */
    "\UF72B" = "moveToEndOfLine:";          /* End */
    "\UF72C" = "pageUp:";                   /* PgUp */
    "\UF72D" = "pageDown:";                 /* PgDn */
    "$\UF729" = "moveToBeginningOfLineAndModifySelection:";  /* Shift-Home */
    "$\UF72B" = "moveToEndOfLineAndModifySelection:";        /* Shift-End */
    "~v" = "pageUp:";                       /* M-v */
    "~<" = "moveToBeginningOfDocument:";    /* M-< */
    "~>" = "moveToEndOfDocument:";          /* M-> */
    "^ " = "setMark:";                      /* C-space */
    "^w" = "deleteToMark:";                 /* C-w */
    "~w" = ("selectToMark:", "copy:");      /* M-w */
    "^x" = {
        "^x"  = "swapWithMark:";            /* C-x C-x */
        "^m"  = "selectToMark:";            /* C-x C-m */
    };
    "\U001B" = {
        "v" = "pageUp:";                    /* M-v */
        "<" = "moveToBeginningOfDocument:"; /* M-< */
        ">" = "moveToEndOfDocument:";       /* M-> */
        "w" = ("selectToMark:", "copy:");   /* M-w */
    };
}

「快適」というよりは「ストレスフルではなくなった」というところ.

Copyright © 2010 Yoshinori Kohyama All Rights Reserved.