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

spi*_*ike 3 emacs elisp

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

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

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

Dai*_*rod 5

(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))
Run Code Online (Sandbox Code Playgroud)

要测试它,请选择一些文本并运行M-xmy/testRET

  • 像这样的东西似乎有效: `(let ((res (funcall func (buffer-substring (mark) (point))))) (delete-region (region-beginning) (region-end)) (insert res)) ` - 更新你的答案以便我可以接受? (2认同)

Die*_*lla 5

我认为你可以在 周围做一些诡计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))))
Run Code Online (Sandbox Code Playgroud)

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