¿Cómo puedo obtener una selección visual de vimscript?

11

Si tengo un par de líneas de vimscript que quiero probar antes de poner mi vimrc, ¿es posible seleccionarlas visualmente y luego buscarlas?

Yo he tratado

  • hacer una selección visual v, luego hacer movimientos para hacer una selección, etc., luego
  • :'<,'>so

Pero vim da un error

no se permite rango

además

:'<,'>w | so

da

Utilizar ! escribir buffer parcial

¿Cómo puedo obtener vimscript visualmente seleccionado?

the_velour_fog
fuente

Respuestas:

11

En la línea de comando, presione y <C-u>luego escriba @*e ingrese.

<C-u>eliminará el rango visual '<,'>que se ha insertado automáticamente si se selecciona visualmente algún texto.

:@*ejecutará el contenido del *registro que contiene todo lo que se selecciona visualmente en este momento.

Incluso si el texto seleccionado / resaltado está en su navegador web (firefox, chrome, ...), funcionará, el *registro le permitirá acceder directamente a él en vim.


Si se selecciona el texto en un buffer de Vim, otra solución es copiarlo en un registro llamado, por ejemplo, el de un registro mediante la tipificación "ay.

Luego, en la línea de comando, escriba: <C-r>ae ingrese.
Ctrl+ rle dará una especie de mensaje representado por el personaje "(para más información, lea :h c_Ctrl-r).
En este nuevo mensaje, si le da el nombre de un registro, su contenido se insertará en la línea de comando, donde podrá editarlo antes de la ejecución.


Además, si copia algún texto sin especificar un registro, será accesible desde el registro sin nombre " .

Supongamos que tiene una línea de vimscript en un archivo y desea obtenerla rápidamente, puede copiarla Y, luego buscarla en la línea de comando con: :<C-r>"e ingresar.

Finalmente, si usa esta última solución, solo hay un problema que debe tener en cuenta.
Si ve un personaje extraño en la línea de comando como este ^M, es la notación de intercalación del retorno de carro. Debería eliminarlo, de lo contrario probablemente obtendrá un error.

En resumen, usted:

  1. copia tu línea de vimscript con Y
  2. cambiar al modo de comando con :
  3. presione <C-r>para ingresar a la solicitud de registros
  4. escriba "para llamar al registro sin nombre
  5. presione la tecla de retroceso para eliminar el ^Mpersonaje
  6. y pulsa enter.
Saginaw
fuente
1
¡Dulce! : D funciona muy bien. Nunca había visto @*antes, ¡gracias!
the_velour_fog
Me alegra que te haya ayudado. He editado la respuesta para proponer otra solución.
Saginaw
1
bueno, probé tu sugerencia sobre usarlo, : <C-r>a en realidad también funcionó bien :) Supongo que vim leyó los ^M's como retorna la línea - y ejecutó cada uno como su propia línea / comando individual.
the_velour_fog
Esa es una buena pregunta, sinceramente no lo sé. Por lo general, si no elimino este personaje, tengo errores. Me alegro de que te haya funcionado sin errores. Quizás alguien con más conocimiento sobre el tema nos explique cómo trata vim ese tipo de personajes especiales.
saginaw
2

De hecho, lo hago un poco diferente, solo hago las ediciones en mi vimrc y lo vuelvo a buscar cada vez que lo escribo. (Tengo un conjunto de archivos vimrc en cascada, así que esto me permite cambiar cualquiera de ellos).

if $MYVIMRC != ''
    autocmd BufWritePost    *vimrc      source $MYVIMRC
endif
dash-tom-bang
fuente
2

Más directamente a la pregunta que a mi otra respuesta, podría definir un mapeo como este ( nnoremappara ninguna selección, simplemente ejecute la línea actual; vnoremappara cuando el modo visual está activo):

nnoremap <F2> :execute getline(".")<CR>
vnoremap <F2> :<C-u>for line in getline("'<", "'>") \| execute line \| endfor<CR>

En ambos casos, la "línea actual" es :executed, por lo que en la versión visual estás :executepasando una línea tras otra a través de la selección visual.

Como se indicó en otra respuesta, <C-u>elimina la especificación de rango que aparece en la línea de comando cuando :se escribe. Los |caracteres deben escaparse porque, de lo contrario, se interpretan como el final del vnoremapcomando.

Esto también podría convertirse en una función para deshacerse de algunas de las gimnasias de escape, pero no me parece una gran victoria en este momento. Básicamente sería el vnoremap expandido en múltiples líneas y calleditado con un rango o no dependiendo del modo de mapeo [nv].

dash-tom-bang
fuente
Oh, el mapeo del modo visual ejecuta líneas enteras, por lo que si utiliza bloques o caracteres, ignorará los puntos de inicio y final dentro de las líneas.
dash-tom-bang