2013-01-31 23 views
1

我想複製區域到Emacs中的另一個(臨時)緩衝區,但如果沒有(活動)區域,我想複製整個當前緩衝區。我所做的是如下:如何在Emacs中將區域或整個緩衝區複製到另一個緩衝區而不影響kill ring?

(defun do-something-with-region-or-buffer() 
    (interactive) 
    (save-excursion 
    (let ((begin (point-min)) (end (point-max))) 
     (when (region-active-p) 
     (setq begin (region-beginning)) 
     (setq end (region-end))) 
     (copy-region-as-kill begin end) 
     (with-temp-buffer 
     (switch-to-buffer (current-buffer)) 
     (rename-buffer "*My Temp Buffer*") 
     (delete-other-windows) 
     (yank) 
     (do-something-with-current-buffer))))) 

但是,我有強烈的感覺,這是不理想的,因爲我搞亂殺戒。如何做到這一點而不影響它? (獎金問題:是我與該地區整個緩衝區如果沒有有源區一個很好的做事方式?)

回答

4

這是我會怎麼做:

(defun aak/dswrob() 
    (interactive) 
    (let* ((regionp (region-active-p)) 
     (beg (and regionp (region-beginning))) 
     (end (and regionp (region-end))) 
     (buf (current-buffer))) 
    (with-temp-buffer 
     (switch-to-buffer (current-buffer) nil t) 
     (rename-buffer "*My Temp Buffer*" t) 
     (insert-buffer-substring buf beg end) 
     (read-key-sequence "Keys?")))) 

這是由您決定是否要insert-buffer-substringinsert-buffer-substring-no-properties,但沒有必要使用 殺戒指。

而且這是相當奇怪做點什麼內 with-temp-buffer交互:你要運行的一種模式循環出現的, 還是隻是顯示一些進展?

與該地區整個緩衝區做事的(注:模 縮小),它不是相當不尋常的(見replace-string和 朋友)。

+0

非常感謝!如果沒有其他更好的答案出現,我會在明天左右接受這個答案。 'with-temp-buffer':它是一種視覺玩具,對當前緩衝區的內容做一些有趣的事情,當它結束時我想讓它消失。 – mbork