Intellij插件开发,覆盖CaretImpl

时间:2015-08-29 06:24:22

标签: java intellij-idea webstorm intellij-plugin

我尝试改变页面向上和向下翻页的方式。

我已经成功扩展了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);

负责移动插入符,但得到caretModel是我认为的单身人士,以及移动插入符号的神奇之处。

这个方法很大,我不知道实际上将插入符号移动到第一个字符的位置,但是在我到达之前:

我需要才能在 CaretImpl 中覆盖 moveCaretRelatively

我可以参与Caret for Editor的创作吗?

修改

注意!如果您向下翻页过多,它也会将插入符号移到第一行,但是,在此之后向上翻页似乎记住了您的插入位置。但是页面向上然后向下翻页不会,所以似乎有一个错误,因为页面底部然后页面确实可以正常工作

1 个答案:

答案 0 :(得分:2)

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

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