Pregunta

Debe ser trivial, y que incluso podría ser en la ayuda, pero no puedo averiguar cómo navegar por ella.¿Cómo puedo guión varias líneas rápidamente en vi?

¿Fue útil?

Solución

Utilice el comando > . Para sangrar 5 líneas, 5> & Gt; . Para marcar un bloque de líneas e sangrarlo, Vjj & Gt; para sangrar 3 líneas (solo vim). Para sangrar un bloque de llaves, coloque el cursor en una de las llaves y use > % o desde cualquier lugar dentro del bloque use gt; i B .

Si & # 8217; está copiando bloques de texto y necesita alinear la sangría de un bloque en su nueva ubicación, use font> p en lugar de solo p . Esto alinea el bloque pegado con el texto circundante.

Además, la configuración shiftwidth le permite controlar cómo muchos espacios para sangrar.

Otros consejos

Esta respuesta resume las otras respuestas y comentarios de esta pregunta, y agrega información adicional basada en la documentación de Vim y el Vim wiki . Para ser concisos, esta respuesta no distingue entre los comandos específicos de Vi y Vim.

En los siguientes comandos, " re-sangría " significa " sangrar líneas según tu configuración de sangría . " shiftwidth es la variable principal que controla la sangría.

Comandos generales

>>   Indent line by shiftwidth spaces
<<   De-indent line by shiftwidth spaces
5>>  Indent 5 lines
5==  Re-indent 5 lines

>%   Increase indent of a braced or bracketed block (place cursor on brace first)
=%   Reindent a braced or bracketed block (cursor on brace)
<%   Decrease indent of a braced or bracketed block (cursor on brace)
]p   Paste text, aligning indentation with surroundings

=i{  Re-indent the 'inner block', i.e. the contents of the block
=a{  Re-indent 'a block', i.e. block and containing braces
=2a{ Re-indent '2 blocks', i.e. this block and containing block

>i{  Increase inner block indent
<i{  Decrease inner block indent

Puede reemplazar { con } o B, p. =iB es un comando de sangría de bloque válido. Eche un vistazo a & Quot; Sangría un bloque de código & Quot; para obtener un buen ejemplo para probar estos comandos.

Además, recuerda que

.    Repeat last command

, por lo que los comandos de sangría se pueden repetir fácil y convenientemente.

Nueva sangría de archivos completos

Otra situación común requiere que se corrija la sangría en un archivo fuente:

gg=G  Re-indent entire buffer

Puede ampliar esta idea a varios archivos:

" Re-indent all your c source code:
:args *.c
:argdo normal gg=G
:wall

O múltiples buffers:

" Re-indent all open buffers:
:bufdo normal gg=G:wall

En modo visual

Vjj> Visually mark and then indent 3 lines

En modo de inserción

Estos comandos se aplican a la línea actual:

CTRL-t   insert indent at start of line
CTRL-d   remove indent at start of line
0 CTRL-d remove all indentation from line

Comandos Ex

Estos son útiles cuando desea sangrar un rango específico de líneas, sin mover su cursor.

:< and :> Given a range, apply indentation e.g.
:4,8>   indent lines 4 to 8, inclusive

Sangría usando marcadores

Otro enfoque es a través de marcadores :

ma     Mark top of block to indent as marker 'a'

... mueve el cursor a la ubicación final

>'a    Indent from marker 'a' to current location

Variables que rigen la sangría

Puede configurarlos en su .vimrc archivo .

set expandtab       "Use softtabstop spaces instead of tab characters for indentation
set shiftwidth=4    "Indent by 4 spaces when using >>, <<, == etc.
set softtabstop=4   "Indent by 4 spaces when pressing <TAB>

set autoindent      "Keep indentation from previous line
set smartindent     "Automatically inserts indentation in some cases
set cindent         "Like smartindent, but stricter and more customisable

Vim tiene una sangría inteligente basada en el tipo de archivo. Intente agregar esto a su .vimrc:

if has ("autocmd")
    " File type detection. Indent based on filetype. Recommended.
    filetype plugin indent on
endif

Referencias

Una gran selección sería:

gg=G

Es realmente rápido, y todo se sangra ;-)

Pruebe también esto para sangría en C sangría, haga :help = para obtener más información:

={

Eso sangrará automáticamente el bloque de código actual en el que se encuentra.

O simplemente:

==

para sangrar automáticamente la línea actual.

Pulsaciones de teclas para más personas visuales:

  1. Ingrese al modo de comando:
    Escape

  2. Desplácese hasta el inicio del área para sangrar:
    hjkl # 8595; & # 8592; & # 8594;

  3. Iniciar un bloque:
    v

  4. Muévete hasta el final del área para sangrar:
    hjkl # 8595; & # 8592; & # 8594;

  5. (Opcional) Escriba el número de niveles de sangría que desee
    0..9

  6. Ejecute la sangría en el bloque:
    >

Además de la respuesta ya dada y aceptada, también es posible colocar un marcador y luego sangrar todo, desde el cursor actual hasta el marcador. Por lo tanto, ingrese ma donde desea la parte superior de su bloque sangrado, desplace el cursor hacia abajo todo lo que necesite y luego escriba >'a (tenga en cuenta que & Quot; a & Quot; puede ser sustituido por cualquier nombre de marcador válido). Esto a veces es más fácil que 5>> o vjjj>.

El maestro de todos los comandos es
gg=G

¡Esto sangra todo el archivo!

Y a continuación se presentan algunos de los comandos simples y elegantes utilizados para sangrar líneas rápidamente en Vim o gVim.

Para sangrar la línea actual
==

Para sangrar todas las líneas debajo de la línea actual

=G

Para sangrar n líneas debajo de la línea actual

n==

Por ejemplo, para sangrar 4 líneas debajo de la línea actual

4==

Para sangrar un bloque de código, vaya a una de las llaves y use el comando

=%

Estos son los comandos más simples pero potentes para sangrar varias líneas.

Ir al inicio del texto

  • presione v para el modo visual.
  • use la flecha arriba / abajo para resaltar el texto.
  • presione = para sangrar todas las líneas que resaltó.

Además de las soluciones ofrecidas, me gusta hacer las cosas un párrafo a la vez con >}

Cuando selecciona un bloque y usa > para sangrar, sangra y luego vuelve al modo normal. Tengo esto en mi archivo .vimrc:

vnoremap < <gv

vnoremap > >gv

Le permite sangrar su selección tantas veces como desee.

Suponga que usa 2 espacios para sangrar su código. Tipo:

:set shiftwidth=2
  • Escriba v (para ingresar al modo de edición de bloque visual)
  • Mueva el cursor con las teclas de flecha (o con h / j / k / l ) para resalte las líneas que desea sangrar o desangrar.

Entonces:

  • Escriba > para sangrar una vez (2 espacios).
  • Escriba 2 > para sangrar dos veces (4 espacios).
  • Escriba 3 > para sangrar tres veces (6 espacios).
  • ...
  • Escriba < para desangrar una vez (2 espacios).
  • Escriba 2 < para desangrar dos veces (4 espacios).
  • Escriba 3 < en unindent tres veces (6 espacios).
  • ...

Se te ocurre la idea.

( Las líneas vacías no se sangrarán, lo que creo que es agradable. )


Encontré la respuesta en la documentación (g) vim para los bloques de sangría:

:help visual-block
/indent
  

Si desea contar el comando, hágalo justo antes de escribir   el carácter del operador: " v {move-around} 3 > " (mueva las líneas 3 sangrías a   la derecha).

La belleza de la interfaz de usuario de vim es que es consistente. Los comandos de edición están compuestos por el comando y un movimiento del cursor. Los movimientos del cursor son siempre los mismos:

  • H a la parte superior de la pantalla, L a la parte inferior, M a la mitad
  • n G para ir a la línea n, G solo al final del archivo, g g al principio
  • n para pasar a la siguiente búsqueda, N a la anterior
  • } hasta el final del párrafo
  • % al siguiente paréntesis coincidente, ya sea entre paréntesis o tipo de etiqueta
  • enter a la siguiente línea
  • ' x para marcar x donde x es una letra u otra '
  • muchos más, incluidos w y W por palabra, $ o 0 a las puntas de la línea, etc, que no se aplican aquí porque no son movimientos de línea .

Entonces, para usar vim, debes aprender a mover el cursor y recordar un repertorio de comandos como, por ejemplo, > para sangrar (y lt; a " outdent ").
Por lo tanto, para sangrar las líneas desde la posición del cursor hasta la parte superior de la pantalla, debe hacer > H , & Gt; G para sangrar al final del archivo.

Si, en lugar de escribir > H , escribe d H , entonces está eliminar el mismo bloque de líneas, c H para reemplazarlo, etc.

Algunos movimientos del cursor se ajustan mejor con comandos específicos. En particular, el comando % es útil para sangrar un bloque HTML o XML completo.
Si el archivo tiene la sintaxis resaltada (:syn on), entonces establezca el cursor en el texto de una etiqueta (como, en & Quot; i & Quot; de & Lt; div & Gt; y ingresar > % sangrará hasta el cierre < / div > etiqueta.

Así es como funciona vim: uno tiene que recordar solo los movimientos del cursor y los comandos, y cómo mezclarlos.
Entonces, mi respuesta a esta pregunta sería & Quot; vaya a un extremo del bloque de líneas que desea sangrar, y luego escriba el comando & Gt; y un movimiento hacia el otro final del bloque " si sangría se interpreta como desplazamiento de las líneas, = si sangría se interpreta como una impresión bonita.

haz esto

$vi .vimrc

y agrega esta línea

autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent

esto es solo para el archivo cpp, puede hacerlo para otro tipo de archivo también simplemente modificando el tipo de archivo ...

Una forma rápida de hacer esto usando VISUAL MODE utiliza el mismo proceso como comentar un bloque de código.

Esto es útil si usted prefiere no cambiar su shiftwidth o el uso de cualquier set directivas y es lo suficientemente flexible como para trabajar con PESTAÑAS o ESPACIOS o de cualquier otro carácter.

  1. La posición del cursor al principio de la cuadra
  2. v para cambiar a -- VISUAL MODE --
  3. Seleccione el texto con sangría
  4. Tipo de : para cambiar el símbolo del sistema
  5. La sustitución con 3 espacios a la izquierda:

    :'<,'>s/^/ /g

  6. O reemplazar con el líder de fichas:

    :'<,'>s/^/\t/g

  7. Breve Explicación:

    '<,'> - Dentro de los discapacitados Rango Seleccionado

    s/^/ /g - Insertar 3 espacios al principio de cada línea dentro de toda la gama

    (o)

    s/^/\t/g - Insertar Tab al principio de cada línea dentro de toda la gama

Me gusta marcar texto para sangrar:

  1. vaya al comienzo de la línea de texto y luego escriba ma (a es la etiqueta del 'm'ark: podría ser cualquier letra)
  2. vaya a la línea final de texto y escriba mz (nuevamente z podría ser cualquier letra)
  3. : 'a,' z > o: 'a,' z < sangrará o sangrará (¿es una palabra?)
  4. Voila! el texto se mueve (las líneas vacías permanecen vacías sin espacios)

PS: puede usar: 'a,' z técnica para marcar un rango para cualquier operación (d, y, s ///, etc.) donde puede usar líneas, números o%

>} o >{ sangría desde la línea actual hasta el siguiente párrafo

<} o <{ misma sangría

Hay una forma más que no se ha mencionado & # 8217; todavía puede usar el comando norm i para insertar texto dado al comienzo de la línea. Para insertar 10 espacios antes de las líneas 2-10:

:2,10norm 10i 

Recuerde que debe haber un carácter de espacio al final del comando; este será el carácter que queremos insertar. También podemos sangrar la línea con cualquier otro texto, por ejemplo, sangrar cada línea del archivo con 5 caracteres de subrayado:

:%norm 5i_

O algo aún más elegante:

:%norm 2i[ ]

Un ejemplo más práctico es comentar código Bash / Python / etc con el carácter #:

:1,20norm i#

Para volver a sangrar use x en lugar de i . Por ejemplo, para eliminar los primeros 5 caracteres de cada línea:

:%norm 5x

Para mí, la solución MacVim (Visual) era, seleccionar con el mouse y presionar & "; > &"; pero después de poner las siguientes líneas en & "; ~ /. vimrc " como me gustan los espacios en lugar de las pestañas:

set expandtab
set tabstop=2
set shiftwidth=2

También es útil poder llamar a MacVim desde la línea de comandos (Terminal.app), por lo que tengo el siguiente directorio auxiliar " ~ / bin " ;, donde coloco un script llamado " macvim " ;:

#!/usr/bin/env bash
/usr/bin/open -a /Applications/MacPorts/MacVim.app $@

Y, por supuesto, en " ~ / .bashrc " ;:

export PATH=$PATH:$HOME/bin

Macports se mete con " ~ / .profile " mucho, por lo que la variable de entorno PATH puede ser bastante larga.

No encontré un método que utilizo en los comentarios, así que lo compartiré (creo que solo vim):

  1. Esc para ingresar al modo de comando
  2. Muévase al primer carácter de la última línea que desea identificar
  3. ctrl - v para iniciar la selección de bloque
  4. Muévase al primer carácter de la primera línea que desea identificar
  5. shift - i para ingresar al modo de inserción especial
  6. escriba tantos espacios / pestañas como necesite sangrar (2 por ejemplo
  7. presione Esc y aparecerán espacios en todas las líneas

Esto es útil cuando no desea cambiar la configuración de identificación / pestaña en vimrc o recordar que la cambien durante la edición.

Para eliminar la sangría, uso el mismo ctrl - v selección de bloque para seleccionar espacios y eliminarlo con d .

No sé por qué es tan difícil encontrar una respuesta simple como esta ...

Yo mismo tuve que luchar mucho para saber que esto es es muy simple

edite su archivo .vimrc en el directorio de inicio agrega esta línea

set cindent

en su archivo donde desea sangrar correctamente

en modo normal / tipo de comando

10==   (this will indent 10 lines from the current cursor location )
gg=G   (complete file will be properly indented)

5== sangrará 5 líneas desde la posición actual del cursor. para que pueda escribir cualquier número antes de ==, sangrará el número de líneas. Esto está en modo comando.

gg=G sangrará todo el archivo de arriba a abajo.

:help left

En ex mode puede utilizar :left o :le para alinear las líneas de una cantidad determinada.Específicamente, :left se Alinear a la izquierda de las líneas en el [gama].Se establece la sangría en las líneas a [guión] (0 por defecto).

:%le3 o :%le 3 o :%left3 o :%left 3 alinear todo el archivo mediante el relleno con tres espacios.

:5,7 le 3 se alinee las líneas 5 a 7 por relleno de ellos con 3 espacios.

:le sin ningún valor o :le 0 va a alinear a la izquierda con un margen de 0.

Esto funciona en vim y gvim.

:line_num_start,line_num_end>

p.

14,21> shifts line number 14 to 21 to one tab

Aumenta el '>' símbolo para más pestañas

p.

14,21>>> for 3 tabs

Utilizando mucho Python, me encuentro con la necesidad frecuente de cambiar bloques por más de una sangría. Puede hacerlo utilizando cualquiera de los métodos de selección de bloque y luego simplemente ingrese el número de sangrías que desea saltar justo antes de >

Ej. V5j3> sangrará 5 líneas 3 veces, que son 12 espacios si usa 4 espacios para sangrías

Para sangrar cada línea en un tipo de archivo, esc luego G = gg

Cómo sangría de código resaltado en la vi inmediatamente por un número de espacios:

Opción 1:Sangría de un bloque de código en vi a tres espacios con Visual en el modo de bloqueo:

  1. Seleccione el bloque de código que desee aplicar una sangría.Hacer esto utilizando Ctrl+V en modo normal y desplácese hacia abajo para seleccionar texto.Mientras está seleccionada, introduzca : para dar un comando para el bloque de texto seleccionado.

  2. Aparecerá lo siguiente en la línea de comandos: :'<,'>

  3. Para establecer la sangría de 3 espacios, tipo de le 3 y presione entrar.Esto es lo que aparece: :'<,'>le 3

  4. El texto seleccionado es inmediatamente sangría de 3 espacios.

Opción 2:Sangría de un bloque de código en vi a tres espacios con una Línea Visual modo:

  1. Abrir el archivo en VI.
  2. Coloque el cursor sobre el código
  3. Estar en modo normal, presione las siguientes teclas:

    Vjjjj:le 3
    

    La interpretación de lo que hizo:

    V significa empezar a seleccionar texto.

    jjjj las flechas hacia abajo 4 líneas, resaltado de 4 líneas.

    : le dice a vi entrará en una instrucción para el texto resaltado.

    le 3 significa sangría de texto resaltado de 3 líneas.

    El código seleccionado es inmediatamente aumentado o disminuido a tres espacios de sangría.

Opción 3:utilizar Visual en el modo de bloqueo y especial modo de inserción para aumentar sangría:

  1. Abrir el archivo en VI.
  2. Coloque el cursor sobre el código
  3. Estar en modo normal, presione las siguientes teclas:

    Ctrl+V

    jjjj
    

    (presione la barra espaciadora 5 veces)

    Esc Shift+i

    Todo el texto resaltado sangría de 5 espacios.

Para sangrar todo el archivo por 4:

esc 4G=G

Uso la selección visual en modo bloque:

  • Ve al frente del bloque para moverte (en la parte superior o inferior).
  • Presione ctrl-v para ingresar al modo de bloqueo visual.
  • Navegue para seleccionar una columna delante de las líneas.
  • Presione I (shift i) para ingresar al modo de inserción.
  • Escriba algunos espacios.
  • Presione ESC. Todas las líneas cambiarán.

Esto no es uni-tasker. Funciona:

  • En el medio de las líneas.
  • Para insertar cualquier cadena en todas las líneas.
  • Para cambiar una columna (use c en lugar de I).
  • tirar, borrar, sustituir, etc. ...
  • Para el bloque de código {}: = + %

  • Para la línea seleccionada: Shift + v seleccione usando la tecla de flecha arriba / abajo y luego presione = .

  • Para todo el archivo: gg + = + G

Nota: 'gg' significa ir a la línea 1, '=' es el comando de sangría y 'G' mueve el cursor al final del archivo .

Suponga que | representa la posición del cursor en Vim. Si el texto a sangrar está encerrado en un bloque de código como:

int main() {
line1
line2|
line3
}

puede hacer >i{ lo que significa " sangría (>) dentro del bloque (i) ({) " y obtener:

int main() {
    line1
    line2|
    line3
}

Ahora suponga que las líneas son contiguas pero están fuera de un bloque, como:

do
line2|
line3
line4
done

Para sangrar las líneas 2 a 4, puede seleccionar visualmente las líneas y escribir >2j. O incluso más rápido puede hacer >Nj para obtener:

do
    line2|
    line3
    line4
done

Tenga en cuenta que N significa sangría desde la línea actual a set relativenumber líneas a continuación. Si el número de líneas a sangrar es grande, el usuario puede tardar algunos segundos en contar el valor adecuado de <=>. Para ahorrar valiosos segundos, puede activar la opción de número relativo con <=> (disponible desde Vim versión 7.3).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top