用区域上的函数调用结果替换区域

时间:2013-01-07 18:22:11

标签: emacs elisp

我如何编写一个交互式函数,该函数接受一个函数并用当前选定区域替换该区域上调用该函数的结果。

我看到了这个答案: https://stackoverflow.com/a/6539916/625365

但是这个函数每行调用一次,而不是将该区域作为参数,并且它看起来像很多代码。

2 个答案:

答案 0 :(得分:3)

(defun apply-to-region (func)
  (unless (use-region-p)
    (error "need an active region"))
  (delete-region (region-beginning) (region-end))
  (insert (funcall func)))

(defun foo ()
  ""
  "foobar")

(defun my/test ()
  (interactive)
  (apply-to-region 'foo))

要测试它,请选择一些文本并运行 M-x my/test RET

答案 1 :(得分:3)

我认为你可以在filter-buffer-substring周围做一些诡计,但这似乎是一个模糊的功能,至少对我而言。另一方面,直接在Emacs Lisp中这样做似乎并不复杂:

(defun apply-function-to-region (fn)   
  (interactive "XFunction to apply to region: ")   
  (save-excursion
    (let* ((beg (region-beginning))
           (end (region-end))
           (resulting-text 
            (funcall 
             fn 
             (buffer-substring-no-properties beg end))))
      (kill-region beg end)
      (insert resulting-text))))

然后,您可以使用接受并生成文本的函数(例如capitalize),并将该区域大写。该功能将要求应用功能。最后,删除的文本保存在kill ring中。