Java Intellij插件开发,覆盖CaretImpl

Java Intellij插件开发,覆盖CaretImpl,java,intellij-idea,webstorm,intellij-plugin,Java,Intellij Idea,Webstorm,Intellij Plugin,我试图改变上下翻页的处理方式 我已经成功地扩展了EditorAction,并且可以更改它执行的跳转的大小 这是为其运行的代码: @Override public void execute(Editor editor, DataContext dataContext) { boolean $isWithSelection = false; int $divider = 2; int l

我试图改变上下翻页的处理方式

我已经成功地扩展了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);
    }
我已将页面大小除以2。

但我也想改变支付插入符号是放在页面上,当没有更多的页面上

Intellij将令人恼火地将插入符号放在第一行第一个字符上,打破任何向下翻页的流程,如果您以后向下翻页,则返回到上次的位置。

事实上,您应该能够上下翻页,并且始终返回到同一行、同一列、同一字符

“向上翻页”和“向下翻页”通常用于在更高的代码处达到峰值,但Intellij使这成为了一个真正的难题。你总是翻页,然后就完蛋了

最后一行:

            editor.getCaretModel().moveCaretRelatively(0, lineShift, $isWithSelection, editor.isColumnMode(), true);
负责移动插入符号,但get caretModel是我相信的单例,这就是移动插入符号的魔力所在

这种方法非常庞大,我不知道是什么将插入符号移动到第一个字符,但在我到达之前:

我需要做什么才能在CaretImpl中覆盖movecaretrelative

我可以参与编辑插入符号的创建吗

编辑



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

不,您不能参与创建CaretImpl,也不能覆盖moveCaretRelatively()方法


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

如果您还不知道,这只是一个提示,但是JetBrains有一个插件开发论坛。你也可以在那里搜索/询问。我在论坛上的运气通常比较好。等我有时间的话,我会尽快调查的。谢谢;)