Intellij 插件开发,覆盖 CaretImpl

Intellij plugin development, overriding CaretImpl

我正在尝试改变向上翻页和向下翻页的处理方式。

我已经成功地扩展了 EditorAction 并且可以改变它执行的跳转的大小。

这是为其运行的代码:

    @Override
    public void execute(Editor editor, DataContext dataContext) {
            boolean $isWithSelection = false;
            int     $divider         = 2;

            int lineHeight = editor.getLineHeight();
            Rectangle visibleArea = editor.getScrollingModel().getVisibleArea();

            int linesIncrement = (visibleArea.height / lineHeight) / $divider;

            editor.getScrollingModel().scrollVertically(visibleArea.y - visibleArea.y % lineHeight - linesIncrement * lineHeight);

            int lineShift = -linesIncrement;

            editor.getCaretModel().moveCaretRelatively(0, lineShift, $isWithSelection, editor.isColumnMode(), true);
    }

我把页面的大小分成了二等分

但我还想更改插入符号在没有更多要向上翻页时放置在向上翻页上的位置。

Intellij 会 烦人地 将插入符放在第一行的第一个字符上,中断任何向下翻页的流程,return 到您所在的位置 最后一次,如果你稍后翻页。

事实上,您应该能够向上翻页和向下翻页,并且总是 return 到同一行、同一列、同一字符。

Page up 和 page down 通常用于在更高的代码处达到峰值,但 Intellij 使这成为一个真正的麻烦。你向上翻页,你总是被搞砸了。

所以最后一行:

            editor.getCaretModel().moveCaretRelatively(0, lineShift, $isWithSelection, editor.isColumnMode(), true);

负责移动插入符,但我认为获取插入符模型是一个单例,这就是移动插入符的魔法发生的地方。

那个方法很庞大,我不知道是什么将插入符号实际移动到第一个字符,但在我到达那里之前:

我需要做什么才能覆盖 CaretImpl 中的 moveCaretRelatively

我可以参与创建 Caret for Editor 吗?

编辑


注意!如果你向下翻页太多,它也会将插入符号移动到第一行,但是,在那之后向上翻页似乎会记住你的插入符号位置。但是向上翻页然后向下翻页不会,所以似乎有一个错误 因为翻页底部然后向上翻页确实如我所愿

不可以,您不能参与 CaretImpl 的创建,也不能重写 moveCaretRelatively() 方法。

但是,您实际上并不需要它:您可以计算要移动插入符号的确切位置,然后调用 CaretModel.moveToOffset() 或 CaretModel.moveToLogicalPosition,而不是调用该方法() 将插入符移到那里。