使Scala的REPL选项卡完成读取列而不是跨行?

时间:2011-02-11 02:41:13

标签: shell scala read-eval-print-loop tab-completion

Scala REPL中制表符完成的输出读取行,在开始新行之前从左到右排序。这对我来说很尴尬;我习惯于在开始新列之前阅读从上到下排序的列表。有没有办法改变输出,以便它读取列,而不是?

1 个答案:

答案 0 :(得分:2)

Scala REPL使用jline以便正确完成。 查看jline的代码,您可以看到CandidateListCompletionHandler.printCandidates(...)调用reader.printColumns(candidates)这里是复制/粘贴。

正如您所看到的,无法在colomn模式而不是行模式下对完成候选项进行排序,您可以做的最好的事情是修补jline并将其替换为scala / lib /目录。

public void printColumns(final Collection stuff) throws IOException {
    if ((stuff == null) || (stuff.size() == 0)) {
        return;
    }

    int width = getTermwidth();
    int maxwidth = 0;

    for (Iterator i = stuff.iterator(); i.hasNext(); maxwidth = Math.max(
            maxwidth, i.next().toString().length())) {
        ;
    }

    StringBuffer line = new StringBuffer();

    int showLines;

    if (usePagination)
        showLines = getTermheight() - 1; // page limit
    else
        showLines = Integer.MAX_VALUE;

    for (Iterator i = stuff.iterator(); i.hasNext();) {
        String cur = (String) i.next();

        if ((line.length() + maxwidth) > width) {
            printString(line.toString().trim());
            printNewline();
            line.setLength(0);
            if (--showLines == 0) { // Overflow
                printString(loc.getString("display-more"));
                flushConsole();
                int c = readVirtualKey();
                if (c == '\r' || c == '\n')
                    showLines = 1; // one step forward
                else if (c != 'q')
                    showLines = getTermheight() - 1; // page forward

                back(loc.getString("display-more").length());
                if (c == 'q')
                    break; // cancel
            }
        }

        pad(cur, maxwidth + 3, line);
    }

    if (line.length() > 0) {
        printString(line.toString().trim());
        printNewline();
        line.setLength(0);
    }
}