Atomフライトマニュアル翻訳:4.2深いキーテーブル(keymap)

5280 ワード

キーテーブルの深さ(keymap)
キーテーブルファイルは、ネストされたハッシュテーブルを含む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.csonsnippets-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()が呼び出され、キーテーブルシステムに別の一致するバインディングを探し続けるように伝えます.
詳細手順:キーイベントをコマンドにマッピングする方法
  • キーイベントは、フォーカスを取得する要素の上に表示されます.
  • フォーカスを取得する要素から開始します.キーテーブルは、ドキュメントのルート要素まで検索され、現在のDOM要素に一致し、キーイベントに一致するショートカット・キー・ワイルドカードを含む最も特異的なCSSセレクタが検索されます.
  • 一致するショートカット・キー・ワイルドカードが見つかった後、検索は終了し、ワイルドカードにバインドされたコマンドが現在の要素でトリガーされます.
  • トリガされたイベントオブジェクト上で.abortKeyBinding()が呼び出されると、検索が再開され、次の最も特異的なCSSセレクタにバインドされたイベントが同じ要素上でトリガされるか、上への検索が続行されます.
  • ショートカットキーが見つからない場合、イベントは通常Chromeによって処理されます.