Emacs/Vimで、ただの削除をする方法
2017-01-26
- PC
Vimでは "_ をつけてから削除系のコマンドを打つと、削除したものがクリップボード的なものに入らない。つまり「切り取り」ではなく完全な「削除」になる。とても便利。
だがEmacsでこれをやる方法がわからず、地味に困っていたので調べた。ついでにVimについても書く。
何がしたいのか
foo を bar で置き換えたいとする。(置換コマンドを打てというのはなしで。)
fooを普通に削除(Vimでdiw、EmacsでM-dみたいに)して、barを貼り付けようとしても、クリップボード的なものにはたったいま削除したfooが入ってしまっているので、貼り付けられない。「削除」と言いつつ、知る限りのコマンドはすべて「切り取り」でしかないから。
fooを削除するとき、クリップボード的なものにこれを入れないようにしたい。
Vim
レジスタについて
普通 dd や ci" など削除系コマンドを打つと、削除した内容がクリップボード的なもの(レジスタ)に入っていく。レジスタの指定をするときはダブルクオーテーションを前につける。
レジスタは0や+などいろいろあり、たとえば3のレジスタに入っている内容を貼り付けたいなら"3pのように、ダブルクオーテーション + レジスタのあとに貼り付けコマンドを打てばいい。逆に"3ddのように削除内容を入れるレジスタを指定することもできる。これは削除系(dとかcとか)だけでなくヤンクyでも同じ。
レジスタの内容は:diや:regで確認できる。
解決法: _レジスタを使うといい
特殊なレジスタとして_がある。Vimで:h "_とコマンドを打てばこのレジスタのヘルプが見れる。そこには"Black hole register"と書いてある。このレジスタを指定して削除系のコマンドを打てば、レジスタには残らない。ただの削除が行えるということだ。"_ddとすれば行の削除、"_di{とすれば{}内の削除が、レジスタを汚さずにできる。
これを使えば、上のような例の場合、fooを"_diwで消せばレジスタに残らないので、pでbarが貼り付けられる。
まあdiwで削除しても"0pとすればbarが貼り付けられるが。
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-regionがtになっているとき(デフォルト)、BackspaceやDeleteがそのリージョン全体に対してBackspaceやDeleteの働きをするためのようだ(Backspaceなどはキルリングを汚さず、ただの削除をするので)。リージョン選択後にM-x delete-regionでもいける。