1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
package dotty.tools
package dotc
package repl
import core.Contexts._
import ammonite.terminal._
import LazyList._
import Ansi.Color
import filters._
import BasicFilters._
import GUILikeFilters._
import util.SourceFile
import printing.SyntaxHighlighting
class AmmoniteReader(val interpreter: Interpreter)(implicit ctx: Context) extends InteractiveReader {
val interactive = true
def incompleteInput(str: String): Boolean =
interpreter.delayOutputDuring(interpreter.interpret(str)) match {
case Interpreter.Incomplete => true
case _ => false
}
val reader = new java.io.InputStreamReader(System.in)
val writer = new java.io.OutputStreamWriter(System.out)
val cutPasteFilter = ReadlineFilters.CutPasteFilter()
var history = List.empty[String]
val selectionFilter = GUILikeFilters.SelectionFilter(indent = 2)
val multilineFilter: Filter = Filter("multilineFilter") {
case TermState(lb ~: rest, b, c, _)
if (lb == 10 || lb == 13) && incompleteInput(b.mkString) =>
BasicFilters.injectNewLine(b, c, rest)
}
def readLine(prompt: String): String = {
val historyFilter = new HistoryFilter(
() => history.toVector,
Console.BLUE,
AnsiNav.resetForegroundColor
)
val allFilters = Filter.merge(
UndoFilter(),
historyFilter,
selectionFilter,
GUILikeFilters.altFilter,
GUILikeFilters.fnFilter,
ReadlineFilters.navFilter,
cutPasteFilter,
multilineFilter,
BasicFilters.all
)
Terminal.readLine(
Console.BLUE + prompt + Console.RESET,
reader,
writer,
allFilters,
displayTransform = (buffer, cursor) => {
val ansiBuffer = Ansi.Str.parse(SyntaxHighlighting(buffer))
val (newBuffer, cursorOffset) = SelectionFilter.mangleBuffer(
selectionFilter, ansiBuffer, cursor, Ansi.Reversed.On
)
val newNewBuffer = HistoryFilter.mangleBuffer(
historyFilter, newBuffer, cursor,
Ansi.Color.Green
)
(newNewBuffer, cursorOffset)
}
) match {
case Some(res) =>
history = res :: history;
res
case None => ":q"
}
}
}
|