从shell保存彩色emacs文本

时间:2017-02-12 01:38:53

标签: bash shell emacs

我试图将几百个短文件(约100行ea。)用作邮件脚本(或pdf)文件,使用emacs渲染它们的颜色。所以我正在编写一个bash脚本,在emacs中打开它们并将它们保存为.ps文件。

到目前为止,我最好的尝试是迭代使用以下命令:

emacs --file $(filename).m --no-desktop --eval '(ps-print-buffer-with-faces)' --eval '(kill-emacs)' 

但是,这会直接将其发送到默认打印机。我想把它保存为$(filename)_PS.ps。在emacs gui中,我可以做到

C-u M-x ps-print-buffer-with-faces

它会显示文件保存提示。然而,手动执行此操作非常麻烦。如何使用shell脚本完成这项工作?

1 个答案:

答案 0 :(得分:2)

简单的答案就是提供代码,但接下来我就是学习和学习 每当你需要Emacs的帮助时,你还是要问!更有趣的是 我试着指出你正确的方向 - 对你来说可能不那么有趣 最初,但是如果我做对了,你就不需要问多少问题了 未来然后必须等待另一个自以为是的答案:)

使用Emacs学习最重要的技能是如何使用内置帮助 设施。第二个最重要的是通过阅读学习一些基本的Emacs lisp Emacs Lisp参考(与Emacs捆绑在一起)。第三是学习划伤 你自己的痒。

你有基本的功能,所以我们可以从那里开始。 C-h f ps-print-buffer-with-faces告诉我们......

  

ps-print-buffer-with-faces是一个交互式自动加载的Lisp函数   在'ps-print.el'。

     

它必然会。

     

(ps-print-buffer-with-faces& optional FILENAME)

     

生成并打印缓冲区的PostScript图像。喜欢   'ps-print-buffer',但包括字体,颜色和下划线信息   在生成的图像中。此命令仅在您使用时才有效   窗口系统,所以它有一种方法来确定颜色值。

好的,但乍一看,似乎没有太多有用的信息 那里。但是,有一个可点击的ps-print-buffer链接。点击 我们得到......

  

ps-print-buffer是一个交互式自动加载的Lisp函数   “PS-print.el”。

     

它必然会。

     

(ps-print-buffer& optional FILENAME)

     

生成并打印缓冲区的PostScript图像。

     

交互式地,当您使用前缀参数(C-u)时,该命令   提示用户输入文件名,并保存PostScript图像   该文件而不是将其发送到打印机。

     

非交互式,参数FILENAME被视为如下:如果它   为零,将图像发送到打印机。如果FILENAME是一个字符串,请保存   具有该名称的文件中的PostScript图像。

这给了我们更多,包括如何调用它的重要细节 非交互式,参数是写入输出的文件的名称 至。这似乎很有希望,因为我们不想被迫称之为 以交互方式使用C-u来处理我们要打印的众多文件中的每一个。

如果我们可以定义一个可以解决这个问题的新命令,我们就可以 使用M-x - 甚至更好,我们可以将它绑定到一个键,然后我们只需要使用 那条捷径。

查看Emacs Lisp参考(也与Emacs捆绑在一起),我们看到了菜单 选项命令循环。查看该节点,我们会看到一个用于定义的菜单选项 命令。这很有希望。在阅读该节点并遵循一些链接之后 在那个关于定义函数等的节点中,我们得到了一个基本的起点......

(defun buffer-to-ps ()
  (interactive)
  ;; do something
  )

我们将其放在 scratch 缓冲区中并对其进行评估。不是非常令人兴奋。让我们 添加一些文档,以便我们记住这是为了什么......

(defun buffer-to-ps ()
  "Write the current buffer to a PS file"
  (interactive)
  ;; do something
  )

现在我们可以做C-h f buffer-to-ps,我们将看到我们的文档。还没有 做了很多。我们需要调用我们的函数并为其提供文件名 论点。我们试试......

(defun buffer-to-ps ()
  "Write the current buffer to a PS file"
  (interactive)
  (ps-print-buffer-with-faces "test.ps"))

将光标放在定义的末尾,而在暂存缓冲区中,我们这样做 C-x C-e来评估我们的定义。我们尝试在运行时运行新命令 临时缓冲区,我们做M-x buffer-to-ps,我们在echo区域看到一条消息 其中写了一个文件调用test.ps。用查看器打开该文件 我们看到文件已经创建,它有颜色等。但是,我们 不希望所有文件都被称为test.ps,所以现在我们需要找到一种方法 生成唯一名称以用作文件名参数。我们有几种方法 可以做到这一点,但第一个显而易见的是以某种方式尝试并使用的名称 缓冲区。我们使用C-h a并输入"缓冲区名称",这会给出一些命中。展望 通过列表,我们看到buffer-name。做C-h f buffer-name给我们

  

buffer-name是'C源代码'中的内置函数。

     

(缓冲区名称和可选BUFFER)

     

以字符串形式返回BUFFER的名称。 BUFFER默认为当前   缓冲。如果BUFFER被杀,则返回nil。

看起来很有希望,所以让我们试一试。 ...

(defun buffer-to-ps ()
  "Write the current buffer to a PS file"
  (interactive)
  (ps-print-buffer-with-faces (buffer-name)))

评估定义并使用M-x运行它会导致新文件存在 创建名为 scratch 。用ps观察器看它,我们看到它是我们的 缓冲内容与颜色等所以我们已经做到了!

但等等,我们有问题休斯顿!如果我们使用包含的缓冲区运行它 来自文件的内容,缓冲区名称将与文件名和时间相同 我们运行我们的命令,它将覆盖我们的文件 - 可能不是我们想要的。

我们可能希望输出文件与相应的脚本类似,但是 我们也可能希望它反映它是后记的渲染 脚本。我们可以尝试一些事情,但是懒惰,我们会去寻找 最简单的。如果我们只生成一个具有" .ps"的文件名怎么样呢? 附加到它。这也意味着我们有一个带扩展名的文件名 更适合文件名约定。我们如何连接" .ps"到了 缓冲区名称返回的文件名字符串? C-h是一个concat,我们得到了

  

concat是'C源代码'中的内置函数。

     

(concat& rest SEQUENCES)

     

连接所有参数并将结果作为字符串。结果   是一个字符串,其元素是所有参数的元素。每   参数可以是字符串,也可以是列表或字符向量(整数)。

所以我们将我们的功能更新为......

(defun buffer-to-ps ()
  "Write the current buffer to a PS file"
  (interactive)
  (ps-print-buffer-with-faces (concat (buffer-name) ".ps")))

我们使用M-x进行试用,最后得到文件 scratch .ps。

所以我们现在拥有基本功能。我们可以将此命令绑定到密钥 顺序,以便当我们在缓冲区时,我们只需按键序列和emacs 将根据当前缓冲区名称生成扩展名为.ps的文件 其中包含缓冲内容的postscript呈现 相应的面色。

下一步是什么?好吧,使用这个函数要求我们先在一个文件中打开文件 缓冲然后调用该函数(可能只需按一个键)。我们能做到 它在您的早期版本显示的命令行上,但每个都启动emacs 这样做的时间非常低效。什么是更好的方法?

要尝试的一件事是定义一个列出a中所有文件的函数 具有特定文件名模式的目录,即所有脚本文件和每个文件 其中,将它们加载到缓冲区然后调用您刚刚使用的函数 定义。这留给读者练习!发布更新 提问或创建一个新的,也许有人会提供更多帮助:)