anchor.diff:          ]
           not <| List.contains keyEvt.Key modifierKeys
   
  +    let getPrompt pathFormat (node: Node) inputMode =
  +        let caseName (case: obj) = case |> GetUnionCaseName |> String.readableIdentifier |> sprintf "%s:"
  +        match inputMode with
  +        | Confirm (Overwrite (_, src, dest)) ->
  +            match dest.Type with
  +            | Folder -> sprintf "Folder \"%s\" already exists. Move anyway and merge files y/n ?" dest.Name
  +            | File ->
  +                match src.Modified, src.Size, dest.Modified, dest.Size with
  +                | Some srcModified, Some srcSize, Some destModified, Some destSize ->
  +                    let compare a b less greater =
  +                        if a = b then "same"
  +                        else if a < b then less
  +                        else greater
  +                    sprintf "File \"%s\" already exists. Overwrite with file dated %s (%s), size %s (%s) y/n ?"
  +                        dest.Name
  +                        (Format.dateTime srcModified) (compare srcModified destModified "older" "newer")
  +                        (Format.fileSize srcSize) (compare srcSize destSize "smaller" "larger")
  +                | _ -> sprintf "File \"%s\" already exists. Overwrite it y/n ?" dest.Name
  +            | _ -> ""
  +        | Confirm Delete ->
  +            sprintf "Permanently delete %s y/n ?" node.Description
  +        | Confirm (OverwriteBookmark (char, existingPath)) ->
  +            sprintf "Overwrite bookmark \"%c\" currently set to \"%s\" y/n ?" char (existingPath.Format pathFormat)
  +        | Prompt (Find caseSensitive) ->
  +            sprintf "Find%s:" (if caseSensitive then " case-sensitive" else "")
  +        | Prompt promptType ->
  +            promptType |> caseName
  +        | Input inputType ->
  +            inputType |> caseName
  +
       override this.SetBindings (model: MainBindModel) =
  +        let keepSelectedInView () =
  +            if window.NodeGrid.SelectedItem <> null then
  +                window.NodeGrid.ScrollIntoView(window.NodeGrid.SelectedItem)
  +
           model.Invoke <- fun f -> window.Dispatcher.Invoke(fun () -> f())
   
           // setup grid
  
positive.code:             config.Save()
  
      override this.EventStreams = [
          window.Activated |> Observable.choose this.Activated
          window.PathBox.PreviewKeyDown |> Observable.choose (fun evt ->
              if evt.Key = Key.Enter then Some <| OpenPath window.PathBox.Text
              else None
  
negative.code:         )
          window.NodeGrid.MouseDoubleClick |> Observable.mapTo OpenSelected
          window.InputBox.PreviewKeyDown |> onKeyFunc Key.Enter (fun () -> SubmitInput)
          window.InputBox.PreviewTextInput |> Observable.choose (fun keyEvt ->
              match keyEvt.Text.ToCharArray() with
              | [| c |] -> Some (InputCharTyped c)
              | _ -> None
          )
          config.Changed |> Observable.mapTo ConfigChanged
      ]
  
  module MainStatus =
      // navigation
  