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に戻る。

*1:つまり最初に kill-ring に格納したテキスト。

*2:つまり最後に kill-ring に格納したテキスト。