在Emacs的start-process输出缓冲区中使用ANSI颜色。

5

我正在emacs中运行一个进程,该进程在其输出中使用ANSI颜色代码。

我正在使用start-process创建该进程,并为进程的输出提供了自定义缓冲区名称。

(start-process "foo" "*Foo*" foo-command foo-args)

如果我打开*Foo*缓冲区,ANSI颜色代码会以原始格式打印到缓冲区中。
^[[36msome output message^[[m
^[[1;35msome output message^[[m
^[[1;34msome output message^[[m

我在这篇Stack Overflow回答中看到可以给缓冲区添加颜色;然而,我不确定如何在使用start-process创建的缓冲区中实现它。

是否可能将这些ANSI颜色代码转换为我的*Foo*缓冲区中的有色输出?

2个回答

3

看起来之前的链接答案中没有不涉及comint-mode 的解决方法。你可以使用ansi-color-apply-on-region将输出缓冲区着色,例如:

(set-process-sentinel
 (start-process "foo" "*Foo*" foo-command foo-args)
 (lambda (p _m)
   (when (eq 0 (process-exit-status p))
     (with-current-buffer (process-buffer p)
       (ansi-color-apply-on-region (point-min) (point-max))))))

谢谢,太棒了,我直接复制粘贴了你的代码片段,它就能用了! - Steve Lorimer
1
哦,很遗憾(考虑到代码的机制,这是显而易见的),缓冲区将在进程执行时显示控制代码,并且只有在完成后才调用 ansi-color-apply-on-region。您知道是否可能实时应用 ansi-color 转换吗? - Steve Lorimer
@SteveLorimer 我认为最简单的方法可能是在comint-mode中启动缓冲区。否则,您可以创建一个process-filter并在过滤器中应用颜色。 - Rorschach

3
这里有一个解决方案,可以在执行过程中显示颜色(而不是在完成过程后调用ansi-color-apply-on-region)。
关键是最后一行:set-process-filter
(defun runserver ()
  (interactive)
  (setq *server-buffer* (get-buffer-create "server"))
  (with-current-buffer *server-buffer*
    (ansi-color-for-comint-mode-on)
    (comint-mode))
  (let ((default-directory "~/server/"))
    (setq *server-process*
          (start-process-shell-command
           "server" *server-buffer* "./run_server")))
  (set-process-filter *server-process* 'comint-output-filter))

进程筛选函数是一个接收相关进程标准输出的函数。该进程的所有输出都将传递到筛选器中。默认的筛选器直接输出到进程缓冲区。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接