2

使用 Ace 编辑器,工作正常,除了: 和行的开头和结尾,如果文档中至少有一行不适合屏幕,则水平滚动不完整。对于行首的插入符号,一旦视图被水平滚动,当插入符号位于行首时,它不会完全向后滚动,因此插入符号不会显示。恼人的。与行尾的插入符号相同(尽管它似乎根本不滚动,而不是不向右对齐,所以可能是不同的错误。有人知道如何修复吗?哪些版本受到影响?

(哦,对了,忘了说:排水沟已启用。)

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

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

(Edit#N:设法隐藏排水沟:“editor_loaded.renderer.setShowGutter(false);”。问题仍然存在。)

4

1 回答 1

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);
    }
};

显然,日志调用对于除调试之外的任何事情都是不必要的。

于 2013-11-28T14:03:56.297 回答