2015-03-23 19 views
7

ho già letto diverse domande e risposte:Vim: rientro con le schede, allineare con spazi

Ma nessuno di loro offre una soluzione per me.

Voglio davvero applicare il principio "Indent with tabs, align with spaces", ma quando si tratta di indentazione automatica, non sono riuscito a insegnare a Vim come farlo correttamente.

Si consideri il codice, assumendo tabstops == 3, shiftwidth == 3

(>-- significa scheda, e . (un punto) significa spazio):

{ 
>--long a = 1, 
>-->--..b = 2, 
>-->--..c = 3; 
} 

Quindi, fa rientrare con le linguette quanto più possibile, e quindi riempie il resto con spazi. Ma in realtà è un approccio pessimo: quando qualcuno leggerà questo codice con diverse dimensioni della scheda, il codice sarà incasinato. Ecco come apparirà con una dimensione di tabulazione uguale a 8 caratteri:

{ 
>-------long a = 1, 
>------->-------..b = 2, 
>------->-------..c = 3; 
} 

È orribile. Il problema è che Vim non distingue tra indentazione e allineamento.

Per far sembrare correttamente con qualunque sia la dimensione scheda è, il codice dovrebbe essere rientrato in questo modo:

{ 
>--long a = 1, 
>--.....b = 2, 
>--.....c = 3; 
} 

Quindi, questo codice sarà un aspetto gradevole qualunque essa dimensioni scheda è. Ad esempio, 8 caratteri:

{ 
>-------long a = 1, 
>-------.....b = 2, 
>-------.....c = 3; 
} 

Come ottenere ciò?

+0

Forse il tabulare del plugin ti darebbe quello che stai cercando? https://github.com/godlygeek/tabular – Zach

risposta

3

Il modo più efficace per influenzare il rientro in Vim è tramite 'indentexpr'. Dal suo :help:

L'espressione deve restituire il numero di spazi del valore di rientro. È può restituire "-1" per mantenere il rientro corrente (ciò significa che "autoindent" è utilizzato per il rientro).

Dato che questo restituisce il numero di di spazi, non la stessa trattino reso, e Vim supporta solo così lontano da tabulazioni, spazio- o massimo numero-di-tab-seguita-by-spazi (chiamato softtabstop), questo non può essere fatto.

Quindi, se si vuole davvero usare questo metodo di indentazione (personalmente mi piace anche per la sua purezza ed eleganza! (Ma non lo uso)), è necessario disattivare il rientro automatico e l'auto- formattazione e fai tutto da solo manualmente, sfortunatamente

+0

Ah, è troppo male. Grazie. Probabilmente cercherò di scrivere sulla mailing list di Vim e di contattare gli sviluppatori NeoVim, probabilmente questa funzione apparirà in futuro .. –

+0

A meno che non sviluppiate e inviate una patch completa, dovreste essere molto pazienti per ottenere questo in Vim ; la lista di cose da fare è infinitamente lunga, sfortunatamente. –

0

Come già sottolineato, vim non è in grado di distinguere se si preme il tasto tab per il rientro o perché si sta tentando di allineare il testo, quindi non è possibile automatizzare il comportamento desiderato.

cosa più vicina si può fare è cercare di giocare con softtabstop e valori diversi per tabstop, ma in questo modo si ottiene il contrario di quello che hai chiesto: premendo una linguetta sta per inserire il più spazi possibile prima di utilizzare Una scheda.

Nota a margine, se si desidera che il codice abbia sempre l'aspetto desiderato, è possibile provare a impostare direttamente expandtab.

sguardo spazia sempre lo stesso, in modo da

{ 
.........long a = 1, 
..............b = 2, 
..............c = 3; 
} 

è come apparirà sempre il codice.

+0

Non si tratta di "premere scheda", si tratta di ** auto ** - indentazione. Chiaramente ** è ** un modo per distinguere tra allineamento e indentazione, ma Vim non lo fa. Per quanto riguarda softtabstop, grazie per il suggerimento, ma non mi piace questo approccio. –

+0

Per quanto riguarda expandtab, rende Vim mai utilizzare le schede (inserire solo spazi). Questo è l'approccio che uso in questi giorni nei miei progetti, ma non è quello che voglio ottenere nella mia domanda. –

+0

L'ho fatto notare solo nel caso, dal momento che ciò che hai richiesto non può essere raggiunto e gli spazi sono un modo semplice per mantenere l'aspetto del codice indipendentemente dall'indentazione e dall'allineamento, e questa era una delle tue preoccupazioni principali. –