Implement save via ^O (has a filename prompt)

This commit is contained in:
Anthony Sottile
2019-12-20 23:00:48 -08:00
parent 5251d7e9d1
commit 98f19ca6b2
2 changed files with 45 additions and 2 deletions

15
babi.py
View File

@@ -266,15 +266,17 @@ class Status:
*, *,
history: Optional[str] = None, history: Optional[str] = None,
default_prev: bool = False, default_prev: bool = False,
default: Optional[str] = None,
) -> Optional[str]: ) -> Optional[str]:
self.clear() self.clear()
default = default or ''
if history is not None: if history is not None:
lst = [*self._history[history], ''] lst = [*self._history[history], default]
lst_pos = len(lst) - 1 lst_pos = len(lst) - 1
if default_prev and history in self._history_prev: if default_prev and history in self._history_prev:
prompt = f'{prompt} [{self._history_prev[history]}]' prompt = f'{prompt} [{self._history_prev[history]}]'
else: else:
lst = [''] lst = [default]
lst_pos = 0 lst_pos = 0
pos = 0 pos = 0
@@ -1324,6 +1326,15 @@ def _edit(screen: Screen) -> EditResult:
screen.status.update(f'invalid command: {response}') screen.status.update(f'invalid command: {response}')
elif key.keyname == b'^S': elif key.keyname == b'^S':
screen.file.save(screen, screen.status) screen.file.save(screen, screen.status)
elif key.keyname == b'^O':
response = screen.status.prompt(
screen, 'enter filename', default=screen.file.filename,
)
if not response:
screen.status.update('cancelled')
else:
screen.file.filename = response
screen.file.save(screen, screen.status)
elif key.keyname == b'^X': elif key.keyname == b'^X':
return EditResult.EXIT return EditResult.EXIT
elif key.keyname == b'kLFT3': elif key.keyname == b'kLFT3':

View File

@@ -101,3 +101,35 @@ def test_save_file_when_it_did_not_exist(tmpdir):
h.await_text_missing('*') h.await_text_missing('*')
assert f.read() == 'hello world\n' assert f.read() == 'hello world\n'
def test_save_via_ctrl_o(tmpdir):
f = tmpdir.join('f')
with run(str(f)) as h, and_exit(h):
h.press('hello world')
h.press('^O')
h.await_text(f'enter filename: {f}')
h.press('Enter')
h.await_text('saved! (1 line written)')
assert f.read() == 'hello world\n'
def test_save_via_ctrl_o_set_filename(tmpdir):
f = tmpdir.join('f')
with run() as h, and_exit(h):
h.press('hello world')
h.press('^O')
h.await_text('enter filename:')
h.press_and_enter(str(f))
h.await_text('saved! (1 line written)')
assert f.read() == 'hello world\n'
@pytest.mark.parametrize('key', ('^C', 'Enter'))
def test_save_via_ctrl_o_cancelled(tmpdir, key):
with run() as h, and_exit(h):
h.press('hello world')
h.press('^O')
h.await_text('enter filename:')
h.press(key)
h.await_text('cancelled')