プラグイン作って覚えたことを淡々と記録するよ(各種リスナ編)

イヤ,プラグイン作ってないし。:-P
IdeaVIMを調べたときのメモを後世に残す。


って書き起こすの面倒だったから,メモ帳そのまま貼るわ。黒字がIDEAのOpenAPIで,赤字がIdeaVIMね。


補足
EditorFactoryAdapter
EditoFactoryのリスナ用アダプタ。拾えるイベントは,Editorの生成(editorCreated),解放(editorReleased)。やってることは,カーソル形状をブロックカーソルにすることと,Editor配下のDocumentにちょっとしたリスナを登録してるだけ。
キーイベントのフックは個々のEditorに対して行うワケじゃない。


TypedActionHandler
Editorに対するキータイプイベントを受け取るハンドラ。EditorManager->TypedActionのTypedActionに対して設定する。「キータイプイベント」ってのが,どこまでなのかは把握しきれてないが,IdeaVIMの中枢なのは間違いなさそう。
※EditorManagerがEditorと強く関連してないのがポイント。

IdeaVIMのVimTypedActionHandlerってのが,IdeaVIMのKeyHandlerに振り分けるのか,IDEAが元々持っているTypedActionHanlderに振り分けるのかを判断している。
でも,VimTypedActionHandlerがIdeaVIMのすべての起点ではない。だけど,大抵のキーイベントはこいつが拾ってる。


EditorActionHandler
EditorActionに張り付くHandler。IdeaVIMだとEditorKeyHandlerってのが重要。設定してる場所を完全に把握できてないが,RegisterActions->KeyParserあたりで設定しているっぽい。
どうもActionManagerから直接IDEAのAction(AnAction/EditorAction)を抜き出して,ピンポイントで差し替えやハンドラを設定しているみたい。

IdeaVIMのEditorKeyHandlerは,BS,DELETE,ENTERなどのキーイベントを拾っているみたい。


FileEditorManagerListener
FileEditorManagerに張り付くリスナで,ファイルを開く(fileOpened)/ファイルを閉じる(fileClosed)/選択範囲が変化する(selectionChanged)を拾う。ちなみに,EditorFactoryListener(EditorFactoryAdapter)との関係はこんな感じ。

  • ファイルを開く
    1. EditorFactoryListener.editorCreated()
    2. FileEditorManagerListener.selectionChanged()
    3. FileEditorManagerListener.fileOpened()
  • ファイルを閉じる
    1. FileEditorManagerListener.selectionChanged()
    2. EditorFactoryListener.editorReleased()
    3. FileEditorManagerListener.fileClosed()

↑これを利用してパッチ当てた。


おまけ
RegisterActionsでKeyParserに対して設定しているアクションのアクション名は,接頭子の"Vim"を削るとIDEAのアクション名になるみたい。
例) "VimClassNameCompletion" -> "ClassNameCompletion"

これと,KeyParser.registerActionのバリエーションで,IdeaVIMが用意したアクションの設定をしている。中にはDelegateActionつってIDEAのアクションにスルーするだけのもあるし,そんなのも介さず,ただ単にキーマップを変えるだけってのもあった。


ここいじれば,独自の機能とか追加できそう。
できれば,surround.vim相当の機能を組み込みたい。:-D