Sostituisci le schede con spazi in vim


358

Vorrei convertire la scheda in spazi in gVim. Ho aggiunto la seguente riga al mio _vimrc:

set tabstop=2

Funziona per fermarsi in due spazi ma sembra ancora che sia inserito un tasto tab (ho provato a usare il tasto h per contare gli spazi in seguito).

Non sono sicuro di cosa dovrei fare per fare in modo che gVim converta le schede in spazi?


1
Personalmente, troverei tabstop = 2 un trattino troppo piccolo; Uso ts = 4 e capisco perché le persone (come il team del kernel di Linux) usano ts = 8 (e non usano expaptab - lo faccio).
Jonathan Leffler,

4
C'è un modo per convertire gli spazi in schede all'interno di VIM?
Cwd

2
@cwd sostituire gli spazi con il carattere di tabulazione ( ^Iche proviene da Ctrl-vallora Tab) funzionerebbe, ad esempio se le tue schede attuali sono 4 spazi::%s/ /^I/g
Indra Ginanjar,

Risposte:


381

IIRC, qualcosa del tipo:

set tabstop=2 shiftwidth=2 expandtab

dovrebbe fare il trucco. Se hai già delle schede, seguila con un bel RE globale per sostituirle con doppi spazi.


25
Oops, questo è ":%! Expand -t2"
Paul Tomblin,

369
oppure puoi semplicemente usare: retab
rampion

cosa succede se voglio salvarlo con spazi? in questo momento quando: wq e apro di nuovo il file sono tornato alle schede
Gorkem Yurtseven

1
@Gorkem ha inserito questi comandi nel tuo .vimrc, in modo che vim utilizzi queste impostazioni in ogni sessione
Cracovia

5
Cosa significa tutto ciò, è ben spiegato sul wiki di Vim .
Serge Stroobandt,

825

Dopo aver attivato la scheda di espansione secondo le altre risposte, il modo estremamente conveniente per convertire i file esistenti in base alle nuove impostazioni è:

:retab

Funzionerà sul buffer corrente.


ma come possiamo fare in modo che il retab chieda conferma di ogni occorrenza di TAB?
Oculus Dexter,

8
Ed essendo Vim, funziona anche su regioni visivamente selezionate :)
Andy,

2
Grazie per insegnarmi una cosa nuova. Ho usato il noioso :%s/\t/ /gper anni prima di vedere il tuo commento.
Tai Le,

Puoi anche fare :args retab | wqualcosa per tutti i file aperti sulla riga di comando, ad es vim *.txt.
JakeD

Qualcuno sa quale versione di vim ha: retab? Il mio 7.3.322 no.
Bitmaker,

114

Provare

set expandtab

per le schede soft.

Per correggere le schede preesistenti:

:%s/\t/  /g

Ho usato due spazi poiché hai già impostato il tabstop su 2 spazi.


5
Tale correzione inserirà due spazi in cui è richiesto solo uno.
Jonathan Leffler,

8
invece di fare la sostituzione, puoi fare ciò che Nick ha suggerito sopra, ovvero retab. In questo modo, tutte le schede esistenti verranno riqualificate come il numero di spazi impostati nel tabstop.
Gowri,

Suggerimento fantastico! Vim mi ha mostrato un file perfettamente identificato mentre cat (linux cmd) ha mostrato un'identificazione irregolare. Ho appena cambiato i 2 spazi in 4 mentre uso in Vim set ts = 4.
karlphillip,

60

Questo ha funzionato per me:

puoi vedere le schede prima facendo questo:

:set list

quindi per rendere possibile la sostituzione delle schede, procedere come segue:

:set expandtab

poi

:retab

ora tutte le schede sono state sostituite con spazi, quindi puoi tornare alla visualizzazione normale in questo modo:

:set nolist

1
:set listè semplicemente bellissimo.
Amir A. Shabani,

44

gg=G reindirizzerà l'intero file e rimuoverà la maggior parte se non tutte le schede che ottengo nei file dai colleghi.


1
sostituisce le schede con spazi?
likejudo

1
Eccezionale! Ha funzionato anche per me.
Nawaz,

1
Puoi spiegare cosa fa gg = G? questo ha fatto esattamente quello che stavo cercando. Ho HTML su sublime e quando l'ho incollato in VIM, è stato follemente rientrato. Questo ora sembra pulito.
jes516

3
@ jes516 ggsposta il cursore all'inizio del buffer. =è formato e accetta un comando di movimento. Gsposta il cursore alla fine del buffer, quindi indica a Vim di formattare dall'inizio alla fine del buffer corrente.
Jake Sellers,

40

Aggiungi le seguenti righe al tuo .vimrc

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

Apri un file in vim e premi F2 Le schede verranno convertite in 4 spazi e il file verrà salvato automaticamente.


Probabilmente vale la pena notare che qchiuderà anche il buffer corrente del file. Questo può o non può essere desiderato.
Willem van Ketwich,

14

Se vuoi mantenere il tuo \tuguale a 8 spazi, considera l'impostazione:

   set softtabstop=2 tabstop=8 shiftwidth=2

Questo ti darà due spazi per <TAB>stampa, ma l'attuale \tnel tuo codice sarà comunque visualizzato come 8 caratteri.


Grazie per aver menzionato softtabstopuna delle caratteristiche killer, credo.
Martin Ueding,


4

prima cerca le schede nel tuo file: / ^ I: imposta expandtab: retab

funzionerà.


la prima parte potrebbe spiegarlo, per favore
serup

3

Questo articolo ha un eccellente script vimrc per la gestione di tabs + spazi e la conversione tra di loro.

Questi comandi sono forniti:

Space2Tab Converti gli spazi in schede, solo nei rientri.

Tab2Space Converti le schede in spazi, solo nei rientri.

RetabIndent Esegui Space2Tab (se è impostato 'expandtab') o Tab2Space (altrimenti).

Ogni comando accetta un argomento che specifica il numero di spazi in una colonna della scheda. Per impostazione predefinita, viene utilizzata l'impostazione "tabstop".

Fonte: 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>)

Questo mi ha aiutato un po 'di più rispetto alle risposte qui quando ho iniziato a cercare una soluzione.


3

expandè un'utilità unix per convertire le schede in spazi. Se non vuoi fare setnulla in vim, puoi usare un comando shell da vim:

:!% expand -t8

1
se vuoi solo espandere una parte del codice: prima seleziona quella parte in modalità visiva, quindi premi :. Ora mostra la riga di comando di vim :'<,'>. Quindi immettere !expand -t4per tab per 4 spazio. (La riga di comando risultante è simile :'<,'>!expand -t4)
Penghe Geng,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.