2013-04-13 13 views
6

Ho recentemente iniziato a utilizzare vim per i miei progetti a livello di laurea. Problema principale, affronto il fatto che a volte effettuo il check-in un codice non indentato. Sento che se riesco in qualche modo a creare una scorciatoia di auto-indent + save + close allora dovrebbe risolvere il mio problema.Come dire a vim di auto-indent prima di salvare

Il mio file .vimrc:

set expandtab 
set tabstop=2 
set shiftwidth=2 
set softtabstop=2 
set pastetoggle=<F2> 
syntax on 
filetype indent plugin on 

Esiste un modo per creare tali scorciatoie comando & over-ride con: x (salvare + uscita).

Per favore fatemi sapere.

+3

Invece di un trigger prima di salvare, utilizzare 'set autoindent' e rientrare il codice correttamente, in primo luogo! –

risposta

5

Si consiglia di attivare autoindent per evitare questo problema in primo luogo. È molto più facile da lavorare con codice correttamente rientrato in ogni fase di sviluppo.

set autoindent 

Leggere i documenti tramite :help autoindent.

Tuttavia, il comando = esegue il rientro delle righe in base alle regole del tipo di file. È possibile creare un autocmd BufWritePre per eseguire il rientro su tutto il file.

Non ho provato questo, e non so quanto bene potrà mai funzionare:

autocmd BufWritePre * :normal gg=G 

:help autocmd Leggi per ulteriori informazioni sull'argomento. gg=g rompe come:

  • :normal eseguito come un normale comando di modifica modalità, piuttosto che un comando :ex
  • gg mossa per la parte superiore del file
  • = trattino fino ..
  • G ... la fine del file.

Io davvero non consiglio questa strategia. Abituati a utilizzare set autoindent invece. Probabilmente non è saggio definire questo autocmd su tutti i file (come con *). Si potrebbe essere fatto solo su alcuni tipi di file:

" Only for c++ files, for example 
autocmd BufWritePre *.cpp :normal gg=G 
+2

Non usare 'normal' senza bang negli script,' gg = G' non è necessario analizzare come scritto qui in questo caso. – ZyX

+0

Questo comando è utile a meno che non si abbia la tendenza a salvare il file dopo ogni inserimento, in quanto riporta il cursore a gg, rendendolo non utilizzabile. –

14

Aggiungi quanto segue al .vimrc:

" Restore cursor position, window position, and last search after running a 
" command. 
function! Preserve(command) 
    " Save the last search. 
    let search = @/ 

    " Save the current cursor position. 
    let cursor_position = getpos('.') 

    " Save the current window position. 
    normal! H 
    let window_position = getpos('.') 
    call setpos('.', cursor_position) 

    " Execute the command. 
    execute a:command 

    " Restore the last search. 
    let @/ = search 

    " Restore the previous window position. 
    call setpos('.', window_position) 
    normal! zt 

    " Restore the previous cursor position. 
    call setpos('.', cursor_position) 
endfunction 

" Re-indent the whole buffer. 
function! Indent() 
    call Preserve('normal gg=G') 
endfunction 

Se si desidera che tutti i tipi di file per essere auto-frastagliata al momento del salvataggio, che vi consiglio vivamente di non, aggiungere questo gancio per il vostro .vimrc:

" Indent on save hook 
autocmd BufWritePre <buffer> call Indent() 

Se si desidera che solo determinati tipi di file ad essere auto-rientrato su Sa ve, che raccomando, quindi seguire le istruzioni.Diciamo che si desidera file C++ per essere auto-frastagliata su Save, quindi creare ~/.vim/after/ftplugin/cpp.vim e mettere questo gancio c'è:

" Indent on save hook 
autocmd BufWritePre <buffer> call Indent() 

Lo stesso sarebbe andato per altri tipi di file, vale a dire ~/.vim/after/ftplugin/java.vim per Java e così via.

+0

Grazie per la funzione Preserve! – ibizaman

1

rientrare un file già esistente, è possibile utilizzare la scorciatoia gg=G (non un comando, è sufficiente premere g due volte, poi =, poi Shift+g), in particolare dal momento che si sta utilizzando la linea di filetype indent ....

Vim: gg=G aligns left, does not auto-indent

Problemi correlati