it-swarm.it

Schede e spazi in vim

Come posso impedire a vim di sostituire gli spazi con le schede quando è attivo l'indentazione automatica?

Un esempio: se ho due schede e 7 spazi all'inizio della riga e tabstop=3 e premo Invio, la riga successiva ha quattro schede e 1 spazio all'inizio, ma non voglio che ...

71
RQ

È forse una buona idea non usare affatto le schede.

:set expandtab

Se vuoi sostituire tutte le schede del tuo file in 3 spazi (che saranno abbastanza simili a tabstop=3):

:%s/^I/   /

(dove ^I è il TAB personaggio)

Dalla guida in linea VIM:

'tabstop' 'ts'      number  (default 8)
        local to buffer
Number of spaces that a <Tab> in the file counts for.  Also see
|:retab| command, and 'softtabstop' option.

Note: Setting 'tabstop' to any other value than 8 can make your file
appear wrong in many places (e.g., when printing it).

There are four main ways to use tabs in Vim:
1. Always keep 'tabstop' at 8, set 'softtabstop' and 'shiftwidth' to 4
   (or 3 or whatever you prefer) and use 'noexpandtab'.  Then Vim
   will use a mix of tabs and spaces, but typing <Tab> and <BS> will
   behave like a tab appears every 4 (or 3) characters.
2. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use
   'expandtab'.  This way you will always insert spaces.  The
   formatting will never be messed up when 'tabstop' is changed.
3. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use a
   |modeline| to set these values when editing the file again.  Only
   works when using Vim to edit the file.
4. Always set 'tabstop' and 'shiftwidth' to the same value, and
   'noexpandtab'.  This should then work (for initial indents only)
   for any tabstop setting that people use.  It might be Nice to have
   tabs after the first non-blank inserted as spaces if you do this
   though.  Otherwise aligned comments will be wrong when 'tabstop' is
   changed.
78
user11211

Puoi convertire tutti i TAB in SPACE

:set et
:ret!

o converti tutti SPACE in TAB

:set et!
:ret!
42
kev

tutto quello che voglio è che la riga autoindentata abbia esattamente gli stessi caratteri di rientro della riga precedente.

:help copyindent

'copyindent''ci'booleano (impostazione predefinita disattivata); da locale a buffer; {non in Vi}

Copia la struttura del rientro delle righe esistenti quando si autoindentifica una nuova riga. Normalmente il nuovo trattino viene ricostruito da una serie di schede seguite da spazi come richiesto (a meno che 'expandtab' sia abilitato, nel qual caso vengono usati solo spazi). Abilitando questa opzione, la nuova riga copia tutti i caratteri utilizzati per il rientro sulla riga esistente. Se il nuovo rientro è maggiore rispetto alla riga esistente, lo spazio rimanente viene riempito nel modo normale.

NOTA: 'copyindent' viene resettato quando 'compatibile' è impostato.
Vedi anche 'preservindent' .

:help preserveindent

'preservindent''pi'booleano (impostazione predefinita disattivata); da locale a buffer; {non in Vi}

Quando si modifica il rientro della riga corrente, conservare il più possibile la struttura del rientro. Normalmente il rientro è sostituito da una serie di schede seguite da spazi come richiesto (a meno che 'expandtab' sia abilitato, nel qual caso vengono usati solo spazi). Abilitare questa opzione significa che il rientro manterrà il maggior numero possibile di caratteri esistenti per il rientro e aggiungerà solo schede o spazi aggiuntivi come richiesto.

NOTA: quando si utilizza ">>" più volte, il rientro risultante è un mix di schede e spazi. Potrebbe non piacerti.
NOTA: 'preservindent' viene resettato quando 'compatibile' è impostato.
Vedi anche 'copyindent' .
Usa: retab per pulire gli spazi bianchi.

41

Ecco parte del mio .vimrc:

set autoindent
set expandtab
set softtabstop=4
set shiftwidth=4

Questo funziona bene per me perché non voglio assolutamente schede nel mio codice sorgente. Dalla tua domanda sembra che tu voglia mantenere due schede e sette spazi nella riga successiva, e non sono sicuro che ci sia un modo per insegnare a Vim ad adattarsi a quello stile.

25
Greg Hewgill

Forse il fondo di questo può aiutarti?

Standard vi interpreta letteralmente il tasto tab, ma ci sono alternative popolari derivate da vi che sono più intelligenti, come vim. Per far sì che vim interpreti tab come un comando `` indent '' anziché come comando insert-a-tab, procedere come segue:

set softtabstop=2
1
svrist

Se si desidera sostituire tutte le schede con spazi basati sull'impostazione di 'ts', è possibile utilizzare: retab. Può anche fare il contrario.

1
graywh