我想将该区域复制到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)))))
但是,我有一种强烈的感觉,这是次优的,因为我正在搞乱杀戮戒指。怎么做而不影响它? (额外的问题:我的方式是使用区域或整个缓冲区,如果没有活动区域是好的吗?)
答案 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-substring
或
insert-buffer-substring-no-properties
,但没有必要使用
杀死戒指。
在内部互动地做一些事情也很奇怪
with-temp-buffer
:你打算在那里运行一种模态循环,
或者只是展示了一些进展?
使用区域或处理整个缓冲区(NB:modulo
缩小),这并不常见(见replace-string
和
朋友)。