为 compilation-buffer 增加输入功能

发布于 2025-01-06 23:21:43 字数 1782 浏览 9 评论 0

Emacs 的 compile 命令是一个未被充分利用的工具。它允许你运行任意的构建工具并且为多种编程语言提供错误高亮与快速掉转到错误的功能。但是许多的 Emacs 使用者依然习惯于切换到终端下运行 make,lein test 以及 bundle exec。然而 compile 命令有一个限制,那就是 compilation buffer 并不是真正的 shell,因此若正在运行的命令需要用户输入额外信息(即使是简单的 y/n 确认),也没有办法输入这些信息。

幸运的是,为其增加输入功能并不复杂。下面的代码片段定义了两个命令。第一个命令会提示你输入要输入的信息,然后将你的输入附上回车符,一起传递到低层的终端上, 该命令用于提示输入时或在 REPL 循环中。第二个命令只是简单的传递我们按下得键, 主要用于回答 y/n 问题,或者使用 C-dC-j 快速退出 REPL。

  (defun endless/send-input (input &optional nl)
    "Send INPUT to the current process.
  Interactively also sends a terminating newline."
    (interactive "MInput: \nd")
    (let ((string (concat input (if nl "\n"))))
      ;; This is just for visual feedback.
      (let ((inhibit-read-only t))
        (insert-before-markers string))
      ;; This is the important part.
      (process-send-string
       (get-buffer-process (current-buffer))
       string)))

  (defun endless/send-self ()
    "Send the pressed key to the current process."
    (interactive)
    (endless/send-input
     (apply #'string
            (append (this-command-keys-vector) nil))))

  (define-key compilation-mode-map (kbd "C-c i")
    #'endless/send-input)

  (dolist (key '("\C-d" "\C-j" "y" "n"))
    (define-key compilation-mode-map key
      #'endless/send-self))

几年来我一直忽略这个缺陷(This is something I’ve run into for years), 但是最终,我还是决定修正它,因为它使得当我的代码中包含 binding.pry(它会产生一个 REPL) 时,无法在 compilation buffer 中运行 Ruby 的 rspec 命令。现在我可以通过先按下 C-c i 来与 REPL 交互,也可以使用 C-d 快速退出这个 REPL。若你也遇到与我一样的情况,你还需要在你的 .pryrc 文件中设置下面选项 .pryrc file。

  Pry.config.pager = false if ENV["INSIDE_EMACS"]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

旧城空念

暂无简介

文章
评论
28 人气
更多

推荐作者

5576443447

文章 0 评论 0

酒几许

文章 0 评论 0

xiaolangfanhua

文章 0 评论 0

好久不见√

文章 0 评论 0

盗心人

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文