From 4f103d74fb6b34e82899f8f3facae1ddae45f1bf Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Tue, 28 Apr 2020 11:49:26 -0700 Subject: [PATCH] Do not emit newline when running commands if the cursor is on its own line If the cursor has been wrapped to the last line, and is the only thing on that line, do not emit a newline when executing a command. Fixes #6826 --- src/reader.cpp | 6 +++++- src/screen.cpp | 7 +++++++ src/screen.h | 4 ++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/reader.cpp b/src/reader.cpp index 1a29e8f87..b54af88c4 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -3581,7 +3581,11 @@ maybe_t reader_data_t::readline(int nchars_or_0) { repaint_if_needed(); } - ignore_result(write(STDOUT_FILENO, "\n", 1)); + // Emit a newline so that the output is on the line after the command. + // But do not emit a newline if the cursor has wrapped onto a new line all its own - see #6826. + if (!screen.cursor_is_wrapped_to_own_line()) { + ignore_result(write(STDOUT_FILENO, "\n", 1)); + } // Ensure we have no pager contents when we exit. if (!pager.empty()) { diff --git a/src/screen.cpp b/src/screen.cpp index 72d66fef3..821831500 100644 --- a/src/screen.cpp +++ b/src/screen.cpp @@ -1222,3 +1222,10 @@ void screen_force_clear_to_end() { } screen_t::screen_t() : outp_(outputter_t::stdoutput()) {} + +bool screen_t::cursor_is_wrapped_to_own_line() const { + // Note == comparison against the line count is correct: we do not create a line just for the + // cursor. If there is a line containing the cursor, then it means that line has contents and we + // should return false. + return actual.cursor.x == 0 && static_cast(actual.cursor.y) == actual.line_count(); +} diff --git a/src/screen.h b/src/screen.h index ba750cf3a..612827241 100644 --- a/src/screen.h +++ b/src/screen.h @@ -154,6 +154,10 @@ class screen_t { /// \return the outputter for this screen. outputter_t &outp() { return outp_; } + + /// \return whether we believe the cursor is wrapped onto the last line, and that line is + /// otherwise empty. This includes both soft and hard wrapping. + bool cursor_is_wrapped_to_own_line() const; }; /// This is the main function for the screen putput library. It is used to define the desired