3

関数を受け取り、現在選択されている領域をその領域でその関数を呼び出した結果に置き換えるインタラクティブな関数をどのように記述すればよいでしょうか。

この回答が表示されます: https://stackoverflow.com/a/6539916/625365

しかし、これは関数を 1 行に 1 回呼び出すだけで、引数としてリージョンを指定するのではなく、大量のコードのように見えます。

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) を使用して、リージョンを大文字にすることができます。関数は、適用する関数を要求します。最後に、削除されたテキストがキル リングに保存されます。

于 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 に答える