commit b9c8e4a5a2a40cbe5e7faf243cd5cb079d851905 Author: 宇天 Date: Fri Dec 21 14:08:14 2018 +0800 init project diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4d91d25 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +.DS_Store +.AppleDouble +.LSOverride +.vscode + +# Thumbnails +._* + +# Files that might appear on external disk +.Spotlight-V100 +.Trashes +package-lock.json + +node_modules +.vscode-test +*.vsix \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..8380796 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,20 @@ +language: node_js + +os: + - osx + +node_js: + - node + +install: + - npm install + +cache: + directories: + - "node_modules" + +script: + - npm test + +notifications: + email: false \ No newline at end of file diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..1889691 --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,6 @@ +.vscode/** +test/** +.vscode-test/** +package-lock.json +.gitignore + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ab60297 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8447d5b --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# Build System +> 🔥 类似sublime的Build System功能, 方便快速调试一些代码片断或想法。 +>> 目前只支持脚本语言的简单编译调试, 因为vscode原则上只是一个编辑器, 我并不希望把它变成一个IDE, 所以暂时并不打算支持那些需要复杂的编译环境及配置的语言。 + +[![Version](https://vsmarketplacebadge.apphb.com/version-short/yutent.build-system.svg)](https://marketplace.visualstudio.com/items?itemName=yutent.build-system) +[![Rating](https://vsmarketplacebadge.apphb.com/rating-short/yutent.build-system.svg)](https://marketplace.visualstudio.com/items?itemName=yutent.build-system) +[![Installs](https://vsmarketplacebadge.apphb.com/installs/yutent.build-system.svg)](https://marketplace.visualstudio.com/items?itemName=yutent.build-system) +[![Build Status](https://travis-ci.org/yutent/build-system.svg?branch=master)](https://travis-ci.org/yutent/build-system) + + + + + +## 兼容性 +> 理论上, 兼容Linux/MacOS/Windows, 不过我只在Linux/MacOS下测试过, 用Windows的童鞋请自行测试,有什么问题, 可以提issue。 + +## 安装 +> 直接在商店搜索安装即可。 + + diff --git a/build_system.js b/build_system.js new file mode 100644 index 0000000..d1090e0 --- /dev/null +++ b/build_system.js @@ -0,0 +1,186 @@ +/** + * 编译系统 + * + * @author yutent + * @date 2018/12/20 11:37:54 + */ + +'use strict' + +const vsc = require('vscode') +const exec = require('child_process').exec +const path = require('path') +const os = require('os') +const kill = require('tree-kill') + +const log = console.log +const std = vsc.window.createOutputChannel('build-system') +std.out = function(msg) { + std.appendLine(msg) +} + +const EXTS = { + '.bat': 'cmd /c', + '.dart': 'dart', + '.go': 'go run', + '.js': 'node', + '.py': 'python -u', + '.sh': 'bash', + '.swift': 'swift', + '.ts': 'ts-note' +} + +const BuildSystem = { + build() { + let editor = vsc.window.activeTextEditor + + if (this.__RUNNING__) { + return + } + + if (editor) { + this.__DOC__ = editor.document + this.__CWD__ = path.dirname(this.__DOC__.fileName) + + if (this.__DOC__.languageId === 'Log') { + return + } + + // 先保存 + if (this.__OPTION__.saveBeforeBuild) { + vsc.workspace + .saveAll() + .then(_ => { + if (this.__DOC__.isUntitled) { + if (!this.__DOC__.isDirty) { + return Promise.reject('空文件无法直接执行...') + } + return this.__DOC__.save() + } + return true + }) + .then(saved => { + log(this.__DOC__, saved) + if (saved) { + this.__start__() + } + }) + .catch(err => { + vsc.window.showInformationMessage('空文件无法直接执行...') + }) + } else { + this.__start__() + } + } + }, + + stop() { + if (this.__PROGRESS__) { + kill(this.__PROGRESS__.pid) + } + this.__RUNNING__ = false + // todo... + }, + + // 初始化 配置 + __init__(opt) { + this.__OPTION__ = opt + }, + + __start__() { + this.__parseCmd__() + + log(this.__CMD__) + if (!this.__CMD__) { + return + } + + this.__RUNNING__ = true + if (this.__OPTION__.runInTerminal) { + this.__runInTerminal__() + } else { + this.__output__() + } + }, + + __parseCmd__() { + let firstLine = this.__DOC__.lineAt(0).text + let ext = path.extname(this.__DOC__.fileName) + let lang = EXTS[ext] + if (firstLine.startsWith('#!')) { + lang = firstLine.slice(2) + } + if (!lang) { + this.__CMD__ = null + if (this.__OPTION__.runInTerminal) { + if (this.__TERMINAL__) { + vsc.commands.executeCommand('workbench.action.terminal.clear') + } + } else { + std.clear() + } + return vsc.window.showInformationMessage('不支持的语言...') + } + this.__CMD__ = `${lang} "${this.__DOC__.fileName}"` + }, + + // 在终端内运行 + __runInTerminal__() { + let hasTerminal = vsc.window.terminals.some(it => it.name === 'BuildSystem') + + if (hasTerminal) { + vsc.window.terminals.forEach(it => { + if (it.name === 'BuildSystem') { + this.__TERMINAL__ = it + } + }) + } else { + this.__TERMINAL__ = vsc.window.createTerminal('BuildSystem') + } + this.__TERMINAL__.show() + + if (hasTerminal) { + vsc.commands.executeCommand('workbench.action.terminal.clear').then(_ => { + this.__TERMINAL__.sendText(this.__CMD__) + this.__RUNNING__ = false + }) + } else { + this.__TERMINAL__.sendText(this.__CMD__) + this.__RUNNING__ = false + } + }, + + // 直接输出 + __output__() { + // 运行前先清除之前的输出 + std.clear() + + std.show(true) + + let t1 = Date.now() + + this.__PROGRESS__ = exec(this.__CMD__, { cwd: this.__CWD__ }) + + // 运行输出 + this.__PROGRESS__.stdout.on('data', _ => { + std.append(_) + }) + + // 异常输出 + this.__PROGRESS__.stderr.on('data', _ => { + std.append(_) + }) + + // 结束 + this.__PROGRESS__.on('close', _ => { + let t2 = Date.now() + let time = (t2 - t1) / 1000 + std.out('') + std.out('[Finished in ' + time + ' seconds]') + this.__PROGRESS__ = null + this.__RUNNING__ = false + }) + } +} + +module.exports = BuildSystem diff --git a/index.js b/index.js new file mode 100644 index 0000000..7c634a9 --- /dev/null +++ b/index.js @@ -0,0 +1,37 @@ +/** + * build system + * @author yutent + * @date 2018/12/20 10:46:07 + */ + +'use strict' + +const vsc = require('vscode') + +const BuildSystem = require('./build_system') + +function activate(ctx) { + let conf = vsc.workspace.getConfiguration('BuildSystem') + + BuildSystem.__init__(conf) + + vsc.window.onDidCloseTerminal(() => { + // BuildSystem.onDidCloseTerminal() + }) + + const build = vsc.commands.registerCommand('BuildSystem.build', _ => { + BuildSystem.build() + }) + + const stop = vsc.commands.registerCommand('BuildSystem.stop', _ => { + BuildSystem.stop() + }) + + ctx.subscriptions.push(build) + ctx.subscriptions.push(stop) +} + +function deactivate() {} + +exports.activate = activate +exports.deactivate = deactivate diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..3e3473f Binary files /dev/null and b/logo.png differ diff --git a/package.json b/package.json new file mode 100644 index 0000000..0f17a6f --- /dev/null +++ b/package.json @@ -0,0 +1,94 @@ +{ + "name": "build-system", + "displayName": "sublime build system", + "description": "🔥 类似sublime的Build System功能, 方便快速调试一些代码片断或想法。", + "version": "0.9.0", + "publisher": "yutent", + "author": "Yutent [@yutent]", + "icon": "logo.png", + "engines": { + "vscode": "^1.28.0" + }, + "categories": ["Programming Languages", "Other"], + "activationEvents": ["*"], + "main": "./index", + "contributes": { + "commands": [ + { + "command": "BuildSystem.build", + "title": "Build and run..." + }, + { + "command": "BuildSystem.stop", + "title": "Stop run..." + } + ], + "keybindings": [ + { + "command": "BuildSystem.build", + "key": "cmd+alt+b" + }, + { + "command": "BuildSystem.stop", + "key": "cmd+alt+c" + } + ], + "menus": { + "editor/context": [ + { + "when": "!inOutput", + "command": "BuildSystem.build", + "title": "Build and run this file" + }, + { + "when": "inOutput", + "command": "BuildSystem.stop", + "group": "Stop run this file" + } + ] + }, + "configuration": { + "type": "object", + "title": "Sublime Build System 配置", + "properties": { + "BuildSystem.saveBeforeBuild": { + "type": "boolean", + "default": true, + "description": "编译之前先保存文件" + }, + "BuildSystem.runInTerminal": { + "type": "boolean", + "default": false, + "description": "是否使用终端来运行编译结果" + } + } + } + }, + "repository": { + "type": "git", + "url": "https://github.com/yutent/build-system.git" + }, + "keywords": [ + "run code", + "sublime", + "build", + "system", + "sublime build system", + "javascript", + "typescript", + "nodejs", + "python", + "yutent" + ], + "scripts": { + "test": "node ./node_modules/vscode/bin/test" + }, + "license": "MIT", + "devDependencies": { + "vscode": "^1.1.21" + }, + "dependencies": { + "iofs": "^1.1.0", + "tree-kill": "^1.2.1" + } +} diff --git a/test/Untitled-1 b/test/Untitled-1 new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/test/Untitled-1 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/demo.dart b/test/demo.dart new file mode 100644 index 0000000..3f9dc49 --- /dev/null +++ b/test/demo.dart @@ -0,0 +1,3 @@ +void main() { + print('hello dart'); +} diff --git a/test/demo.js b/test/demo.js new file mode 100644 index 0000000..11a6bbf --- /dev/null +++ b/test/demo.js @@ -0,0 +1 @@ +console.log('hello js blabla') diff --git a/test/demo.php b/test/demo.php new file mode 100644 index 0000000..f88f715 --- /dev/null +++ b/test/demo.php @@ -0,0 +1,4 @@ + +# @date 2018/12/20 16:24:15 + + +print('hello python') \ No newline at end of file diff --git a/test/index.js b/test/index.js new file mode 100644 index 0000000..e62245a --- /dev/null +++ b/test/index.js @@ -0,0 +1,9 @@ +const testRunner = require('vscode/lib/testrunner') + +testRunner.configure({ + ui: 'tdd', // the TDD UI is being used in extension.test.ts (suite, test, etc.) + useColors: true, // colored output from test results + timeout: 10000 +}) + +module.exports = testRunner