Reemplazar selección con salida de comando externo

10

Suponiendo que tengo una línea en un archivo con XXXXun marcador de posición que he seleccionado de la vsiguiente manera:

XXXX Some other text

¿Cómo puedo cambiar solo la XXXXsalida de un comando externo, como date +%Y%m%d?

Llegué tan lejos

:'<,'>!date +\%Y\%m\%d 

pero eso reemplazó toda la línea.

muk.li
fuente
Pregunta relacionada sobre stackoverflow: stackoverflow.com/q/8403599/…
Hotschke

Respuestas:

15

Puede eliminar el texto e insertar la salida de un comando usando CtrlR- =:

CTRL-R {0-9a-z"%#*+:.-=}                                        i_CTRL-R
                Insert the contents of a register.  Between typing CTRL-R and
                the second character, '"' will be displayed to indicate that
                you are expected to enter the name of a register.
 …
                                                        i_CTRL-R_=
                        '='     the expression register: you are prompted to
                                enter an expression (see expression)

Para la expresión, puede usar la system()función para ejecutar comandos externos.

Después de seleccionar el texto, presione c, luego <c-r>=y use system('date +%Y%m%d')como expresión.

muru
fuente
1
Eso agrega una nueva línea entre el texto reemplazado y el resto de la línea, ¿no?
muk.li
2
@ muk.li que es parte de la salida de date. Si intenta algo como system('printf %s foo'), que no genera una nueva línea final, verá que hay una diferencia.
muru
44
@ muk.li si solo desea la fecha en el texto, existe la strftimefunción que puede usar en lugar de system('date …'). La cadena de formato es la misma.
muru
2
No es necesario eliminar el texto seleccionado. Puede utilizar "=system('date +%Y%m%d')pen la selección visual en su lugar.
Hauleth
5

Si coloca el cursor en dicha línea puede:

  • 0 poner el cursor en la primera columna.
  • f Space poner el cursor en el primer espacio en blanco.
  • i Enter Esc para dividir la línea
  • l para mover el cursor una línea hacia arriba.
  • :.!date +\%Y\%m\%d para ejecutar el comando
  • J para unir las líneas nuevamente.

De :h :visual_example:

Actualmente, el comando ":" funciona solo en líneas completas. Cuando selecciona parte de una línea, hacer algo como ":! Date" reemplazará toda la línea. Si desea reemplazar solo una parte de la línea, tendrá que hacer un mapeo para ella. En una versión futura ":" puede funcionar en líneas parciales.

Ver también :h visual-operatorspara más detalles.

De este comentario: También puedes probar el complemento vis o NrrwRgn . Ambos deberían manejarlo bien. (Gracias @ christian-brabandt por el dato).

Jair López
fuente
2

Cree una asignación temporal para tales reemplazos. Por ejemplo:

:vnoremap qq c<C-R>=system('wc -c | perl -pe chomp', @")<CR><ESC>

Luego, en modo visual, puede seleccionar texto, escribir qqy será reemplazado por la salida del comando. En este ejemplo wc -cprocesará su selección, que es el @"parámetro. perl -pe chompes necesario para eliminar una nueva línea final de la salida.

Oleg Tsybulskyi
fuente
1
Tenga en cuenta que esta solución es una envoltura alrededor de la respuesta de muru, crear un mapeo para un uso único podría no ser el método más eficiente.
statox
1

Prueba esto:

:let @a = system('date +\%Y\%m\%d')[:-2]
:'<,'>g/XXXX/s/XXXX/\=@a/g
  • La primera línea guarda la salida del datecomando en el registro a, con la nueva línea final eliminada.
  • La segunda línea inspecciona globalmente su selección y marca las líneas que contienen XXXX( g/XXXX/), y
  • reemplace todas las instancias del XXXXcon el contenido del registro a ( s/XXXX/\=@a/g)

Consulte :h let-@y :h :globalla sección "Sublista" en:h list-index

Charles Jie
fuente
0

Plugin: Visual Block Commands (vis) por DrChip

Instalación vis.vba.gzy dependencia cecutil.vba.gzen vim8 packpath

# shell brace expansion (bash >=3.0, zsh>=2.6)
$ mkdir -p ~/.vim/pack/manual/start/{vis,cecutil}
$ vim http://www.drchip.org/astronaut/vim/vbafiles/vis.vba.gz
:UseVimball ~/.vim/pack/manual/start/vis
:e http://www.drchip.org/astronaut/vim/vbafiles/cecutil.vba.gz
:UseVimball ~/.vim/pack/manual/start/cecutil

OP se convierte en ejemplo

:'<,'>B !date +\%Y\%m\%d 
Hotschke
fuente