diff --git a/rc/grep.kak b/rc/grep.kak index 3f9ec56e..728dce76 100644 --- a/rc/grep.kak +++ b/rc/grep.kak @@ -12,7 +12,7 @@ def -shell-params -file-completion \ fi echo "eval -try-client '$kak_opt_toolsclient' %{ - edit! -fifo ${output} *grep* + edit! -fifo ${output} -scroll *grep* set buffer filetype grep hook buffer BufClose .* %{ nop %sh{ rm -r $(dirname ${output}) } } }" diff --git a/rc/make.kak b/rc/make.kak index 43219e04..c020a4e0 100644 --- a/rc/make.kak +++ b/rc/make.kak @@ -7,7 +7,7 @@ def -shell-params make %{ %sh{ ( eval ${kak_opt_makecmd} "$@" > ${output} 2>&1 ) > /dev/null 2>&1 < /dev/null & echo "eval -try-client '$kak_opt_toolsclient' %{ - edit! -fifo ${output} *make* + edit! -fifo ${output} -scroll *make* set buffer filetype make hook buffer BufClose .* %{ nop %sh{ rm -r $(dirname ${output}) } } }" diff --git a/src/buffer_utils.cc b/src/buffer_utils.cc index 7e8f3da4..1ed1a836 100644 --- a/src/buffer_utils.cc +++ b/src/buffer_utils.cc @@ -22,16 +22,29 @@ CharCount get_column(const Buffer& buffer, return col; } -Buffer* create_fifo_buffer(String name, int fd) +Buffer* create_fifo_buffer(String name, int fd, bool scroll) { Buffer* buffer = new Buffer(std::move(name), Buffer::Flags::Fifo | Buffer::Flags::NoUndo); - auto watcher = new FDWatcher(fd, [buffer](FDWatcher& watcher) { + auto watcher = new FDWatcher(fd, [buffer, scroll](FDWatcher& watcher) { constexpr size_t buffer_size = 1024 * 16; char data[buffer_size]; ssize_t count = read(watcher.fd(), data, buffer_size); - buffer->insert(buffer->end()-1, count > 0 ? String(data, data+count) - : "*** kak: fifo closed ***\n"); + auto pos = buffer->end()-1; + + bool prevent_scrolling = pos == buffer->begin() and not scroll; + if (prevent_scrolling) + ++pos; + + buffer->insert(pos, count > 0 ? String(data, data+count) + : "*** kak: fifo closed ***\n"); + + if (prevent_scrolling) + { + buffer->erase(buffer->begin(), buffer->begin()+1); + buffer->insert(buffer->end(), "\n"); + } + if (count <= 0) { kak_assert(buffer->flags() & Buffer::Flags::Fifo); diff --git a/src/buffer_utils.hh b/src/buffer_utils.hh index bd08d9b3..ba295821 100644 --- a/src/buffer_utils.hh +++ b/src/buffer_utils.hh @@ -41,7 +41,7 @@ inline void avoid_eol(const Buffer& buffer, Selection& sel) CharCount get_column(const Buffer& buffer, CharCount tabstop, BufferCoord coord); -Buffer* create_fifo_buffer(String name, int fd); +Buffer* create_fifo_buffer(String name, int fd, bool scroll = false); } diff --git a/src/commands.cc b/src/commands.cc index 2523d0c0..714736bd 100644 --- a/src/commands.cc +++ b/src/commands.cc @@ -46,7 +46,7 @@ Buffer* open_or_create(const String& filename, Context& context) return buffer; } -Buffer* open_fifo(const String& name , const String& filename) +Buffer* open_fifo(const String& name , const String& filename, bool scroll) { int fd = open(parse_filename(filename).c_str(), O_RDONLY); fcntl(fd, F_SETFD, FD_CLOEXEC); @@ -55,7 +55,7 @@ Buffer* open_fifo(const String& name , const String& filename) BufferManager::instance().delete_buffer_if_exists(name); - return create_fifo_buffer(std::move(name), fd); + return create_fifo_buffer(std::move(name), fd, scroll); } const PerArgumentCommandCompleter filename_completer({ @@ -111,7 +111,7 @@ void edit(const ParametersParser& parser, Context& context) buffer = new Buffer(name, Buffer::Flags::None); } else if (parser.has_option("fifo")) - buffer = open_fifo(name, parser.option_value("fifo")); + buffer = open_fifo(name, parser.option_value("fifo"), parser.has_option("scroll")); else buffer = open_or_create(name, context); } @@ -139,7 +139,8 @@ void edit(const ParametersParser& parser, Context& context) ParameterDesc edit_params{ SwitchMap{ { "scratch", { false, "create a scratch buffer, not linked to a file" } }, - { "fifo", { true, "create a buffer reading its content from a named fifo" } } }, + { "fifo", { true, "create a buffer reading its content from a named fifo" } }, + { "scroll", { false, "place the initial cursor so that the fifo will scroll to show new data" } } }, ParameterDesc::Flags::None, 1, 3 };