Imagina que tengo el siguiente texto:
some random stuff
* asdf
* foo
* bar
some other random stuff
Quiero reemplazar las viñetas de asterisco con números, así:
some random stuff
1. asdf
2. foo
3. bar
some other random stuff
¿Cómo se puede hacer esto en vim?
substitute
filetype-markdown
range
markup
counting
Brennan Vincent
fuente
fuente
1.
? Entonces:%s/^* /1. /
lo haría. Eso parece mucho menos trabajo.Respuestas:
Puedes probar el siguiente comando:
Primero inicializa la variable
c
(let c=0
), luego ejecuta el comando globalg
que busca el patrón^*
(un comienzo de línea, seguido de un asterisco y un espacio).Cada vez que se encuentra una línea que contiene este patrón, el comando global ejecuta el comando:
let c+=1 | s//\=c.'. '
incrementa la variable
c
(let c+=1
), luego (|
) sustituye (s
) el patrón buscado anterior (//
) con la evaluación de una expresión (\=
):el contenido de la variable
c
concatenada (.
) con la cadena'. '
Si no desea modificar todas las líneas de su búfer, pero solo un párrafo específico, puede pasar un rango al comando global. Por ejemplo, para modificar solo las líneas cuyo número está entre 5 y 10:
Si tiene un archivo que contiene varias listas similares que desea convertir, por ejemplo, algo como esto:
Puedes hacerlo con el siguiente comando:
Es solo una variante del comando anterior, que restablece la variable
c
cuando cambia a otra lista. Para detectar si está en otra lista, la variabled
se utiliza para almacenar el número de la última línea donde se realizó una sustitución.El comando global compara el número de línea actual (
line('.')
) cond+1
. Si son iguales, significa que estamos en la misma lista que antes, por lo quec
se incrementa (c+1
), de lo contrario significa que estamos en una lista diferente, por lo quec
se restablece (1
).Dentro de una función, el comando
let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]
podría reescribirse así:O así:
Para guardar algunas pulsaciones de teclas, también puede definir el comando personalizado
:NumberedLists
, que acepta un rango cuyo valor predeterminado es1,$
(-range=%
):Cuándo
:NumberedLists
se ejecutará<line1>
y<line2>
se reemplazará automáticamente con el rango que utilizó.Entonces, para convertir todas las listas en el búfer, escribiría:
:NumberedLists
Solo las listas entre las líneas 10 y 20:
:10,20NumberedLists
Solo la selección visual:
:'<,'>NumberedLists
Para más información, ver:
fuente
Esto solo funciona con una versión reciente de Vim (que tiene
:h v_g_CTRL-A
):*
) y reemplazarlos con0
(cursor está en la primera*
):Ctrl-v
j
j
r
0
.gv
g
Ctrl-a
... y eso es :)
(Si usted quiere tener un punto después de cada número, cambiar primero paso para:
Ctrl-v
j
j
s
0
.
Esc
)fuente
Seleccione visualmente las líneas y ejecute este comando de sustitución:
Ver
:help sub-replace-expression
,:help line()
y:help '<
.Para evitar tener que seleccionar las líneas, se pueden usar búsquedas hacia atrás y hacia adelante con desplazamientos para especificar el rango de sustitución de esta manera:
Ver
:help cmdline-ranges
fuente
De otra manera:
fuente
También podría definir operadores personalizados
Puede asignarlos a las secuencias de teclas
'*
y'#
. Las marcas*
y#
no existen, por lo que no anulará ninguna funcionalidad predeterminada. La razón para elegir'
como prefijo es obtener algún tipo de mnemotecnia. Estás agregando un signo / marca delante de algunas líneas. Y generalmente para ir a una marca usas el prefijo'
.También funciona desde el modo visual.
Los comandos Ex son buenos para las secuencias de comandos, pero para un uso interactivo, un operador normal es probablemente mejor, porque puede combinarlo con cualquier movimiento u objeto de texto.
Por ejemplo, puede alternar una lista prefijada con asteriscos o signos menos dentro del párrafo actual presionando
'*ip
. Aquí,'*
es un operador yip
es el objeto de texto en el que trabaja.Y haga lo mismo para una lista prefijada con números en las siguientes 10 líneas presionando
'#10j
. Aquí,'#
hay otro operador y10j
es un movimiento que cubre las líneas en las que trabaja el operador.El otro beneficio de usar un operador personalizado es que puede repetir su última edición con el comando punto.
fuente