Tengo algunos códigos copiados de Internet que tienen sangría de 2 espacios y quiero cambiarlos a sangría de 4 espacios. Me pregunto si hay una rutina vim corta para realizar la tarea sin tener que escribir un script vim. Así es como lo estoy haciendo actualmente con un archivo HTML:
- Grabar una macro
- Ir al principio de una línea
- Visual seleccione todos los espacios en blanco hasta la primera aparición de "<"
- Tira y pega todos los espacios en blanco (básicamente para doblarlos)
- Reproducir la macro hasta el final del archivo
En breve qa0vt<yp<esc>jq
Escollos:
La macro falla para una línea en blanco o una línea que no comienza con "<". Y no tengo idea de cómo extender esta solución a archivos que no son HTML.
ts
: =tabstop
,sts
: =softtabstop
y[no]et
: =[no]expandtab
.retab
útil el argumento y por qué no podemos usarlo para esta tarea?:set sts=2 noet
y,:retab! 2
por lo tanto, sería un poco más corto (aunque quizás menos legible) de esa manera.:set ts=2 sts=2 noet | retab! | set ts=4 sts=4 et | retab!
y luego úsalos@:
en diferentes archivos para aplicar rápidamente la misma acción.Puede ser posible con
:set shiftwidth=4
ygg=G
.fuente
gg=G
significa exatly? Entiendo quegg
significa "mover a 1,1" yG
significa "mover a la última línea".=
hace sangría, por lo que solo significa sangrar de principio a fin del texto%retab
, que convirtió incorrectamente espacios incrustados dentro de cadenas literales.Lo que hago es muy similar a los enfoques de esneider y cforbish, pero un poco más rápido de escribir:
Simplemente reemplaza el espacio inicial (espacios o tabulaciones) con el doble de espacio inicial (
&
se sustituye por la expresión coincidente).fuente
%
.sed
y aplicarlo a todos los archivos en un directorio superuser.com/a/159286/41494Usé esta expresión regular (duplica el número de espacios iniciales):
fuente
%s/\s\+/&&/
hace lo mismo? Por cierto, creo que lag
bandera es innecesaria (por un lado, solo habría 1 coincidencia^pattern
en cada línea, ¿no?)%s/^\s\+/&&/g
está más cerca.Esta es una pregunta muy antigua, sin embargo, todas las respuestas son ... incorrectas ... Vim tiene una manera muy fácil de reindentrar todo el archivo. Aprendí esto después de escribir mi propia función para hacerlo, así que estoy en el mismo bote de la ignorancia;)
tipo
esto es asumiendo que tiene su tabstop configurado como lo desea, (por lo que para el OP sería ts = 4)
Aprendí esto de http://vim.wikia.com/wiki/Fix_indentation , que menciona
fuente
Similar (pero algo más simple) a la respuesta de cforbish, esta expresión regular duplicará los espacios iniciales
O puede usar esta otra expresión regular para transformar 2 espacios en 4 espacios, preservando espacios únicos (y cantidades impares en general)
Es decir,
fuente
Además de la respuesta de @ spro, puse esto en mi
.vimrc
Solo escribe
:Format
.Con la selección visual, esto solo formatea las líneas seleccionadas.
Sin selección visual, esto formatea todo el archivo.
fuente
Esta es una variante de las respuestas basadas en expresiones regulares.
Tengo un script bash en mi directorio bin local que duplicará la cantidad de espacios en blanco al comienzo de una línea. La entrada puede ser stdin o un archivo:
Utilizo esto dentro de vim seleccionando visualmente una línea y emitiendo el siguiente comando:
Esto me ahorra la necesidad de escribir (o recordar) la expresión regular.
También lo uso en mapas como el siguiente:
que lo aplicará a un bloque de texto pegado recientemente. Normalmente uso el siguiente mapa para pegar en lugar de
:set paste
Mi flujo de trabajo habitual es:
o simplemente cambiando la sangría en los bloques pegados desde otro búfer.
fuente