À quoi sert le registre des trous noirs ("_)?

15

J'ai récemment lu sur le registre du trou noir "_qui est un registre en écriture seule.

La documentation Vim le décrit de cette façon:

  1. Registre des trous noirs "_

Lors de l'écriture dans ce registre, rien ne se passe. Cela peut être utilisé pour supprimer du texte sans affecter les registres normaux. Lors de la lecture de ce registre, rien n'est retourné.

Dans tous les articles et livres que j'ai lus, les auteurs utilisent toujours le même exemple qui consiste à utiliser ce registre lorsque nous devons supprimer du texte sans effacer ce que nous avions précédemment tiré.

Je comprends cette utilisation mais je suis surpris par le fait que je ne trouve pas d'autres cas d'utilisation de ce registre, ce qui m'amène à 2 questions:

  • Ce registre est-il utile dans certains autres cas d'utilisation ? Si oui, lesquels?

  • Si le seul but de ce registre est d'être utilisé dans le cas d'utilisation que j'ai cité précédemment, pourquoi les créateurs de Vim ont-ils décidé de résoudre ce problème avec un tel registre ? Je veux dire que cette réponse montre une solution au problème qui implique moins de frappes que d'utiliser "_. L'utilisation "0peut également éviter l'utilisation du registre des trous noirs, alors pourquoi l'ont-ils créé?

statox
la source

Réponses:

18

Le registre de trou noir est utilisé dans les mêmes situations que /dev/null: lorsque vous effectuez une action qui génère normalement quelque chose mais que vous n'avez aucune utilité pour cette sortie.

Le comportement par défaut de Vim est de "couper", pas de "supprimer". Dans la plupart des cas, cela n'a pas d'importance mais, parfois, les utilisateurs peuvent avoir besoin de "supprimer". C'est là que le registre des trous noirs est utile.

Ce registre est-il utile dans certains autres cas d'utilisation?

Le registre des trous noirs est là pour nous permettre de couper des trucs sans encombrer le registre sans nom et les registres numérotés.

Les cas d'utilisation possibles sont nombreux mais sans surprise très similaires:

  • fournir une "suppression" réelle,
  • avoir un meilleur contrôle sur les registres, principalement celui sans nom,
  • garder les registres numérotés dans un état stable,
  • couper quelque chose tout en conservant la possibilité de mettre du registre sans nom, ce qui nous donne des "puts répétables",
  • mettre quelque chose par-dessus quelque chose dont vous ne vous souciez pas,
  • éviter les effets secondaires dans les scripts…

On pourrait utiliser "0ppour le scénario des " put répétés" (le cas d'utilisation le plus courant, d'où son omniprésence dans la littérature Vim) mais ce registre est loin d'être aussi utile que "_pour les autres scénarios.

romainl
la source
Je vois davantage vos cas d'utilisation comme des conséquences du comportement de ce registre, mais je pense que votre réponse décrit clairement ce registre avec `Le registre du trou noir est là pour nous permettre de couper des trucs sans encombrer le registre sans nom et les registres numérotés '. en attendant d'autres réponses mais il semble que ce soit la seule utilisation de ce registre. Merci beaucoup pour votre réponse!
statox
5

Outre la suppression de texte, vous pouvez utiliser le registre de trou noir pour supprimer d'autres registres. Exemple:

:let @a=@_

C'est une façon d'effacer le registre "a.

cbaumhardt
la source
2
Au cas où quelqu'un d'autre lisant ceci penserait, "je me demande s'il s'agit d'un remplacement plus court et plus clair de :call setreg('a', [])", comme je l'ai fait: malheureusement, la réponse est non. Il agit comme :call setreg('a', '')(laissant "adans la sortie de la :registerscommande.
Rich
@Rich Quelle est l'importance de laisser "adans la sortie de :registerspour les non-initiés?
Alexej Magura
@AlexejMagura Eh bien, si votre objectif est de ranger ce que vous voyez lorsque vous consultez le contenu de votre registre, alors laisser un tas de registres vides pourrait ne pas être idéal. Je ne sais pas s'il y a une autre différence pratique entre un registre supprimé et un registre existant qui se trouve être vide.
Rich
1

Une utilisation pratique dans une fonction. Dans la fonction ci-dessous, le commentaire python #est ajouté et supprimé en fonction du résultat de getline('.')[0]. Si la ligne a un commentaire, le caractère #est supprimé, mais dans ce cas, nous ne voulons pas qu'il perturbe notre registre par défaut.

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>
SergioAraujo
la source