2

我需要一个 shell 脚本,它允许我从 TextWrangler(一个 Mac 应用程序)排版 Lilypond 文件。到目前为止,我想出了这个:

#!/bin/sh
/Applications/LilyPond.app/Contents/Resources/bin/lilypond -o $1

当然,这是行不通的。(这就是我在 Stack Overflow 的原因。)

当我从 TextWrangler 的 shebang 菜单运行该脚本时,我得到以下输出:

/Applications/LilyPond.app/Contents/Resources/bin/lilypond: option faultpaper,
--output'' requires an argument

是什么赋予了?

我正在运行 Snow Leopard、TextWrangler 和 Lilypond。帮助表示赞赏。

4

2 回答 2

1

编辑:找到了一种在 TextWrangler 启动的 Unix 脚本中获取文档路径的方法,所以我重写了这个。

有多种方法可以通过#!在 TextWrangler 中处理脚本。菜单,我不确定您要使用哪一个。不过,看起来您正在尝试创建一个 Unix 脚本来转换您的 LilyPond 文档。

正如您的错误提示,不幸的是,Unix 脚本根本没有给出任何参数,因此$1将为空。但是,事实证明,最新版本的 BBEdit/TextWrangler在运行脚本之前确实设置了一些环境变量(请参阅BBEdit 9.3 发行说明并向下滚动到Changes)。特别是,您可以使用以下环境变量:

BB_DOC_PATH            path of the document (not set if doc is unsaved)

因此,将此脚本保存到~/Library/Application Support/TextWrangler/Unix Support/Unix Scripts您应该一切顺利。

您可能尝试执行此操作但效果不佳的其他方法:

  • 使用 Unix 过滤器:为此,您必须选择文档中的所有 LilyPond 代码,并将其保存到一个临时文件中,该文件作为参数传递给您的脚本。好的,这样就可以得到一个输入文件名,但代价是一些麻烦。但随后该脚本的输出(即 LiiyPond 编译器输出)默认替换您刚刚选择的任何内容,这可能不是您想要的。错误的工作工具。
  • 使用#! →在 LilyPond 文件上运行:#!这涉及在文件顶部放置一行并让 TextWrangler 尝试将文件作为脚本执行,使用#!作为选择脚本解释器的指南。不幸的是,该#!行仅适用于某些脚本语言,而 LilyPond(不是一种脚本语言)不是其中之一。这就是 Peter Hilton 正在尝试做的事情,正如他所指出的,如果您尝试添加#!,您将收到 LilyPond 语法错误!行到 LilyPond 文件的顶部。(如果你好奇,从技术上讲,有一种方法可以得到#!→运行工作,即使用 here-document 语法将您的 LilyPond 代码嵌入到可执行的 shell 或 perl 脚本中。但这是一个粗俗的hack,很快就会变得笨拙。)

上面链接的脚本有一些限制:

  • 它不会在运行 LilyPond 之前检查您是否保存了文档。在运行 LilyPond 之前让 TextWrangler 自动保存会很好。
  • 它不能将文本片段或未保存的文档作为输入,只能将保存的文档作为输入。

您可以通过转向 AppleScript 来制定更复杂的解决方案来解决这些问题。这样做的两种方法:

  • 创建一个特定于 TextWrangler 的脚本并将其放入~/Library/Application Support/TextWrangler/Scripts. 然后它会显示在 AppleScript 菜单(奇怪的滚动 S)中,或者您可以通过调出Window → Palettes → Scripts来获得它。我相信有两个人已经走上了这条路并分享了他们的结果:
  • 创建一个 Mac OS 服务,这可能是一种可以在几乎任何文本编辑器中重复使用的方法。这就是我们在 NeXT 时代编译 Common Music 文件的方式,所以我可以证明它的优雅。不幸的是,我没有一个很好的最新示例。
于 2012-01-06T08:52:29.203 回答
0

好问题。如果你这样做,它实际上会在我的系统上运行 Lilypond:

#!/Applications/LilyPond.app/Contents/Resources/bin/lilypond -o $1

…但失败,因为#不是行注释字符,所以 Lilypond 尝试解析该行。

用块注释包围它会失败,因为 TextWrangler 找不到“shebang”行。

%{
#!/Applications/LilyPond.app/Contents/Resources/bin/lilypond -o $1
%}

另一种方法是使用Smultron 3,它允许您定义commands可以使用键盘快捷键运行。

于 2011-09-26T10:14:54.413 回答