【问题标题】:can I attach functions to the coffee console before it starts?我可以在咖啡控制台启动之前将功能附加到它吗?
【发布时间】:2013-02-14 23:26:26
【问题描述】:

假设我想要一个pp 函数:

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

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

【问题讨论】:

    标签: coffeescript


    【解决方案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
    

    但是,它不会像 Coffee REPL 那样 100% 工作。例如,箭头键似乎不起作用。

    Edit (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 完成都没有问题:)

    顺便说一句,我认为您需要在没有 npm 上的 -g 选项的情况下安装 CoffeeScript 才能正常工作。

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

    【讨论】:

    • 谢谢。蹩脚的是它被删除了。我更喜欢 irb 的 Coffee REPL。我将使用这种技术,并在命令行中为咖啡起别名——直到它消失:(
    • @jcollum 我再次更新了我的答案:)。顺便说一句,当我发现 -r 选项被删除时,我 asked on unix.stackexchange 如何将一些文本发送到命令的标准输入,然后让命令继续从终端读取。也许你也对这些答案感兴趣:)
    【解决方案2】:

    看看@Daniel's (Daniel Taylor's) 的优秀nesh,一个增强的节点外壳,也讲 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 v. CoffeeScript - 和您正在加载的代码的语言必须相同编辑:唯一的例外是您始终可以通过扩展名为 .js文件 加载 JavaScript,即使在启动 CoffeeScript REPL 时也是如此。 (相比之下,您不能在启动 CoffeeScript REPL 时指定 JS 字符串)。

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

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

    更新:以下是您可以通过 JavaScript REPL 使用完全相同的“nesh 配置文件”的方法;使用 process substitution 即时编译为 JavaScript:

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

    neshnpm 包的形式提供,因此您可以按如下方式轻松安装:

    sudo npm install nesh -g
    

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 2011-09-15
      • 2018-03-24
      • 1970-01-01
      • 2012-07-08
      • 2015-01-21
      • 2016-12-06
      • 1970-01-01
      • 2012-07-26
      相关资源
      最近更新 更多