summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2012-10-09 19:37:50 +0200
committerMaxime Coste <frrrwww@gmail.com>2012-10-10 13:59:55 +0200
commit74cdeb5952d478ec72b7bee8933d801ef76f2353 (patch)
tree29dda00b6add3e7ed67fd0d5b3184c6dbff55553 /src
parentb48d6399765fa06e6c6723d3df35eb53b1c3148c (diff)
Paste use a linewise mode when pasted string ends with a \n
Diffstat (limited to 'src')
-rw-r--r--src/main.cc36
1 files changed, 31 insertions, 5 deletions
diff --git a/src/main.cc b/src/main.cc
index 7978a289..3e8144c5 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -162,17 +162,43 @@ void do_change(Context& context)
do_insert<InsertMode::Replace>(context);
}
-// todo linewise paste
+static InsertMode adapt_for_linewise(InsertMode mode)
+{
+ if (mode == InsertMode::Append)
+ return InsertMode::AppendAtLineEnd;
+ if (mode == InsertMode::Insert)
+ return InsertMode::InsertAtLineBegin;
+
+ assert(false);
+ return InsertMode::Insert;
+}
+
template<InsertMode insert_mode>
void do_paste(Context& context)
{
Editor& editor = context.editor();
int count = context.numeric_param();
- Register& reg = RegisterManager::instance()['"'];
+ auto strings = RegisterManager::instance()['"'].values(context);
+ InsertMode mode = insert_mode;
if (count == 0)
- editor.insert(reg.values(context), insert_mode);
- else
- editor.insert(reg.values(context)[count-1], insert_mode);
+ {
+ for (auto& str : strings)
+ {
+ if (not str.empty() and str.back() == '\n')
+ {
+ mode = adapt_for_linewise(mode);
+ break;
+ }
+ }
+ editor.insert(strings, mode);
+ }
+ else if (count <= strings.size())
+ {
+ auto& str = strings[count-1];
+ if (not str.empty() and str.back() == '\n')
+ mode = adapt_for_linewise(mode);
+ editor.insert(str, mode);
+ }
}
void do_select_regex(Context& context)