0

我正在用 javascript 编写类似 Nano 的编辑器,并且在计算光标位置和文件偏移以进行显示时遇到问题:

当您在第 20 行移动光标_rows并且settings.verticalMoveOffset有 19 行光标偏移verticalMoveOffset.

我在这几个小时内工作,无法弄清楚如何将文件指针(行)映射到编辑器光标和文件的偏移量(它开始视图的行)。

最后一次尝试是

if (y >= this._rows) {
    var page = Math.floor(y / (this._rows-this._settings.verticalMoveOffset))-1;
    var new_offset = (this._rows - this._settings.verticalMoveOffset) * page;
    if (this._offset !== new_offset) {
        this._view(new_offset);
    }
    cursor_y = y - (this._rows*page) + this._settings.verticalMoveOffset;
} else {
    if (y <= this._rows - this._settings.verticalMoveOffset - 1 &&
        this._offset !== 0) {
        this._pointer.x = x;
        this._pointer.y = y;
        this._view(0);
        cursor_y = y;
    } else if (this._offset !== 0) {
        cursor_y = (y - this._settings.verticalMoveOffset) + 1;
    } else {
        cursor_y = y;
    }
}

当我从第 1 页切换到第 2 页并返回到第 3 页时,它会切换到 1 行以快速切换,cursor_y即 -1。在计算页面时,我尝试在不同的地方加上正负 1,但它不起作用。

任何人都可以帮助我吗?

4

1 回答 1

0

我找到了解决方案(this._offset 由 this._view 设置)

var offset = this._offset + this._rows - cursor_offset;
if (y-this._offset >= this._rows) {
    cursor_y = y - offset;
    if (this._offset !== offset) {
        this._pointer.x = x;
        this._pointer.y = y;
        this._view(offset);
    }
} else if (y-this._offset < 0) {
    var new_offset = this._offset - this._rows + cursor_offset;
    this._pointer.x = x;
    this._pointer.y = y;
    this._view(new_offset);
    cursor_y = y - new_offset;
} else {
    cursor_y = y - offset + cursor_offset + 1;
}
于 2013-08-04T06:58:28.820 回答