Emacs缓冲区的shell命令

9
我想设置一个函数,相当于标记整个缓冲区,并运行C-u M-|来提示命令,将缓冲区管道传输到命令并用输出替换缓冲区。然后可能将其设置为Shift-F5或其他键。
我只完成了如下代码:
(defun shell-command-on-buffer ()
  (interactive)
  (mark-whole-buffer))

我该如何完成剩余部分?
3个回答

8
这对我有用:
(defun shell-command-on-buffer (command)
  (interactive "sShell command on buffer: ")
  (shell-command-on-region (point-min) (point-max) command t))

谢谢,我试过了。这为我打开了一个新的缓冲区 - 理想情况下,我希望它能像 C-u M-| 一样替换当前的缓冲区。 - teppic
1
啊,抱歉,我的初始建议与shell-command-on-region具有相同的C-u行为。编辑后更好地回答了您的请求。 - brontitall
很抱歉,没有成功 - 它提示我输入命令,但是报错参数数量错误。 - teppic
奇怪..我刚刚启动了一个没有自定义(-q)的新emacs,它对我有效。你用的是哪个版本的emacs? - brontitall
24.2.1. 完整的错误信息是:参数数量错误:(lambda nil (interactive "sShell command on buffer: ") (shell-command-on-region (point-min) (point-max) command t)), 1 - teppic
显示剩余2条评论

4
这种方法的优点在于使用“shell命令”迷你缓冲区历史记录,而不是通用迷你缓冲区历史记录。
(defun shell-command-on-buffer ()
  (interactive)
  (shell-command-on-region (point-min) (point-max) (read-shell-command "Shell command on buffer: ") t))

1
请注意,read-shell-command 函数是在 GNU Emacs 23.1 版本中引入的。如果您需要与旧版本兼容,则不应使用此函数,或者您需要添加代码来检查是否存在 read-shell-command 函数,然后再尝试调用它。 - David C.

1

对@killdash9答案的渐进式改进,具体如下:

  1. 确实替换了缓冲区内容(而不是将输出附加到缓冲区头部)
  2. 努力恢复光标位置。

在emacs 27.1上测试通过

(defun shell-command-on-buffer ()
  (interactive)
  (let ((line (line-number-at-pos)))
    ;; replace buffer with output of shell command
    (shell-command-on-region (point-min) (point-max) (read-shell-command "Shell command on buffer: ") nil t)
    ;; restore cursor position
    (goto-line line)
    (recenter-top-bottom)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接