3

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

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

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

4

2 回答 2

6

我认为你可以做一些诡计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 中。

于 2013-01-07T19:08:38.410 回答
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-xmy/testRET.

于 2013-01-07T18:57:08.303 回答