@@ -55,8 +55,8 @@ select (Region start end) source =
5555 let
5656 relevantLines =
5757 lines source
58− |> drop (line start)
59− |> take (line end - line start)
58+ |> drop (line start - 1)
59+ |> take (line end - line start + 1)
6060 in
6161 case relevantLines of
6262 [] ->
@@ -64,14 +64,17 @@ select (Region start end) source =
6464
6565 [theLine] ->
6666 let
67− lineNumber = show (line start) ++ "|"
67+ n = line start
68+ w = length (show (n + 1))
69+ underline =
70+ replicate (column start - 1) ' '
71+ ++ replicate (max 1 (column end - column start)) '^'
6872 in
69− lineNumber
70− ++ theLine
71− ++ "\n"
72− ++ replicate (column start + length lineNumber) ' '
73− ++ replicate (column end - column start) '^'
74− ++ "\n"
73+ unlines
74+ [ addLineNumber w (n-1) ""
75+ , addLineNumber w n theLine
76+ , addLineNumber w (n+1) underline
77+ ]
7578
7679 firstLine : rest ->
7780 let
@@ -85,13 +88,13 @@ select (Region start end) source =
8588 filteredFirstLine : init rest ++ [filteredLastLine]
8689
8790 lineNumbersWidth =
88− length (show (line end))
91+ length (show (line end + 1))
8992
9093 numberedLines =
9194 zipWith
9295 (addLineNumber lineNumbersWidth)
93− [line start .. line end]
94− focusedRelevantLines
96+ [line start - 1 .. line end + 1]
97+ ("" : focusedRelevantLines ++ [""])
9598 in
9699 unlines numberedLines ++ "\n"
97100
@@ -99,9 +102,9 @@ select (Region start end) source =
99102addLineNumber :: Int -> Int -> String -> String
100103addLineNumber width n line =
101104 let
102− number = show n
105+ number = if n < 0 then " " else show n
103106 in
104− replicate (width - length number) ' ' ++ number ++ "|" ++ line
107+ replicate (width - length number) ' ' ++ number ++ "| " ++ line
105108
106109
107110-- JSON