emacs启动过程输出缓冲区中的ANSI着色

时间:2017-06-03 20:51:36

标签: emacs

我正在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

我在this SO answer中看到可以为缓冲区添加颜色;但是我不确定如何使用start-process

创建的缓冲区来完成它

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

2 个答案:

答案 0 :(得分:2)

看起来链接的答案看起来没有涉及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))))))

答案 1 :(得分:2)

这是一个解决方案,将在执行过程时显示颜色,而不是在处理完成并调用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))

过程过滤器功能是从相关过程接收标准输出的功能。该过程的所有输出将传递到过滤器。默认过滤器只是直接输出到进程缓冲区。