Для чого використовується регістр чорної діри ("_)?


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

@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.