From f7153c6ec6306d67e4d4535097a9bc3daee2a572 Mon Sep 17 00:00:00 2001 From: ManuelHentschel <53863351+ManuelHentschel@users.noreply.github.com> Date: Thu, 18 Mar 2021 17:22:48 +0100 Subject: [PATCH 1/2] Send code to debug repl --- src/rTerminal.ts | 16 ++++++++++++++-- src/selection.ts | 41 +++++++++++++++++++++++------------------ 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/rTerminal.ts b/src/rTerminal.ts index bb1795918..48a8ade6d 100644 --- a/src/rTerminal.ts +++ b/src/rTerminal.ts @@ -213,7 +213,7 @@ export async function chooseTerminal(): Promise { return rTerm; } -export async function runSelectionInTerm(moveCursor: boolean): Promise { +export async function runSelectionInTerm(moveCursor: boolean, useRepl = true): Promise { const selection = getSelection(); if (moveCursor && selection.linesDownToMoveCursor > 0) { const lineCount = vscode.window.activeTextEditor.document.lineCount; @@ -224,7 +224,11 @@ export async function runSelectionInTerm(moveCursor: boolean): Promise { await vscode.commands.executeCommand('cursorMove', { to: 'down', value: selection.linesDownToMoveCursor }); await vscode.commands.executeCommand('cursorMove', { to: 'wrappedLineFirstNonWhitespaceCharacter' }); } - await runTextInTerm(selection.selectedText); + if(useRepl && vscode.debug.activeDebugSession?.type === 'R-Debugger'){ + await sendRangeToRepl(selection.range); + } else{ + await runTextInTerm(selection.selectedText); + } } export async function runChunksInTerm(chunks: vscode.Range[]): Promise { @@ -266,3 +270,11 @@ function setFocus(term: vscode.Terminal) { term.show(focus !== 'terminal'); } } + +export async function sendRangeToRepl(rng: vscode.Range): Promise { + const sel0 = vscode.window.activeTextEditor.selections; + const sel1 = new vscode.Selection(rng.start, rng.end); + vscode.window.activeTextEditor.selections = [sel1]; + await vscode.commands.executeCommand('editor.debug.action.selectionToRepl'); + vscode.window.activeTextEditor.selections = sel0; +} diff --git a/src/selection.ts b/src/selection.ts index 95cf144d1..4f36b4f9f 100644 --- a/src/selection.ts +++ b/src/selection.ts @@ -31,34 +31,39 @@ export function surroundSelection(text: string, rFunctionName: string[]): string return text; } -export function getSelection(): { +export interface RSelection { linesDownToMoveCursor: number; selectedText: string; -} { - const selection = { linesDownToMoveCursor: 0, selectedText: '' }; - const { start, end } = window.activeTextEditor.selection; + startLine: number; + endLine: number; + range: Range; +} + +export function getSelection(): RSelection { const currentDocument = window.activeTextEditor.document; - const range = new Range(start, end); + const { start, end } = window.activeTextEditor.selection; + const selection = { + linesDownToMoveCursor: 0, + selectedText: '', + startLine: start.line, + endLine: end.line, + range: new Range(start, end) + }; - let selectedLine = currentDocument.getText(range); - if (!selectedLine) { - const { startLine, endLine } - = extendSelection(start.line, (x) => currentDocument.lineAt(x).text, currentDocument.lineCount); + if (selection.range.isEmpty) { + const {startLine, endLine} = extendSelection( + start.line, + (x) => currentDocument.lineAt(x).text, + currentDocument.lineCount + ); const charactersOnLine = window.activeTextEditor.document.lineAt(endLine).text.length; const newStart = new Position(startLine, 0); const newEnd = new Position(endLine, charactersOnLine); selection.linesDownToMoveCursor = endLine + 1 - start.line; - selectedLine = currentDocument.getText(new Range(newStart, newEnd)); - } else if (start.line === end.line) { - selection.linesDownToMoveCursor = 0; - selection.selectedText = currentDocument.getText(new Range(start, end)); - - return selection; - } else { - selectedLine = currentDocument.getText(new Range(start, end)); + selection.range = new Range(newStart, newEnd); } - selection.selectedText = selectedLine.trim(); + selection.selectedText = currentDocument.getText(selection.range).trim(); return selection; } From 18cb548587db5d3c7e02df56c0d4e4b1383200a7 Mon Sep 17 00:00:00 2001 From: ManuelHentschel <53863351+ManuelHentschel@users.noreply.github.com> Date: Sun, 21 Mar 2021 23:12:14 +0100 Subject: [PATCH 2/2] Fix leading/trailing newlines --- src/rTerminal.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/rTerminal.ts b/src/rTerminal.ts index 48a8ade6d..1f8862d23 100644 --- a/src/rTerminal.ts +++ b/src/rTerminal.ts @@ -272,9 +272,16 @@ function setFocus(term: vscode.Terminal) { } export async function sendRangeToRepl(rng: vscode.Range): Promise { - const sel0 = vscode.window.activeTextEditor.selections; - const sel1 = new vscode.Selection(rng.start, rng.end); - vscode.window.activeTextEditor.selections = [sel1]; + const editor = vscode.window.activeTextEditor; + const sel0 = editor.selections; + let sel1 = new vscode.Selection(rng.start, rng.end); + while(/^[\r\n]/.exec(editor.document.getText(sel1))){ + sel1 = new vscode.Selection(sel1.start.translate(1), sel1.end); + } + while(/\r?\n\r?\n$/.exec(editor.document.getText(sel1))){ + sel1 = new vscode.Selection(sel1.start, sel1.end.translate(-1)); + } + editor.selections = [sel1]; await vscode.commands.executeCommand('editor.debug.action.selectionToRepl'); - vscode.window.activeTextEditor.selections = sel0; + editor.selections = sel0; }