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