docs: def create_layout(lexer=None,
                    reserve_space_for_menu=8,
                    get_prompt_tokens=None,
                    get_bottom_toolbar_tokens=None,
                    extra_input_processors=None, multiline=False,
                    wrap_lines=True):
      """
      Creates a custom `Layout` for the Crash input REPL
  
      This layout includes:
          * a bottom left-aligned session toolbar container
          * a bottom right-aligned side-bar container
  
      +-------------------------------------------+
      | cr> select 1;                             |
      |                                           |
      |                                           |
      +-------------------------------------------+
      | bottom_toolbar_tokens      sidebar_tokens |
      +-------------------------------------------+
      """
  
      # Create processors list.
      input_processors = [
          ConditionalProcessor(
              # Highlight the reverse-i-search buffer
              HighlightSearchProcessor(preview_search=True),
              HasFocus(SEARCH_BUFFER)),
      ]
  
      if extra_input_processors:
          input_processors.extend(extra_input_processors)
  
      lexer = PygmentsLexer(lexer, sync_from_start=True)
      multiline = to_cli_filter(multiline)
  
      sidebar_token = [
          (Token.Toolbar.Status.Key, "[ctrl+d]"),
          (Token.Toolbar.Status, " Exit")
      ]
      sidebar_width = token_list_width(sidebar_token)
  
      get_sidebar_tokens = lambda _: sidebar_token
  
      def get_height(cli):
          # If there is an autocompletion menu to be shown, make sure that our
          # layout has at least a minimal height in order to display it.
          if reserve_space_for_menu and not cli.is_done:
              buff = cli.current_buffer
  
              # Reserve the space, either when there are completions, or when
              # `complete_while_typing` is true and we expect completions very
              # soon.
              if buff.complete_while_typing() or buff.complete_state is not None:
                  return LayoutDimension(min=reserve_space_for_menu)
  
          return LayoutDimension()
  
      # Create and return Container instance.
      return HSplit([
          VSplit([
              HSplit([
                  # The main input, with completion menus floating on top of it.
                  FloatContainer(
                      HSplit([
                          Window(
                              BufferControl(
                                  input_processors=input_processors,
                                  lexer=lexer,
                                  # enable preview search for reverse-i-search
                                  preview_search=True),
                              get_height=get_height,
                              wrap_lines=wrap_lines,
                              left_margins=[
                                  # In multiline mode, use the window margin to display
                                  # the prompt and continuation tokens.
                                  ConditionalMargin(
                                      PromptMargin(get_prompt_tokens),
                                      filter=multiline
                                  )
                              ],
                          ),
                      ]),
                      [
                          # Completion menu
                          Float(xcursor=True,
                                ycursor=True,
                                content=CompletionsMenu(
                                    max_height=16,
                                    scroll_offset=1,
                                    extra_filter=HasFocus(DEFAULT_BUFFER))
                                ),
                      ]
                  ),
  
                  # reverse-i-search toolbar (ctrl+r)
                  ConditionalContainer(SearchToolbar(), multiline),
              ])
          ]),
      ] + [
          VSplit([
              # Left-Aligned Session Toolbar
              ConditionalContainer(
                  Window(
                      TokenListControl(get_bottom_toolbar_tokens),
                      height=LayoutDimension.exact(1)
                  ),
                  filter=~IsDone() & RendererHeightIsKnown()),
  
              # Right-Aligned Container
              ConditionalContainer(
                  Window(
                      TokenListControl(get_sidebar_tokens),
                      height=LayoutDimension.exact(1),
                      width=LayoutDimension.exact(sidebar_width)
                  ),
                  filter=~IsDone() & RendererHeightIsKnown())
          ])
      ])