summaryrefslogtreecommitdiff
path: root/src/normal.cc
diff options
context:
space:
mode:
authorgeppettodivacin <ericdilmore@gmail.com>2020-01-25 20:02:22 -0600
committergeppettodivacin <ericdilmore@gmail.com>2020-01-26 16:03:03 -0600
commit5596b4b2b9dbc56d106f1cd3d3b09ccdcd28ad88 (patch)
tree38eefbd6bca9d7117386c37f9c1299f584ad15f9 /src/normal.cc
parent2749093143fe5cdbda306569bdb88ff8162486e9 (diff)
Add support for `@` symbols in selection buffer
The selection descriptions use the format `<buffer>@<timestamp>@<main_index>`. This fails when file paths have `@` symbols in them: the parser splits on `@` symbols and finds more values than it expects. We here modify the behavior to require *at least* two @ symbols, using the last two for `<timestamp>` and `<main_index>` and leaving the remaining text for the <buffer>. This should work for any number of `@` symbols, since `<timestamp>` and `<main_index>` are numbers and should never contain `@` symbols.
Diffstat (limited to 'src/normal.cc')
-rw-r--r--src/normal.cc21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/normal.cc b/src/normal.cc
index f9b1184f..2c00fb63 100644
--- a/src/normal.cc
+++ b/src/normal.cc
@@ -1,5 +1,7 @@
#include "normal.hh"
+#include <functional>
+
#include "buffer.hh"
#include "buffer_manager.hh"
#include "buffer_utils.hh"
@@ -1774,11 +1776,20 @@ SelectionList read_selections_from_register(char reg, Context& context)
if (content.size() < 2)
throw runtime_error(format("register '{}' does not contain a selections desc", reg));
- struct error : runtime_error { error(size_t) : runtime_error{"expected <buffer>@<timestamp>@main_index"} {} };
- const auto desc = content[0] | split<StringView>('@') | static_gather<error, 3>();
- Buffer& buffer = BufferManager::instance().get_buffer(desc[0]);
- const size_t timestamp = str_to_int(desc[1]);
- size_t main = str_to_int(desc[2]);
+ // Use the last two values for timestamp and main_index to allow the buffer
+ // name to have @ symbols
+ struct error : runtime_error { error() : runtime_error{"expected <buffer>@<timestamp>@main_index"} {} };
+ const auto desc = content[0] | split<StringView>('@') | gather<Vector>();
+ const size_t desc_size = desc.size();
+ if (desc_size < 3)
+ throw new error;
+ auto const buffer_name_view = desc | drop(2);
+ auto const buffer_name_temp = accumulate (buffer_name_view, ""_str,
+ [](auto str1, auto str2) { return str1 + "@"_str + str2; });
+ auto const buffer_name = buffer_name_temp.substr (CharCount (1));
+ Buffer& buffer = BufferManager::instance().get_buffer(buffer_name);
+ const size_t timestamp = str_to_int(desc[desc_size - 2]);
+ size_t main = str_to_int(desc[desc_size - 1]);
return selection_list_from_strings(buffer, ColumnType::Byte, content | skip(1), timestamp, main);
}