               if match?
                 any_match = true
                 #console.log(["expr match", match, remaining])
-                line_exprs.push match.pre
+                line_parts.push match.pre
                 obj = $$ -> @span {class: pattern.config.name}, => @raw(match.match)
                 obj.name = pattern.config.name
-                line_exprs.push obj
+                line_parts.push obj
                 remaining = match.post
                 break # process remaining
         if any_match
           continue # next part
         if remaining.length >= 0
-          line_exprs.push remaining
+          line_parts.push remaining
       else
-        line_exprs.push part
-
-    if line_exprs.length == 0
-      line_exprs = [line]
-
-    #console.log(["line_exprs", line_exprs])
+        line_parts.push part
+
+    if line_parts.length == 0
+      line_parts = [line]
+
+    #console.log(["line_parts", line_parts])
     #console.log(">> " + line_processed)
 
     ##### replace all objects in line for whole-line matching
     line_processed = ""
-    for part in line_exprs
+    for part in line_parts
       if typeof part == "string"
         line_processed += part
       else
         line_processed += "<" + part.name + ">"
     #console.log("== " + line_processed)
 
-    ##### whole-line matching
+    ##### (whole-)line matching
     for pattern in @patterns
       if pattern.config.isLineExpression
         match = line_processed.match(pattern.regex)
         if match?
           #console.log(["line match", match.match, line_processed])
           line_span = $$ -> @span {class: pattern.config.name}
-          for part in line_exprs
+          for part in line_parts
             if typeof part == "string"
               line_span.append $$ -> @text(part)
             else

              any_match = true
              #console.log(["path exist", match.match, remaining])
              cwd = @processController.getCwd()
              line_exprs.push match.pre
              obj = new PathView(cwd, match)
              obj.name = "path"
              line_exprs.push obj
              remaining = match.post
              break # process remaining
            remaining = match.post
            line_exprs.push match.pre + match.match
    if remaining.length >= 0
      line_exprs.push remaining

    ##### process inline patterns patterns
    parts = line_exprs
    line_exprs = []
    for part in parts
      if typeof part == "string"
        remaining = part

      addNewLine = true;

  # append line to output panel
  #   uses three kinds of patterns (processed in three loops in this sequence):
  #     * PTHEXP = path expression
  #     * INLEXP = inline expression
  #     * LINEXP = (whole-)line expression
  #   * PTHEXPs are roughly the same as INLEXPs, but create clickable objects (PathView)
  #   * PTHEXPs only match if a corresponding file exists (this allows very loose path regexps)
  #   * INLEXPs are converted to span objects
  #   * converting is done sequentially: remaining = match(line) ; while(remaining) remaining = match(remaining)
  #   * resulting objects and the remaining strings are collected in an array (line_parts)
  #   * LINEXPs are detected by using `^` at the start
  #   *   because of that INLEXP anchored at the start of the line need to use a fake group or similar
  #   * the first matching LINEXP stops matching outputs a span object wrapping the collected array

  appendLine: (line) ->

    #console.log("<< " + line)
