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

然而,我有一种强烈的感觉,那就是这不是最理想的,因为我在搞乱杀戮戒指。如何在不影响的情况下做到这一点?(额外的问题:如果没有活动区域,我对区域整个缓冲区的处理方式是一个好方法吗?)

4

1 回答 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,但无需使用杀戮戒指。

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

至于对区域整个缓冲区进行处理(注意:模 变窄),这并不罕见(见replace-string和朋友)。

于 2013-01-31T22:38:33.857 回答