Implement save via ^O (has a filename prompt)
This commit is contained in:
15
babi.py
15
babi.py
@@ -266,15 +266,17 @@ class Status:
|
||||
*,
|
||||
history: Optional[str] = None,
|
||||
default_prev: bool = False,
|
||||
default: Optional[str] = None,
|
||||
) -> Optional[str]:
|
||||
self.clear()
|
||||
default = default or ''
|
||||
if history is not None:
|
||||
lst = [*self._history[history], '']
|
||||
lst = [*self._history[history], default]
|
||||
lst_pos = len(lst) - 1
|
||||
if default_prev and history in self._history_prev:
|
||||
prompt = f'{prompt} [{self._history_prev[history]}]'
|
||||
else:
|
||||
lst = ['']
|
||||
lst = [default]
|
||||
lst_pos = 0
|
||||
pos = 0
|
||||
|
||||
@@ -1324,6 +1326,15 @@ def _edit(screen: Screen) -> EditResult:
|
||||
screen.status.update(f'invalid command: {response}')
|
||||
elif key.keyname == b'^S':
|
||||
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':
|
||||
return EditResult.EXIT
|
||||
elif key.keyname == b'kLFT3':
|
||||
|
||||
@@ -101,3 +101,35 @@ def test_save_file_when_it_did_not_exist(tmpdir):
|
||||
h.await_text_missing('*')
|
||||
|
||||
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')
|
||||
|
||||
Reference in New Issue
Block a user