Debería ser trivial, e incluso podría estar en la ayuda, pero no puedo entender cómo navegarlo. ¿Cómo sangro varias líneas rápidamente en vi?
Debería ser trivial, e incluso podría estar en la ayuda, pero no puedo entender cómo navegarlo. ¿Cómo sangro varias líneas rápidamente en vi?
Respuestas:
Usa el >comando. Para sangrar cinco líneas, 5>>. Para marcar un bloque de líneas y sangrarlo, Vjj>sangra tres 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 uso del bloque >iB.
Si está copiando bloques de texto y necesita alinear la sangría de un bloque en su nueva ubicación, use en ]plugar de solo p. Esto alinea el bloque pegado con el texto circundante.
Además, la shiftwidth
configuración le permite controlar cuántos espacios para sangrar.
shiftwidth
configuración para saber cómo cambiar eso.
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 wiki de Vim . Para ser concisos, esta respuesta no distingue entre los comandos específicos de Vi y Vim.
En los comandos a continuación, "re-sangría" significa "líneas de sangría de acuerdo con su configuración de sangría ". shiftwidth
es la variable primaria 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
, por ejemplo, =iB
es un comando de sangría de bloque válido. Eche un vistazo a "Sangría un bloque de código" para ver 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.
Re-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 extender 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 three 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 el cursor.
:< and :> Given a range, apply indentation e.g.
:4,8> indent lines 4 to 8, inclusive
Sangría utilizando marcadores
Otro enfoque es a través de marcadores :
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 gobiernan la sangría
Puede configurarlos 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 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
>}
. Muchas gracias
Una gran selección sería:
gg=G
Es realmente rápido, y todo se sangra ;-)
gg=G
simplemente coloca cada línea a partir de la posición 1. Se han eliminado todos los espacios en blanco. ¿Hay algo más específico para XML?
set cindent
debería estar en vimrc o debería ejecutarse :set cindent
antes de ejecutar ese comando
Pruebe también esto para la sangría de sangría en C. Haz :help =
para más información:
={
Eso sangrará automáticamente el bloque de código actual en el que se encuentra.
O solo:
==
para sangrar automáticamente la línea actual.
Pulsaciones de teclas para personas más visuales:
Ingrese al modo de comando:
Escape
Muévase al comienzo del área para sangrar:
hjkl↑↓←→
Comience un bloque:
v
Muévase hasta el final del área para sangrar:
hjkl↑↓←→
(Opcional) Escriba el número de niveles de sangría que desee
0..9
Ejecute la sangría en el bloque:
>
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 pero potentes para sangrar varias líneas.
vim
, no vi
.
vim
que está vinculado 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 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 " a
" se puede sustituir por cualquier nombre de marcador válido). Esto a veces es más fácil que 5>>
o vjjj>
.
Ir al inicio del texto.
Además de las soluciones ofrecidas, me gusta hacer las cosas un párrafo a la vez con >}
Cuando selecciona un bloque y lo 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
Entonces:
Tienes 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, haga esto 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 su consistencia. Los comandos de edición están compuestos por el comando y un movimiento del cursor. Los movimientos del cursor son siempre los mismos:
'
.Entonces, para usar vim, debe aprender a mover el cursor y recordar un repertorio de comandos como, por ejemplo, >sangrar (y <"saliente").
Por lo tanto, para sangrar las líneas desde la posición del cursor hasta la parte superior de la pantalla >H, >Gsangra hasta la parte inferior del archivo.
Si, en lugar de escribir >H, escribe , dHestá eliminando el mismo bloque de líneas, cHpara 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 la "i" de <div> y al ingresar >%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 sangría se interpreta como desplazamiento de las líneas, =si sangría se interpreta como en bonita impresión.
Hacer esto:
$vi .vimrc
Y agregue esta línea:
autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent
Esto es solo para un archivo cpp. Puede hacer esto para otro tipo de archivo, también simplemente modificando el tipo de archivo ...
Puede usar el norm i
comando 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 tiene que 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, sangrar cada línea en un archivo con cinco 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 el uso en xlugar de i. Por ejemplo, para eliminar los primeros 5 caracteres de cada línea:
:%norm 5x
Una forma rápida de hacer esto usando VISUAL MODE
el mismo proceso que comentar un bloque de código.
Esto es útil si prefiere no cambiar sus directivas shiftwidth
o utilizar ninguna set
directiva y es lo suficientemente flexible como para trabajar con TABS o SPACES o cualquier otro personaje.
-- VISUAL MODE --
:
para cambiar a la solicitudSustitución por 3 espacios principales:
:'<,'>s/^/ /g
O reemplazando con pestañas iniciales:
:'<,'>s/^/\t/g
Breve explicacion:
'<,'>
- Dentro del rango visualmente seleccionado
s/^/ /g
- Inserte 3 espacios al comienzo de cada línea dentro de todo el rango
(o)
s/^/\t/g
- Insertar Tab
al principio de cada línea dentro de todo el rango
Me gusta marcar texto para sangrar:
PD: puede usar la :'a,'ztécnica para marcar un rango para cualquier operación (d, y, s ///, etc.) donde puede usar líneas, números o %.
:help left
En ex mode
puede usar :left
o :le
para alinear líneas una cantidad especificada. Específicamente, :left
se líneas Alinear a la izquierda en la [rango]. Establece la sangría en las líneas en [sangría] (valor predeterminado 0).
:%le3
o :%le 3
o :%left3
o:%left 3
alineará todo el archivo rellenando con tres espacios.
:5,7 le 3
alineará las líneas 5 a 7 rellenándolas con tres espacios.
:le
sin ningún valor o :le 0
se alineará con un relleno de 0.
Esto funciona en Vim y gVim.
:'<,'>le4
insertar los espacios. ¡Gracias!
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), 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 mucho con "~ / .profile", por lo que la variable de entorno PATH puede ser bastante larga.
5==
sangrará cinco líneas desde la posición actual del cursor.
Entonces puede escribir cualquier número antes ==
. Sangrará el número de líneas. Esto está en modo comando.
gg=G
sangrará todo el archivo de arriba a abajo.
No encontré un método que utilizo en los comentarios, así que lo compartiré (creo que solo Vim):
Esto es útil cuando no desea cambiar las configuraciones de sangría / tabulación vimrc
o recordarlas para cambiarlas durante la edición.
Para eliminar la sangría, uso el mismo Ctrl+ Vbloque de selección 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:
.vimrc
archivo en el directorio de inicio.Agrega esta línea
set cindent
en su archivo donde desea sangrar correctamente.
En modo normal / comando escriba
10== (This will indent 10 lines from the current cursor location)
gg=G (Complete file will be properly indented)
:line_num_start,line_num_end>
Por ejemplo,
14,21> shifts line number 14 to 21 to one tab
Aumente el símbolo '>' para más pestañas.
Por ejemplo,
14,21>>> for three tabs
:set number
para alternar los números de línea (están desactivados de forma predeterminada) o poner set number
en su vimrc.
Usando 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>
Por ejemplo, V5j3>
sangrará cinco líneas tres veces, que son 12 espacios si usa cuatro espacios para sangrías.
Opción 1: sangra un bloque de código en vi a tres espacios con el modo Visual Block:
Seleccione el bloque de código que desea sangrar. Haga esto usando Ctrl+Vel modo normal y haciendo flechas 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 tres espacios, escriba le 3
y presione Intro. Esto es lo que aparece::'<,'>le 3
El texto seleccionado se sangra inmediatamente a tres espacios.
Opción 2: sangra un bloque de código en vi a tres espacios con el modo Visual Line:
Estar en modo normal y presionar las siguientes teclas:
Vjjjj:le 3
Interpretación de lo que hiciste:
V
significa comenzar a seleccionar texto.
jjjj
flechas hacia abajo cuatro líneas, resaltando cuatro líneas.
:
le dice a vi que ingresará una instrucción para el texto resaltado.
le 3
significa sangrar texto resaltado tres líneas.
El código seleccionado se aumenta o disminuye inmediatamente a tres espacios de sangría.
Opción 3: use el modo Bloque visual y el modo de inserción especial para aumentar la sangría:
En modo normal, presione las siguientes teclas:
Ctrl+V
jjjj
(presione la barra espaciadora cinco veces)
Esc Shift+i
Todo el texto resaltado tiene una sangría adicional de cinco espacios.
Yo uso la selección visual en modo bloque:
I
( Shift+ I) para ingresar al modo de inserción.Esto no es uni-tasker. Funciona:
c
lugar de I
).vim-prettier
lugar del motor de sangría predeterminado). De >
lo contrario, el uso ralentizará el formato realizado por Prettier.
Para un bloque de código, {}: =+%
Para una línea seleccionada: Shift+ vseleccione usando las teclas 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 .
Para sangrar todo el archivo por cuatro:
esc 4G=G
Fuente: https://www.fir3net.com/UNIX/General/how-do-i-tab-multiple-lines-within-vi.html