scheme - 如何更改 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"
}
scheme
mit-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
任何帮助将不胜感激,谢谢!
解决方案
该脚本实际上并没有运行任何东西:它只是定义了一个 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 人可以在那里提供帮助。