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

3

我想在Emacs中将区域复制到另一个(临时)缓冲区,但如果没有(活动的)区域,我想复制整个当前缓冲区。我的做法如下:

(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)))))

然而,我强烈感觉这种做法不够优秀,因为我在操纵kill ring。如何在不影响kill ring的情况下完成操作?(附加问题:如果没有活动区域,我使用区域还是整个缓冲区的方式是否可行?)

1个回答

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?"))))

由你决定是否使用insert-buffer-substringinsert-buffer-substring-no-properties,但是没有必要使用kill rings。

此外,在with-temp-buffer中交互式执行某些操作相当奇怪:你是要在那里运行一种模态循环,还是只是显示一些进度?

至于针对区域或整个缓冲区进行操作(注:减少),这并不太不寻常(参见replace-string和相关工具)。


关于 with-temp-buffer:它有点像一个视觉玩具,对当前缓冲区的内容做一些有趣的事情,我希望它在完成后消失。非常感谢!如果没有其他更好的答案出现,我明天左右会接受这个答案。 - mbork

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接