mirror of
https://github.com/samsonjs/repl-edit.git
synced 2026-03-25 09:25:49 +00:00
first commit
This commit is contained in:
commit
7fe609bd61
5 changed files with 180 additions and 0 deletions
18
LICENSE
Normal file
18
LICENSE
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
Copyright 2009, 2010 Sami Samhuri. All rights reserved.
|
||||
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.
|
||||
1
Readme.md
Normal file
1
Readme.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
TODO
|
||||
135
lib/index.js
Normal file
135
lib/index.js
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
//
|
||||
// Copyright 2010 Sami Samhuri @_sjs
|
||||
// MIT license
|
||||
//
|
||||
// github.com/samsonjs/edit-repl
|
||||
//
|
||||
|
||||
// TODO proper error handling
|
||||
|
||||
var fs = require('fs')
|
||||
, _repl
|
||||
|
||||
exports.startRepl = function() {
|
||||
console.log('Commands: edit(), run(), stash(filename), unstash(filename), setEditor(editor)')
|
||||
// TODO extend the repl context instead, problem is that repl.js:resetContext() isn't exported
|
||||
// so simple assignments to _repl.context can't survive .clear yet
|
||||
exports.extend(global)
|
||||
_repl = require('repl').start()
|
||||
}
|
||||
|
||||
exports.extend = function(obj) {
|
||||
var path = require('path')
|
||||
, spawn = require('child_process').spawn
|
||||
, sys = require('sys')
|
||||
, _tmpfile = path.join(process.env['TMPDIR'], 'node-repl-' + process.pid + '.js')
|
||||
|
||||
obj.edit = function(editor) {
|
||||
editor = editor || process.ENV['EDITOR']
|
||||
pausingRepl(function(unpause) {
|
||||
var fds = [process.openStdin(), process.stdout, process.stdout]
|
||||
, args = [_tmpfile]
|
||||
// handle things like 'mate -w' and 'emacsclient --server-file <filename>'
|
||||
if (editor.match(/\s/)) {
|
||||
var words = editor.split(/\s+/)
|
||||
args = words.slice(1).concat(args)
|
||||
editor = words[0]
|
||||
}
|
||||
spawn(editor, args, {customFds: fds}).on('exit', function(code) {
|
||||
// FIXME figure out why obj.run doesn't work properly here (output is skewed)
|
||||
if (code === 0) {
|
||||
runFile(_tmpfile, function() { unpause() })
|
||||
} else {
|
||||
unpause()
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
obj.run = function() {
|
||||
pausingRepl(function(unpause) {
|
||||
runFile(_tmpfile, function() { unpause() })
|
||||
})
|
||||
}
|
||||
|
||||
obj.setEditor = function(editor) {
|
||||
process.ENV['EDITOR'] = editor
|
||||
}
|
||||
|
||||
obj.stash = function(dest) {
|
||||
try {
|
||||
fs.statSync(_tmpfile)
|
||||
} catch (e) {
|
||||
console.log('nothing to stash')
|
||||
return
|
||||
}
|
||||
pausingRepl(function(unpause) {
|
||||
var read = fs.createReadStream(_tmpfile)
|
||||
read.on('end', function() {
|
||||
console.log('stashed')
|
||||
unpause()
|
||||
})
|
||||
// TODO confirm before overwriting an existing file
|
||||
sys.pump(read, fs.createWriteStream(dest))
|
||||
})
|
||||
}
|
||||
|
||||
obj.unstash = function(source) {
|
||||
try {
|
||||
fs.statSync(source)
|
||||
} catch (e) {
|
||||
console.log('no stash at ' + source)
|
||||
return
|
||||
}
|
||||
pausingRepl(function(unpause) {
|
||||
var read = fs.createReadStream(source)
|
||||
read.on('end', function() {
|
||||
console.log('unstashed')
|
||||
unpause()
|
||||
})
|
||||
sys.pump(read, fs.createWriteStream(_tmpfile))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function pausingRepl(fn) {
|
||||
var origPrompt = _repl.prompt || '> '
|
||||
_repl.stream.pause()
|
||||
_repl.rli.enabled = false
|
||||
_repl.prompt = ''
|
||||
fn(function() {
|
||||
_repl.prompt = origPrompt
|
||||
_repl.rli.enabled = true
|
||||
_repl.stream.resume()
|
||||
_repl.displayPrompt()
|
||||
})
|
||||
}
|
||||
|
||||
function runFile(filename, callback) {
|
||||
var Script = process.binding('evals').Script
|
||||
, evalcx = Script.runInContext
|
||||
, read = fs.createReadStream(filename)
|
||||
, s = ''
|
||||
read.on('data', function(d) { s += d })
|
||||
read.on('end', function() {
|
||||
// The catchall for errors
|
||||
try {
|
||||
// Use evalcx to supply the global context
|
||||
var ret = evalcx(s, _repl.context, "repl");
|
||||
if (ret !== undefined) {
|
||||
_repl.context._ = ret;
|
||||
repl.writer(ret) + "\n"
|
||||
}
|
||||
} catch (e) {
|
||||
// On error: Print the error and clear the buffer
|
||||
if (e.stack) {
|
||||
_repl.stream.write(e.stack + "\n");
|
||||
} else {
|
||||
_repl.stream.write(e.toString() + "\n");
|
||||
}
|
||||
}
|
||||
if (callback) callback()
|
||||
})
|
||||
}
|
||||
|
||||
if (require.main === module) exports.startRepl()
|
||||
23
package.json
Normal file
23
package.json
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
{ "name" : "edit-repl"
|
||||
, "description" : "Edit code in the repl using a real text editor"
|
||||
, "version" : "0.0.1"
|
||||
, "homepage" : "http://samhuri.net/node/edit-repl"
|
||||
, "author" : "Sami Samhuri <sami@samhuri.net> (http://blog.izs.me)"
|
||||
, "repository" :
|
||||
{ "type" : "git"
|
||||
, "url" : "http://github.com/samsonjs/edit-repl.git"
|
||||
}
|
||||
, "bugs" :
|
||||
{ "mail" : "sami.samhuri+edit-repl@gmail.com"
|
||||
, "web" : "http://github.com/samsonjs/edit-repl/issues"
|
||||
}
|
||||
, "directories" : { "lib" : "./lib" }
|
||||
, "bin" : { "node-edit-repl" : "./repl.js" }
|
||||
, "main" : "./lib/index"
|
||||
, "engines" : { "node" : ">=0.2.0" }
|
||||
, "licenses" :
|
||||
[ { "type" : "MIT"
|
||||
, "url" : "http://github.com/samsonjs/edit-repl/raw/master/LICENSE"
|
||||
}
|
||||
]
|
||||
}
|
||||
3
repl.js
Executable file
3
repl.js
Executable file
|
|
@ -0,0 +1,3 @@
|
|||
#!/usr/bin/env node
|
||||
|
||||
require('./lib/index').startRepl()
|
||||
Loading…
Reference in a new issue