Coffeescript 我可以在咖啡控制台启动前将功能连接到它吗?

Coffeescript 我可以在咖啡控制台启动前将功能连接到它吗?,coffeescript,Coffeescript,假设我想要一个pp函数: coffee> pp = (obj) -> JSON.stringify(obj) [Function] coffee> pp({cat: "fancy"}) '{"cat":"fancy"}'

假设我想要一个
pp
函数:

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

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

您可以将这些函数放入
全局
变量(类似于节点版本的
窗口
)中,然后使用
-r
选项

# utils.coffee
global.pp = (obj) -> JSON.stringify(obj)
然后直接在相同的utils.coffee上运行:

coffee-r./utils
它应该启动CoffeeScript REPL,并将
pp
函数作为全局变量提供:

coffee>pp欧姆:“干净”
“{”欧姆“:“整洁”}”
更新:似乎是
-r
命令行选项。它可能不打算这样使用:(

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

{ echo "require './utils'"; cat; } | coffee
然而,它不会像咖啡应答器那样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”。实际上不需要重新实现任何内容。基于此,您可以执行以下操作:

#! /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和新函数完全相同(箭头键和制表符完成都没有问题:)

顺便说一句,我认为您需要在
npm
上安装CoffeeScript,而不使用
-g
选项才能工作

不过,这是一个非常粗糙的解决方案,它依赖于内部CoffeeScript实现文件结构及其功能,并且随时可能发生变化(事实上,我知道在Node的基础上改进的Coffee REPL中已经做了一些工作……我希望能够以编程的方式使用这些功能,这样这些黑客就不再是黑客了)。

看看@Daniel's(Daniel Taylor's)卓越的
nesh
,一个增强的节点外壳,也能讲咖啡脚本:

下面是如何将
pp
函数加载到CoffeeScript REPL中:

nesh -c -e 'pp = (obj) -> JSON.stringify(obj)'
类似地,如果您想加载一个文件,比如说
~/.nesh_profile.coffee
(类似于加载shell配置文件),在启动时使用:

nesh -c -e ~/.nesh_profile.coffee
小提示:REPL语言-JavaScript v.CoffeeScript-和您正在加载的代码的语言必须相同。Edit:唯一的例外是,您始终可以通过扩展名为
.js
的文件加载JavaScript,即使在启动CoffeeScript REPL时也是如此。(相比之下,启动CoffeeScript REPL时不能指定JS字符串)

要自动将“nesh配置文件”加载到CoffeeScript REPL中,您可以在shell配置文件中定义别名;例如:

alias neshc='nesh -c -e ~/.nesh_profile.coffee'
更新:下面是如何将相同的“nesh配置文件”与JavaScript REPL一起使用;JavaScript编译是通过以下方式动态执行的:


谢谢。很遗憾它被删除了。我希望Coffee REPL对我来说更像irb。我将使用此技术,并在命令行中别名Coffee——直到它消失:(@jcollum我再次更新了我的答案:).BTW,当我发现
-r
选项被删除时,我想知道如何将一些文本发送到命令的stdin,然后让命令继续从终端读取。也许你也对这些答案感兴趣:)
alias neshj='nesh -e <(coffee -bp ~/.nesh_profile.coffee)'
sudo npm install nesh -g