2013-01-07 34 views

回答

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),並利用該地區。該功能將要求申請一個功能。最後,刪除的文本被保存在殺戒中。

+0

將殺死的文本保存到殺戒中是一個特別好的觸摸。謝謝! – spike

+0

建議使用(交互式「XFunction應用於區域:」),因此可以在飛行中編寫lambda。像這樣:M-x apply-function-to-region RET(lambda(arg)(apply'string(reverse(string-to-list arg))))RET – desudesudesu

+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-Xmy/testRET

+0

這個調用函數,但是我想給'func'當前區域作爲一個字符串,並用結果替換該區域。 '(funcall func(buffer-substring(mark)(point)))''作用,但是我必須註釋掉'delete-region',否則沒有任何東西會被傳進去。 – spike

+0

類似這樣的東西似乎工作:'(let (funcall func(buffer-substring(mark)(point)))) (delete-region(region-beginning)(region-end)) (insert res)) - 更新您的答案,以便我可以接受它? – spike