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()