如何将区域或整个缓冲区复制到Emacs中的另一个缓冲区而不影响kill ring?

mbo*_*ork 3 emacs elisp

我想将该区域复制到Emacs中的另一个(临时)缓冲区,但如果没有(acive)区域,我想复制整个当前缓冲区.我做的是如下:

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

但是,我有一种强烈的感觉,这是不是最理想的,因为我正在搞乱杀戮戒指.怎么做而不影响它?(额外的问题:如果没有活跃的区域,那么我可以用区域整个缓冲区做事吗?)

Ant*_*nko 7

我就是这样做的:

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

这取决于你决定是否需要insert-buffer-substring或者 insert-buffer-substring-no-properties,但是没有必要使用杀环.

在内部交互式地做一些事情也很奇怪 with-temp-buffer:你打算在那里运行一种模态循环,还是只是显示一些进展?

至于处理区域整个缓冲区(NB:模数 缩小),它并不常见(见replace-string和朋友).