Top / Eclipse / プラグイン開発のTIPS集 / キーバインディングを設定する

Eclipse/RCPはplugin.xmlで宣言的にキーバインディング*1を設定することができます。Eclipseの

ウィンドウ >> 設定 の 一般 >> キー 

に表示されるヤツですね。これでCtrl+Sで保存とか、いわゆるキーボードのショートカットを定義することができます。

key.png

コマンドの定義

キーをバインドする仕組みについてですが、まず「コマンド」というモノを定義して、そのコマンドにキーを関連づけます。さらにそのコマンドに対して、アクションを関連づけることで

あるキーを押す-> コマンドが決まる -> そのコマンドのアクションが実行される

といった流れになります。

plugin.xml

<extension point="org.eclipse.ui.commands">
  <category id="nu.mine.kino.plugin.samples.rcp.category" name="Sample"/>
  <command  categoryId="nu.mine.kino.plugin.samples.rcp.category" <-categoryのid属性
      id="nu.mine.kino.plugin.samples.rcp.command" name="サンプルコマンド"/>
</extension>
<extension point="org.eclipse.ui.bindings">
  <key sequence="F10" <-F10を割当
   commandId="nu.mine.kino.plugin.samples.rcp.command" <-commandのid属性
   schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
  </key>     ↑ デフォルトのスキーム
                ほかに org.eclipse.ui.emacsAcceleratorConfiguration がある
</extension>

これで、コマンドとそのキーバインドが定義されました。

view.png

カテゴリが「Sample」、コマンドが「サンプルコマンド」、キーが「F10」という設定が追加されている。

mod.png

さらに、スキームは「デフォルト」になっている

アクションの関連づけ

次にこのコマンドにアクションを関連づけますが、それはアクションの拡張ポイントにコマンドのIDを与えてやることで実現します。たとえばこんな感じです。

<action class="nu.mine.kino.plugin.samples.rcp.actions.HogeAction"
 definitionId="nu.mine.kino.plugin.samples.rcp.command" <- commandのid
 id="nu.mine.kino.plugin.samples.rcp.actions.HogeAction"
 label="アクション。"  menubarPath="topmenu/sepa01" style="push"/>

以上で、あるアクションに対してキーをバインドすることができました。

F10.png

TIPS

キーシーケンスの値について

キーのバインドで

<key sequence="F10" <-F10を割当

としましたが、たとえば「Ctrl+S」の場合は

<key sequence="Ctrl+S"

とします。複数書く場合は

<key sequence="Ctrl+X Ctrl+S" 

などとなります。

Ctrlなど特殊なキーをプラットフォームに依存しないで設定するには

Ctrlなど特殊なキーは、プラットフォーム非依存にするためにエイリアスがきってあります。

M1 (WindowsはCtrl、MacはCommand)
M2 (Shift)
M3 (WindowsはAlt、MacはOption)
M4 (MacはCtrl、その他は未定義)

などがあるようです。詳細はEclipseヘルプを「M1 M2」などで検索しましょう。

プログラマティカルにアクションを追加した場合

プログラマティカルにアクションを追加した場合は、そのアクションクラス内で

Action#setActionDefinitionId("nu.mine.kino.plugin.samples.rcp.command");

としてコマンドのIDと関連づけましょう。

Ctrl+Qで、アプリケーションを終了する

<key
     sequence="M1+Q"
     commandId="org.eclipse.ui.file.exit" <- QuitActionのコマンドID
     schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
</key>

ちなみにQuitAction?のコンストラクタのソースはこんな感じ

public QuitAction(IWorkbenchWindow window) {
  // Although window is not currently used,
  // this follows the same pattern as other ActionFactory actions.
  if (window == null) {
    throw new IllegalArgumentException();
  }
  this.workbenchWindow = window;
  setText(WorkbenchMessages.Exit_text); 
  setToolTipText(WorkbenchMessages.Exit_toolTip);
  setActionDefinitionId("org.eclipse.ui.file.exit"); //$NON-NLS-1$
  window.getWorkbench().getHelpSystem().setHelp(this,
  IWorkbenchHelpContextIds.QUIT_ACTION);
}

リンク


この記事は

選択肢 投票
おもしろかった 13  
そうでもない 1  
  • すでにあるヤツとバッティングするCtrl+Sとかはうまくいかないなあ。この辺の解決方法がまだわかんない。。。 -- きの? 2006-03-25 17:27:58 (土)
  • いったんコマンドIDを付けたアクションは、Workbenchに登録されてなくてはならない、とEclipse Rich Client Platform の本には書いてありますね。んで、この登録コマンドが、おきまりのActionBarAdvisor?#register(action)なんですね。ユーザ入力に対して、その入力値にマッチするアクションがあるかを探すために必要なのかなあ。
    quitAction = ActionFactory.QUIT.create(window);
    register(quitAction);
    おきまりのコーディングだよなあって思ってたけど、まあいっか。。 -- きの? 2006-03-25 18:16:49 (土)
  • Eclipse 3.3からこのcommandの仕組みを用いてアクション関連を定義するらしい。。。うーんまた思い出さんと(´д`;) -- きの? 2009-02-18 (水) 17:01:54

Top / Eclipse / プラグイン開発のTIPS集 / キーバインディングを設定する

現在のアクセス:18917


*1 ショートカットキーといえばよい?キーボード・アクセラレーターというヒトもいる

添付ファイル: fileview.png 1047件 [詳細] filemod.png 1030件 [詳細] filekey.png 1144件 [詳細] fileF10.png 1034件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-05-10 (火) 08:13:40 (943d)