¿De qué sirve el registro de agujeros negros ("_)?


15

Hace poco leí sobre el registro de agujeros negros, "_que es un registro de solo escritura.

La documentación de Vim lo describe de esta manera:

  1. Registro de agujero negro "_

Al escribir en este registro, no pasa nada. Esto se puede usar para eliminar texto sin afectar los registros normales. Al leer desde este registro, no se devuelve nada.

En todos los artículos y libros que leo, los autores siempre usan el mismo ejemplo, que es usar este registro cuando necesitamos eliminar algo de texto sin borrar lo que hemos eliminado previamente.

Entiendo este uso, pero me sorprende el hecho de que no puedo encontrar otros casos de uso de este registro, lo que me lleva a 2 preguntas:

  • ¿Es útil este registro en otros casos de uso ? En caso afirmativo, ¿cuáles?

  • Si el único propósito de este registro es utilizarlo en el caso de uso que cité antes, ¿por qué los creadores de Vim decidieron resolver este problema con dicho registro ? Quiero decir que esta respuesta muestra una solución al problema que implica menos pulsaciones de teclas que el uso "_. El uso "0también puede evitar el uso del registro de agujeros negros, ¿por qué lo crearon?

Respuestas:


18

El registro de agujero negro se usa en las mismas situaciones que /dev/null: cuando realiza una acción que normalmente genera algo pero no tiene uso para esa salida.

El comportamiento predeterminado de Vim es "cortar", no "eliminar". En la mayoría de los casos no importa, pero a veces los usuarios pueden necesitar "eliminar". Ahí es donde el registro de agujeros negros es útil.

¿Es útil este registro en otros casos de uso?

El registro de agujeros negros está aquí para permitirnos cortar cosas sin alterar el registro sin nombre y los registros numerados.

Los posibles casos de uso son numerosos pero, como era de esperar, muy similares:

  • proporcionar una "eliminación" real,
  • tener un mejor control sobre los registros, principalmente el anónimo,
  • mantener los registros numerados en un estado estable,
  • cortar algo mientras conserva la capacidad de poner desde el registro sin nombre, dándonos "puestos repetibles",
  • pon algo sobre algo que no te importa,
  • prevenir los efectos secundarios en los guiones ...

Se podría usar "0ppara el escenario de "puestos repetidos" (el caso de uso más común, de ahí su ubicuidad en la literatura de Vim), pero ese registro está lejos de ser tan útil como "_para los otros escenarios.


Veo sus casos de uso más como consecuencias del comportamiento de este registro, pero creo que su respuesta describe claramente este registro con `El registro de agujeros negros está aquí para permitirnos cortar cosas sin tropezar con el registro sin nombre y los registros numerados. esperando otras respuestas pero parece que es el único uso de este registro. Muchas gracias por tu respuesta!
statox

5

Además de eliminar texto, puede usar el registro de agujeros negros para eliminar otros registros. Ejemplo:

:let @a=@_

Esta es una forma de borrar el registro "a.


2
En caso de que alguien más que lea esto piense: "Me pregunto si este es un reemplazo más corto y claro de :call setreg('a', [])", como lo hice yo: lamentablemente, la respuesta es no. Actúa como :call setreg('a', '')(dejando "aen la salida del :registerscomando.
Rich

@Rich ¿Cuál es el significado de dejar "aen la salida de :registerslos no iniciados?
Alexej Magura

@AlexejMagura Bueno, si tu objetivo es ordenar lo que ves cuando ves el contenido de tu registro, entonces dejar un montón de registros vacíos podría no ser lo ideal. No estoy seguro de si hay alguna otra diferencia práctica entre un registro eliminado y uno existente que esté vacío.
Rico

1

Un uso práctico en una función. En la función de abajo #se agrega y elimina el comentario de Python según el resultado de getline('.')[0]. Si la línea tiene un comentario, el carácter #se elimina, pero en este caso no queremos que se enrede con nuestro registro predeterminado.

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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.