複数回貼付けに関する設定

Emacsの基本的なコマンドは C-u "数字"の後に実行すると"数字"回だけ
繰り返してくれるんだけど、C-yとか M-yの場合、繰り返すんじゃなくて、
"数字"個前の kill-ringの内容が貼り付けられる。


yank-popを使うならさておき anything-show-kill-ringみたいなものを
yank-popの代わりに使えば n個前のものを貼りつけというのは不要なので、
繰り返して貼付けという操作がやはり欲しくなる。


10行ぐらい貼りつけて、各行少しずつ直すというような作業はわりと
多いと思います。Vimだと 10yyとか 10ddみたいな感じでとても簡単に
できることなんですが、それができないというのはあれなので。

コード

基本的に EmacsWikiとか StackOverflowで見たものを引用

現在の行を複製する関数

キーはお好きなように割り当ててください。

;; duplicate current line
(defun duplicate-current-line (&optional n)
  "duplicate current line, make more than 1 copy given a numeric argument"
  (interactive "p")
  (save-excursion
    (let ((nb (or n 1))
          (current-line (thing-at-point 'line)))
      ;; when on last line, insert a newline first
      (when (or (= 1 (forward-line 1)) (eq (point) (point-max)))
        (insert "\n"))

      ;; now insert as many time as requested
      (while (> n 0)
        (insert current-line)
        (decf n)))))

(global-set-key (kbd "C-S-d") 'duplicate-current-line)
繰り返し yank。だたし改行を付加する。

Vimの ddような関数として kill-whole-lineというのがあったり、
設定で kill-lineの挙動を変えて行全体というのもできるんですが、
通常だと C-kは改行を含まないので意図的に改行を足してみました。

;; repeat yank. Because C-y can't accept `C-u Number' prefix
(defun repeat-yank (num)
  (interactive "NRepeat Count > ")
  (dotimes (i num)
    (yank)
    (insert "\n")))

(global-set-key (kbd "M-g y") 'repeat-yank)

おわりに

yank-popが n個前というのはわかるんだけど、普通でyankが
繰り返さないのは納得できないですね。まあ前述のとおり、
C-kは行末までで改行を含まないから、それで単純に繰り返して
しまうとひたすら横に伸びてしまうということになってしまう
からなのかなと思っています。マクロでさらりとこなすのが
Emacs流なのかもしれないですけどね・・・。