From 115227e61aa4324383890f63998d2c95c1d0695e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 3 Jul 2025 12:14:24 +0530 Subject: [PATCH] Allow simple interaction to pick save file name can type and if no matches are found the typed text is used as the file name with a further opportunity to edit it. --- kittens/choose_files/main.go | 28 ++++++++++++++++++---------- kittens/choose_files/save-file.go | 4 ++-- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/kittens/choose_files/main.go b/kittens/choose_files/main.go index a37484fae..ddbd8b6dc 100644 --- a/kittens/choose_files/main.go +++ b/kittens/choose_files/main.go @@ -292,7 +292,7 @@ func (h *Handler) change_to_current_dir_if_possible() error { func (h *Handler) finish_selection() error { if h.state.mode.CanSelectNonExistent() { - h.initialize_save_file_name() + h.initialize_save_file_name(h.state.suggested_save_file_name) return h.draw_screen() } h.lp.Quit(0) @@ -333,15 +333,17 @@ func (h *Handler) OnKeyEvent(ev *loop.KeyEvent) (err error) { return h.draw_screen() } case ev.MatchesPressOrRepeat("enter"): + m := h.current_abspath() if h.state.mode.SelectFiles() { - m := h.current_abspath() - var s os.FileInfo - if s, err = os.Stat(m); err != nil { - h.lp.Beep() - return nil - } - if s.IsDir() { - return h.change_to_current_dir_if_possible() + if m != "" { + var s os.FileInfo + if s, err = os.Stat(m); err != nil { + h.lp.Beep() + return nil + } + if s.IsDir() { + return h.change_to_current_dir_if_possible() + } } } if h.add_selection_if_possible() { @@ -350,7 +352,13 @@ func (h *Handler) OnKeyEvent(ev *loop.KeyEvent) (err error) { } return h.draw_screen() } else { - h.lp.Beep() + if h.state.mode.CanSelectNonExistent() { + t := h.state.SearchText() + h.initialize_save_file_name(utils.IfElse(t == "", h.state.suggested_save_file_name, t)) + return h.draw_screen() + } else { + h.lp.Beep() + } } } case SAVE_FILE: diff --git a/kittens/choose_files/save-file.go b/kittens/choose_files/save-file.go index 84d047b24..b42330011 100644 --- a/kittens/choose_files/save-file.go +++ b/kittens/choose_files/save-file.go @@ -43,11 +43,11 @@ func (h *Handler) save_file_name_handle_key(ev *loop.KeyEvent) (err error) { return } -func (h *Handler) initialize_save_file_name() { +func (h *Handler) initialize_save_file_name(use_fname_when_no_selections string) { h.state.screen = SAVE_FILE h.rl.ResetText() cdir := h.state.CurrentDir() - fname := h.state.suggested_save_file_name + fname := use_fname_when_no_selections if len(h.state.selections) > 0 { if q, err := filepath.Abs(h.state.selections[0]); err == nil { if s, err := os.Stat(q); err == nil {