Pregunta:
Tengo una línea como esta:
function my_function(argument, another argument, but there are spaces)
Quiero sustituir los caracteres de espacio (dentro de los nombres de los argumentos) con un guión bajo. Por tanto, me gustaría utilizar:
:s/\ /_/g
pero, ¿cómo puedo elegir no aplicarlo a toda la línea, sino a partir de, digamos, la posición del cursor? (¿O la tercera palabra)?
Respuesta:
Puede utilizar la siguiente solución:
Primero use v $ para seleccionar el texto desde el cursor hasta el final de la línea. Luego usa el siguiente comando:
:s/\%V\ /_/g
El \%V
indica cambiar el texto en el área previamente seleccionada visualmente, ver :h /\%V
Si tomo tu ejemplo:
function my_function(argument, another argument, but there are spaces)
Si mi cursor está en la columna 40 y uso el comando que acabo de escribir, obtengo:
function my_function(argument, another argument,_but_there_are_spaces)
En respuesta a su comentario también puede utilizar
-
\%#
que coincide con la posición del cursor -
\%>23c
que coincide con la columna 23. -
\%>'m
que coincide con la posición de una marca
Ver :h /\%#
:h /\%>c
:h /\%>'m
.
@ User9433424 dio una forma de usar \%#
en su comentario. Para el patrón con la marca, puede configurarlo con ma y luego usar:
:s/\%>'a /_/g
Una explicación del patrón dado por @ User9433424 es la siguiente:
:s/\v(%#.*)@<= /_/
:s/ substitution command
\v Enable the very magic mode
%#.* Any characters from the cursor position
@<= Check for matches just before what follows
space Followed by a space
/_/ Substitute the matches by underscores