Какая польза от регистра черной дыры («_»)?


15

Я недавно читал о регистре черной дыры, "_который является регистром только для записи.

Документация Vim описывает это так:

  1. Регистр черной дыры "_

При записи в этот регистр ничего не происходит. Это можно использовать для удаления текста, не затрагивая обычные регистры. При чтении из этого регистра ничего не возвращается.

Во всех статьях и книгах, которые я читал, авторы всегда используют один и тот же пример, который заключается в использовании этого регистра, когда нам нужно удалить какой-то текст, не стирая то, что мы ранее дернули.

Я понимаю это использование, но меня удивляет тот факт, что я не могу найти другие варианты использования этого регистра, что приводит меня к 2 вопросам:

  • Этот регистр полезен в некоторых других случаях использования ? Если да, то какие?

  • Если единственная цель этого регистра - использовать его в приведенном выше случае использования, почему создатели Vim решили решить эту проблему с помощью такого реестра ? Я имею в виду, что этот ответ показывает решение проблемы, которая предполагает меньше нажатий клавиш, чем при использовании "_. Использование "0может также избежать использования регистра черной дыры, так почему они его создали?

Ответы:


18

Регистр черной дыры используется в тех же ситуациях, что и /dev/null: когда вы делаете действие, которое обычно выводит что-то, но вы не используете этот вывод.

Поведение Vim по умолчанию - «вырезать», а не «удалить». В большинстве случаев это не имеет значения, но иногда пользователям может потребоваться «удалить». Вот тут и подходит регистр черной дыры.

Этот регистр полезен в некоторых других случаях использования?

Регистр черной дыры здесь, чтобы позволить нам вырезать материал, не загромождая неназванный регистр и пронумерованные регистры.

Возможные варианты использования многочисленны, но неудивительно, что они очень похожи:

  • обеспечить фактическое «удаление»,
  • лучше контролировать регистры, в основном безымянные,
  • сохранить пронумерованные регистры в стабильном состоянии,
  • вырезать что-то, сохраняя возможность ставить из неназванного регистра, давая нам «повторяемые путы»,
  • положить что-то поверх того, что вас не волнует,
  • предотвратить побочные эффекты в сценариях ...

Можно использовать "0pсценарий «многократные путы» (наиболее распространенный вариант использования, отсюда его повсеместное распространение в литературе по Vim), но этот регистр далеко не так полезен, как "_в других сценариях.


Я рассматриваю ваши варианты использования в большей степени как последствия поведения этого регистра, но я думаю, что ваш ответ четко описывает этот регистр следующим образом: «Регистр черной дыры здесь для того, чтобы позволить нам вырезать материал, не перекрывая неназванный регистр и пронумерованные регистры». Я был ожидая других ответов, но, похоже, это единственное использование этого регистра. Большое спасибо за ваш ответ!
statox

5

Помимо удаления текста, вы можете использовать регистр черной дыры для удаления других регистров. Пример:

:let @a=@_

Это один из способов очистки реестра "a.


2
В случае, если кто-то еще читает это, думает: «Интересно, это более короткая и понятная замена :call setreg('a', [])», как я и сделал: к сожалению, ответ - нет. Это действует как :call setreg('a', '')(оставляя "aв выводе :registersкоманды.
Рич

@Rich Какое значение оставить "aна выходе :registersдля непосвященных?
Алексей Магура

@AlexejMagura Ну, если ваша цель состоит в том, чтобы привести в порядок то, что вы видите при просмотре содержимого вашего реестра, то оставить кучу пустых регистров может быть не идеальным. Я не уверен, есть ли какая-либо другая практическая разница между удаленным регистром и существующим, который оказывается пустым.
Рич

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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.