2013-08-05 16 views
10

ho la maggior parte IDE e editor di testo moderni (Testo Sublime 3) il cursore viene correttamente rientrato dopo l'inserimento di una nuova riga tra un tag html (alias 'in espansione" del tag):posizione del cursore Vim dopo l'espansione tag html

Prima :

<div>|</div> 

Dopo aver premuto CR:

<div> 
    | 
</div> 

Ma in Vim, questo è ciò che ottengo:

<div> 
|</div> 

Come posso ottenere lo stesso comportamento in Vim come nella maggior parte degli altri editor (vedere sopra)?

+0

provare questo: https://github.com/othree/xml.vim – Kent

+0

Sto avendo difficoltà a rispondere a questa domanda qui per qualche motivo (continuo a ricevere gli errori al momento della presentazione uno) . Ho incollato la mia risposta sarebbe in [questo gist] (https://gist.github.com/rson/7bd877744ac59bee5491). –

+0

@RandyMorris Non ho avuto problemi a postarlo come risposta. Prova a postarlo di nuovo? – FDinoff

risposta

7

L'unico corretto comportamento di <CR> in modalità di inserimento è interrompere la linea sul cursore.

Quello che vuoi è un migliorato comportamento ed è necessario aggiungere qualcosa alla tua configurazione per ottenerlo: una mappatura, una funzione breve o un plugin a pieno titolo.

Quando ho iniziato a utilizzare vim, quel comportamento era in realtà una delle prime cose che ho aggiunto al mio vimrc. Ho cambiato molte volte in passato, ma questa mappatura è stata abbastanza stabile per un po ':

inoremap <leader><CR> <CR><C-o>==<C-o>O 

ho usato <leader><CR> per mantenere il normale comportamento di <CR>.


Ecco una piccola funzione che sembra fare quello che vuoi:

function! Expander() 
    let line = getline(".") 
    let col = col(".") 
    let first = line[col-2] 
    let second = line[col-1] 
    let third = line[col] 

    if first ==# ">" 
    if second ==# "<" && third ==# "/" 
     return "\<CR>\<C-o>==\<C-o>O" 

    else 
     return "\<CR>" 

    endif 

    else 
    return "\<CR>" 

    endif 

endfunction 

inoremap <expr> <CR> Expander() 
+0

Grazie mille - la tua soluzione funziona e la accetterò come risposta. Preferirei vedere un comportamento più automatico come se lo avessi in Sublime Text o Textmate. Potrei indagare sull'apprendimento del vimscript e sull'estensione della soluzione di Randy Morris di seguito. –

+0

FWIW, utilizzo SnipMate e Sparkup per scrivere HTML. Dovresti considerare questi plugin: ti aiuteranno a risparmiare ** un sacco ** di battitura. – romainl

+0

@DanielLang, vedere la mia modifica. – romainl

2

@RandyMorris e @romainl hanno pubblicato buone soluzioni per il vostro problema esatto.

Ci sono alcune altre possibilità che potrebbero interessarti se stai scrivendo questi tag da solo: c'è il plugin ragtag.vim per l'editing HTML/XML.

Con ragtag.vim si digita questo per creare il tuo (modalità di inserimento) "prima di" situazione:

div<C-X><Space> 

Per creare la "dopo" la situazione si sarebbe invece digitare:

div<C-X><Enter> 

Quindi, se sai in anticipo che stai per "espandere" il tag, digitando solo il nome dell'elemento e la combinazione CtrlX seguito da Inserire è sufficiente.

Esistono anche altri plugin più avanzati per salvare le sequenze di tasti durante la modifica di HTML, come ad esempio ZenCoding.vim e Sparkup.

+0

Grazie! Sfortunatamente questo non funziona per me, anche se ho già installato il plugin ragtag e lo uso molto per inserire i tag ruby ​​(quindi so che funziona). –

3

questo piccolo frammento sarà rimappare Enter in modalità di inserimento per verificare se il cursore si trova tra il > e < e agire di conseguenza se lo è. A seconda delle impostazioni del rientro, potrebbe essere necessario rimuovere lo \<Tab>.

Sarà Non bello giocare con altri plugin che potrebbero essere essere anche la mappatura dei Enter chiave in modo da essere consapevoli del fatto che non v'è probabilmente più lavoro da fare se si vuole che la compatibilità.

function EnterOrIndentTag() 
    let line = getline(".") 
    let col = getpos(".")[2] 
    let before = line[col-2] 
    let after = line[col-1] 

    if before == ">" && after == "<" 
    return "\<Enter>\<C-o>O\<Tab>" 
    endif 
    return "\<Enter>" 
endfunction 

inoremap <expr> <Enter> EnterOrIndentTag() 

Ho testato solo i semplici casi (all'inizio della riga, fine della linea, dentro e fuori di ><), ci sono probabilmente bordo casi che questo non avrebbe raggiunto.

+0

Grazie, Randy. La tua soluzione è molto bella, ma in realtà ho bisogno di qualcosa che funzioni bene con altri plugin come matchIt. Il tuo codice mi ha fatto pensare di scrivere una funzione del genere, grazie! –

0

Poiché nessuno l'ha menzionato lo farò. C'è eccellente plugin che fa esattamente che delemitmate

Problemi correlati