我尝试改变页面向上和向下翻页的方式。
我已经成功扩展了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的创作吗?
修改
注意!如果您向下翻页过多,它也会将插入符号移到第一行,但是,在此之后向上翻页似乎记住了您的插入位置。但是页面向上然后向下翻页不会,所以似乎有一个错误,因为页面底部然后页面确实可以正常工作
答案 0 :(得分:2)
不,你不能参与CaretImpl的创建,也不能覆盖moveCaretRelatively()方法。
但是,您实际上并不需要:不是调用该方法,而是可以计算您希望移动插入符的确切位置,并调用CaretModel.moveToOffset()或CaretModel.moveToLogicalPosition()来移动插入符号那里。