【问题标题】:Emacs automatically close async output buffers on command completionEmacs 在命令完成时自动关闭异步输出缓冲区
【发布时间】:2011-08-02 16:25:50
【问题描述】:

我目前正在运行具有相当规律性的异步 emacs 命令,如下所示:

(save-window-excursion
  (async-shell-command
    cmd
    (generate-new-buffer "async")))

这一切都很好,但它用大量的 async 和 async 缓冲区弄乱了我的 emacs 实例。当相应的异步命令执行完毕后,如何自动终止这些缓冲区?

【问题讨论】:

    标签: emacs


    【解决方案1】:

    虽然它不会在命令完成时杀死它们,但您可以在一段时间后杀死缓冲区 - 这假设异步命令是 shotr-lived(或具有相当知名的运行时)。比如:

    (save-window-excursion
      (let ((buf (generate-new-buffer "async")))
        (async-shell-command cmd buf)
        (run-with-timer 10 nil (lambda (buf) (kill-buffer buf)) buf)))
    

    【讨论】:

    • 我想如果这是唯一的方法......总比没有好。
    • 使用此解决方案,在用户有机会检查缓冲区的输出之前删除缓冲区。这是期望的行为吗?
    【解决方案2】:

    请看 http://news.gmane.org/find-root.php?message_id=%3cloom.20120517T145957%2d51%40post.gmane.org%3e

    那里的第二个提议与 shell 进程一起启动了一个哨兵。 当此哨兵检测到进程状态“退出”时,您可以立即终止进程缓冲区,或者您可以按照引用的帖子中的建议启动进程缓冲区的终止模式。

    在消亡时间内,您可以检查进程输出,取消消亡或延长缓冲区的寿命。

    最好的问候, 托比亚斯

    【讨论】:

      【解决方案3】:

      我假设(对于这个特定的用例)您很少对查看放在“异步”缓冲区中的输出感兴趣,并且您只想防止创建无关缓冲区。如果是这样,你可以这样做:

      (save-window-excursion
        (when (get-buffer "async")
          (kill-buffer "async"))
        (async-shell-command
          cmd
          (generate-new-buffer "async")))
      

      这将在运行“async-shell-command”之前终止“async”缓冲区,从而防止创建额外的“async”缓冲区。

      【讨论】:

      • 遗憾的是,这不适用于同时运行多个异步命令的情况,因为它会尝试使用正在运行的命令杀死缓冲区,并且无论如何新缓冲区都不会被命名为“async”但“async”之类的。
      • 我已经用您可能喜欢的替代方法修改了我的答案。
      • 没关系,我的替代方法也好不到哪里去。我已经删除了。
      猜你喜欢
      • 1970-01-01
      • 2012-06-18
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多