Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 从shell保存彩色emacs文本_Bash_Shell_Emacs - Fatal编程技术网

Bash 从shell保存彩色emacs文本

Bash 从shell保存彩色emacs文本,bash,shell,emacs,Bash,Shell,Emacs,我正在尝试使用emacs渲染的颜色将几百个短文件(每个大约100行)保存为PostScript(或pdf)文件。因此,我正在编写一个bash脚本,在emacs中打开它们并将它们保存为.ps文件 到目前为止,我最好的尝试是迭代使用以下命令: emacs --file $(filename).m --no-desktop --eval '(ps-print-buffer-with-faces)' --eval '(kill-emacs)' 但是,这会直接将其发送到默认打印机。我想将其另存为$(f

我正在尝试使用emacs渲染的颜色将几百个短文件(每个大约100行)保存为PostScript(或pdf)文件。因此,我正在编写一个bash脚本,在emacs中打开它们并将它们保存为.ps文件

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

emacs --file $(filename).m --no-desktop --eval '(ps-print-buffer-with-faces)' --eval '(kill-emacs)' 
但是,这会直接将其发送到默认打印机。我想将其另存为$(filename)\u PS.PS。在EmacsGUI中,我可以

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

并弹出文件保存提示。然而,手工操作很麻烦。如何使用shell脚本来实现这一点?

简单的答案是只提供代码,但我是学习和开发的人 您仍然需要在每次需要Emacs帮助时询问!对我来说更有趣 让我试着给你指出正确的方向——对你来说可能没那么有趣 一开始,但如果我做对了,你就不需要问那么多问题了 未来,然后不得不等待另一个像这样固执己见的答案:)

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

你有基本的功能,所以我们可以从那里开始。C-h-f ps打印缓冲区与面告诉我们

ps print buffer with faces是一个交互式自动加载的Lisp函数 在“ps print.el”中

这是必然的

(带面和可选文件名的ps打印缓冲区)

生成并打印缓冲区的PostScript图像。喜欢 “ps打印缓冲区”,但包括字体、颜色和下划线信息 在生成的图像中。此命令仅在使用 窗口系统,因此它有一种确定颜色值的方法

好的,但乍一看,似乎没有多少有用的信息 那里但是,有一个指向ps打印缓冲区的链接,可以单击。点击 在它上面我们得到

ps打印缓冲区是中的一个交互式自动加载Lisp函数 “ps print.el”

这是必然的

(ps打印缓冲区和可选文件名)

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

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

非交互式地,参数文件名按如下方式处理:如果 如果为零,请将图像发送到打印机。如果文件名是字符串,请保存 具有该名称的文件中的PostScript图像

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

如果我们能定义一个新的命令来处理这个问题,我们就可以 使用M-x——更好的是,我们可以将它绑定到一个密钥,然后我们只需要使用 那条捷径

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

(defun buffer-to-ps ()
  (interactive)
  ;; do something
  )
我们将其放入暂存缓冲区并对其进行评估。不太令人兴奋。让 添加一些文档,以便我们能够记住这是为了

(defun buffer-to-ps ()
  "Write the current buffer to a PS file"
  (interactive)
  ;; do something
  )
现在我们可以对ps进行C-HF缓冲,我们将看到我们的文档。不过,不是 做了很多。我们需要调用函数并为其提供文件名 论点我们尝试

(defun buffer-to-ps ()
  "Write the current buffer to a PS file"
  (interactive)
  (ps-print-buffer-with-faces "test.ps"))
光标位于定义的末尾,而在暂存缓冲区中,我们可以 C-x C-e来评估我们的定义。我们尝试在中运行新命令 暂存缓冲区,我们对ps进行M-x缓冲,我们在回音区看到一条消息 这说明已经编写了一个文件call test.ps。用查看器打开该文件 我们看到文件已经创建,并且有颜色等。但是,我们 不希望所有文件都被称为test.ps,因此现在我们需要找到一种方法 生成用作文件名参数的唯一名称。我们有几种方法 可以做到这一点,但第一个明显的问题是设法使用 缓冲区。我们使用C-ha并输入“buffername”,这会给出一些命中率。去 通过列表,我们可以看到缓冲区名称。做C-HF缓冲区名给我们

缓冲区名称是“C源代码”中的内置函数

(缓冲区名称和可选缓冲区)

以字符串形式返回缓冲区的名称。缓冲区默认为当前值 缓冲器如果缓冲区已被终止,则返回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查看器查看它,我们看到它是我们的 缓冲内容与颜色等,所以我们已经做到了

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

我们可能希望输出文件类似于相应的脚本,但是 我们也可能希望它反映出这是一个postscript渲染 剧本有几件事我们可以尝试,但由于懒惰,我们会去做 最简单的优先。如果我们只生成一个有“.ps”的文件名呢 附加在它后面。这也意味着我们有一个扩展名为 更适合文件名约定。如何将“.ps”连接到 缓冲区名称返回的文件名字符串?C-h海螺,我们得到

concat是“C源代码”中的内置函数

(concat和rest序列)

连接所有参数
(defun buffer-to-ps ()
  "Write the current buffer to a PS file"
  (interactive)
  (ps-print-buffer-with-faces (concat (buffer-name) ".ps")))