From 5e1bcd9abbf2ce57a9c2a9f3628688292f104a60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Tue, 10 Sep 2019 13:59:42 +0200 Subject: [PATCH 01/10] Bump package version v2.0.35 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 617561dfb..aa596638d 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Calva: Clojure & Clojurescript Interactive Programming", "description": "Integrated REPL, formatter, Paredit, and more. Powered by nREPL.", "icon": "assets/calva.png", - "version": "2.0.34", + "version": "2.0.35", "publisher": "betterthantomorrow", "author": { "name": "Better Than Tomorrow", From 2f05dbe80ccae930aabcb0492f01c5fb9df8d5ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Tue, 10 Sep 2019 14:02:54 +0200 Subject: [PATCH 02/10] Bring on version: v2.0.36 [skip ci] --- package-lock.json | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 83207d2e6..b4ac87cca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "calva", - "version": "2.0.35", + "version": "2.0.36", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index aa596638d..f011e68ae 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Calva: Clojure & Clojurescript Interactive Programming", "description": "Integrated REPL, formatter, Paredit, and more. Powered by nREPL.", "icon": "assets/calva.png", - "version": "2.0.35", + "version": "2.0.36", "publisher": "betterthantomorrow", "author": { "name": "Better Than Tomorrow", @@ -222,7 +222,7 @@ "items": { "type": "string" } - }, + }, "calva.replConnectSequences": { "type": "array", "description": "For when your project needs a custom REPL connect sequence.", From d338bd00a596f254336b31bde5547e1913f3a995 Mon Sep 17 00:00:00 2001 From: Kevin Stehn Date: Tue, 10 Sep 2019 19:40:26 +0200 Subject: [PATCH 03/10] upgradee to 0.22.1 --- calva/nrepl/project-types.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/calva/nrepl/project-types.ts b/calva/nrepl/project-types.ts index f602d9291..330625349 100644 --- a/calva/nrepl/project-types.ts +++ b/calva/nrepl/project-types.ts @@ -41,7 +41,7 @@ export function shadowBuilds(): string[] { const cliDependencies = { "nrepl": "0.6.0", - "cider/cider-nrepl": "0.21.1", + "cider/cider-nrepl": "0.22.1", } const cljsCommonDependencies = { @@ -56,7 +56,7 @@ const cljsDependencies: { [id: string]: Object } = { "com.bhauman/figwheel-main": "0.2.3" }, "shadow-cljs": { - "cider/cider-nrepl": "0.21.1", + "cider/cider-nrepl": "0.22.1", }, "Nashorn": { }, @@ -65,7 +65,7 @@ const cljsDependencies: { [id: string]: Object } = { } const leinPluginDependencies = { - "cider/cider-nrepl": "0.21.1" + "cider/cider-nrepl": "0.22.1" } const leinDependencies = { "nrepl": "0.6.0", From 50f79375060df3fe9237b91b722f354cadd35539 Mon Sep 17 00:00:00 2001 From: Kevin Stehn Date: Tue, 10 Sep 2019 19:45:36 +0200 Subject: [PATCH 04/10] Add update to changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c2a50c5b..6047d1a47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ Changes to Calva. (We really will try to keep this updated now.) ## [Unreleased] - - Fix [REPL Window namespace being reset to user](https://github.com/BetterThanTomorrow/calva/issues/302) - +- Update nrepl-version to 0.22.1 ## [2.0.35] - 10.09.2019 - [Customizing the REPL connect sequence](https://github.com/BetterThanTomorrow/calva/issues/282) - [Support for launching with user aliases/profiles](https://github.com/BetterThanTomorrow/calva/issues/288) From 777d2cdedcfd9568844122e2f1ff4ca01a7b7901 Mon Sep 17 00:00:00 2001 From: cf Date: Wed, 11 Sep 2019 11:04:51 +0200 Subject: [PATCH 05/10] Added rimraf to the build config to be platform independent. --- package-lock.json | 74 +++++++++++++++++++++++++++++++++++++++++------ package.json | 7 +++-- 2 files changed, 69 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4ac87cca..60b23dfad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1098,6 +1098,15 @@ "yallist": "^3.0.2" } }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", @@ -1574,6 +1583,17 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "copy-descriptor": { @@ -1991,6 +2011,15 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } } } }, @@ -3006,6 +3035,17 @@ "graceful-fs": "^4.1.2", "rimraf": "~2.6.2", "write": "^0.2.1" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "flush-write-stream": { @@ -4806,7 +4846,8 @@ "json": { "version": "9.0.6", "resolved": "https://registry.npmjs.org/json/-/json-9.0.6.tgz", - "integrity": "sha1-eXLCpaSKQmeNsnMMfCxO5uTiRYU=" + "integrity": "sha1-eXLCpaSKQmeNsnMMfCxO5uTiRYU=", + "dev": true }, "json-parse-better-errors": { "version": "1.0.2", @@ -5415,6 +5456,17 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "ms": { @@ -5525,6 +5577,15 @@ "which": "1" }, "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "semver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", @@ -10047,9 +10108,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { "glob": "^7.1.3" @@ -10190,11 +10251,6 @@ "node-forge": "0.7.5" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, "semver-diff": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", diff --git a/package.json b/package.json index f011e68ae..38a957fc9 100644 --- a/package.json +++ b/package.json @@ -1144,7 +1144,7 @@ }, "scripts": { "watch-webpack": "webpack --mode development --watch", - "watch-ts": "rm -rf ./out/* ./tsconfig.tsbuildinfo && npm run compile-cljs && tsc -watch -p ./tsconfig.json", + "watch-ts": "rimraf ./out && rimraf ./tsconfig.tsbuildinfo && npm run compile-cljs && tsc -watch -p ./tsconfig.json", "release-cljs": "npx shadow-cljs release :calva-lib", "NOT-USED-start": "ts-node --inspect=5858 webview-src/server/main.ts", "NOT-USED-repl-window-dev-server": "concurrently \"npx nodemon -- ./webview-src/client/index.js\" \"npx webpack-dev-server\"", @@ -1155,7 +1155,7 @@ "update-grammar": "node ./calva/calva-fmt/update-grammar.js ./calva/calva-fmt/atom-language-clojure/grammars/clojure.cson clojure.tmLanguage.json", "release": "npm i && npm run update-grammar && npm run release-cljs && npm run webpack-release", "disabled-release": "npm i && npm run update-grammar && npm run release-cljs && tsc -p ./", - "vscode:prepublish": "rm -rf ./out/* && npm run release", + "vscode:prepublish": "rimraf ./out && npm run release", "disabled-vscode:prepublish": "npm run release", "postinstall": "node ./node_modules/vscode/bin/install" }, @@ -1207,6 +1207,7 @@ "webpack": "^4.33.0", "webpack-cli": "^3.3.3", "webpack-dev-server": "^3.8.0", - "vsce": "^1.66.0" + "vsce": "^1.66.0", + "rimraf": "^2.7.1" } } From 9add6597abf34db69ca34f1477c8283e14cd64d8 Mon Sep 17 00:00:00 2001 From: Kevin Stehn Date: Tue, 10 Sep 2019 19:40:26 +0200 Subject: [PATCH 06/10] upgradee to 0.22.1 --- calva/nrepl/project-types.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/calva/nrepl/project-types.ts b/calva/nrepl/project-types.ts index f602d9291..330625349 100644 --- a/calva/nrepl/project-types.ts +++ b/calva/nrepl/project-types.ts @@ -41,7 +41,7 @@ export function shadowBuilds(): string[] { const cliDependencies = { "nrepl": "0.6.0", - "cider/cider-nrepl": "0.21.1", + "cider/cider-nrepl": "0.22.1", } const cljsCommonDependencies = { @@ -56,7 +56,7 @@ const cljsDependencies: { [id: string]: Object } = { "com.bhauman/figwheel-main": "0.2.3" }, "shadow-cljs": { - "cider/cider-nrepl": "0.21.1", + "cider/cider-nrepl": "0.22.1", }, "Nashorn": { }, @@ -65,7 +65,7 @@ const cljsDependencies: { [id: string]: Object } = { } const leinPluginDependencies = { - "cider/cider-nrepl": "0.21.1" + "cider/cider-nrepl": "0.22.1" } const leinDependencies = { "nrepl": "0.6.0", From 750c5d236ef422765bb03d69e99eae3f8744b593 Mon Sep 17 00:00:00 2001 From: Kevin Stehn Date: Tue, 10 Sep 2019 19:45:36 +0200 Subject: [PATCH 07/10] Add update to changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c2a50c5b..6047d1a47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ Changes to Calva. (We really will try to keep this updated now.) ## [Unreleased] - - Fix [REPL Window namespace being reset to user](https://github.com/BetterThanTomorrow/calva/issues/302) - +- Update nrepl-version to 0.22.1 ## [2.0.35] - 10.09.2019 - [Customizing the REPL connect sequence](https://github.com/BetterThanTomorrow/calva/issues/282) - [Support for launching with user aliases/profiles](https://github.com/BetterThanTomorrow/calva/issues/288) From 12bcbe17dcfb7c1bc1f5f8e361866eb83f55aba4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Thu, 12 Sep 2019 22:36:13 +0200 Subject: [PATCH 08/10] Don't clone new sessions for every repl win eval Fixes #302 --- calva/connector.ts | 3 ++- calva/repl-window.ts | 59 +++++++++++++++++++++++++------------------- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/calva/connector.ts b/calva/connector.ts index 5e3e38de6..42a12ae58 100644 --- a/calva/connector.ts +++ b/calva/connector.ts @@ -10,7 +10,7 @@ import * as projectTypes from './nrepl/project-types'; const { parseEdn } = require('../cljs-out/cljs-lib'); import { NReplClient, NReplSession } from "./nrepl"; -import { reconnectReplWindow, openReplWindow, sendTextToREPLWindow } from './repl-window'; +import { reconnectReplWindow, openReplWindow, sendTextToREPLWindow, createReplWindow } from './repl-window'; import { CljsTypeConfig, ReplConnectSequence, getDefaultCljsType, CljsTypes, askForConnectSequence } from './nrepl/connectSequence'; async function connectToHost(hostname, port, connectSequence: ReplConnectSequence) { @@ -90,6 +90,7 @@ async function connectToHost(hostname, port, connectSequence: ReplConnectSequenc async function setUpCljsRepl(cljsSession, chan, build) { state.cursor.set("cljs", cljsSession); chan.appendLine("Connected session: cljs" + (build ? ", repl: " + build : "")); + await createReplWindow(cljsSession, "cljs"); await openReplWindow("cljs", true); await reconnectReplWindow("cljs"); status.update(); diff --git a/calva/repl-window.ts b/calva/repl-window.ts index fdd97bb83..5394603b1 100644 --- a/calva/repl-window.ts +++ b/calva/repl-window.ts @@ -74,12 +74,12 @@ class REPLWindow { let result = await this.session.info(msg.ns, msg.symbol); this.postMessage({ type: "info", data: result }); } - + if (msg.type == "focus") { vscode.commands.executeCommand("setContext", "calva:replWindowActive", true); vscode.commands.executeCommand("setContext", "calva:pareditValid", true); } - + if (msg.type == "blur") { vscode.commands.executeCommand("setContext", "calva:replWindowActive", false); } @@ -203,52 +203,59 @@ export async function reconnectReplWindow(mode: "clj" | "cljs") { } } -export async function openReplWindow(mode: "clj" | "cljs" = "clj", preserveFocus: boolean = false) { +export async function openReplWindow(mode: "clj" | "cljs" = "clj", preserveFocus: boolean = true) { let session = mode == "clj" ? cljSession : cljsSession, nreplClient = session.client; + if (!replWindows[mode]) { + await createReplWindow(session, mode); + } else if (!nreplClient.sessions[replWindows[mode].session.sessionId]) { + replWindows[mode].session = await session.clone(); + } + + replWindows[mode].panel.reveal(vscode.ViewColumn.Two, preserveFocus); + return replWindows[mode]; +} + +export async function createReplWindow(session: NReplSession, mode: "clj" | "cljs" = "clj") { + const nreplClient = session.client; + if (replWindows[mode]) { const modeSession = nreplClient.sessions[replWindows[mode].session.sessionId]; if (!modeSession || modeSession !== session) { replWindows[mode].session = await session.clone(); } - replWindows[mode].panel.reveal(vscode.ViewColumn.Two, preserveFocus); return replWindows[mode]; } - if (!session) { - vscode.window.showErrorMessage("Not connected to nREPL"); - return; - } - const sessionClone = await session.clone(); let title = mode == "clj" ? "CLJ REPL" : "CLJS REPL"; - const panel = vscode.window.createWebviewPanel("replInteractor", - title, { - viewColumn: vscode.ViewColumn.Two, - preserveFocus: preserveFocus - }, - { - retainContextWhenHidden: true, - enableScripts: true, localResourceRoots: [vscode.Uri.file(path.join(ctx.extensionPath, 'html'))] - }); + const panel = vscode.window.createWebviewPanel("replInteractor", title, { + viewColumn: vscode.ViewColumn.Two, + preserveFocus: true + }, { + retainContextWhenHidden: true, + enableScripts: true, localResourceRoots: [vscode.Uri.file(path.join(ctx.extensionPath, 'html'))] + }); const cljType: string = state.extensionContext.workspaceState.get('selectedCljTypeName'); const cljsType: string = state.extensionContext.workspaceState.get('selectedCljsTypeName'); - let repl = replWindows[mode] = new REPLWindow(panel, sessionClone, mode, cljType, cljsType); - await repl.initialized; - return repl; + let replWin = replWindows[mode] = new REPLWindow(panel, sessionClone, mode, cljType, cljsType); + await replWin.initialized; + return replWin; } -function loadNamespaceCommand(reload = true) { - setREPLNamespace(util.getDocumentNamespace(), reload).catch(r => { console.error(r) }); +async function loadNamespaceCommand(reload = true) { + await setREPLNamespace(util.getDocumentNamespace(), reload).catch(r => { console.error(r) }); + openReplWindow(util.getREPLSessionType()); } function setREPLNamespaceCommand() { setREPLNamespace(util.getDocumentNamespace(), false).catch(r => { console.error(r) }); + openReplWindow(util.getREPLSessionType()); } export async function sendTextToREPLWindow(text, ns: string, pprint: boolean) { - let wnd = await openReplWindow(util.getREPLSessionType()); + let wnd = await openReplWindow(util.getREPLSessionType(), true); if (wnd) { let oldNs = wnd.ns; if (ns && ns != oldNs) @@ -307,8 +314,8 @@ function evalCurrentTopLevelFormInREPLWindowCommand() { export function activate(context: vscode.ExtensionContext) { ctx = context; - context.subscriptions.push(vscode.commands.registerCommand('calva.openCljReplWindow', () => openReplWindow("clj"))); - context.subscriptions.push(vscode.commands.registerCommand('calva.openCljsReplWindow', () => openReplWindow("cljs"))); + context.subscriptions.push(vscode.commands.registerCommand('calva.openCljReplWindow', () => openReplWindow("clj", true))); + context.subscriptions.push(vscode.commands.registerCommand('calva.openCljsReplWindow', () => openReplWindow("cljs"), true)); context.subscriptions.push(vscode.commands.registerCommand('calva.loadNamespace', loadNamespaceCommand)); context.subscriptions.push(vscode.commands.registerCommand('calva.setREPLNamespace', setREPLNamespaceCommand)); context.subscriptions.push(vscode.commands.registerCommand('calva.evalCurrentFormInREPLWindow', evalCurrentFormInREPLWindowCommand)); From 19afcff549e3f998fa87e11004be03ffef573ceb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Thu, 12 Sep 2019 22:43:24 +0200 Subject: [PATCH 09/10] Await the setREPL namespace --- calva/repl-window.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/calva/repl-window.ts b/calva/repl-window.ts index 5394603b1..d1bc954a6 100644 --- a/calva/repl-window.ts +++ b/calva/repl-window.ts @@ -246,12 +246,12 @@ export async function createReplWindow(session: NReplSession, mode: "clj" | "clj async function loadNamespaceCommand(reload = true) { await setREPLNamespace(util.getDocumentNamespace(), reload).catch(r => { console.error(r) }); - openReplWindow(util.getREPLSessionType()); + await openReplWindow(util.getREPLSessionType()); } -function setREPLNamespaceCommand() { - setREPLNamespace(util.getDocumentNamespace(), false).catch(r => { console.error(r) }); - openReplWindow(util.getREPLSessionType()); +async function setREPLNamespaceCommand() { + await setREPLNamespace(util.getDocumentNamespace(), false).catch(r => { console.error(r) }); + await openReplWindow(util.getREPLSessionType()); } export async function sendTextToREPLWindow(text, ns: string, pprint: boolean) { From 2f69367157b3f358773f15335309049e662939fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Thu, 12 Sep 2019 22:54:31 +0200 Subject: [PATCH 10/10] Use cider-nrepl 0.22.1 Fix bug with creating session clones on masse Reinstall focus staying in editor when eval to repl window --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6047d1a47..9c6ab6d1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,13 @@ Changes to Calva. (We really will try to keep this updated now.) ## When time allows, this will be worked on - [Support for custom project/workflow commands](https://github.com/BetterThanTomorrow/calva/issues/281) -## [Unreleased] - +## [Unreleased] +- Nothing to see here + +## [2.0.36] - 12.09.2019 - Fix [REPL Window namespace being reset to user](https://github.com/BetterThanTomorrow/calva/issues/302) - Update nrepl-version to 0.22.1 + ## [2.0.35] - 10.09.2019 - [Customizing the REPL connect sequence](https://github.com/BetterThanTomorrow/calva/issues/282) - [Support for launching with user aliases/profiles](https://github.com/BetterThanTomorrow/calva/issues/288)