瀏覽代碼

feat(clipboard): Copy code to clipboard.

Marcelo Fornet 5 年之前
父節點
當前提交
bcd2a96556
共有 3 個文件被更改,包括 140 次插入6 次删除
  1. 112 3
      package-lock.json
  2. 10 1
      package.json
  3. 18 2
      src/extension.ts

+ 112 - 3
package-lock.json

@@ -1,6 +1,6 @@
 {
     "name": "acmx",
-    "version": "0.2.3",
+    "version": "0.2.5",
     "lockfileVersion": 1,
     "requires": true,
     "dependencies": {
@@ -113,6 +113,11 @@
             "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
             "dev": true
         },
+        "arch": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz",
+            "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg=="
+        },
         "argparse": {
             "version": "1.0.10",
             "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
@@ -314,6 +319,16 @@
                 }
             }
         },
+        "clipboardy": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.2.0.tgz",
+            "integrity": "sha512-9ry9nC3VFULNmoEIqvuRwCIQ9M7wjnm4O+yvk7xkmhR+7FAUWaeX751oeYJbORg0h0zmqW1EVDoZK8f7yapwbg==",
+            "requires": {
+                "arch": "^2.1.1",
+                "execa": "^1.0.0",
+                "is-wsl": "^2.1.1"
+            }
+        },
         "clone-response": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
@@ -393,6 +408,18 @@
             "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
             "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
         },
+        "cross-spawn": {
+            "version": "6.0.5",
+            "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+            "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+            "requires": {
+                "nice-try": "^1.0.4",
+                "path-key": "^2.0.1",
+                "semver": "^5.5.0",
+                "shebang-command": "^1.2.0",
+                "which": "^1.2.9"
+            }
+        },
         "dashdash": {
             "version": "1.14.1",
             "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
@@ -521,6 +548,20 @@
             "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
             "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
         },
+        "execa": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+            "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+            "requires": {
+                "cross-spawn": "^6.0.0",
+                "get-stream": "^4.0.0",
+                "is-stream": "^1.1.0",
+                "npm-run-path": "^2.0.0",
+                "p-finally": "^1.0.0",
+                "signal-exit": "^3.0.0",
+                "strip-eof": "^1.0.0"
+            }
+        },
         "express": {
             "version": "4.16.4",
             "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
@@ -886,17 +927,32 @@
             "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
             "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
         },
+        "is-stream": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+            "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+        },
         "is-typedarray": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
             "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
             "dev": true
         },
+        "is-wsl": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz",
+            "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog=="
+        },
         "isarray": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
             "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
         },
+        "isexe": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+            "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+        },
         "isstream": {
             "version": "0.1.2",
             "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -1142,11 +1198,24 @@
             "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
             "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
         },
+        "nice-try": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+            "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
+        },
         "normalize-url": {
             "version": "3.3.0",
             "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
             "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="
         },
+        "npm-run-path": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+            "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+            "requires": {
+                "path-key": "^2.0.0"
+            }
+        },
         "oauth-sign": {
             "version": "0.9.0",
             "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
@@ -1174,6 +1243,11 @@
             "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.0.0.tgz",
             "integrity": "sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA=="
         },
+        "p-finally": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+            "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+        },
         "parse-cache-control": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
@@ -1190,6 +1264,11 @@
             "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
             "dev": true
         },
+        "path-key": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+            "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+        },
         "path-parse": {
             "version": "1.0.6",
             "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
@@ -1351,8 +1430,7 @@
         "semver": {
             "version": "5.6.0",
             "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
-            "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
-            "dev": true
+            "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
         },
         "send": {
             "version": "0.16.2",
@@ -1405,6 +1483,24 @@
             "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
             "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
         },
+        "shebang-command": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+            "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+            "requires": {
+                "shebang-regex": "^1.0.0"
+            }
+        },
+        "shebang-regex": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+            "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+        },
+        "signal-exit": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+            "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+        },
         "source-map": {
             "version": "0.6.1",
             "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -1466,6 +1562,11 @@
                 "ansi-regex": "^2.0.0"
             }
         },
+        "strip-eof": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+            "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+        },
         "supports-color": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
@@ -1708,6 +1809,14 @@
                 "https-proxy-agent": "^2.2.1"
             }
         },
+        "which": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+            "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+            "requires": {
+                "isexe": "^2.0.0"
+            }
+        },
         "wrappy": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",

+ 10 - 1
package.json

@@ -131,6 +131,10 @@
             {
                 "command": "acmx.debugTestCase",
                 "title": "Select Test Case"
+            },
+            {
+                "command": "acmx.copyToClipboard",
+                "title": "ACMX: Copy Submission"
             }
         ],
         "keybindings": [
@@ -153,6 +157,10 @@
             {
                 "command": "acmx.upgrade",
                 "key": "ctrl+alt+u"
+            },
+            {
+                "command": "acmx.copyToClipboard",
+                "key": "ctrl+alt+m"
             }
         ],
         "menus": {
@@ -202,6 +210,7 @@
         "unescape": "^1.0.1",
         "express": "^4.16.4",
         "body-parser": "^1.18.3",
-        "md5-file": "^4.0.0"
+        "md5-file": "^4.0.0",
+        "clipboardy": "^2.2.0"
     }
 }

+ 18 - 2
src/extension.ts

@@ -7,6 +7,7 @@ import { getSite, SITES } from './conn';
 import { ATTIC, compileCode, currentProblem, initAcmX, newContestFromId, newProblemFromId, removeExtension, solFile, SRC, stressSolution, testSolution, upgradeArena, verdictName } from './core';
 import { hideTerminals } from './terminal';
 import { SiteDescription, Verdict } from './types';
+const clipboardy = require('clipboardy');
 
 const TESTCASES = 'testcases';
 
@@ -48,8 +49,7 @@ async function addProblem() {
     let problemPath = await newProblemFromId(path, site, id);
 
     await vscode.commands.executeCommand("vscode.openFolder", vscode.Uri.file(problemPath));
-    // TODO: 007
-    // Just want to run two commands below
+    // TODO(#42): Just want to run two commands below
     // await vscode.commands.executeCommand("vscode.open", vscode.Uri.file(solFile()));
     // vscode.window.showInformationMessage(`Add problem ${site}/${id} at ${path}`);
 }
@@ -343,6 +343,20 @@ async function debugTestCase(uriPath: vscode.Uri) {
     closeSync(launchTaskFdW);
 }
 
+async function copySubmissionToClipboard() {
+    let path = currentProblem();
+
+    if (path === undefined) {
+        vscode.window.showErrorMessage("No active problem");
+        return;
+    }
+
+    let sol = join(path, solFile());
+    let content = readFileSync(sol, "utf8");
+
+    clipboardy.writeSync(content);
+}
+
 async function debugTest() {
     vscode.window.showInformationMessage(String.fromCharCode(65));
     console.log("no bugs :O");
@@ -365,6 +379,7 @@ export function activate(context: vscode.ExtensionContext) {
     let compileCommand = vscode.commands.registerCommand('acmx.compile', compile);
     let setCheckerCommand = vscode.commands.registerCommand('acmx.setChecker', setChecker);
     let debugTestCaseCommand = vscode.commands.registerCommand('acmx.debugTestCase', debugTestCase);
+    let copySubmissionToClipboardCommand = vscode.commands.registerCommand('acmx.copyToClipboard', copySubmissionToClipboard);
 
     let debugTestCommand = vscode.commands.registerCommand('acmx.debugTest', debugTest);
 
@@ -379,6 +394,7 @@ export function activate(context: vscode.ExtensionContext) {
     context.subscriptions.push(compileCommand);
     context.subscriptions.push(setCheckerCommand);
     context.subscriptions.push(debugTestCaseCommand);
+    context.subscriptions.push(copySubmissionToClipboardCommand);
 
     context.subscriptions.push(debugTestCommand);
 }