블랙홀 레지스터 ( "_)의 사용법은 무엇입니까?


15

최근 "_에 쓰기 전용 레지스터 인 블랙홀 레지스터에 대해 읽었습니다 .

Vim 문서는 다음과 같이 설명합니다 :

  1. 블랙홀 레지스터 "_

이 레지스터에 쓸 때 아무 일도 일어나지 않습니다. 일반 레지스터에 영향을주지 않고 텍스트를 삭제하는 데 사용할 수 있습니다. 이 레지스터에서 읽을 때는 아무 것도 반환되지 않습니다.

모든 기사와 책에서 필자는 필자가 항상 동일한 예제를 사용합니다.이 예제는 이전에 적신 내용을 지우지 않고 텍스트를 삭제해야 할 때이 레지스터를 사용하는 것입니다.

이 사용법을 이해하지만이 레지스터의 다른 사용 사례를 찾을 수 없다는 사실에 놀랐습니다.

  • 이 레지스터는 다른 사용 사례에 유용 합니까? 그렇다면 어느 것입니까?

  • 이 레지스터의 유일한 목적이 내가 이전에 인용 한 사용 사례에서 사용된다면, Vim의 제작자가 왜 이러한 레지스터로이 문제를 해결하기로 결정 했습니까? 내 말은 이 응답 사용하는 것보다 적은 키 입력을 의미하는 문제에 대한 해결책을 보여줍니다 "_. 사용 "0은 또한 블랙홀 레지스터를 사용하지 않아도되므로 왜 블랙홀 레지스터를 작성 했습니까?

답변:


18

블랙홀 레지스터는 다음과 같은 상황에서 사용됩니다 /dev/null. 일반적으로 무언가를 출력하는 작업을 수행하지만 해당 출력에는 사용하지 않는 경우.

Vim의 기본 동작은 "삭제"가 아니라 "잘라 내기"입니다. 대부분의 경우 중요하지 않지만 때로는 사용자가 실제로 "삭제"해야 할 수도 있습니다. 블랙홀 레지스터가 유용한 곳입니다.

이 레지스터는 다른 사용 사례에 유용합니까?

블랙홀 레지스터는 이름이없는 레지스터와 번호가 매겨진 레지스터를 방해하지 않고 물건을 자르도록하기 위해 여기에 있습니다.

가능한 사용 사례는 많지만 예상치 못하게 매우 유사합니다.

  • 실제 "삭제"를 제공하고
  • 레지스터, 주로 명명되지 않은 레지스터를 더 잘 제어 할 수 있습니다.
  • 번호가 매겨진 레지스터를 안정된 상태로 유지
  • 이름이없는 레지스터에서 넣을 수있는 능력을 유지하면서 무언가를 잘라내어 "반복 가능한 풋"을줍니다.
  • 신경 쓰지 않는 것 위에 무언가를 두십시오.
  • 스크립트의 부작용 방지…

하나는 사용할 수 있습니다 "0p은 "반복 박았"시나리오 (가장 일반적인 사용 사례는 빔 문학에 따라서 그 편재)에 대한하지만 레지스터로 유용되는 것을 멀리 "_다른 시나리오.


나는 당신의 유스 케이스를이 레지스터의 동작의 결과로 더 많이보고 있지만, 당신의 대답은이 레지스터를 명확하게 설명한다고 생각합니다. 다른 답변을 기대하지만이 레지스터의 유일한 사용 인 것 같습니다. 답변 주셔서 감사합니다!
statox

5

텍스트 삭제 외에도 블랙홀 레지스터를 사용하여 다른 레지스터를 삭제할 수 있습니다. 예:

:let @a=@_

이것은 레지스터를 지우는 한 가지 방법입니다 "a.


2
다른 사람이 이것을 읽은 것처럼 "이것이 더 짧고 명확하게 대체되는지 궁금합니다."라고 :call setreg('a', [])유감스럽게도 대답은 아니오입니다. 다음과 같이 작동 합니다 ( 명령 의 출력을 :call setreg('a', '')그대로 둡니다 ."a:registers
Rich

@Rich 시작하지 않은 사람 "a의 결과물에 남겨 두는 것의 중요성은 무엇입니까 :registers?
Alexej Magura

@AlexejMagura 글쎄, 당신의 목표가 레지스터 내용을 볼 때 보이는 것을 정리하는 것이라면 빈 레지스터를 잔뜩 남겨 두는 것은 이상적이지 않을 수 있습니다. 삭제 된 레지스터와 비어있는 기존 레지스터 사이에 다른 실질적인 차이가 있는지 확실하지 않습니다.
Rich

1

하나의 기능에서 하나의 실제 사용. 벨로우 함수에서 파이썬 주석은 #의 결과에 따라 추가되고 제거됩니다 getline('.')[0]. 줄에 주석이 있으면 문자 #가 삭제되지만이 경우 기본 레지스터를 엉망으로 만들고 싶지 않습니다.

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.