Created
December 1, 2009 04:57
-
-
Save misfo/246069 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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