summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-05-02 18:58:04 +0100
committerMaxime Coste <frrrwww@gmail.com>2014-05-02 18:58:04 +0100
commite83123de1f24667afbf52c78b9743e251bdef952 (patch)
tree07b54b4259c49cb6ce2a7e61b83d7683cb7fd628
parent26dd21706edcb63459715dc4e1a078c2a0b9c0de (diff)
Add support for non-scrolling fifo buffers
-rw-r--r--rc/grep.kak2
-rw-r--r--rc/make.kak2
-rw-r--r--src/buffer_utils.cc21
-rw-r--r--src/buffer_utils.hh2
-rw-r--r--src/commands.cc9
5 files changed, 25 insertions, 11 deletions
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
};