【问题标题】:ANSI coloring in emacs start-process output bufferemacs 启动进程输出缓冲区中的 ANSI 着色
【发布时间】:2017-06-03 20:51:35
【问题描述】:

我在 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* 缓冲区中的彩色输出?

【问题讨论】:

    标签: emacs


    【解决方案1】:

    链接的答案似乎没有任何不涉及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))))))
    

    【讨论】:

    • 谢谢,太棒了,直接复制粘贴了你的 sn-p 就可以了!
    • 嗯,不幸的是(很明显,考虑到代码的机制)缓冲区将在进程执行时显示控制代码,只有在完成后,调用ansi-color-apply-on-region。您知道是否可以“即时”应用ansi-color 转换?
    • @SteveLorimer 我认为最简单的方法可能是在comint-mode 中启动缓冲区。否则,您可以创建 process-filter 并在过滤器中应用颜色。
    【解决方案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))
    

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

    【讨论】:

      猜你喜欢
      • 2013-11-27
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      相关资源
      最近更新 更多