diff options
Diffstat (limited to 'editor.c')
-rw-r--r-- | editor.c | 36 |
1 files changed, 32 insertions, 4 deletions
@@ -7,11 +7,16 @@ #define DEFAULT_EDITOR "vi" #endif +int is_terminal_dumb(void) +{ + const char *terminal = getenv("TERM"); + return !terminal || !strcmp(terminal, "dumb"); +} + const char *git_editor(void) { const char *editor = getenv("GIT_EDITOR"); - const char *terminal = getenv("TERM"); - int terminal_is_dumb = !terminal || !strcmp(terminal, "dumb"); + int terminal_is_dumb = is_terminal_dumb(); if (!editor && editor_program) editor = editor_program; @@ -40,6 +45,23 @@ 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; + int print_waiting_for_editor = advice_waiting_for_editor && isatty(2); + + if (print_waiting_for_editor) { + /* + * A dumb terminal cannot erase the line later on. Add a + * newline to separate the hint from subsequent output. + * + * Make sure that our message is separated with a whitespace + * from further cruft that may be written by the editor. + */ + const char term = is_terminal_dumb() ? '\n' : ' '; + + fprintf(stderr, + _("hint: Waiting for your editor to close the file...%c"), + term); + fflush(stderr); + } p.argv = args; p.env = env; @@ -58,12 +80,18 @@ int launch_editor(const char *path, struct strbuf *buffer, const char *const *en if (ret) return error("There was a problem with the editor '%s'.", editor); + + if (print_waiting_for_editor && !is_terminal_dumb()) + /* + * Go back to the beginning and erase the entire line to + * avoid wasting the vertical space. + */ + fputs("\r\033[K", stderr); } if (!buffer) return 0; if (strbuf_read_file(buffer, path, 0) < 0) - return error("could not read file '%s': %s", - path, strerror(errno)); + return error_errno("could not read file '%s'", path); return 0; } |