È possibile convertire le schede in spazi, mantenendo l'allineamento del testo?
La semplice sostituzione funziona solo in modo utile quando non ci sono personaggi principali.
È possibile convertire le schede in spazi, mantenendo l'allineamento del testo?
La semplice sostituzione funziona solo in modo utile quando non ci sono personaggi principali.
Risposte:
Puoi usare il :retab
comando A partire dal
:help :retab
Sostituisci tutte le sequenze di spazi bianchi contenenti a
<Tab>
con nuove stringhe di spazi bianchi utilizzando il nuovo valore tabstop fornito. Se non si specifica una nuova dimensione tabstop o è zero, Vim utilizza il valore corrente di'tabstop'
. [...] Con'expandtab'
on, Vim sostituisce tutte le schede con il numero appropriato di spazi.
Si noti che il comando accetta un intervallo, quindi è possibile effettuare una selezione visiva e quindi solo :retab
le linee selezionate.
Puoi usare :retab
, come detto, tuttavia, questo cambierà tutte le schede in spazi, non solo le schede all'inizio della riga
Quindi questo (dove ⇥
è un carattere di tabulazione):
if :; do
⇥echo "⇥hello"
end
viene modificato in (dov'è ␣
un personaggio spaziale):
if :; do
␣␣echo "␣␣hello"
end
Ciò può produrre effetti collaterali imprevisti in alcuni scenari ed è ancora più un problema quando si cambiano gli spazi in schede!
Quindi, ho scritto una piccola funzione per modificare solo le schede / spazi all'inizio della riga:
" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
let l:spaces = repeat(' ', &tabstop)
" Replace tabs with spaces
if a:expandtab
silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
" Replace spaces with tabs
else
silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
endif
endfun
Con questa versione, è necessario specificare manualmente expandtab
nella chiamata di funzione (es. :call Retab(1)
Per cambiare le schede in spazi), ma è anche possibile modificarlo per assumere il valore corrente di &expandtab
(come già fa con &tabstop
) proprio come :retab
fa. (Preferisco specificarlo manualmente).
a
in if a:expandtab
?
set expandtab
nel tuo .vimrc e poi autocmd BufWritePre * :call Retab(&expandtab)
- il rientro sarà cambiato in tabs, invece che in spazi.
Vim fornisce un !retab
comando che sostituirà tutte le sequenze di <Tab>
con nuove stringhe di spazi bianchi usando il nuovo valore tabstop (ad es. :set tabstop=2
) Dato, ma tutte le schede all'interno delle stringhe possono essere modificate (ad es. In un programma C, dovresti usare \t
per evitarlo)!
Quindi in alternativa puoi cambiare tutte le schede in spazi usando il seguente comando:
:%s/\t/ /g
o come suggerito da @Shahbaz :
:%s/^\t\+/ g
Quindi vengono convertite solo le schede utilizzate nel rientro.
Spiegazione:
%
rappresenta l'intero buffer / file ( :help :%
)s
sta per substitute ( :help sub-replace-special
)\t
o ^I
sta per tab
- usa tutti gli spazi di cui hai bisogno per una schedag
- sta per globale e convertirà più ricorrenze di schede nella stessa rigaPoi per correggere indentazione del tutto il file, si può provare: gg=G. Verifica: rientro del codice con rientro errato per ulteriori dettagli.
Per utilizzare gli spazi per impostazione predefinita anziché le schede, è necessario aggiungere le seguenti impostazioni al .vimrc
file:
set tabstop=2 " (ts) width (in spaces) that a <tab> is displayed as
set expandtab " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2 " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)
La soluzione alternativa è usare tidy
Relazionato:
%s/^\t\+/ g
modo che vengano convertite solo le schede utilizzate nel rientro. Inoltre, gg=G
potrebbe essere catastrofico con linguaggi come Python.
Prova a usare:
expand -t 4 input_filename output_filename
expand
è uno strumento da riga di comando per convertire le schede in spazi, che è possibile eseguire da una shell o con :!expand
.
È in POSIX quindi dovrebbe essere disponibile sulla maggior parte dei sistemi. unexpand
farà il contrario, a proposito.
expand
?
:%!expand -t 4
all'interno di Vim. Meglio ancora, potresti anche usare l'attuale opzione di larghezza di spostamento: :exe '%!expand -t ' . &shiftwidth
Per completezza, =
potrebbe anche essere utilizzato per correggere i rientri, dopo aver specificato che le schede vengono sostituite con spazi. In modalità normale, puoi farlo digitando :set expandtab
. Quindi =
potrebbe essere utilizzato in due modi:
=
correggeva i rientri dei blocchi di codice selezionati.gg=G
aggiustava l'intero file, dove gg
sposta il cursore all'inizio del file, quindi =
viene applicato e G
sposta il cursore alla fine del file.Riferimento: link
:h vim-faq
e cerca/tab characters
. Il tag difficile da memorizzare è:h faq-14.16
.