2011-02-11 3 views
2

스칼라 REPL에서 탭 완성 결과는 행을 가로 질러 읽고, 새로운 행을 시작하기 전에 항목을 왼쪽에서 오른쪽으로 정렬합니다. 이것은 나에게 어색함을 느낀다. 나는 새로운 열을 시작하기 전에 위에서 아래로 정렬 된 목록을 읽는 데 익숙합니다. 출력을 변경하여 열을 읽도록하는 방법이 있습니까?스칼라의 REPL 탭 완성으로 행 전체가 아닌 열이 읽히는가?

+1

개선 티켓을 제출할 수 있습니까? 그것은 구성 할 수 있다면 좋을 것 ... – soc

답변

2

스칼라 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); 
    } 
}