Do not insert any end-of-line when piping data out

This will unfortunately break some use case which will require
using wrapper scripts to add the necessary newline. It is however
harder to do the contrary, and it makes a lot of other use case
possible, such as checksuming.

Fixes #3669
This commit is contained in:
Maxime Coste 2022-01-24 21:48:51 +11:00
parent 00080f8337
commit 6f135c0c8e
5 changed files with 9 additions and 10 deletions

View File

@ -44,6 +44,9 @@ struct {
unsigned int version;
StringView notes;
} constexpr version_notes[] = { {
0,
"» pipe commands do not append final end-of-lines anymore\n"
}, {
20211107,
"» colored and curly underlines support (undocumented in 20210828)\n"
}, {

View File

@ -582,10 +582,6 @@ void pipe(Context& context, NormalParams params)
const auto end = changes_tracker.get_new_coord_tolerant(sel.max());
String in = buffer.string(beg, buffer.char_next(end));
const bool insert_eol = in.back() != '\n';
if (insert_eol)
in += '\n';
// Needed in case we read selections inside the cmdline
context.selections_write_only().set({keep_direction(Selection{beg, end}, sel)}, 0);
@ -593,12 +589,9 @@ void pipe(Context& context, NormalParams params)
cmdline, context, in,
ShellManager::Flags::WaitForStdout).first;
if (insert_eol)
{
in.resize(in.length()-1, 0);
if (not out.empty() and out.back() == '\n')
out.resize(out.length()-1, 0);
}
if (in.back() != '\n' and not out.empty() and out.back() == '\n')
out.resize(out.length()-1, 0);
auto new_end = apply_diff(buffer, beg, in, out);
if (new_end != beg)
new_sels.push_back(keep_direction({beg, buffer.char_prev(new_end), std::move(sel.captures())}, sel));

View File

@ -0,0 +1 @@
|cksum<ret>

View File

@ -0,0 +1 @@
%(foo)

View File

@ -0,0 +1 @@
2470157969 3