KeySnail How To (Japanese)

mooz edited this page Sep 13, 2010 · 13 revisions

使い方

モードとは

KeySnail がインストールされると、ブラウザのステータスバーに次のようなアイコンが現れます。

Keybindings

まずは、このアイコンの上で右クリックをしてみましょう。メニューが現れましたね。

では、ここから「キーバインド一覧を表示」を選んでクリックしてみましょう。新しいタブが開いて、次のようなページが表示されるはずです。

Keybindings

このページは、「ある状態」において「どんなキーの組み合わせ」が「どんな機能」へ割り当てられているか、というものの一覧表示となっています。この組み合わせのことを「キーバインド」と言います。

「ある状態」をこの拡張機能では「モード」と呼びます。これは現在のところ三つ用意されており、それぞれ次のようなものとなっています。

モード名 説明
View mode カーソルが表示されていない、通常のブラウジングモード
Caret mode F7 キーを入力することで入れる、カーソルが表示されたキャレットブラウジングモード
Edit mode テキストボックスやインプットエリアなどにカーソルがあり、テキストを編集している状態

キーマップとは

「キーの組み合わせ」と「関数(機能)」の対応、すなわち「キーバインド」を定義したものです。 例えば「Ctrl + a」に対して「行頭へ移動」を対応付ける、といった具合です。

上で示したそれぞれのモードには「どんなキーの組み合わせ」が「どんな機能」に割り当てられているかが設定された「ローカルキーマップ」というものが用意されています。

また、それぞれのモードの上位へ位置するものとして「グローバルキーマップ」というものも用意されています。

この拡張機能はユーザが入力したキーの組み合わせを、以下のような順番で探します。

  1. 現在のモードに対応するローカルキーマップ
  2. (1. で見つからなければ)グローバルキーマップ

「それぞれのモード特有のキーバインドを定義したければローカルキーマップ、それ以外はグローバルキーマップ」というスタンスでキーの割り当てを行っていくのが良いでしょう。

キーの割り当て方

どんなモードがあるのかを前節では紹介しました。この節では、それぞれのモードにどうやって機能を割り当てていくか、ということについて学んでいきましょう。

まず初めに知っておかなければならないのは、「この拡張機能はカスタマイズの大半を設定ファイル経由で行う」ということです。他の親切な拡張機能のように分かりやすい GUI の設定画面は用意されていません。ゆえにカスタマイズの手順は、

  1. 設定ファイルをエディタで編集
  2. ステータスバーのメニューなどから、設定ファイルを再読み込みする

といったものとなります。

この設定ファイルはデフォルトでユーザのホームディレクトリ以下に作られます。 Windows ユーザの方は C:\Documents and Settings\ユーザ名 のようなプロファイルディレクトリ以下に作成されるはずです。

設定ファイルはインストール時に開いたウィザードですでに作成しているはずですが、もしウィザードをスキップしてしまったという方は、ステータスバーのメニューから「設定」を選び、「設定ファイルの作成 / 選択」からもう一度ウィザードをやり直してみて下さい。

それでは、まずは設定ファイルを覗いてみることにしましょう。お好みのエディタで前述のディレクトリから .keysnail.js もしくは _keysnail.js というファイルを開きます。

この設定ファイルは Javascript の形式で記述されているので Emacs や Vim, gedit などシンタックスハイライトが効くエディタを使用して見ていくのが良いかと思います。 (個人的には Emacs で js2-mode を使用するのがオススメです)

さて、中身の説明に移りましょう。なにらやずらずらと説明が書かれていますね。この辺りは全て行頭が // で始まった、 Javascript でのコメントとなっています。初めの 80 行ほどは説明となっているので、この辺りを読んで関数割り当ての方法を知るか、もしくは 110 行目辺りまでスキップしてしまい実際の関数割り当てを覗いてみても良いでしょう。

110 行目辺りまでくると、次のような記述が確認できるかと思います。

この拡張機能では各モードに対し「キーの組み合わせ」と「呼び出される機能」を割り当てることが可能です。この割り当てを行うのが、上に示した key.set*Key() という関数の呼び出しです。

各関数の定義は次のようになっており、全く同じ引数を取ることが分かります。


key.setEditKey(keys, func, ksDescription, ksNoRepeat);
key.setViewKey(keys, func, ksDescription, ksNoRepeat);
key.setCaretKey(keys, func, ksDescription, ksNoRepeat);
key.setGlobalKey(keys, func, ksDescription, ksNoRepeat);

各引数の説明は以下の通りです。この辺りは設定ファイル内がより詳しいです。

引数名 説明
keys キー (文字列) か キーシーケンス (文字列の配列) を指定する
func キー入力があった場合に呼び出したい無名関数を指定する
ksDescription 関数の説明
ksNoRepeat 前置引数が与えられたときコマンドの繰り返しを抑制するかどうか

次の節では、実際にオリジナルのキーバインドを定義してみることにしましょう。

はじめてのキーバインド定義

では、ここで試しに次のようなコードを設定ファイルに記述してみましょう。

ファイルを保存したら、ステータスバーのメニューから設定ファイルを再読み込みさせます。

設定ファイルは読み込まれましたか? そうしたら Ctrl + c, Ctrl + w, Ctrl + a と順番に打ち込んでみましょう。間違えた場合は Ctrl + g でキャンセルして初めからやり直しが出来ます。

どうですか、うまくいけば次のようなダイアログが表示されるはずです。

hello dialog

前置引数を使う

Emacs ユーザの方は、前置引数をご存知かと思います。通常のキーシーケンスを打ち込む前に、 C-u や C— の後に続けて数字を入力しておくと、その数字がコマンドへ渡される、というものです。

この拡張機能でも同様にして、前置引数を使うことが出来ます。先程の設定を次のように変更してみてください。

そして先程のようにして Ctrl + c, Ctrl + w, Ctrl + a と順に打ち込みます。すると次のようなダイアログが表示されることでしょう。

hello dialog with no prefix argument

前置引数の入力を行わずに関数を呼び出したので、 null となっていますね。では次に C-u 3 と入力してから C-c C-w C-a と続けてみてください。ダイアログの表記が次のように変わるはずです。

hello dialog with prefix argument 3

前置引数として 3 を指定したので、その値がしっかり表示されていますね。

それでは、ダイアログを閉じてみてください。すると、ダイアログを閉じたにも関わらず、先程と同じダイアログが現れました。もう一度ダイアログを閉じます。また、同じダイアログが現れます。ダイアログを閉じます……安心して下さい。これで終わりです。

どうしてこんなことが起こったのでしょう。少し戻って、何度ダイアログが開いたかを数えてみてください。 3 回ですね。そう、これは前置引数の値と一致します。言い換えれば、「前置引数で指定した数だけ、コマンドが繰り返された」ということになります。

前置引数が与えられたとき、特に指定がなければこの拡張機能はコマンドを前置引数の回数分繰り返し実行します。例えばテキストエリアで C-u 20 * と入力してみてください。 ******************* という具合に、 * が 20 個入力されるのが確認出来ることでしょう。

しかし、今回のように「コマンドを繰り返してほしくない」場合も多々あります。そんなときは関数説明の後、つまりキーバインド定義関数の第四引数へ true を指定して下さい。先程の例だと次のようになります。

設定ファイルを保存して、再読み込みしてから C-u 3 C-c C-w C-a と入力してみましょう。先程同様にダイアログが表示されますね。では、ダイアログを閉じて見てください。もうダイアログは復活しません。一度だけの実行となったのです。

関数を複数のキーシーケンスへ一気に割り当てたい

ある関数を、複数のキーシーケンスへ割り当てたい、ということは結構あります。

例えば “g” と “M-<” そして [“ESC”, “<”] に対して「ページ先頭へ移動」という関数を割り当てたい、と思ったとき

として同じような呼び出しを何度も行うのでは、どうにも無駄が多い感じがします。

こんなときの為に、各 set*Key() には特別なフォームが用意されています。次のコードをご覧下さい。

このコードでは先程の例と同様の割り当てを行っていますが、ずいぶんすっきりとしました。違うのは、

  1. setViewKey() を一度しか呼んでいない
  2. setViewKey() 第一引数が「配列の配列」になっている

ということです。

各 set*Key() は通常「文字列」もしくは「文字列の配列」を第一引数にとり、そこで指定されたキーの組み合わせに関数を割り当てます。しかし「文字列の配列の配列」が指定された場合は、各文字列の配列に対して一つずつ関数を割り当てるようになるのです。

複数のキーシーケンスに対してある関数を一度に割り当てたいときは「配列の配列」を指定する、ということを覚えておけば良いでしょう。

キーの設定

特殊キーの設定

特殊キーとは、次に示すキーのことを言います。

キー名 役割 デフォルト値
quitKey キー入力のキャンセル等 C-g
helpKey ヘルプコマンド表示用 F1
escapeKey このキーに続けて入力されたキーをエスケープ (KeySnail がハンドリングしない) C-q
macroStartKey キーマクロの定義を開始 F3
macroEndKey キーマクロの定義を終了 / 実行 F4

これらのキーを変更したい場合は、設定ファイル内にて

のようにして下さい。

現在の特殊キーは key.listKeyBindings() 関数で見ることが出来ます。この関数はデフォルトの初期化ファイルにおいて f1 + b に割り当てられています。

これは、ステータスバーのアイコンを右クリックし「キーバインド一覧を表示」とするのと同じことです。

コントロール / メタキーの変更

KeySnail がコントロールキー、メタキーと解釈するキーはデフォルトで次のようになっています。

  • コントロールキー
    • Ctrl
  • メタキー
    • Alt
    • Command

この割り当てを変更したい場合は、初期化ファイル内で key.isControlKey(), key.isMetaKey() という関数を上書きして下さい。

これらの関数は元々次のような定義となっています。

例えば ControlKey に Caps Lock キーを使いたい場合は key.isControlKey() の定義を次のように変更すれば良いでしょう。

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.