vim - lenguaje - Sangrar múltiples líneas rápidamente en vi
que es vim (29)
Cómo sangrar código resaltado en vi inmediatamente por un # de espacios:
Opción 1: sangrar un bloque de código en vi en tres espacios con el modo Bloqueo visual:
Seleccione el bloque de código que desea sangrar. Hágalo usando Ctrl + V en modo normal y girando hacia abajo para seleccionar texto. Mientras está seleccionado, ingrese
:
para dar un comando al bloque de texto seleccionado.Lo siguiente aparecerá en la línea de comando
:''<,''>
Para establecer la sangría en 3 espacios, escriba
le 3
y presione enter. Esto es lo que aparece:::''<,''>le 3
El texto seleccionado se sangra inmediatamente a 3 espacios.
Opción 2: sangrar un bloque de código en vi en tres espacios con el modo de línea visual:
- Abra su archivo en VI.
- Ponga su cursor sobre algún código
Estar en modo normal, presionar las siguientes teclas:
Vjjjj:le 3
Interpretación de lo que hiciste:
V
significa empezar a seleccionar texto.jjjj
flechas hacia abajo 4 líneas, resaltando 4 líneas.:
le dice a vi que ingresará una instrucción para el texto resaltado.le 3
significa sangría de texto resaltado 3 líneas.El código seleccionado se aumenta o disminuye inmediatamente a tres espacios de sangría.
Opción 3: use el modo Bloqueo visual y el modo de inserción especial para aumentar la sangría:
- Abra su archivo en VI.
- Ponga su cursor sobre algún código
Estar en modo normal, presionar las siguientes teclas:
Ctrl + V
jjjj
(presiona la barra espaciadora 5 veces)
Esc Shift + i
Todo el texto resaltado está sangrado 5 espacios adicionales.
Debería ser trivial, e incluso podría ser de ayuda, pero no puedo averiguar cómo navegarlo. ¿Cómo sangrar varias líneas rápidamente en vi?
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 desee la parte superior de su bloque con sangría, presione el cursor hacia abajo hasta donde lo necesite y luego escriba >''a
(tenga en cuenta que " a
" puede sustituirse por cualquier nombre de marcador válido). Esto es a veces más fácil que 5>>
o vjjj>
.
Además de las soluciones ofrecidas, me gusta hacer las cosas un párrafo a la vez con >}
Al usar mucho Python, me parece que necesito con frecuencia desplazar bloques en más de una sangría. Puede hacer esto usando 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 >
P.ej. V5j3>
5 líneas 3 veces, lo que V5j3>
12 espacios si usa 4 espacios para sangrías
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
Te permite sangrar tu selección tantas veces como quieras.
El maestro de todos los comandos es
gg=G
Esto sangra todo el archivo!
Y a continuación se muestran 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 y poderosos para sangrar múltiples líneas.
Esta respuesta resume las otras respuestas y comentarios de esta pregunta, y agrega información adicional basada en la documentación de Vim y la wiki de Vim . Por concisión, esta respuesta no distingue entre los comandos específicos de Vi y Vim.
En los comandos a continuación, "volver a sangrar" significa "líneas de sangría según su 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 {
por }
o B
, por ejemplo, =iB
es un comando de sangría de bloque válido. Eche un vistazo a "Sangrar un bloque de código" para ver un buen ejemplo de cómo probar estos comandos.
Además, recuerda que
. Repeat last command
, por lo que los comandos de sangrado pueden repetirse fácil y convenientemente
Reentregar archivos completos
Otra situación común es requerir que la sangría se arregle a través de un archivo fuente:
gg=G Re-indent entire buffer
Puedes extender esta idea a múltiples 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
Ex comandos
Estos son útiles cuando desea sangrar un rango específico de líneas, sin mover el cursor.
:< and :> Given a range, apply indentation e.g.
:4,8> indent lines 4 to 8, inclusive
Sangrar utilizando marcadores
Otro enfoque es a través de markers :
ma Mark top of block to indent as marker ''a''
... mover el cursor a la ubicación final
>''a Indent from marker ''a'' to current location
Variables que rigen la sangría.
Puede establecer estos en su archivo .vimrc .
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 sangría inteligente basada en el tipo de archivo. Intenta agregar esto a tu .vimrc:
if has ("autocmd")
" File type detection. Indent based on filetype. Recommended.
filetype plugin indent on
endif
Referencias
Hay una forma más que aún no se ha mencionado: puede usar el comando de la norm i
para insertar el texto dado al principio 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 una línea con cualquier otro texto, por ejemplo, para sangrar cada línea en un 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 el código Bash / Python / etc con el carácter #:
:1,20norm i#
Para volver a sangrar utilice x en lugar de i . Por ejemplo, para eliminar los primeros 5 caracteres de cada línea:
:%norm 5x
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ó.
La belleza de la interfaz de usuario de vim es que es consistente. Los comandos de edición están formados por el comando y un 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
- } al final del párrafo
- % al siguiente corchete coincidente, ya sea entre paréntesis o el tipo de etiqueta
- entrar a la siguiente línea
- '' x para marcar x donde x es una letra u otra''
- muchos más, incluyendo 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 .
Por lo tanto, para usar vim, debe aprender a mover el cursor y recordar un repertorio de comandos como, por ejemplo, > sangrar (y < para "agotar").
Por lo tanto, para sangrar las líneas desde la posición del cursor hasta la parte superior de la pantalla, haga clic en > H , > G para sangrar en la parte inferior del archivo.
Si, en lugar de escribir > H , escribe d H , está eliminando el mismo bloque de líneas, c H para reemplazarlo, etc.
Algunos movimientos del cursor encajan 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
), al configurar el cursor en el texto de una etiqueta (como en la "i" de <div> e ingresar > % se sangrará hasta la etiqueta de cierre </div>.
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 "ir a un extremo del bloque de líneas que desea sangrar, y luego escribir el comando > y un movimiento al otro extremo del bloque" si la sangría se interpreta como desplazar las líneas, = Si la sangría se interpreta como en impresión bonita.
Me gusta marcar el texto para la sangría:
- vaya al principio de la línea de texto y luego escriba ma (a es la etiqueta del ''m''ark: podría ser cualquier letra)
- vaya a la línea final del texto y escriba mz (de nuevo, z podría ser cualquier letra)
- : ''a,'' z> o: ''a,'' z <sangrará o quedará inactivo (¿es esto una palabra?)
- Voila! el texto se mueve (las líneas vacías permanecen vacías sin espacios)
PD: puede usar la técnica ''a,'' z para marcar un rango para cualquier operación (d, y, s ///, etc.) donde puede usar líneas, números o%
No encontré un método que uso en los comentarios, así que lo compartiré (creo que solo vim):
- Esc para entrar en modo de comando
- Desplácese al primer carácter de la última línea que desea identificar.
- ctrl - v para iniciar la selección de bloque
- Desplácese al primer carácter de la primera línea que desea identificar.
- cambio - i para entrar en el modo de inserción especial
- escriba tantos espacios / pestañas como necesite para sangrar (2 por ejemplo
- Presiona Esc y aparecerán espacios en todas las líneas.
Esto es útil cuando no desea cambiar la configuración de ident / tab en vimrc o recordarlos para cambiarlos mientras edita.
Para dejar de usar, utilizo la misma selección de bloque ctrl - v 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 esto, es muy simple.
edite su archivo .vimrc
en el directorio principal agregue esta línea
set cindent
en el archivo donde desea sangrar correctamente
en modo normal / modo de comando
10== (this will indent 10 lines from the current cursor location )
gg=G (complete file will be properly indented)
Para mí, la solución MacVim (Visual) fue, seleccione con el mouse y presione ">", pero después de poner las siguientes líneas en "~ / .vimrc" ya que 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), ya 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 mucho con "~ / .profile", por lo que la variable de entorno PATH puede ser bastante larga.
Para sangrar cada línea en un tipo de archivo, esc y G = gg
Para sangrar todo el archivo por 4:
esc 4G=G
Presiones de teclas para personas más visuales:
Entrar en modo de comando:
EscaparMuévete al inicio del área para sangrar:
h j k l ↑ ↓ ← →Iniciar un bloque:
vMuévete hasta el final del área para sangrar:
h j k l ↑ ↓ ← →(Opcional) Escriba el número de niveles de sangría que desea
0..9Ejecutar la sangría en el bloque:
>
Supongamos |
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{
que significa " sangría ( >
) dentro de ( i
) bloquear ( {
) " y obtener:
int main() {
line1
line2|
line3
}
Ahora supongamos que las líneas son contiguas pero 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 >
. O incluso más rápido puedes hacer >2j
para obtener:
do
line2|
line3
line4
done
Tenga en cuenta que >Nj
significa sangría desde la línea actual hasta las N
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 correcto de N
Para guardar segundos valiosos, puede activar la opción de número relativo con set relativenumber
(disponible desde la versión 7.3 de Vim).
Supongamos que utiliza 2 espacios para sangrar su código. Tipo:
:set shiftwidth=2
- Escriba v (para entrar en el modo de edición de bloque visual)
- Mueva el cursor con las teclas de flecha (o con h / j / k / l ) para resaltar las líneas que desea sangrar o no.
Entonces:
- Escriba > para sangrar una vez (2 espacios).
- Escriba 2 > para sangrar dos veces (4 espacios).
- Tipo 3 > a sangrar tres veces (6 espacios).
- ...
- Escribe < a unindent una vez (2 espacios).
- Escriba 2 < a unindent dos veces (4 espacios).
- Escriba 3 < a tres veces unindent (6 espacios).
- ...
Tienes la idea
( Las líneas vacías no se sangran, lo que creo que es agradable ) .
Encontré la respuesta en la documentación de (g) vim para sangrar bloques:
:help visual-block
/indent
Si desea dar un recuento al comando, haga esto justo antes de escribir el carácter del operador: "v {move-around} 3>" (mueva las líneas 3 guiones hacia la derecha).
También intente esto para la sangría C-indenting , do :help =
para más información:
={
Eso auto-sangrará el bloque de código actual en el que estás.
O solo:
==
para auto-sangrar la línea actual.
Una forma rápida de hacer esto usando VISUAL MODE
usa el mismo proceso que comentar un bloque de código.
Esto es útil si prefiere no cambiar su shiftwidth
o usar directivas set
y es lo suficientemente flexible como para trabajar con TABS o ESPACIOS o cualquier otro personaje.
- Posiciona el cursor al principio del bloque.
- v para cambiar a
-- VISUAL MODE --
- Selecciona el texto a sangrar.
- Tipo
:
para cambiar al prompt Reemplazo con 3 espacios delanteros:
:''<,''>s/^/ /g
O reemplazando con pestañas iniciales:
:''<,''>s/^//t/g
Breve explicacion:
''<,''>
- Dentro del rango seleccionado visualmentes/^/ /g
: inserte 3 espacios al principio de cada línea dentro del rango completo(o)
s/^//t/g
- InsertarTab
al principio de cada línea dentro del rango completo
Una gran selección sería:
gg=G
Es realmente rápido, y todo se sangra ;-)
Usa el comando > . Para sangrar 5 líneas, 5 >> . Para marcar un bloque de líneas y sangrarlo, V j j > sangrar 3 líneas (solo vim). Para sangrar un bloque de llaves, coloque el cursor en una de las llaves y use > % .
Si está copiando bloques de texto y necesita alinear la sangría de un bloque en su nueva ubicación, use ] p en lugar de solo p . Esto alinea el bloque pegado con el texto circundante.
Además, la configuración de shiftwidth
permite controlar cuántos espacios se deben sangrar.
Yo uso la selección visual en modo bloque:
- Vaya al frente del bloque para moverse (en la parte superior o inferior).
- Presione ctrl-v para entrar en el modo de bloqueo visual.
- Navega 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 un uni-tasker. Funciona:
- En medio de líneas.
- Para insertar cualquier cadena en todas las lineas.
- Para cambiar una columna (usa c en lugar de I).
- tirar, borrar, sustituir, etc ...
hacer esto
$vi .vimrc
y agrega esta linea
autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent
esto es solo para el archivo cpp, puede hacer esto para otro tipo de archivo también solo modificando el tipo de archivo ...
>}
o >{
sangrar desde la línea actual hasta el siguiente párrafo
<}
o <{
misma sangría
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 de comando.
gg=G
sangrará el archivo completo de arriba a abajo.
:help left
En ex mode
puede usar :left
o :le
para alinear líneas una cantidad específica. Específicamente :left
a la izquierda alineará a la izquierda las líneas en el [rango]. Establece la sangría en las líneas a [sangría] (por defecto 0).
:%le3
o :%le 3
o :%left3
o :%left 3
alinearán todo el archivo rellenando con tres espacios.
:5,7 le 3
alineará las líneas 5 a 7 rellenándolas con 3 espacios.
:le
sin ningún valor o :le 0
se alineará a la izquierda con un relleno de 0.
Esto funciona en vim
y gvim
.
:line_num_start,line_num_end>
p.ej
14,21> shifts line number 14 to 21 to one tab
Incrementa el símbolo ''>'' para más pestañas
p.ej
14,21>>> for 3 tabs