ブラックホールレジスタ( "_)の用途は何ですか?


15

最近"_、書き込み専用のレジスタであるブラックホールレジスタについて読みました。

Vimのドキュメントでは、次のように説明しています。

  1. ブラックホールレジスタ "_

このレジスタに書き込むとき、何も起こりません。これを使用して、通常のレジスタに影響を与えずにテキストを削除できます。このレジスタから読み取る場合、何も返されません。

私が読んだすべての記事と本では、著者は常に同じ例を使用しています。これは、以前にヤンクしたものを消去せずにテキストを削除する必要があるときにこのレジスタを使用することです。

私はこの使用法を理解していますが、このレジスタの他の使用例を見つけることができないという事実に驚いています。

  • このレジスタは、他のいくつかのユースケースで役立ちますか?はいの場合、どれですか?

  • このレジスタの唯一の目的が前に引用したユースケースで使用される場合、Vimの作成者はなぜこのようなレジスタでこの問題を解決することにしたのですか?私が意味するこの回答使用するよりも少ないキーストロークを意味し、問題の解決ショーを"_。を使用"0すると、ブラックホールレジスタの使用を回避することもできますが、なぜそれを作成したのですか?

回答:


18

ブラックホールレジスタは、/dev/null次の場合と同じ状況で使用されます。通常は何かを出力するが、その出力を使用しないアクションを実行する場合。

Vimのデフォルトの動作は、「削除」ではなく「カット」です。ほとんどの場合、問題ではありませんが、ユーザーが実際に「削除」する必要がある場合があります。そこで、ブラックホールレジスタが役立ちます。

このレジスタは他のいくつかのユースケースで役立ちますか?

ブラックホールレジスタは、名前のないレジスタと番号の付いたレジスタを壊すことなくデータをカットできるようにするためのものです。

考えられるユースケースは多数ありますが、当然のことながら非常によく似ています。

  • 実際の「削除」を提供し、
  • 主に名前のないレジスタをより適切に制御できます。
  • 番号付きレジスタを安定した状態に保ちます。
  • 名前のないレジスタから置く能力を保持しながら何かをカットし、「繰り返し可能なプット」を与えます。
  • 気にしないものの上に何かを置く、
  • スクリプトの副作用を防ぐ…

一つは使用することができ"0p、「繰り返しプット」シナリオ(最も一般的なユースケース、Vimの文献における従ってその遍在)のためにそれレジスタなどとして有用であるから遠い"_他のシナリオのために。


あなたのユースケースはこのレジスタの動作の結果としてより多く見ますが、あなたの答えはこのレジスタを「ブラックホールレジスタは無名のレジスタと番号付きレジスタを壊すことなくものをカットできるようにするためにここにあります」と明確に説明していると思います」他の答えを期待していますが、それはこのレジスタの唯一の使用であるようです。ご回答ありがとうございました!
statox

5

テキストを削除する以外に、ブラックホールレジスタを使用して他のレジスタを削除できます。例:

:let @a=@_

これは、レジスタをクリアする1つの方法です"a


2
これを読んでいる他の誰かが「これがのより短く、より明確な代替物であるかどうか疑問に思う」場合、:call setreg('a', [])残念ながら、答えはノーです。それはのような働き:call setreg('a', '')(が去る"aの出力に:registersコマンド。
リッチ

@Rich初心者"aの出力に残すことの重要性は何:registersですか?
アレクセイマグラ

@AlexejMaguraまあ、あなたの目標がレジスターの内容を表示するときに見えるものを整理することである場合、空のレジスターの束を残すことは理想的ではないかもしれません。削除されたレジスタと空である既存のレジスタの間に他の実用的な違いがあるかどうかはわかりません。
リッチ

1

1つの機能での1つの実用。以下の関数では#、の結果に応じてPythonコメントが追加および削除されgetline('.')[0]ます。行にコメントがある場合、char #は削除されますが、この場合、デフォルトのレジスタを台無しにしたくありません。

function! ToggleComment()
    let l:win_view = winsaveview()
    if getline('.')[0] == "#"
        normal! 0"_x
    else
        normal! I#
    endif
    call winrestview(l:win_view)
endfunction
nnoremap <Leader>t :call ToggleComment()<CR>
vnoremap <Leader>t <C-o>:call ToggleComment()<CR>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.