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

时间:2013-01-31 22:10:15

标签: 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)))))

但是,我有一种强烈的感觉,这是次优的,因为我正在搞乱杀戮戒指。怎么做而不影响它? (额外的问题:我的方式是使用区域整个缓冲区,如果没有活动区域是好的吗?)

1 个答案:

答案 0 :(得分: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,但没有必要使用 杀死戒指。

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

使用区域处理整个缓冲区(NB:modulo 缩小),这并不常见(见replace-string和 朋友)。