From: Junio C Hamano <gitster@xxxxxxxxx> When a graphical GIT_EDITOR is spawned by a Git command that opens and waits for user input (e.g. "git rebase -i"), then the editor window might be obscured by other windows. The user may be left staring at the original Git terminal window without even realizing that s/he needs to interact with another window before Git can proceed. To this user Git appears hanging. Show a message in the original terminal and get rid of it when the editor returns. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> Signed-off-by: Lars Schneider <larsxschneider@xxxxxxxxx> --- Junio posted the original version of this patch [1] as response to my RFC [2]. I took Junio's patch and slightly changed the commit message as well as the message printed to the user after GIT_EDITOR is invoked [3]. Thanks, Lars [1] https://public-inbox.org/git/xmqqr2syvjxb.fsf@xxxxxxxxxxxxxxxxxxxxxxxxxxx/ [2] https://public-inbox.org/git/274B4850-2EB7-4BFA-A42C-25A573254969@xxxxxxxxx/ [3] https://public-inbox.org/git/DAEC36C7-AE09-4C9B-ACC4-07F2C5F2B97F@xxxxxxxxx/ Notes: Base Ref: master Web-Diff: https://github.com/larsxschneider/git/commit/6fd6d8e682 Checkout: git fetch https://github.com/larsxschneider/git editor-v2 && git checkout 6fd6d8e682 editor.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/editor.c b/editor.c index 7519edecdc..23db92d8c6 100644 --- a/editor.c +++ b/editor.c @@ -40,6 +40,32 @@ int launch_editor(const char *path, struct strbuf *buffer, const char *const *en const char *args[] = { editor, real_path(path), NULL }; struct child_process p = CHILD_PROCESS_INIT; int ret, sig; + static const char *close_notice = NULL; + + if (isatty(2) && !close_notice) { + char *term = getenv("TERM"); + + if (term && strcmp(term, "dumb")) + /* + * go back to the beginning and erase the + * entire line if the terminal is capable + * to do so, to avoid wasting the vertical + * space. + */ + close_notice = "\r\033[K"; + else + /* otherwise, complete and waste the line */ + close_notice = "done.\n"; + } + + if (close_notice) { + fprintf( + stderr, + "Launched your editor ('%s'). Adjust, save, and close the " + "file to continue. Waiting for your input... ", editor + ); + fflush(stderr); + } p.argv = args; p.env = env; @@ -53,11 +79,14 @@ int launch_editor(const char *path, struct strbuf *buffer, const char *const *en sig = ret - 128; sigchain_pop(SIGINT); sigchain_pop(SIGQUIT); + if (sig == SIGINT || sig == SIGQUIT) raise(sig); if (ret) return error("There was a problem with the editor '%s'.", editor); + if (close_notice) + fputs(close_notice, stderr); } if (!buffer) base-commit: 89ea799ffcc5c8a0547d3c9075eb979256ee95b8 -- 2.15.0