Skip to content

Instantly share code, notes, and snippets.

@misfo
Created December 1, 2009 04:57
Show Gist options
  • Save misfo/246069 to your computer and use it in GitHub Desktop.
Save misfo/246069 to your computer and use it in GitHub Desktop.
package net.sourceforge.vrapper.vim.commands;
import net.sourceforge.vrapper.platform.TextContent;
import net.sourceforge.vrapper.utils.ContentType;
import net.sourceforge.vrapper.utils.LineInformation;
import net.sourceforge.vrapper.utils.Position;
import net.sourceforge.vrapper.utils.TextRange;
import net.sourceforge.vrapper.utils.VimUtils;
import net.sourceforge.vrapper.vim.EditorAdaptor;
import net.sourceforge.vrapper.vim.register.RegisterContent;
public class PasteOperation extends SimpleTextOperation {
public static final PasteOperation INSTANCE = new PasteOperation();
private PasteOperation() { /* NOP */ }
@Override
public void execute(EditorAdaptor editorAdaptor, TextRange region, ContentType contentType) {
try {
editorAdaptor.getHistory().beginCompoundChange();
doIt(editorAdaptor, region, contentType);
} finally {
editorAdaptor.getHistory().endCompoundChange();
}
}
public TextOperation repetition() {
return this;
}
public static void doIt(EditorAdaptor editorAdaptor, TextRange range, ContentType contentType) {
RegisterContent registerContent = editorAdaptor.getRegisterManager().getActiveRegister().getContent();
String text = registerContent.getText();
TextContent content = editorAdaptor.getModelContent();
int offset = range.getLeftBound().getModelOffset();
DeleteOperation.doIt(editorAdaptor, range, contentType);
int position;
if (registerContent.getPayloadType() == ContentType.LINES) {
text = "\n" + text;
content.replace(offset, 0, text);
LineInformation firstPastedLine = content.getLineInformationOfOffset(offset + 1);
position = VimUtils.getFirstNonWhiteSpaceOffset(content, firstPastedLine);
} else {
position = offset + text.length() - 1;
content.replace(offset, 0, text);
}
// content.replace(offset, 0, StringUtils.multiply(text, count));
// TODO: compatibility option: position vs. offset for destination
Position destination = editorAdaptor.getCursorService().newPositionForModelOffset(position);
editorAdaptor.setPosition(destination, true);
}
}
@Test public void testPastingInVisualMode() {
defaultRegister.setContent(new StringRegisterContent(ContentType.TEXT, "a series of tubes"));
checkCommand(forKeySeq("p"),
false, "The internet is ","awesome","!",
false, "The internet is a series of tube","","s!");
verify(adaptor).changeMode(NormalMode.NAME);
assertYanked(ContentType.TEXT, "awesome");
defaultRegister.setContent(new StringRegisterContent(ContentType.LINES, "\t\ta series of tubes\n"));
checkCommand(forKeySeq("p"),
true, "The internet is ","awesome","!",
true, "The internet is \n\t\t","","a series of tubes\n!");
verify(adaptor, times(2)).changeMode(NormalMode.NAME);
assertYanked(ContentType.TEXT, "awesome");
defaultRegister.setContent(new StringRegisterContent(ContentType.LINES, "a series of tubes\n"));
checkCommand(forKeySeq("p"),
false, "The internet is \n","awesome\n","!",
false, "The internet is \n","","a series of tubes\n!");
verify(adaptor, times(3)).changeMode(NormalMode.NAME);
assertYanked(ContentType.LINES, "awesome\n");
defaultRegister.setContent(new StringRegisterContent(ContentType.TEXT, "a series of tubes"));
checkCommand(forKeySeq("p"),
false, "The internet is \n","awesome\n","!",
false, "The internet is \n","","a series of tubes\n!");
verify(adaptor, times(4)).changeMode(NormalMode.NAME);
assertYanked(ContentType.LINES, "awesome\n");
defaultRegister.setContent(new StringRegisterContent(ContentType.TEXT, "a series of tubes"));
checkCommand(forKeySeq("2p"),
false, "The internet is ","awesome","!",
false, "The internet is a series of tubesa series of tube","","s!");
verify(adaptor).changeMode(NormalMode.NAME);
assertYanked(ContentType.TEXT, "awesome");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment