class VehicleTab(): """ A tab holding the input and output buffers for a vehicle """ def __init__(self, name, cmdProcessor): self.prompt = BeforeInput('MAV>') self.input = Buffer(multiline=False, accept_handler=self.handle_action) self.output = Buffer(multiline=True) self.active = False self.name = name self.cmdCallback = cmdProcessor def handle_action(self, buff): """ Handles any commands from prompt for this vehicle """ # Process command? self.cmdCallback(self.name, buff.text) def output_text(self, text: str): """ Send text to output """ self.output.insert_text(self.prompt.text + str(text) + '\n') def changePrompt(self, prompt: str): """ Change the prompt (mode) """ self.prompt = BeforeInput(prompt + ">")
def expand(self, buffer: Buffer) -> bool: """expand the given abbr text. Return true if cursor position changed.""" if not abbrevs: return False document = buffer.document word = document.get_word_before_cursor(WORD=True) if word in abbrevs.keys(): partial = document.text[:document.cursor_position] startix, endix, quote = check_for_partial_string(partial) if startix is not None and endix is None: return False text = get_abbreviated(word, buffer) buffer.delete_before_cursor(count=len(word)) buffer.insert_text(text) self.last_expanded = _LastExpanded(word, text) if EDIT_SYMBOL in text: set_cursor_position(buffer, text) return True return False
class BufferTest(unittest.TestCase): def setUp(self): self.buffer = Buffer() def test_initial(self): self.assertEqual(self.buffer.text, '') self.assertEqual(self.buffer.cursor_position, 0) def test_insert_text(self): self.buffer.insert_text('some_text') self.assertEqual(self.buffer.text, 'some_text') self.assertEqual(self.buffer.cursor_position, len('some_text')) def test_cursor_movement(self): self.buffer.insert_text('some_text') self.buffer.cursor_left() self.buffer.cursor_left() self.buffer.cursor_left() self.buffer.cursor_right() self.buffer.insert_text('A') self.assertEqual(self.buffer.text, 'some_teAxt') self.assertEqual(self.buffer.cursor_position, len('some_teA')) def test_backspace(self): self.buffer.insert_text('some_text') self.buffer.cursor_left() self.buffer.cursor_left() self.buffer.delete_before_cursor() self.assertEqual(self.buffer.text, 'some_txt') self.assertEqual(self.buffer.cursor_position, len('some_t')) def test_cursor_up(self): # Cursor up to a line thats longer. self.buffer.insert_text('long line1\nline2') self.buffer.cursor_up() self.assertEqual(self.buffer.document.cursor_position, 5) # Going up when already at the top. self.buffer.cursor_up() self.assertEqual(self.buffer.document.cursor_position, 5) # Going up to a line that's shorter. self.buffer.reset() self.buffer.insert_text('line1\nlong line2') self.buffer.cursor_up() self.assertEqual(self.buffer.document.cursor_position, 5) def test_cursor_down(self): self.buffer.insert_text('line1\nline2') self.buffer.cursor_position = 3 # Normally going down self.buffer.cursor_down() self.assertEqual(self.buffer.document.cursor_position, len('line1\nlin')) # Going down to a line that's storter. self.buffer.reset() self.buffer.insert_text('long line1\na\nb') self.buffer.cursor_position = 3 self.buffer.cursor_down() self.assertEqual(self.buffer.document.cursor_position, len('long line1\na')) def test_join_next_line(self): self.buffer.insert_text('line1\nline2\nline3') self.buffer.cursor_up() self.buffer.join_next_line() self.assertEqual(self.buffer.text, 'line1\nline2 line3') # Test when there is no '\n' in the text self.buffer.reset() self.buffer.insert_text('line1') self.buffer.cursor_position = 0 self.buffer.join_next_line() self.assertEqual(self.buffer.text, 'line1') def test_newline(self): self.buffer.insert_text('hello world') self.buffer.newline() self.assertEqual(self.buffer.text, 'hello world\n') def test_swap_characters_before_cursor(self): self.buffer.insert_text('hello world') self.buffer.cursor_left() self.buffer.cursor_left() self.buffer.swap_characters_before_cursor() self.assertEqual(self.buffer.text, 'hello wrold')
def _wrapper(text): buf = Buffer() buf.insert_text(text) return buf
class BufferTest(unittest.TestCase): def setUp(self): self.buffer = Buffer() def test_initial(self): self.assertEqual(self.buffer.text, '') self.assertEqual(self.buffer.cursor_position, 0) def test_insert_text(self): self.buffer.insert_text('some_text') self.assertEqual(self.buffer.text, 'some_text') self.assertEqual(self.buffer.cursor_position, len('some_text')) def test_cursor_movement(self): self.buffer.insert_text('some_text') self.buffer.cursor_left() self.buffer.cursor_left() self.buffer.cursor_left() self.buffer.cursor_right() self.buffer.insert_text('A') self.assertEqual(self.buffer.text, 'some_teAxt') self.assertEqual(self.buffer.cursor_position, len('some_teA')) def test_backspace(self): self.buffer.insert_text('some_text') self.buffer.cursor_left() self.buffer.cursor_left() self.buffer.delete_before_cursor() self.assertEqual(self.buffer.text, 'some_txt') self.assertEqual(self.buffer.cursor_position, len('some_t')) def test_cursor_up(self): # Cursor up to a line thats longer. self.buffer.insert_text('long line1\nline2') self.buffer.cursor_up() self.assertEqual(self.buffer.document.cursor_position, 5) # Going up when already at the top. self.buffer.cursor_up() self.assertEqual(self.buffer.document.cursor_position, 5) # Going up to a line that's shorter. self.buffer.reset() self.buffer.insert_text('line1\nlong line2') self.buffer.cursor_up() self.assertEqual(self.buffer.document.cursor_position, 5) def test_cursor_down(self): self.buffer.insert_text('line1\nline2') self.buffer.cursor_position = 3 # Normally going down self.buffer.cursor_down() self.assertEqual(self.buffer.document.cursor_position, len('line1\nlin')) # Going down to a line that's storter. self.buffer.reset() self.buffer.insert_text('long line1\na\nb') self.buffer.cursor_position = 3 self.buffer.cursor_down() self.assertEqual(self.buffer.document.cursor_position, len('long line1\na')) def test_join_next_line(self): self.buffer.insert_text('line1\nline2\nline3') self.buffer.cursor_up() self.buffer.join_next_line() self.assertEqual(self.buffer.text, 'line1\nline2line3') # Test when there is no '\n' in the text self.buffer.reset() self.buffer.insert_text('line1') self.buffer.cursor_position = 0 self.buffer.join_next_line() self.assertEqual(self.buffer.text, 'line1') def test_newline(self): self.buffer.insert_text('hello world') self.buffer.newline() self.assertEqual(self.buffer.text, 'hello world\n') def test_swap_characters_before_cursor(self): self.buffer.insert_text('hello world') self.buffer.cursor_left() self.buffer.cursor_left() self.buffer.swap_characters_before_cursor() self.assertEqual(self.buffer.text, 'hello wrold')
#!/usr/bin/env python from prompt_toolkit import Application from prompt_toolkit.buffer import Buffer from prompt_toolkit.layout.containers import HSplit, Window from prompt_toolkit.layout.controls import BufferControl, FormattedTextControl from prompt_toolkit.layout.layout import Layout from prompt_toolkit.key_binding import KeyBindings buffer2 = Buffer(read_only=False) # Read-only buffer buffer2.insert_text('Hello World\n') def enter_cmd(cmd): buffer2.insert_text(cmd.document.text) buffer2.insert_text('\n') return False buffer1 = Buffer(multiline=False, accept_handler=enter_cmd) # Editable buffer. root_container = HSplit([ # Display the text 'Hello world' on the right. Window(height=1, content=BufferControl(buffer=buffer1)), # A vertical line in the middle. We explicitly specify the width, to # make sure that the layout engine will not try to divide the whole # width by three for all these windows. The window will simply fill its # content by repeating this character. Window(height=1, char='-'),