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.

David.Chu.ca
fuente
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.

D.Shawley
fuente
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.

ʞɔıu
fuente
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.

Hank Gay
fuente
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
serup
fuente
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.

Jake Sellers
fuente
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.

anish
fuente
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.

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

Esto me funcionó:

:set tabstop=2 shiftwidth=2 expandtab | retab
Willem van Ketwich
fuente
4

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

trabajará.

Shekar
fuente
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.

Adam Eberlin
fuente
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
qwr
fuente
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