From 3e77e7b65f5645db66c146141ae70ce822802c91 Mon Sep 17 00:00:00 2001 From: Pete Gleeson Date: Mon, 25 Apr 2016 15:43:26 +1000 Subject: [PATCH 1/6] copy to clipboard on delete --- package.json | 1 + src/textEditor.ts | 2 ++ test/textEditor.test.ts | 12 ++++++++++++ 3 files changed, 15 insertions(+) diff --git a/package.json b/package.json index fcd1e69124c..b30faf0ea0b 100644 --- a/package.json +++ b/package.json @@ -147,6 +147,7 @@ "postinstall": "node ./node_modules/vscode/bin/install && gulp init" }, "dependencies": { + "copy-paste": "^1.1.4", "lodash": "^4.5.1" }, "devDependencies": { diff --git a/src/textEditor.ts b/src/textEditor.ts index 9fc9209cec7..163c4af64e7 100644 --- a/src/textEditor.ts +++ b/src/textEditor.ts @@ -1,6 +1,7 @@ "use strict"; import * as vscode from "vscode"; +import {copy} from "copy-paste"; export class TextEditor { static async insert(text: string): Promise { @@ -16,6 +17,7 @@ export class TextEditor { } static async delete(range: vscode.Range): Promise { + copy(vscode.window.activeTextEditor.document.getText(range)); return vscode.window.activeTextEditor.edit(editBuilder => { editBuilder.delete(range); }); diff --git a/test/textEditor.test.ts b/test/textEditor.test.ts index 6cab76fa09f..714b1bae45c 100644 --- a/test/textEditor.test.ts +++ b/test/textEditor.test.ts @@ -2,6 +2,7 @@ import * as assert from 'assert'; import * as vscode from 'vscode'; +import {paste} from "copy-paste"; import {TextEditor} from './../src/textEditor'; import {setupWorkspace, cleanUpWorkspace} from './testUtils'; @@ -59,4 +60,15 @@ suite("text editor", () => { assert.throws(() => TextEditor.readLineAt(1), RangeError); assert.throws(() => TextEditor.readLineAt(2), RangeError); }); + + test("delete should copy to clipboard", async () => { + const expectedText = "Hello World"; + await TextEditor.insert(expectedText); + + const range = vscode.window.activeTextEditor.document.lineAt(0).range; + + await TextEditor.delete(range); + const actualText = paste(); + assert.equal(actualText, expectedText); + }); }); From 3bacebb3979f65c5c95d4d00d500158e93230750 Mon Sep 17 00:00:00 2001 From: Pete Gleeson Date: Mon, 25 Apr 2016 22:24:49 +1000 Subject: [PATCH 2/6] added put operator with tests --- src/mode/modeNormal.ts | 2 ++ src/mode/modeVisual.ts | 2 +- src/operator/put.ts | 33 +++++++++++++++++++++ test/operator/put.test.ts | 61 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 src/operator/put.ts create mode 100644 test/operator/put.test.ts diff --git a/src/mode/modeNormal.ts b/src/mode/modeNormal.ts index 7416b4aa10a..989d5ef61cf 100644 --- a/src/mode/modeNormal.ts +++ b/src/mode/modeNormal.ts @@ -9,6 +9,7 @@ import {Motion, MotionMode} from './../motion/motion'; import {ModeHandler} from './modeHandler'; import {DeleteOperator} from './../operator/delete'; import {ChangeOperator} from './../operator/change'; +import {PutOperator} from './../operator/put'; import {TextEditor} from './../textEditor'; export class NormalMode extends Mode { @@ -136,6 +137,7 @@ export class NormalMode extends Mode { return {}; }, "X" : async (m) => { return vscode.commands.executeCommand("deleteLeft"); }, + "p" : async (m) => { await new PutOperator(this._modeHandler).run(m.position, null);}, "esc": async () => { return vscode.commands.executeCommand("workbench.action.closeMessages"); } }; diff --git a/src/mode/modeVisual.ts b/src/mode/modeVisual.ts index c38d9ae07f1..6a8632d10c4 100644 --- a/src/mode/modeVisual.ts +++ b/src/mode/modeVisual.ts @@ -35,7 +35,7 @@ export class VisualMode extends Mode { // simply allow the operators to say what mode they transition into. 'd': new DeleteOperator(modeHandler), 'x': new DeleteOperator(modeHandler), - 'c': new ChangeOperator(modeHandler) + 'c': new ChangeOperator(modeHandler), }; } diff --git a/src/operator/put.ts b/src/operator/put.ts new file mode 100644 index 00000000000..4dbef2220f6 --- /dev/null +++ b/src/operator/put.ts @@ -0,0 +1,33 @@ +"use strict"; + +import { paste } from 'copy-paste'; +import { Position } from './../motion/position'; +import { Operator } from './operator'; +import { ModeHandler } from './../mode/modeHandler.ts'; +import { TextEditor } from './../textEditor'; + +export class PutOperator extends Operator { + + constructor(modeHandler: ModeHandler) { + super(modeHandler); + } + + public key(): string { return "p"; } + + /** + * Run this operator on a range. + */ + public async run(start: Position, end: Position): Promise { + return new Promise((resolve, reject) => { + paste(async (err, data) => { + if (err) { + reject(); + } else { + await TextEditor.insertAt(data, start.getRight()); + this.modeHandler.currentMode.motion.moveTo(start.line, start.getRight().character); + resolve(); + } + }) + }); + } +} \ No newline at end of file diff --git a/test/operator/put.test.ts b/test/operator/put.test.ts new file mode 100644 index 00000000000..63eefb4189f --- /dev/null +++ b/test/operator/put.test.ts @@ -0,0 +1,61 @@ +"use strict"; + +import * as assert from 'assert'; +import * as vscode from 'vscode'; +import { copy, paste } from "copy-paste"; +import { ModeHandler } from "../../src/mode/modeHandler"; +import { PutOperator } from "../../src/operator/put"; +import { TextEditor } from '../../src/textEditor'; +import { Position, PositionOptions } from "../../src/motion/position"; +import { setupWorkspace, cleanUpWorkspace } from '../testUtils'; + +suite("put operator", () => { + suiteSetup(setupWorkspace); + + suiteTeardown(cleanUpWorkspace); + + test("put 'the dog' into empty file", async () => { + const expectedText = "the dog"; + const position = new Position(0, 0, PositionOptions.CharacterWiseExclusive); + const mode = new ModeHandler(); + const put = new PutOperator(mode); + copy(expectedText); + + await put.run(position, position); + + const actualText = TextEditor.readLineAt(0); + const cursorPosition = vscode.window.activeTextEditor.selection.active; + assert.equal(actualText, expectedText, + "did not paste expected content"); + assert.equal(cursorPosition.line, position.getRight().line, + "cursor should be on the same line"); + assert.equal(cursorPosition.character, position.getRight().character, + "cursor should be on start of put content"); + }); + + test("put ' brown' into 'the dog'", async () => { + const phrase = "brown "; + const expectedText = `the ${phrase}dog`; + const position = new Position(0, 3, PositionOptions.CharacterWiseExclusive); + const mode = new ModeHandler(); + const put = new PutOperator(mode); + copy(phrase); + + // using ^ to show the cusor position + // before : the dog + // ^ + // after : the brown dog + // ^ + + await put.run(position, position); + + const actualText = TextEditor.readLineAt(0); + const cursorPosition = vscode.window.activeTextEditor.selection.active; + assert.equal(actualText, expectedText, + "did not paste expected content"); + assert.equal(cursorPosition.line, position.getRight().line, + "cursor should be on the same line"); + assert.equal(cursorPosition.character, position.getRight().character, + "cursor should be on start of put content"); + }); +}); \ No newline at end of file From 6032bb31620071372d60ddce20efbbd4fe2a4a07 Mon Sep 17 00:00:00 2001 From: Pete Gleeson Date: Wed, 27 Apr 2016 10:06:33 +1000 Subject: [PATCH 3/6] fixed package.json conflict --- package.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/package.json b/package.json index 9329b3be3ed..c123198cd14 100644 --- a/package.json +++ b/package.json @@ -147,13 +147,8 @@ "postinstall": "node ./node_modules/vscode/bin/install && gulp init" }, "dependencies": { -<<<<<<< HEAD - "copy-paste": "^1.1.4", - "lodash": "^4.5.1" -======= "lodash": "^4.5.1", "copy-paste": "^1.1.4" ->>>>>>> 602a4df29b45e6963a5bdbaa9fe2024759dc564c }, "devDependencies": { "gulp": "^3.9.1", From 312a4f7930200260df224507bdda637cf191c32d Mon Sep 17 00:00:00 2001 From: Pete Gleeson Date: Thu, 28 Apr 2016 22:05:10 +1000 Subject: [PATCH 4/6] fixed build errors by adding types for copy-paste module --- src/mode/modeNormal.ts | 5 ++++- typings.json | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/mode/modeNormal.ts b/src/mode/modeNormal.ts index 989d5ef61cf..76adbb07268 100644 --- a/src/mode/modeNormal.ts +++ b/src/mode/modeNormal.ts @@ -137,7 +137,10 @@ export class NormalMode extends Mode { return {}; }, "X" : async (m) => { return vscode.commands.executeCommand("deleteLeft"); }, - "p" : async (m) => { await new PutOperator(this._modeHandler).run(m.position, null);}, + "p" : async (m) => { + await new PutOperator(this._modeHandler).run(m.position, null); + return {}; + }, "esc": async () => { return vscode.commands.executeCommand("workbench.action.closeMessages"); } }; diff --git a/typings.json b/typings.json index c7b32686740..822376c0afd 100644 --- a/typings.json +++ b/typings.json @@ -1,6 +1,7 @@ { "name": "vim", "ambientDependencies": { + "copy-paste": "registry:dt/copy-paste#1.1.3+20160117130525", "lodash": "github:DefinitelyTyped/DefinitelyTyped/lodash/lodash.d.ts#7b7aa2027a8fb6219a8bcf1b6bb12bcd0ff9539d" } } From 4b43f51e8e54b3d2422ad25239b7acade054d189 Mon Sep 17 00:00:00 2001 From: Pete Gleeson Date: Thu, 28 Apr 2016 22:20:37 +1000 Subject: [PATCH 5/6] fixed style violations --- src/operator/put.ts | 22 +++++++++++----------- test/operator/put.test.ts | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/operator/put.ts b/src/operator/put.ts index 4dbef2220f6..7775a3bd5ca 100644 --- a/src/operator/put.ts +++ b/src/operator/put.ts @@ -18,16 +18,16 @@ export class PutOperator extends Operator { * Run this operator on a range. */ public async run(start: Position, end: Position): Promise { - return new Promise((resolve, reject) => { - paste(async (err, data) => { - if (err) { - reject(); - } else { - await TextEditor.insertAt(data, start.getRight()); - this.modeHandler.currentMode.motion.moveTo(start.line, start.getRight().character); - resolve(); - } - }) - }); + return new Promise((resolve, reject) => { + paste(async (err, data) => { + if (err) { + reject(); + } else { + await TextEditor.insertAt(data, start.getRight()); + this.modeHandler.currentMode.motion.moveTo(start.line, start.getRight().character); + resolve(); + } + }); + }); } } \ No newline at end of file diff --git a/test/operator/put.test.ts b/test/operator/put.test.ts index 63eefb4189f..65cdeb97a1b 100644 --- a/test/operator/put.test.ts +++ b/test/operator/put.test.ts @@ -2,7 +2,7 @@ import * as assert from 'assert'; import * as vscode from 'vscode'; -import { copy, paste } from "copy-paste"; +import { copy } from "copy-paste"; import { ModeHandler } from "../../src/mode/modeHandler"; import { PutOperator } from "../../src/operator/put"; import { TextEditor } from '../../src/textEditor'; From 5f5478474d16f5fff94839e57ec71b5b0fbeaad2 Mon Sep 17 00:00:00 2001 From: Pete Gleeson Date: Sat, 30 Apr 2016 13:55:35 +1000 Subject: [PATCH 6/6] updated travis file to install xclip on container --- .travis.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 95d1be429b8..21be7cbf49f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,14 +3,18 @@ notifications: sudo: false +addons: + apt: + packages: + - xclip + language: node_js node_js: - "4.2" - env: - GITHUB_TOKEN=1b17d62d38a4846efa7ea4de4b773b581787b0f1 - + before_install: - if [ $TRAVIS_OS_NAME == "linux" ]; then export CXX="g++-4.9" CC="gcc-4.9" DISPLAY=:99.0;