summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohannes Altmanninger <aclopte@gmail.com>2023-03-09 21:21:29 +0100
committerJohannes Altmanninger <aclopte@gmail.com>2023-03-11 16:21:57 +0100
commit1990a764e3d2ffa77931068f876cd49f76bd43f9 (patch)
tree050b5ef8a116ced85ccb9476cb3c4b0ece311293 /src
parentb2cf74bb4a8286c5a191c54e947c0b2c9bb7cf96 (diff)
Make linewise bracketed paste match P behavior
This is experimental. Testing will reveal if this is the desired behavior.
Diffstat (limited to 'src')
-rw-r--r--src/input_handler.cc12
-rw-r--r--src/normal.cc7
-rw-r--r--src/normal.hh10
3 files changed, 18 insertions, 11 deletions
diff --git a/src/input_handler.cc b/src/input_handler.cc
index a24ddfa2..877517e2 100644
--- a/src/input_handler.cc
+++ b/src/input_handler.cc
@@ -77,13 +77,17 @@ void InputMode::paste(StringView content)
try
{
Buffer& buffer = context().buffer();
+ const bool linewise = not content.empty() and content.back() == '\n';
ScopedEdition edition{context()};
ScopedSelectionEdition selection_edition{context()};
- context().selections().for_each([&buffer, content=std::move(content)]
+ context().selections().for_each([&buffer, content=std::move(content), linewise]
(size_t index, Selection& sel) {
- BufferRange range = buffer.insert(sel.min(), content);
- sel.min() = range.begin;
- sel.max() = range.end > range.begin ? buffer.char_prev(range.end) : range.begin;
+ auto& min = sel.min();
+ auto& max = sel.max();
+ BufferRange range =
+ buffer.insert(paste_pos(buffer, min, max, PasteMode::Insert, linewise), content);
+ min = range.begin;
+ max = range.end > range.begin ? buffer.char_prev(range.end) : range.begin;
}, false);
}
catch (Kakoune::runtime_error& error)
diff --git a/src/normal.cc b/src/normal.cc
index 7dc14382..e3fdee16 100644
--- a/src/normal.cc
+++ b/src/normal.cc
@@ -657,13 +657,6 @@ void change(Context& context, NormalParams params)
enter_insert_mode<InsertMode::Replace>(context, params);
}
-enum class PasteMode
-{
- Append,
- Insert,
- Replace
-};
-
BufferCoord paste_pos(Buffer& buffer, BufferCoord min, BufferCoord max, PasteMode mode, bool linewise)
{
switch (mode)
diff --git a/src/normal.hh b/src/normal.hh
index ad0f81be..080c3d01 100644
--- a/src/normal.hh
+++ b/src/normal.hh
@@ -10,6 +10,7 @@
namespace Kakoune
{
+class Buffer;
class Context;
struct no_selections_remaining : runtime_error
@@ -40,6 +41,15 @@ struct KeyInfo
String build_autoinfo_for_mapping(const Context& context, KeymapMode mode,
ConstArrayView<KeyInfo> built_ins);
+enum class PasteMode
+{
+ Append,
+ Insert,
+ Replace
+};
+
+BufferCoord paste_pos(Buffer& buffer, BufferCoord min, BufferCoord max, PasteMode mode, bool linewise);
+
}
#endif // normal_hh_INCLUDED