mirror of
https://github.com/jashkenas/coffeescript.git
synced 2026-01-20 20:27:57 -05:00
295 lines
15 KiB
HTML
295 lines
15 KiB
HTML
<!DOCTYPE html>
|
|
|
|
<html>
|
|
<head>
|
|
<title>repl.coffee</title>
|
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
|
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
|
|
<link rel="stylesheet" media="all" href="public/stylesheets/normalize.css" />
|
|
<link rel="stylesheet" media="all" href="docco.css" />
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<div class="page">
|
|
|
|
<div class="header">
|
|
|
|
<h1>repl.coffee</h1>
|
|
|
|
|
|
|
|
<div class="toc">
|
|
<h3>Table of Contents</h3>
|
|
<ol>
|
|
|
|
|
|
<li>
|
|
<a class="source" href="browser.html">
|
|
browser.coffee
|
|
</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a class="source" href="cake.html">
|
|
cake.coffee
|
|
</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a class="source" href="coffee-script.html">
|
|
coffee-script.coffee
|
|
</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a class="source" href="command.html">
|
|
command.coffee
|
|
</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a class="source" href="grammar.html">
|
|
grammar.coffee
|
|
</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a class="source" href="helpers.html">
|
|
helpers.coffee
|
|
</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a class="source" href="index.html">
|
|
index.coffee
|
|
</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a class="source" href="lexer.html">
|
|
lexer.coffee
|
|
</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a class="source" href="nodes.html">
|
|
nodes.coffee
|
|
</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a class="source" href="optparse.html">
|
|
optparse.coffee
|
|
</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a class="source" href="repl.html">
|
|
repl.coffee
|
|
</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a class="source" href="rewriter.html">
|
|
rewriter.coffee
|
|
</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a class="source" href="scope.html">
|
|
scope.litcoffee
|
|
</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a class="source" href="sourcemap.html">
|
|
sourcemap.coffee
|
|
</a>
|
|
</li>
|
|
|
|
</ol>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="highlight"><pre><span class="nv">vm = </span><span class="nx">require</span> <span class="s">'vm'</span>
|
|
<span class="nv">nodeREPL = </span><span class="nx">require</span> <span class="s">'repl'</span>
|
|
<span class="nv">CoffeeScript = </span><span class="nx">require</span> <span class="s">'./coffee-script'</span>
|
|
<span class="p">{</span><span class="nx">merge</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s">'./helpers'</span>
|
|
|
|
<span class="nv">replDefaults =</span>
|
|
<span class="nv">prompt: </span><span class="s">'coffee> '</span><span class="p">,</span>
|
|
<span class="nb">eval</span><span class="o">:</span> <span class="nf">(input, context, filename, cb) -></span></pre></div>
|
|
|
|
|
|
|
|
|
|
<p>XXX: multiline hack
|
|
|
|
</p>
|
|
|
|
|
|
<div class="highlight"><pre> <span class="nv">input = </span><span class="nx">input</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/\uFF00/g</span><span class="p">,</span> <span class="s">'\n'</span></pre></div>
|
|
|
|
|
|
|
|
|
|
<p>strip single-line comments
|
|
|
|
</p>
|
|
|
|
|
|
<div class="highlight"><pre> <span class="nv">input = </span><span class="nx">input</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/(^|[\r\n]+)(\s*)##?(?:[^#\r\n][^\r\n]*|)($|[\r\n])/</span><span class="p">,</span> <span class="s">'$1$2$3'</span></pre></div>
|
|
|
|
|
|
|
|
|
|
<p>empty command
|
|
|
|
</p>
|
|
|
|
|
|
<div class="highlight"><pre> <span class="k">return</span> <span class="nx">cb</span> <span class="kc">null</span> <span class="k">if</span> <span class="sr">/^(\s*|\(\s*\))$/</span><span class="p">.</span><span class="nx">test</span> <span class="nx">input</span></pre></div>
|
|
|
|
|
|
|
|
|
|
<p>TODO: fix #1829: pass in-scope vars and avoid accidentally shadowing them by omitting those declarations
|
|
|
|
</p>
|
|
|
|
|
|
<div class="highlight"><pre> <span class="k">try</span>
|
|
<span class="nv">js = </span><span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">compile</span> <span class="s">"_=(</span><span class="si">#{</span><span class="nx">input</span><span class="si">}</span><span class="s">\n)"</span><span class="p">,</span> <span class="p">{</span><span class="nx">filename</span><span class="p">,</span> <span class="nv">bare: </span><span class="kc">yes</span><span class="p">}</span>
|
|
<span class="nx">cb</span> <span class="kc">null</span><span class="p">,</span> <span class="nx">vm</span><span class="p">.</span><span class="nx">runInContext</span><span class="p">(</span><span class="nx">js</span><span class="p">,</span> <span class="nx">context</span><span class="p">,</span> <span class="nx">filename</span><span class="p">)</span>
|
|
<span class="k">catch</span> <span class="nx">err</span>
|
|
<span class="nx">cb</span> <span class="nx">err</span>
|
|
|
|
<span class="nv">addMultilineHandler = </span><span class="nf">(repl) -></span>
|
|
<span class="p">{</span><span class="nx">rli</span><span class="p">,</span> <span class="nx">inputStream</span><span class="p">,</span> <span class="nx">outputStream</span><span class="p">}</span> <span class="o">=</span> <span class="nx">repl</span>
|
|
|
|
<span class="nv">multiline =</span>
|
|
<span class="nv">enabled: </span><span class="kc">off</span>
|
|
<span class="nv">initialPrompt: </span><span class="nx">repl</span><span class="p">.</span><span class="nx">prompt</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/^[^> ]*/</span><span class="p">,</span> <span class="nf">(x) -></span> <span class="nx">x</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/./g</span><span class="p">,</span> <span class="s">'-'</span><span class="p">)</span>
|
|
<span class="nv">prompt: </span><span class="nx">repl</span><span class="p">.</span><span class="nx">prompt</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/^[^> ]*>?/</span><span class="p">,</span> <span class="nf">(x) -></span> <span class="nx">x</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/./g</span><span class="p">,</span> <span class="s">'.'</span><span class="p">)</span>
|
|
<span class="nv">buffer: </span><span class="s">''</span></pre></div>
|
|
|
|
|
|
|
|
|
|
<p>Proxy node's line listener
|
|
|
|
</p>
|
|
|
|
|
|
<div class="highlight"><pre> <span class="nv">nodeLineListener = </span><span class="nx">rli</span><span class="p">.</span><span class="nx">listeners</span><span class="p">(</span><span class="s">'line'</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="nx">rli</span><span class="p">.</span><span class="nx">removeListener</span> <span class="s">'line'</span><span class="p">,</span> <span class="nx">nodeLineListener</span>
|
|
<span class="nx">rli</span><span class="p">.</span><span class="nx">on</span> <span class="s">'line'</span><span class="p">,</span> <span class="nf">(cmd) -></span>
|
|
<span class="k">if</span> <span class="nx">multiline</span><span class="p">.</span><span class="nx">enabled</span>
|
|
<span class="nx">multiline</span><span class="p">.</span><span class="nx">buffer</span> <span class="o">+=</span> <span class="s">"</span><span class="si">#{</span><span class="nx">cmd</span><span class="si">}</span><span class="s">\n"</span>
|
|
<span class="nx">rli</span><span class="p">.</span><span class="nx">setPrompt</span> <span class="nx">multiline</span><span class="p">.</span><span class="nx">prompt</span>
|
|
<span class="nx">rli</span><span class="p">.</span><span class="nx">prompt</span> <span class="kc">true</span>
|
|
<span class="k">else</span>
|
|
<span class="nx">nodeLineListener</span> <span class="nx">cmd</span>
|
|
<span class="k">return</span></pre></div>
|
|
|
|
|
|
|
|
|
|
<p>Handle Ctrl-v
|
|
|
|
</p>
|
|
|
|
|
|
<div class="highlight"><pre> <span class="nx">inputStream</span><span class="p">.</span><span class="nx">on</span> <span class="s">'keypress'</span><span class="p">,</span> <span class="nf">(char, key) -></span>
|
|
<span class="k">return</span> <span class="k">unless</span> <span class="nx">key</span> <span class="o">and</span> <span class="nx">key</span><span class="p">.</span><span class="nx">ctrl</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">key</span><span class="p">.</span><span class="nx">meta</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">key</span><span class="p">.</span><span class="nx">shift</span> <span class="o">and</span> <span class="nx">key</span><span class="p">.</span><span class="nx">name</span> <span class="o">is</span> <span class="s">'v'</span>
|
|
<span class="k">if</span> <span class="nx">multiline</span><span class="p">.</span><span class="nx">enabled</span></pre></div>
|
|
|
|
|
|
|
|
|
|
<p>allow arbitrarily switching between modes any time before multiple lines are entered
|
|
|
|
</p>
|
|
|
|
|
|
<div class="highlight"><pre> <span class="k">unless</span> <span class="nx">multiline</span><span class="p">.</span><span class="nx">buffer</span><span class="p">.</span><span class="nx">match</span> <span class="sr">/\n/</span>
|
|
<span class="nv">multiline.enabled = </span><span class="o">not</span> <span class="nx">multiline</span><span class="p">.</span><span class="nx">enabled</span>
|
|
<span class="nx">rli</span><span class="p">.</span><span class="nx">setPrompt</span> <span class="nx">repl</span><span class="p">.</span><span class="nx">prompt</span>
|
|
<span class="nx">rli</span><span class="p">.</span><span class="nx">prompt</span> <span class="kc">true</span>
|
|
<span class="k">return</span></pre></div>
|
|
|
|
|
|
|
|
|
|
<p>no-op unless the current line is empty
|
|
|
|
</p>
|
|
|
|
|
|
<div class="highlight"><pre> <span class="k">return</span> <span class="k">if</span> <span class="nx">rli</span><span class="p">.</span><span class="nx">line</span><span class="o">?</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">rli</span><span class="p">.</span><span class="nx">line</span><span class="p">.</span><span class="nx">match</span> <span class="sr">/^\s*$/</span></pre></div>
|
|
|
|
|
|
|
|
|
|
<p>eval, print, loop
|
|
|
|
</p>
|
|
|
|
|
|
<div class="highlight"><pre> <span class="nv">multiline.enabled = </span><span class="o">not</span> <span class="nx">multiline</span><span class="p">.</span><span class="nx">enabled</span>
|
|
<span class="nv">rli.line = </span><span class="s">''</span>
|
|
<span class="nv">rli.cursor = </span><span class="mi">0</span>
|
|
<span class="nx">rli</span><span class="p">.</span><span class="nx">output</span><span class="p">.</span><span class="nx">cursorTo</span> <span class="mi">0</span>
|
|
<span class="nx">rli</span><span class="p">.</span><span class="nx">output</span><span class="p">.</span><span class="nx">clearLine</span> <span class="mi">1</span></pre></div>
|
|
|
|
|
|
|
|
|
|
<p>XXX: multiline hack
|
|
</p>
|
|
|
|
|
|
<div class="highlight"><pre> <span class="nv">multiline.buffer = </span><span class="nx">multiline</span><span class="p">.</span><span class="nx">buffer</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/\n/g</span><span class="p">,</span> <span class="s">'\uFF00'</span>
|
|
<span class="nx">rli</span><span class="p">.</span><span class="nx">emit</span> <span class="s">'line'</span><span class="p">,</span> <span class="nx">multiline</span><span class="p">.</span><span class="nx">buffer</span>
|
|
<span class="nv">multiline.buffer = </span><span class="s">''</span>
|
|
<span class="k">else</span>
|
|
<span class="nv">multiline.enabled = </span><span class="o">not</span> <span class="nx">multiline</span><span class="p">.</span><span class="nx">enabled</span>
|
|
<span class="nx">rli</span><span class="p">.</span><span class="nx">setPrompt</span> <span class="nx">multiline</span><span class="p">.</span><span class="nx">initialPrompt</span>
|
|
<span class="nx">rli</span><span class="p">.</span><span class="nx">prompt</span> <span class="kc">true</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="nv">module.exports =</span>
|
|
<span class="nv">start: </span><span class="nf">(opts = {}) -></span>
|
|
<span class="nv">opts = </span><span class="nx">merge</span> <span class="nx">replDefaults</span><span class="p">,</span> <span class="nx">opts</span>
|
|
<span class="nv">repl = </span><span class="nx">nodeREPL</span><span class="p">.</span><span class="nx">start</span> <span class="nx">opts</span>
|
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">on</span> <span class="s">'exit'</span><span class="p">,</span> <span class="nf">-></span> <span class="nx">repl</span><span class="p">.</span><span class="nx">outputStream</span><span class="p">.</span><span class="nx">write</span> <span class="s">'\n'</span>
|
|
<span class="nx">addMultilineHandler</span> <span class="nx">repl</span>
|
|
<span class="nx">repl</span>
|
|
|
|
</pre></div>
|
|
|
|
|
|
<div class="fleur">h</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|