我可以在咖啡机启动前将功能附加到咖啡机上吗?

时间:2013-02-14 23:26:26

标签: coffeescript

假设我想要pp函数:

coffee> pp = (obj) -> JSON.stringify(obj)                      
[Function]                                                     
coffee> pp({cat: "fancy"})                                     
'{"cat":"fancy"}'                                              
coffee>    

有没有办法可以在控制台加载时立即使用该功能?我正在查看coffee -r "utils.coffee",但是没有看到任何方法将所需的库放入命令行中可用的对象。看起来我可以改变repl.js,但这似乎是一个坏主意。

2 个答案:

答案 0 :(得分:1)

您可以将这些函数放入global变量(这是Node的window版本),然后使用-r选项。

# utils.coffee
global.pp = (obj) -> JSON.stringify(obj)

然后在同一个直接的utils.coffee上运行:

coffee -r ./utils

它应该启动一个CoffeeScript REPL,并将pp函数作为全局变量提供:

coffee> pp ohmy: 'neat'
'{"ohmy":"neat"}'

更新:它似乎是-r命令行选项was removed in CoffeeScript's master。它可能不是以这种方式使用的:(

更新2 :还有另一种方法可以做到这一点!它不依赖于任何特定于命令的参数:

{ echo "require './utils'"; cat; } | coffee
但是,它不会像咖啡REPL一样100%工作。例如,箭头键似乎不起作用。

编辑(jc):使用此方法可以为节点卸载,这很方便:

# utils.coffee
global.unload = (moduleName) -> 
  cacheName = require.resolve(moduleName)
  delete require.cache[cacheName]

$ coffee -r ~/Dev/utils.coffee    
coffee> unload                             
[Function]          

更新3 :另一种可能是“创建自己的REPL”。没有真正重新实现任何东西。基于this hacky solution,您可以执行以下操作:

#! /usr/bin/env coffee

# REPL functions.
global.pp = (obj) -> JSON.stringify(obj)

# Start the REPL.
require 'coffee-script/lib/coffee-script/repl'

然后使用该脚本作为新的REPL。它的工作方式与普通的Coffee REPL和新功能完全相同(箭头键没有问题,TAB完成也没问题)。

BTW,我认为您需要安装CoffeeScript而-g上没有npm选项才能使用。

但这是一个非常黑客的解决方案。它依赖于内部的CoffeeScript实现文件结构及其功能,并且随时都可能发生变化(实际上,我知道在基于Node的一个新的改进的Coffee REPL中已经完成了一些工作......我希望该功能被暴露以编程方式使用,因此这些黑客不再是黑客攻击了。)

答案 1 :(得分:1)

看看@ Daniel's(丹尼尔泰勒)出色的nesh,一个增强的节点shell,也会说CoffeeScript:http://danielgtaylor.github.io/nesh/

以下是将pp函数加载到CoffeeScript REPL中的方法:

nesh -c -e 'pp = (obj) -> JSON.stringify(obj)'

同样,如果你想加载一个文件,比如说~/.nesh_profile.coffee(类似于加载一个shell配置文件),请在启动时使用:

nesh -c -e ~/.nesh_profile.coffee

小警告: REPL语言 - JavaScript诉CoffeeScript - 以及您加载的代码语言必须相同修改:唯一的例外是您始终可以通过扩展名为.js文件加载JavaScript,即使在启动CoffeeScript REPL时也是如此。 (相比之下,启动CoffeeScript REPL时无法指定JS 字符串。)

要自动将'nesh配置文件'加载到CoffeeScript REPL中,您可以在shell配置文件中定义别名; e.g:

alias neshc='nesh -c -e ~/.nesh_profile.coffee'

更新:以下是如何使用与 JavaScript REPL完全相同的'nesh配置文件';使用process substitution动态执行JavaScript编译:

alias neshj='nesh -e <(coffee -bp ~/.nesh_profile.coffee)'

nesh作为npm包提供,因此您可以按照以下方式轻松安装:

sudo npm install nesh -g