首页 > 解决方案 > 如何更改 Atom 中的 Script 包以使用 Scheme 而不是 Guile 运行代码?

问题描述

我在 OSX 上使用 Atom 在 Scheme 中编码,并且我希望能够使用 Script 包运行我的代码 - 具体来说,使用 MIT:GNU Scheme,而不是guile,因为guile没有输出。或者,让它如此狡猾地输出我的脚本的逐行输出也可以工作,因为现在它只显示运行时。

我制作了一个名为atom-scheme并将其放入的脚本/usr/local/bin,它执行以下操作:

#!/bin/bash

atom-scheme () {
    scheme --quiet < "$1"
}

schememit-scheme是我为下载 MIT/GNU 方案时附带的脚本设置的别名。

我已经尝试编辑 ~/.atom/packages/script/lib/grammars/lisp.coffee,将第 32 行和第 35 行的“guile”替换为“atom-scheme”,但是,这样做我在 Atom 中得到了一个 TypeError BufferedProcess 类。

我希望结果是当我使用 guile 运行代码时弹出的窗口是我可以看到代码的逐行输出的地方。然而,最终发生的事情如下。

(下面的堆栈跟踪)

原子:1.40.1 x64 电子:3.1.10 操作系统:Mac OS X 10.14.6 抛出自脚本包 3.18.1

堆栈跟踪

未捕获的类型错误:无法读取未定义的属性“setEncoding”

At /Applications/Atom.app/Contents/Resources/app/static/<embedded>:14

TypeError: Cannot read property 'setEncoding' of undefined
    at BufferedProcess.bufferStream (/Applications/Atom.app/Contents/Resources/app/static/<embedded>:14:1127503)
    at BufferedProcess.handleEvents (/Applications/Atom.app/Contents/Resources/app/static/<embedded>:14:1129015)
    at BufferedProcess.start (/Applications/Atom.app/Contents/Resources/app/static/<embedded>:14:1127023)
    at new BufferedProcess (/Applications/Atom.app/Contents/Resources/app/static/<embedded>:14:1126771)
    at Runner.run (/packages/script/lib/runner.js:32:28)
    at Runtime.execute (/packages/script/lib/runtime.js:78:17)
    at HTMLElement.scriptRun (/packages/script/lib/script.js:98:40)
    at CommandRegistry.handleCommandEvent (/Applications/Atom.app/Contents/Resources/app/static/<embedded>:11:349123)
    at KeymapManager.dispatchCommandEvent (/Applications/Atom.app/Contents/Resources/app/static/<embedded>:11:1249835)
    at KeymapManager.handleKeyboardEvent (/Applications/Atom.app/Contents/Resources/app/static/<embedded>:11:1245969)
    at WindowEventHandler.handleDocumentKeyEvent (/Applications/Atom.app/Contents/Resources/app/static/<embedded>:11:284329)

命令

     -0:02.7.0 script:run (input.hidden-input)

非核心包

activate-power-mode 2.7.0 
atom-clock 0.1.17 
atom-ide-ui 0.13.0 
autocomplete-python 1.16.0 
autocomplete-swift 1.0.3 
go-plus 6.1.0 
Hydrogen 2.12.0 
ide-rust 0.21.0 
language-asymptote 1.1.0 
language-boo 0.1.0 
language-julia 0.19.1 
language-kotlin 0.5.0 
language-lisp 0.2.0 
language-markdown 0.37.0 
language-pseudo 0.1.3 
language-r 0.4.2 
language-racket 0.4.0 
language-rockstar 0.3.1 
language-rust 0.4.12 
language-scheme 1.4.0 
language-swift 0.5.0 
language-x86-64-assembly 2.2.11 
python-tools 0.6.9 
script 3.18.1 
swift-debugger 0.1.2 
teletype 0.13.4 

任何帮助将不胜感激,谢谢!

标签: schemelispeditoratom-editor

解决方案


该脚本实际上并没有运行任何东西:它只是定义了一个 shell 函数,一旦脚本终止,该函数就会丢失。由于子进程已退出,您可能会遇到错误。您可能实际上想要运行一个方案。例如:

#!/bin/sh -
exec scheme --quiet < "$1"

或者你想做的任何事情(实际上不是这个)。

更一般地,您要么需要更改包装器,使其与生成的命令行一致lisp.coffee,要么更改lisp.coffee它为您的脚本生成适当的命令行。您的原始脚本和我对它的修改都没有这样做。

调试它的一个好方法是编写一个执行以下操作的脚本:

#!/bin/sh -

echo "$(date)": "$@" >> /tmp/my.debugging.file
env >> /tmp/my.debugging.file

然后让编辑器运行它。现在你知道了,或者至少有一个想法,你需要实现什么参数。

根据评论,似乎找不到该脚本。这有两个可能的原因:

  • 它在PATH但它不是可执行的;
  • 它不在 中PATH,要么是因为编辑PATH不是你想的那样,要么是因为PATH在其他方面是错误的。

对于其中的第一个,解决方案是chmod +x .../atom-scheme,其中...表示“它所在的目录”。

对于其中的第二个:对我来说,如何PATH在 OSX 上为 GUI 应用程序设置是很神秘的:据我所知,它们不是传统 Unix 意义上的登录 shell 的子级,因此PATH以传统方式在 shell 初始化文件中设置可能不起作用:它们是某些登录过程的子进程,但我不明白该过程如何确定PATH应该是什么。

您可以通过将脚本的调用替换为调用来确定编辑PATH env的内容:这将打印环境,其中包括PATH. 如果它错了,我不知道如何改正:也许一些 OSX 人可以在那里提供帮助。


推荐阅读