Emacs/Vimで、ただの削除をする方法

Vimでは "_ をつけてから削除系のコマンドを打つと、削除したものがクリップボード的なものに入らない。つまり「切り取り」ではなく完全な「削除」になる。とても便利。
だがEmacsでこれをやる方法がわからず、地味に困っていたので調べた。ついでにVimについても書く。

何がしたいのか

単語 very_long_long_long_word をコピーし、別の単語 another_long_long_long_word をこれで置き換えたいとする。(置換コマンドを打てというのはなしで。)
another_long_long_long_wordを普通に削除(Vimでdiw、EmacsでM-dみたいに)して、very_long_long_long_wordを貼り付けようとしても、クリップボード的なものにはたったいま削除したanother_long_long_long_wordが入ってしまっているので、貼り付けられない。「削除」と言いつつ、知る限りのコマンドはすべて「切り取り」でしかないから。
another_long_long_long_wordを削除するとき、クリップボード的なものにこれを入れないようにしたい。

Vim

レジスタ

普通 ddci" など削除系コマンドを打つと、削除した内容がクリップボード的なもの(レジスタ)に入っていく。レジスタの指定をするときはダブルクオーテーションを前につける。
レジスタは0+などいろいろあり、たとえば3のレジスタに入っている内容を貼り付けたいなら"3pのように、ダブルクオーテーション + レジスタのあとに貼り付けコマンドを打てばいい。逆に"3ddのように削除内容を入れるレジスタを指定することもできる。これは削除系(dとかcとか)だけでなくヤンクyでも同じ。
レジスタの内容は:di:regで確認できる。

_レジスタを使うといい

特殊なレジスタとして_がある。Vimで:h "_とコマンドを打てばこのレジスタのヘルプが見れる。そこには”Black hole register”と書いてある。このレジスタを指定して削除系のコマンドを打てば、レジスタには残らない。ただの削除が行えるということだ。"_ddとすれば行の削除、"_di{とすれば{}内の削除が、レジスタを汚さずにできる。

これを使えば、上のような例の場合、another_long_long_long_wordを"_diwで消せばレジスタに残らないので、pでvery_long_long_long_wordが貼り付けられる。

まあdiwで削除しても"0pとすればvery_long_long_long_wordが貼り付けられるが。

Emacs

キルリング

Emacsでのクリップボード的なものはキルリングという。C-yのあとにM-yを何度も押すと、キルリングの内容が新しいものから次々に出てきて、過去にコピー・削除したものを貼り付けられる。(M-x helm-show-kill-ringを使えばもっと便利。helm入れてたら使えるはず。)

リージョン指定してBackspaceすればいい

これはEmacs: how to delete text without kill ring? – Stack Overflowに書いてある。Vimのように、どの削除コマンドにも応用できる方法はないようだ。
削除したいリージョンを選択してからDeleteキーなりBackspaceキーを押せば、キルリングを汚さずに、ただの削除ができる。
これは変数delete-active-regiontになっているとき(デフォルト)、BackspaceやDeleteがそのリージョン全体に対してBackspaceやDeleteの働きをするためのようだ(Backspaceなどはキルリングを汚さず、ただの削除をするので)。リージョン選択後にM-x delete-regionでもいける。

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です