Ace编辑器,横向滚动不准确,如何解决?

时间:2012-04-15 19:06:12

标签: ace-editor

使用Ace编辑器,工作正常,除了:和行的开头和结尾,如果文档中至少有一行不适合屏幕,则水平滚动不完整。对于行开头处的插入符号,一旦视图被h滚动,当插入符号位于行开头时它将不会完全向后滚动,因此不会显示插入符号。烦人。对于行尾的插入符号也是如此(虽然看起来它根本不滚动,而不是不正确,所以可能是不同的错误。有人知道如何解决吗?哪些版本会受到影响?

(哦,对,忘了提及:天沟已启用。)

(编辑II:使用谷歌浏览器18.0.1025.162)

(E#3:忘记提及:使用Shift +滚轮我可以手动修复它,向左滚动。(E4:......这只是一个线索;不是解决方案。一个人不应该做任何事情无关的手动鼠标。))

(编辑#N:设法隐藏装订线:“editor_loaded.renderer.setShowGutter(false);”。问题仍然存在。)

1 个答案:

答案 0 :(得分:1)

嗯,按照要求(由'WarFox'),这就是我在0.2.0版本中绕过滚动问题所做的,直接来自本地回购。 HTH,YMMV。当然,无法保证修改此版本或任何版本。 this.scrollCursorIntoView的代码被修改为:

this.scrollCursorIntoView = function() {
    var log = function (s) { 
        // console.log("### scrollCursorIntoView ###: " + s); 
    };
    // log("(scrollCursorIntoView...)");
    function loge(expr) {
        var value = eval(expr);
        log("" + expr + " => " + value);
    }

    // the editor is not visible
    if (this.$size.scrollerHeight === 0)
        return;

    var pos = this.$cursorLayer.getPixelPosition();

    var left = pos.left + this.$padding;
    log("left = " + left);
    var top = pos.top;
    log("top = " + top);

    if (this.scrollTop > top) {
        this.scrollToY(top);
    }

    if (this.scrollTop + this.$size.scrollerHeight < top + this.lineHeight) {
        this.scrollToY(top + this.lineHeight - this.$size.scrollerHeight);
    }

    var scrollLeft = this.scroller.scrollLeft;

    var left_ = left - this.characterWidth;
    log("(scrollLeft > left): " + scrollLeft + " > " + left);
    log("(scrollLeft > left_): " + scrollLeft + " > " + left_);
    if (scrollLeft > left_) {
        this.scrollToX(left_);
    } else {
        log("NOT (scrollLeft > left): " + scrollLeft + " > " + left);
        log("NOT (scrollLeft > left_): " + scrollLeft + " > " + left_);
    }

    loge("scrollLeft");
    log("scrollLeft = " + scrollLeft);
    log("this.$size.scrollerWidth = " + this.$size.scrollerWidth);
    log("left = " + left);
    log("this.characterWidth = " + this.characterWidth);

    var right_side_scroll_yes = scrollLeft + this.$size.scrollerWidth < left + this.characterWidth;
    if (right_side_scroll_yes) {
        log("(right side scroll...)");
        //loge("this.layerConfig.width");
        if (left > this.layerConfig.width) {
            log("right #1");
            log("this.layerConfig.width = " + this.layerConfig.width);
            this.$desiredScrollLeft = left + 2 * this.characterWidth;
            this.scrollToX(this.$desiredScrollLeft);
        } else {
            log("right #2");
            var tmp = Math.round(left + this.characterWidth - this.$size.scrollerWidth);
            loge("tmp");
            this.scrollToX(tmp);
        }
    } else {
        log("NOT (right_side_scroll_yes): " + scrollLeft + " > " + left);
    }
};

显然,除了调试之外,没有必要进行日志记录调用。