Tasto Tab == 4 spazi e rientro automatico dopo parentesi graffe in Vim


1265

Come faccio a fare in modo che vi - Vim non usi mai le tabulazioni (conversione degli spazi in tabulazioni, cattivo!), Rende il tasto tab == 4 spazi e rientra automaticamente il codice dopo i blocchi di parentesi graffe come Emacs ?

Inoltre, come posso salvare queste impostazioni in modo da non doverle più inserire?

Ho visto altre domande relative a questo, ma sembra sempre essere un po 'fuori da quello che voglio.


Risposte:


1882

Come è stato sottolineato in un paio di risposte di seguito, il metodo preferito ora NON è utilizzare smartindent, ma invece utilizzare quanto segue (nel tuo .vimrc ):

filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab

Nel tuo file .vimrc :

set smartindent
set tabstop=4
set shiftwidth=4
set expandtab

I file della guida richiedono un po 'di tempo per abituarsi, ma più leggi, meglio Vim ottiene:

:help smartindent

Ancora meglio, puoi incorporare queste impostazioni nel tuo sorgente per la portabilità:

:help auto-setting

Per vedere le tue impostazioni attuali:

:set all

Come graywh sottolinea nei commenti, smartindent è stato sostituito da cindent che "Funziona in modo più intelligente", sebbene sia ancora principalmente per linguaggi con sintassi simile al C:

:help C-indenting


4
Se hai impostato la scheda di espansione, dovrebbe utilizzare gli spazi. Hai anche "impostato compatibile"? Ciò ha vari effetti collaterali tra cui il ripristino di exptab al suo valore predefinito "off"
Ken,

60
Siamo spiacenti, ma smartindent è stato sostituito da cindent, che a sua volta è appropriato solo per la sintassi in stile C. L'attivazione di entrambi in vimrc può essere un problema quando si lavora con altre lingue. Usa invece "filetype indent on" invece.
graywh

2
Bene, smartindent è anche solo per la sintassi in stile C ed è essenzialmente deprecato.
graywh

4
se abilito expandtab, c'è comunque un modo per inserire effettivamente il carattere di tabulazione nel testo?
Daniele Segato,

3
@DanieleSegato <ctrl v> <tab> dovrebbe funzionare in modalità inserimento: stackoverflow.com/questions/4781070/…
Ken

236

Correlato, se apri un file che utilizza sia schede che spazi, supponendo che tu abbia

set expandtab ts=4 sw=4 ai

È possibile sostituire tutte le schede con spazi nell'intero file con

:%retab

10
Cordiali saluti, se non si desidera che la scheda venga sostituita da spazi, rimuovere la riga di espansione.
Eno,

6
Le schede non sono bianche? ;-)
Rob Wells,

11
@ Rob-Wells: ho cambiato "spazi bianchi" in "spazi". Sei felice ora? ;-)
netjeff,

Potresti spiegare cosa significa quella prima riga?
Fondi Monica's Lawsuit,

2
expandtab determina se le schede sono espanse negli spazi. ts = tabstop = Numero di spazi che conta un <Tab> nel file. sw = shiftwidth = Numero di spazi da utilizzare per ogni passaggio del rientro (auto). ai = autoindent = Copia il rientro dalla riga corrente all'avvio di una nuova riga.
mcmacerson,

89

Il modo migliore per ottenere il rientro specifico del tipo di file è utilizzare filetype plugin indent onnel tuo vimrc. Quindi puoi specificare cose come set sw=4 sts=4 etin .vim / ftplugin / c.vim, ad esempio, senza dover renderle globali per tutti i file che vengono modificati e anche altre sintassi di tipo non C verranno rientrate correttamente (anche lisps) .


9
IMHO, meglio della risposta che è stata contrassegnata come corretta. il rientro del file su sostituisce cindent e smartindent.
0

62

Per avere schede a 4 spazi nella maggior parte dei file, un vero carattere di tabulazione a 8 dimensioni in Makefile e rientro automatico in vari file tra cui C / C ++, inseriscilo nel tuo ~/.vimrcfile:

" Only do this part when compiled with support for autocommands.
if has("autocmd")
    " Use filetype detection and file-based automatic indenting.
    filetype plugin indent on

    " Use actual tab chars in Makefiles.
    autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif

" For everything else, use a tab width of 4 space chars.
set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.
set shiftwidth=4    " Indents will have a width of 4.
set softtabstop=4   " Sets the number of columns for a TAB.
set expandtab       " Expand TABs to spaces.

Perché non ne hai bisogno else? Mi sembra che le ultime righe sovrascrivano il makefile specifico in tutti i casi
lucidbrot,

6
Ciao @lucidbrot, l'istruzione "autocmd FileType make" dice sostanzialmente a vim alcune impostazioni da usare ogni volta che apre un Makefile. Considerando che le linee sottostanti stanno impostando i valori predefiniti. In altre parole, le impostazioni "tabstop = 8 ..." vengono applicate in seguito all'apertura del file e sovrascriveranno le impostazioni "tabstop = 4 ..." che si applicano all'inizializzazione.
Shervin Emami,

56

Su molti sistemi Linux, come Ubuntu, il .vimrcfile non esiste per impostazione predefinita, quindi si consiglia di crearlo prima.

Non utilizzare il .viminfofile esistente nella home directory. È usato per uno scopo diverso.

Passaggio 1: vai alla tua home directory

cd ~

Passaggio 2: creare il file

vim .vimrc

Passaggio 3: aggiungere la configurazione sopra indicata

filetype plugin indent on
set tabstop=4
set shiftwidth=4
set expandtab

Passaggio 3: salvare il file premendo Shift+ ZZ.


11
Non usarlo Shift + ZZcreerà il file .swp. usare wq.
Sha

6
@shas: "ZZ" equivale a ": x" , che è lo stesso di ": wq", tranne per il fatto che salva solo se il file è stato modificato ... ( Ctrl-Zè un'altra storia ...)
Gert van den Berg,

1
@shas È semplicemente falso. Se non si desidera un file di scambio per una sessione di modifica, è necessario eseguire vim -n <file>. Un file di scambio non è qualcosa che viene generato al momento del salvataggio; questo avrebbe praticamente vanificato il suo scopo, poiché i file di scambio diventano utili nel recupero di sessioni di modifica improvvisamente interrotte.
Kaz

32

Il modo consigliato è utilizzare il rientro basato sul tipo di file e utilizzare smartindent e cindent solo se ciò non è sufficiente.

Aggiungi quanto segue al tuo .vimrc

set expandtab
set shiftwidth=2
set softtabstop=2
filetype plugin indent on

Spero che sia d'aiuto come risposta diversa.


12

modifica il tuo ~ / .vimrc

$ vim ~/.vimrc

aggiungi le seguenti righe:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab


6

Il rientro automatico si basa sulla modalità di sintassi corrente. So che se stai modificando Foo.java, inserendo a {e colpendo i Enterrientri nella riga seguente.

Per quanto riguarda le schede, ci sono due impostazioni. All'interno di Vim, digita i due punti, quindi "imposta tabstop = 4" che imposterà le schede in modo che vengano visualizzate come quattro spazi. Premi di nuovo i due punti e digita "set expandtab" che inserirà spazi per le schede.

Puoi mettere queste impostazioni in un .vimrc (o _vimrc su Windows) nella tua home directory, quindi devi digitarle solo una volta.


0

Innanzitutto, non utilizzare la Tabchiave in Vim per il rientro manuale. Vim ha una coppia di comandi in modalità insert per aumentare o diminuire manualmente la quantità di rientro. Quei comandi sono Ctrl-Te Ctrl-D. Questi comandi osservano i valori di tabstop, shiftwidthe expandtab, e mantengono la corretta combinazione di spazi e schede (numero massimo di schede seguito da qualsiasi numero necessario di spazi).

In secondo luogo, questi tasti di rientro manuale non devono essere utilizzati molto se si utilizza il rientro automatico.

Se Ctrl-Tinvece di Tabdisturbarti, puoi rimappare:

:imap <Tab> ^T

Puoi anche rimappare Shift-Tabper fare il Ctrl-Ddeindent:

:imap <S-Tab> ^D

Qui ^ T e ^ D sono caratteri di controllo letterali che possono essere inseriti come Ctrl-VCtrl-T.

Con questa mappatura in atto, è ancora possibile digitare Tab letterale nel buffer utilizzando Ctrl-VTab. Nota che se lo fai, anche se :set expandtabè attivo, otterrai un carattere di tabulazione non espanso.

Un effetto simile al <Tab> mappa si ottiene usando :set smarttab, il che fa sì che anche il backspace nella parte anteriore di una linea si comporti in modo intelligente.

In smarttabmodalità, quando non Tabviene utilizzato all'inizio di una riga, non ha alcun significato speciale. È diverso dalla mia precedente mappatura diTab a Ctrl-T, perché un Ctrl-Tusato ovunque in una linea (in modalità inserimento) aumenterà il rientro di quella linea.

Altre mappature utili possono essere:

:map <Tab> >
:map <S-Tab> <

Ora possiamo fare cose come selezionare alcune linee e premere Tab per rientrarle. Oppure premi Tabdue volte su una linea (in modalità comando) per aumentare il rientro.

Se si utilizzano i comandi di una corretta gestione indentazione, allora tutto è controllato da tre parametri: shiftwidth,tabstop e expandtab.

Il shiftwidthparametro controlla la dimensione del rientro; se vuoi quattro rientri spaziali, usa:set shiftwidth=4 o l'abbreviazione :set sw=4.

Se viene fatto solo questo, allora il rientro verrà creato usando una combinazione di spazi e tab, perché noexpandtab è l'impostazione predefinita. Usa :set expandtab. Questo fa sì che i caratteri di tabulazione che digiti nel buffer si espandano in spazi e che l'indentazione gestita da Vim utilizzi solo spazi.

Quando expandtabè attivo e se gestisci il rientro attraverso tutti i meccanismi di Vim appropriati, il valore di tabstopdiventa irrilevante. Controlla come vengono visualizzate le schede se si verificano nel file. Se si dispone set tabstop=8 expandtabe si inserisce di nascosto una scheda rigida nel file utilizzando Ctrl-VTab, si produrrà un allineamento alla successiva posizione della scheda basata su 8 colonne, come al solito.


Tutti i tuoi mapping dovrebbero utilizzare le varianti non ricorsive. Mapping go <C-t>può usare quella sintassi piuttosto che i letterali. Infine, anche la mappatura <Tab>in modalità normale <C-i>
mapperà

@ D.BenKnoble Non raccomando nulla di tutto ciò; Uso Ctrl-T, Ctrl-D e <> me stesso. Sta usando Vim come previsto. Alle persone abituate a usare Tab in altri editor potrebbe non piacere, tutto qui.
Kaz
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.