Reemplazar pestañas con espacios en vim


358

Me gustaría convertir la pestaña a espacios en gVim. Agregué la siguiente línea a mi _vimrc:

set tabstop=2

Funciona para detenerse en dos espacios, pero todavía parece que se ha insertado una tecla de tabulación (intenté usar la tecla h para contar espacios después).

No estoy seguro de qué debo hacer para que gVim convierta pestañas en espacios.


1
Personalmente, encontraría tabstop = 2 una sangría demasiado pequeña; Uso ts = 4, y entiendo por qué las personas (como el equipo del kernel de Linux) usan ts = 8 (y no usan expandtab, yo sí).
— Jonathan Leffler el

44
¿Hay alguna forma de convertir espacios en pestañas dentro de vim?
— cwd

2
@cwd reemplazar los espacios con caracteres de tabulación ( ^Ique vienen de Ctrl-ventonces Tab) funcionaría, por ejemplo, si sus pestañas actuales son 4 espacios::%s/ /^I/g
— Indra Ginanjar

Respuestas:


381

IIRC, algo así como:

set tabstop=2 shiftwidth=2 expandtab

debería hacer el truco. Si ya tiene pestañas, siga con un buen RE global para reemplazarlos con espacios dobles.


25
Vaya, eso es ":%! Expand -t2"
— Paul Tomblin

369
o simplemente puede usar: retab
— rampion

¿Qué pasa si quiero guardarlo con espacios? ahora mismo cuando: wq y abro el archivo de nuevo, vuelvo a las pestañas
— Gorkem Yurtseven

1
@Gorkem puso estos comandos en su .vimrc, para que vim use esa configuración en cada sesión
— Krakkos

55
Lo que todo esto significa se explica muy bien en la wiki de Vim .
— Serge Stroobandt

825

Una vez que haya expandido la pestaña según las otras respuestas, la forma extremadamente conveniente de convertir archivos existentes de acuerdo con su nueva configuración es:

:retab

Funcionará en el búfer actual.


pero, ¿cómo podemos hacer que retab solicite la confirmación de cada aparición de TAB?
— Oculus Dexter

8
Y siendo Vim, también funciona en regiones visualmente seleccionadas :)
— Andy

2
Gracias por enseñarme una cosa nueva. He usado el tedioso :%s/\t/ /gdurante años antes de ver tu comentario.
— Tai Le

Incluso puede hacer :args retab | wque hacer para todos los archivos abiertos en la línea de comandos, por ejemplo, vim *.txt.
— JakeD

¿Alguien sabe qué versión de vim tiene: retab? Mi 7.3.322 no.
— bitmaker

114

Tratar

set expandtab

para pestañas suaves.

Para arreglar pestañas preexistentes:

:%s/\t/  /g

Usé dos espacios ya que ya configuraste tu tabulación en 2 espacios.


55
Esa reparación insertará dos espacios donde solo se requiere uno.
— Jonathan Leffler el

8
en lugar de hacer la sustitución, puedes hacer lo que Nick sugirió anteriormente, es decir, retab. Eso retomará todas tus pestañas existentes como el número de espacios establecidos en tu pestaña.
— Gowri

Consejo impresionante! Vim me mostró un archivo perfectamente ideado, mientras que cat (linux cmd) mostró una ideación irregular. Acabo de cambiar los 2 espacios a 4 como uso en Vim set ts = 4.
— karlphillip el

60

Esto funcionó para mí:

puedes ver pestañas con hacer esto primero:

:set list

luego para que sea posible reemplazar las pestañas, haga esto:

:set expandtab

entonces

:retab

ahora todas las pestañas han sido reemplazadas por espacios que luego puede volver a la visualización normal de esta manera:

:set nolist

1
:set listes simplemente hermoso
— Amir A. Shabani

44

gg=G reindentará todo el archivo y eliminará la mayoría, si no todas, las pestañas que obtengo en los archivos de mis compañeros de trabajo.


1
¿reemplaza las pestañas con espacios?
— likejudo

1
¡Increíble! A mi también me sirvió.
— Nawaz

1
¿Puedes explicar qué hace gg = G? Esto hizo exactamente lo que estaba buscando. Tengo html en sublime y cuando lo pegué en vim, estaba locamente sangrado. Esto ahora se ve limpio.
— jes516

3
@ jes516 ggmueve el cursor al comienzo del búfer. =es formato, y toma un comando de movimiento. Gmueve el cursor al final del búfer, por lo que le dice a vim que formatee desde el principio hasta el final del búfer actual.
— Jake Sellers

40

Agregue las siguientes líneas a su .vimrc

set expandtab
set tabstop=4
set shiftwidth=4
map <F2> :retab <CR> :wq! <CR>

Abra un archivo en vim y presione F2. Las pestañas se convertirán a 4 espacios y el archivo se guardará automáticamente.


Probablemente valga la pena señalar que qtambién cerrará el búfer actual del archivo. Esto puede o no ser deseado.
— Willem van Ketwich

14

Si desea mantener su \tigual a 8 espacios, considere configurar:

   set softtabstop=2 tabstop=8 shiftwidth=2

Esto le dará dos espacios por <TAB>impresión, pero \tel código real de su código seguirá viéndose como 8 caracteres.


Gracias por mencionar softtabstop, una de las características más importantes, creo.
— Martin Ueding


4

primero busque pestañas en su archivo: / ^ I: set expandtab: retab

trabajará.


la primera parte, ¿podría explicar eso
— Serup

3

Este artículo tiene un excelente script vimrc para manejar pestañas + espacios y convertirlos entre ellos.

Se proporcionan estos comandos:

Space2Tab Convierte espacios en pestañas, solo en sangría.

Tab2Space Convierte pestañas en espacios, solo en sangría.

RetabIndent Ejecutar Space2Tab (si se establece 'expandtab'), o Tab2Space (de lo contrario).

Cada comando acepta un argumento que especifica el número de espacios en una columna de tabulación. De forma predeterminada, se utiliza la configuración de "tabulación".

Fuente: http://vim.wikia.com/wiki/Super_retab#Script

" Return indent (all whitespace at start of a line), converted from
" tabs to spaces if what = 1, or from spaces to tabs otherwise.
" When converting to tabs, result has no redundant spaces.
function! Indenting(indent, what, cols)
  let spccol = repeat(' ', a:cols)
  let result = substitute(a:indent, spccol, '\t', 'g')
  let result = substitute(result, ' \+\ze\t', '', 'g')
  if a:what == 1
    let result = substitute(result, '\t', spccol, 'g')
  endif
  return result
endfunction

" Convert whitespace used for indenting (before first non-whitespace).
" what = 0 (convert spaces to tabs), or 1 (convert tabs to spaces).
" cols = string with number of columns per tab, or empty to use 'tabstop'.
" The cursor position is restored, but the cursor will be in a different
" column when the number of characters in the indent of the line is changed.
function! IndentConvert(line1, line2, what, cols)
  let savepos = getpos('.')
  let cols = empty(a:cols) ? &tabstop : a:cols
  execute a:line1 . ',' . a:line2 . 's/^\s\+/\=Indenting(submatch(0), a:what, cols)/e'
  call histdel('search', -1)
  call setpos('.', savepos)
endfunction

command! -nargs=? -range=% Space2Tab call IndentConvert(<line1>,<line2>,0,<q-args>)
command! -nargs=? -range=% Tab2Space call IndentConvert(<line1>,<line2>,1,<q-args>)
command! -nargs=? -range=% RetabIndent call IndentConvert(<line1>,<line2>,&et,<q-args>)

Esto me ayudó un poco más que las respuestas aquí cuando busqué una solución por primera vez.


3

expandes una utilidad de Unix para convertir pestañas en espacios. Si no desea setnada en vim, puede usar un comando de shell de vim:

:!% expand -t8

1
si solo desea expandir una parte del código: primero seleccione esa parte en modo visual, luego presione :. Ahora se muestra la línea de comando vim :'<,'>. Luego ingrese la !expand -t4pestaña a 4 espacios. (La línea de comando resultante es como :'<,'>!expand -t4)
— Penghe Geng
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.