Exemplo n.º 1
0
def edit_file(filename):
    manager = KeyBindingManager(enable_vi_mode=True, enable_system_prompt=True)
    manager.vi_state.input_mode = InputMode.NAVIGATION

    layout = HSplit([
        Header(),
        Window(content=BufferControl(show_line_numbers=AlwaysOn(),
                                     lexer=get_lexer_for_filename(
                                         filename).__class__)),
        VimToolbar(filename, manager),
        VimInputBar(),
        SystemToolbar(),
        SearchToolbar(),
    ])

    with codecs.open(filename, 'r', 'utf-8') as f:
        text = f.read()

    @manager.registry.add_binding(':',
                                  filter=ViStateFilter(manager.vi_state,
                                                       InputMode.NAVIGATION))
    def enter_command_mode(event):
        """
        Entering command mode.
        """
        event.cli.focus_stack.push('vim-input')
        manager.vi_state.input_mode = InputMode.INSERT

    @manager.registry.add_binding(Keys.Escape, filter=HasFocus('vim-input'))
    @manager.registry.add_binding(Keys.ControlC, filter=HasFocus('vim-input'))
    @manager.registry.add_binding(
        Keys.Backspace,
        filter=HasFocus('vim-input')
        & Condition(lambda cli: cli.buffers['vim-input'].text == ''))
    def leave_command_mode(event):
        """
        Leaving command mode.
        """
        event.cli.focus_stack.pop()
        manager.vi_state.input_mode = InputMode.NAVIGATION
        event.cli.buffers['vim-input'].document = Document()

    @manager.registry.add_binding(Keys.ControlJ, filter=HasFocus('vim-input'))
    def process_command(event):
        """
        Handling of commands.
        """
        text = event.current_buffer.text

        def save():
            with codecs.open(filename, 'w', 'utf-8') as f:
                f.write(event.cli.buffers['default'].text)

        def leave_command_mode():
            event.cli.focus_stack.pop()
            manager.vi_state.input_mode = InputMode.NAVIGATION
            event.cli.buffers['vim-input'].document = Document()

        if text == 'w':
            save()
            leave_command_mode()
        elif text in ('wq', 'wqa'):
            save()
            event.cli.set_return_value('')

        elif text in ('q', 'qa', 'q!', 'qa!'):
            event.cli.set_return_value('')

        else:
            leave_command_mode()

        # TODO: validation of other commands.

    cli = CommandLineInterface(
        layout=layout,
        renderer=Renderer(use_alternate_screen=True),
        key_bindings_registry=manager.registry,
        buffers={
            'default':
            Buffer(returnable=AlwaysOff(),
                   is_multiline=True,
                   initial_document=Document(text, 0)),
            'vim-input':
            Buffer(returnable=AlwaysOff()),
        },
        style=VimStyle,
    )

    # Run interface.
    cli.read_input()