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: そこで一種のモーダル ループを実行するつもりですか、それとも進行状況を表示するだけですか?

リージョンまたはバッファ全体で処理を行う場合 (NB: モジュロ ナ ローイング) は、それほど珍しいことではありません (参照replace-stringしてください)。

于 2013-01-31T22:38:33.857 に答える