From 55582a1294b6237b5291bb52e5d8d2367ecb6b71 Mon Sep 17 00:00:00 2001 From: Ben Chauvette Date: Mon, 19 Sep 2016 00:51:19 -0400 Subject: [PATCH 1/3] Support "+ system clipboard register --- src/register/register.ts | 18 +++++++++++++----- test/register/register.test.ts | 8 ++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/register/register.ts b/src/register/register.ts index 2234c3430ce..95c7e9537f8 100644 --- a/src/register/register.ts +++ b/src/register/register.ts @@ -1,5 +1,6 @@ import { VimState } from './../mode/modeHandler'; import * as clipboard from 'copy-paste'; + /** * There are two different modes of copy/paste in Vim - copy by character * and copy by line. Copy by line typically happens in Visual Line mode, but @@ -21,7 +22,7 @@ export interface IRegisterContent { export class Register { /** * The '"' is the unnamed register. - * The '*' is the special register for stroing into system clipboard. + * The '*' and '+' are special registers for accessing the system clipboard. * TODO: Read-Only registers * '.' register has the last inserted text. * '%' register has the current file path. @@ -30,9 +31,16 @@ export class Register { */ private static registers: { [key: string]: IRegisterContent } = { '"': { text: "", registerMode: RegisterMode.CharacterWise }, - '*': { text: "", registerMode: RegisterMode.CharacterWise } + '*': { text: "", registerMode: RegisterMode.CharacterWise }, + '+': { text: "", registerMode: RegisterMode.CharacterWise } }; + private static systemClipboardRegisters: string[] = ["*", "+"]; + + public static isSystemClipboardRegister(register: string): boolean { + return Register.systemClipboardRegisters.indexOf(register) !== -1; + } + public static isValidRegister(register: string): boolean { return register in Register.registers || /^[a-z0-9]+$/i.test(register); } @@ -48,7 +56,7 @@ export class Register { throw new Error(`Invalid register ${register}`); } - if (register === '*') { + if (Register.isSystemClipboardRegister(register)) { clipboard.copy(content); } @@ -65,7 +73,7 @@ export class Register { throw new Error(`Invalid register ${register}`); } - if (register === '*') { + if (Register.isSystemClipboardRegister(register)) { clipboard.copy(content); } @@ -94,7 +102,7 @@ export class Register { } /* Read from system clipboard */ - if (register === '*') { + if (Register.isSystemClipboardRegister(register)) { const text = await new Promise((resolve, reject) => clipboard.paste((err, text) => { if (err) { diff --git a/test/register/register.test.ts b/test/register/register.test.ts index a5c553b6746..02b1e8c89d4 100644 --- a/test/register/register.test.ts +++ b/test/register/register.test.ts @@ -27,6 +27,7 @@ suite("register", () => { }); clipboard.copy("12345"); + newTest({ title: "Can access '*' (clipboard) register", start: ['|one'], @@ -34,6 +35,13 @@ suite("register", () => { end: ["1234|5one"], }); + newTest({ + title: "Can access '+' (clipboard) register", + start: ['|one'], + keysPressed: '"+P', + end: ["1234|5one"], + }); + newTest({ title: "Can use two registers together", start: ['|one', "two"], From ae5f01005d4f35030d76182871ce2dc9639298c7 Mon Sep 17 00:00:00 2001 From: Ben Chauvette Date: Mon, 19 Sep 2016 22:09:09 -0400 Subject: [PATCH 2/3] Add isClipboardRegister? to IRegisterContent --- src/register/register.ts | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/register/register.ts b/src/register/register.ts index 95c7e9537f8..7640277c295 100644 --- a/src/register/register.ts +++ b/src/register/register.ts @@ -15,8 +15,9 @@ export enum RegisterMode { }; export interface IRegisterContent { - text : string | string[]; - registerMode: RegisterMode; + text : string | string[]; + registerMode : RegisterMode; + isClipboardRegister?: boolean; } export class Register { @@ -31,14 +32,18 @@ export class Register { */ private static registers: { [key: string]: IRegisterContent } = { '"': { text: "", registerMode: RegisterMode.CharacterWise }, - '*': { text: "", registerMode: RegisterMode.CharacterWise }, - '+': { text: "", registerMode: RegisterMode.CharacterWise } + '*': { text: "", registerMode: RegisterMode.CharacterWise, isClipboardRegister: true }, + '+': { text: "", registerMode: RegisterMode.CharacterWise, isClipboardRegister: true } }; - private static systemClipboardRegisters: string[] = ["*", "+"]; + public static isClipboardRegister(registerName: string): boolean { + const register = Register.registers[registerName]; - public static isSystemClipboardRegister(register: string): boolean { - return Register.systemClipboardRegisters.indexOf(register) !== -1; + if (register && register.isClipboardRegister) { + return true; + } + + return false; } public static isValidRegister(register: string): boolean { @@ -56,13 +61,14 @@ export class Register { throw new Error(`Invalid register ${register}`); } - if (Register.isSystemClipboardRegister(register)) { + if (Register.isClipboardRegister(register)) { clipboard.copy(content); } Register.registers[register] = { - text : content, - registerMode: vimState.effectiveRegisterMode(), + text : content, + registerMode : vimState.effectiveRegisterMode(), + isClipboardRegister: Register.isClipboardRegister(register), }; } @@ -73,13 +79,14 @@ export class Register { throw new Error(`Invalid register ${register}`); } - if (Register.isSystemClipboardRegister(register)) { + if (Register.isClipboardRegister(register)) { clipboard.copy(content); } Register.registers[register] = { - text : content, - registerMode: registerMode || RegisterMode.FigureItOutFromCurrentMode, + text : content, + registerMode : registerMode || RegisterMode.FigureItOutFromCurrentMode, + isClipboardRegister: Register.isClipboardRegister(register), }; } @@ -102,7 +109,7 @@ export class Register { } /* Read from system clipboard */ - if (Register.isSystemClipboardRegister(register)) { + if (Register.isClipboardRegister(register)) { const text = await new Promise((resolve, reject) => clipboard.paste((err, text) => { if (err) { From 6d462476a34eaea73581b3a4688f5600742bcdcd Mon Sep 17 00:00:00 2001 From: Ben Chauvette Date: Wed, 21 Sep 2016 02:15:28 -0400 Subject: [PATCH 3/3] Make IRegisterContent.isClipboardRegister required --- src/register/register.ts | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/register/register.ts b/src/register/register.ts index 7640277c295..9b202dabf2d 100644 --- a/src/register/register.ts +++ b/src/register/register.ts @@ -15,9 +15,9 @@ export enum RegisterMode { }; export interface IRegisterContent { - text : string | string[]; - registerMode : RegisterMode; - isClipboardRegister?: boolean; + text : string | string[]; + registerMode : RegisterMode; + isClipboardRegister: boolean; } export class Register { @@ -31,19 +31,14 @@ export class Register { * '#' is the name of last edited file. (low priority) */ private static registers: { [key: string]: IRegisterContent } = { - '"': { text: "", registerMode: RegisterMode.CharacterWise }, + '"': { text: "", registerMode: RegisterMode.CharacterWise, isClipboardRegister: false }, '*': { text: "", registerMode: RegisterMode.CharacterWise, isClipboardRegister: true }, '+': { text: "", registerMode: RegisterMode.CharacterWise, isClipboardRegister: true } }; public static isClipboardRegister(registerName: string): boolean { const register = Register.registers[registerName]; - - if (register && register.isClipboardRegister) { - return true; - } - - return false; + return register && register.isClipboardRegister; } public static isValidRegister(register: string): boolean { @@ -104,8 +99,14 @@ export class Register { throw new Error(`Invalid register ${register}`); } + // Clipboard registers are always defined, so if a register doesn't already + // exist we can be sure it's not a clipboard one if (!Register.registers[register]) { - Register.registers[register] = { text: "", registerMode: RegisterMode.CharacterWise }; + Register.registers[register] = { + text : "", + registerMode : RegisterMode.CharacterWise, + isClipboardRegister: false + }; } /* Read from system clipboard */