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
でもいける。