複数回貼付けに関する設定
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流なのかもしれないですけどね・・・。