Atomフライトマニュアル翻訳:4.2深いキーテーブル(keymap)
キーテーブルの深さ(keymap)
キーテーブルファイルは、ネストされたハッシュテーブルを含むJSONまたはCSONで符号化されたファイルです.スタイルシートのように動作しますが、スタイルプロパティを適用するのではなく、セレクタの要素に一致するショートカットキーの役割を指定します.次の例は、
最初のセレクタの下にショートカットキーをバインドし、特定のキービットワイルドカードをコマンドにマッピングします.
2番目のセレクタグループもエディタを指しますが、
キー・ワイルドカード
キービットワイルドカードは、オプションの補助キー(modifier key)を有する1つまたは複数のキービットを表す.例えば、
を選択します.
例
文字のフォント値
ほじょキー
とくしゅキー
コマンド#コマンド#
コマンドは、バインドされたショートカットキーにキーが一致するとトリガーされるカスタムDOMイベントです.これにより、UIコードは、特定のショートカットキーをトリガする必要がなく、名前付きコマンドをリスニングすることができます.たとえば、次のコードは、エディタに現在の日付を挿入するコマンドを作成します.
新しいショートカットキーをバインドしたい場合は、コマンドパネル(
「グループ」コマンド
よくある質問は、「ショートカットキーを使用して2つ以上のコマンドを実行する方法」です.Atomはこのニーズを直接サポートしていませんが、カスタムコマンドを作成して、目的の複数の操作を実行し、このコマンドのショートカットキーを作成することで解決できます.たとえば、「組合せ」コマンドを作成し、行を選択して切り取りたいとします.
このコマンドを
特異性(優先度)と階層順序
このCSSスタイルが適用された例のように、多くのショートカットキーのバインドが要素に一致する場合、競合は最も特別なセレクタを選択することによって解決されます.一致する2つのセレクタが同じ特異性を持っている場合、階層内で順番に後ろに表示されるセレクタのショートカットキーが優先されます.
現在、JSONのオブジェクトが無秩序であるため、個別のキーテーブルでショートカットキーの順序を指定する方法はありません.最終的には、単一のファイルでソートできるように、CSSのようなカスタムファイルフォーマットをキーテーブルに導入する予定です.これまで、セレクタの順序はキーテーブルを2つのファイルに分割することによって厳格に規定されている場合を選択的に解決することができた.
ショートカットの削除
キーテーブルシステムが
たとえば、次のコードは、ツリービューの
Chromeにローカルショートカットを強制
提供されたショートカットキーでローカルブラウザの動作を強制したい場合は、
ショートカットの再ロード
複数のアクションを同じショートカットキーの下に順番に置く必要がある場合があります.1つの例は、
このようにするために、コードセグメントのパケットは、
イベントプロセッサがカーソルの前に有効な接頭辞がないことを観察すると、`e.abortKeyBinding()が呼び出され、キーテーブルシステムに別の一致するバインディングを探し続けるように伝えます.
詳細手順:キーイベントをコマンドにマッピングする方法キーイベントは、フォーカスを取得する要素の上に表示されます. フォーカスを取得する要素から開始します.キーテーブルは、ドキュメントのルート要素まで検索され、現在のDOM要素に一致し、キーイベントに一致するショートカット・キー・ワイルドカードを含む最も特異的なCSSセレクタが検索されます. 一致するショートカット・キー・ワイルドカードが見つかった後、検索は終了し、ワイルドカードにバインドされたコマンドが現在の要素でトリガーされます. トリガされたイベントオブジェクト上で ショートカットキーが見つからない場合、イベントは通常Chromeによって処理されます.
キーテーブルファイルは、ネストされたハッシュテーブルを含むJSONまたはCSONで符号化されたファイルです.スタイルシートのように動作しますが、スタイルプロパティを適用するのではなく、セレクタの要素に一致するショートカットキーの役割を指定します.次の例は、
atom-text-editor
要素を押したときに有効になるショートカットキーの例です.'atom-text-editor':
'cmd-delete': 'editor:delete-to-beginning-of-line'
'alt-backspace': 'editor:delete-to-beginning-of-word'
'ctrl-A': 'editor:select-to-first-character-of-line'
'ctrl-shift-e': 'editor:select-to-end-of-line'
'cmd-left': 'editor:move-to-first-character-of-line'
'atom-text-editor:not([mini])':
'cmd-alt-[': 'editor:fold-current-row'
'cmd-alt-]': 'editor:unfold-current-row'
最初のセレクタの下にショートカットキーをバインドし、特定のキービットワイルドカードをコマンドにマッピングします.
atom-text-editor
要素がフォーカスされ、cmd-delete
要素が押されると、editor:delete-to-beginning-of-line
というカスタムDOMイベントがatom-text-editor
要素の上でトリガーされる.2番目のセレクタグループもエディタを指しますが、
mini
プロパティのエディタはありません.この例では、コード折り畳みコマンドはミニエディタでは意味がないので、セレクタは通常のエディタに制限します.キー・ワイルドカード
キービットワイルドカードは、オプションの補助キー(modifier key)を有する1つまたは複数のキービットを表す.例えば、
ctrl-w v
およびcmd-shift-up
である.キービットは、-
で区切られた記号で構成される.1つの複数のキーのワイルドカードは、スペースで分割されたキーのワイルドカードとして表すことができる.を選択します.
例
文字のフォント値
a
4
$
ほじょキー
cmd
ctrl
alt
shift
とくしゅキー
enter
escape
backspace
delete
tab
home
end
pageup
pagedown
left
right
up
down
コマンド#コマンド#
コマンドは、バインドされたショートカットキーにキーが一致するとトリガーされるカスタムDOMイベントです.これにより、UIコードは、特定のショートカットキーをトリガする必要がなく、名前付きコマンドをリスニングすることができます.たとえば、次のコードは、エディタに現在の日付を挿入するコマンドを作成します.
atom.commands.add 'atom-text-editor',
'user:insert-date': (event) ->
editor = @getModel()
editor.insertText(new Date().toLocaleString())
atom.commands
は、グローバル{CommandRegistry}
のインスタンスを指し、すべてのコマンドがその中に設定され、コマンドパネルによって取得することができる.新しいショートカットキーをバインドしたい場合は、コマンドパネル(
ctrl-shift-p
)を使用して、フォーカスのあるコンテキストでどのコマンドがリスニングされているかを見てみましょう.簡単なアルゴリズムに従ってコマンドが「人間的」になるので、editor:fold-current-row
コマンドは「Editor:Fold Current Row」と表示されます.「グループ」コマンド
よくある質問は、「ショートカットキーを使用して2つ以上のコマンドを実行する方法」です.Atomはこのニーズを直接サポートしていませんが、カスタムコマンドを作成して、目的の複数の操作を実行し、このコマンドのショートカットキーを作成することで解決できます.たとえば、「組合せ」コマンドを作成し、行を選択して切り取りたいとします.
init.coffee
にコードを追加できます.atom.commands.add 'atom-text-editor', 'custom:cut-line', ->
editor = atom.workspace.getActiveTextEditor()
editor.selectLinesContainingCursors()
editor.cutSelectedText()
このコマンドを
alt-ctrl-z
に関連付けるには、次の内容をキーテーブルに追加します.'atom-text-editor':
'alt-ctrl-z': 'custom:cut-line'
特異性(優先度)と階層順序
このCSSスタイルが適用された例のように、多くのショートカットキーのバインドが要素に一致する場合、競合は最も特別なセレクタを選択することによって解決されます.一致する2つのセレクタが同じ特異性を持っている場合、階層内で順番に後ろに表示されるセレクタのショートカットキーが優先されます.
現在、JSONのオブジェクトが無秩序であるため、個別のキーテーブルでショートカットキーの順序を指定する方法はありません.最終的には、単一のファイルでソートできるように、CSSのようなカスタムファイルフォーマットをキーテーブルに導入する予定です.これまで、セレクタの順序はキーテーブルを2つのファイルに分割することによって厳格に規定されている場合を選択的に解決することができた.
snippets-1.cson
とsnippets-2.cson
のようです.ショートカットの削除
キーテーブルシステムが
unset!
をショートカットキーとするコマンドに遭遇すると、現在のキービットシーケンスにバインドされていないように、親ノードから探し続けます.Atomコアやパッケージのショートカットキーなど、使用しなくなったショートカットキーを削除したい場合は、unset!
を直接使用する必要があります.たとえば、次のコードは、ツリービューの
a
のショートカットキーを削除します.通常、tree-view:add-file
コマンドがトリガーされます.'.tree-view':
'a': 'unset!'
Chromeにローカルショートカットを強制
提供されたショートカットキーでローカルブラウザの動作を強制したい場合は、
native!
をバインドコマンドとして直接使用します.これは、ローカル入力要素の正しい動作を開始するときに役立ちます.たとえば、1つの要素に.native-key-bindings
classを適用すると、ブラウザで処理されるすべてのショートカットキーがnative!
にバインドされます.ショートカットの再ロード
複数のアクションを同じショートカットキーの下に順番に置く必要がある場合があります.1つの例は、
for
のようなプレフィックスを入力した後、tab
を押して挿入されるコードセグメントのパケットである.tab
が押下されるたびに、カーソルの前の文字に対応するコードセグメントが存在する場合は、コードを実行してコードセグメントを展開したい.コードセグメントが存在しない場合は、tab
に空白文字を挿入します.このようにするために、コードセグメントのパケットは、
snippets:expand
コマンドのイベントオブジェクトを表す.abortKeyBinding()
メソッドを利用する.# pseudo-code
editor.command 'snippets:expand', (e) =>
if @cursorFollowsValidPrefix()
@expandSnippet()
else
e.abortKeyBinding()
イベントプロセッサがカーソルの前に有効な接頭辞がないことを観察すると、`e.abortKeyBinding()が呼び出され、キーテーブルシステムに別の一致するバインディングを探し続けるように伝えます.
詳細手順:キーイベントをコマンドにマッピングする方法
.abortKeyBinding()
が呼び出されると、検索が再開され、次の最も特異的なCSSセレクタにバインドされたイベントが同じ要素上でトリガされるか、上への検索が続行されます.