プラグイン作って覚えたことを淡々と記録するよ(各種リスナ編)
イヤ,プラグイン作ってないし。:-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)との関係はこんな感じ。
- ファイルを開く
- EditorFactoryListener.editorCreated()
- FileEditorManagerListener.selectionChanged()
- FileEditorManagerListener.fileOpened()
- ファイルを閉じる
- FileEditorManagerListener.selectionChanged()
- EditorFactoryListener.editorReleased()
- FileEditorManagerListener.fileClosed()
↑これを利用してパッチ当てた。
おまけ
RegisterActionsでKeyParserに対して設定しているアクションのアクション名は,接頭子の"Vim"を削るとIDEAのアクション名になるみたい。
例) "VimClassNameCompletion" -> "ClassNameCompletion"
これと,KeyParser.registerActionのバリエーションで,IdeaVIMが用意したアクションの設定をしている。中にはDelegateActionつってIDEAのアクションにスルーするだけのもあるし,そんなのも介さず,ただ単にキーマップを変えるだけってのもあった。
ここいじれば,独自の機能とか追加できそう。
できれば,surround.vim相当の機能を組み込みたい。:-D