如何編寫一個交互式函數,該函數接受一個函數並用該區域上調用該函數的結果替換當前選定的區域。替換調用區域功能的區域
我看到這樣的回答: https://stackoverflow.com/a/6539916/625365
但是,這一次調用該函數每行,不給它的區域作爲一個參數,它似乎是一個大量的代碼。
如何編寫一個交互式函數,該函數接受一個函數並用該區域上調用該函數的結果替換當前選定的區域。替換調用區域功能的區域
我看到這樣的回答: https://stackoverflow.com/a/6539916/625365
但是,這一次調用該函數每行,不給它的區域作爲一個參數,它似乎是一個大量的代碼。
我認爲你可以在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
),並利用該地區。該功能將要求申請一個功能。最後,刪除的文本被保存在殺戒中。
(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/test
RET。
將殺死的文本保存到殺戒中是一個特別好的觸摸。謝謝! – spike
建議使用(交互式「XFunction應用於區域:」),因此可以在飛行中編寫lambda。像這樣:M-x apply-function-to-region RET(lambda(arg)(apply'string(reverse(string-to-list arg))))RET – desudesudesu
你是對的。我會改變線路。感謝您的建議。 –