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 */
};
}
「快適」というよりは「ストレスフルではなくなった」というところ.