我正在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*
缓冲区中的着色输出?
答案 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))
过程过滤器功能是从相关过程接收标准输出的功能。该过程的所有输出将传递到过滤器。默认过滤器只是直接输出到进程缓冲区。