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流なのかもしれないですけどね・・・。