Vimmerに転職した俺が、Emacsでのコピーアンドペーストを思い出す
(個人的に)何回覚えても忘れてしまうものに、Emacs でのコピーアンドペーストの仕方がある。というわけで備忘録作成。この手の記事は、手軽に書ける点でも便利だね。
今回の記事の元ネタは以下の文章です。
松山智大、井上誠一郎(監修)「Emacsのトラノマキ[第4回] コピー&ペーストを使いこなす」、『Software Design』、2009年8月号、pp.166-173、オンラインで入手
範囲選択(リージョン)
C-SPC を押した時のカーソル位置(終了位置)と、現在のカーソル位置(開始位置)とに挟まれた領域を、リージョンと呼ぶ。
コピー、カット、ペースト
Emacs では、kill-ring という環状のデータ構造に、テキストデータを保持することができる。この機能を元に、コピーアンドペーストが実現される。
M-w は、選択されたリージョンをコピーする(kill-ring の先頭に格納する)。
C-w は、選択されたリージョンをカットする(削除し、kill-ring の先頭に格納する)。
C-y は、ペーストを行う(kill-ring の先頭に格納されたテキストを貼り付ける)。
なぜ Emacs のコピペは難しいのか
M-w や C-w 以外に、副作用として「kill-ring の先頭にテキストを格納する」コマンドがいくつかあるため。
C-k (行削除) や M-d (単語削除) などのコマンドは、テキストを削除した後、当該テキストを kill-ring の先頭に格納してしまう。結果として、望まないテキストを間違えてペーストしてしまうことがある。
Emacs でスマートにコピペする方法
コピーを工夫する: レジスタを使う
kill-ring ではなく、レジスタにテキストを格納する。これなら、副作用による kill-ring の上書きを心配することなくコピペが行える。
C-x r s <アルファベット一文字> は、選択したリージョンを<アルファベット一文字>が表すレジスタにコピーする。
C-x r i <アルファベット一文字> は、<アルファベット一文字>が表すレジスタの内容をペーストする。
ペーストを工夫する: kill-ring をさかのぼる、あるいは拡張機能を利用する
C-y (kill-ring の先頭のテキストをペースト) のすぐ後に M-y を押すと、ペーストしたテキストを、kill-ring の二番目のテキストで置き換える。さらに M-y を押していくと、kill-ring をどんどんさかのぼってテキストを置き換えていく。
これなら、副作用で kill-ring の先頭を置き換えてしまっても、履歴をさかのぼることで、所望のテキストをペーストできる。
さらに、browse-kill-ring.el や anything.el などの拡張機能を利用すると、この「kill-ringをさかのぼる」作業をもっと便利にすることができる。
注意: M-y による kill-ring のさかのぼりは、実際には、「kill-ring を参照するポインタ」を移動させている。従って、次に C-y を押すと、前回 M-y でさかのぼってペーストしたところのテキストが挿入される。
また、kill-ring は前述したように「環状のデータ構造」なので、M-y で最後*1までさかのぼったら先頭*2に戻る。