2015-02-07 9 views
7

mkview e loadview sono modi fantastici per salvare lo stato in vim e molte persone usano comandi .vimrc come questo per salvare automaticamente lo stato su tutti i file.Vim: Come rimuovere/cancellare le viste create da mkview dall'interno di vim

au BufWinLeave ?* mkview 
au BufWinEnter ?* silent loadview 

Questo crea il file di stato (in un luogo come ~/.vim/view)

A volte, però, si vuole cancellare le informazioni vista quindi il file inizia in uno stato fresco.

Gli unici modi che posso vedere di fare questo sono:

  1. Individuare e rimuovere la vista/file corrispondente .vim/dalla riga di comando
  2. temporaneamente modificare il Vimrc per spegnere il loadview, apri il file e ripristina il file .vimrc

Questi sono entrambi ingombranti e implicano fare cose al di fuori di Vim. Non c'è un modo per entrambi: (? o forse un modo per passare un'opzione per il vimrc di saltare il loadview)

  1. Aprire un file senza fare loadview così quando chiudiamo avremo un mkview chiara
  2. Rimuovere/cancellare qualsiasi stato fissato dal loadview oppure cancellare il file loadview corrispondente per un determinato file dall'interno di vim

Immagino che si potrebbe scrivere uno script di shell che ha preso il percorso del file e ha cercato di capire vim del ' = + 'codifica dei percorsi nella directory .vim/view e rimuoverlo e quindi chiamare lo script della shell dall'interno di vim, ma sembra che vim debba avere una sorta di o f supporto per questo.

risposta

4

Sembra che Vim non abbia questa capacità, quindi avevo bisogno di scrivere un vimscript che faccia la citazione corretta (grazie all'ispirazione e alla nota su '& viewdir' di Ingo).

Ecco il vimscript, puoi aggiungerlo al tuo.vimrc per aggiungere il comando per vim:

" # Function to permanently delete views created by 'mkview' 
function! MyDeleteView() 
    let path = fnamemodify(bufname('%'),':p') 
    " vim's odd =~ escaping for/
    let path = substitute(path, '=', '==', 'g') 
    if empty($HOME) 
    else 
     let path = substitute(path, '^'.$HOME, '\~', '') 
    endif 
    let path = substitute(path, '/', '=+', 'g') . '=' 
    " view directory 
    let path = &viewdir.'/'.path 
    call delete(path) 
    echo "Deleted: ".path 
endfunction 

" # Command Delview (and it's abbreviation 'delview') 
command Delview call MyDeleteView() 
" Lower-case user commands: http://vim.wikia.com/wiki/Replace_a_builtin_command_using_cabbrev 
cabbrev delview <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'Delview' : 'delview')<CR> 

Dopo l'aggiunta di questo, si può semplicemente fare:

:delview 

da linea di comando e sarà eliminare la vista creata per il buffer corrente/file di

La tua variabile d'ambiente $ HOME deve essere impostata su qualsiasi cosa vim pensa '~' è

+1

E ora caricato su script vim: http://www.vim.org/scripts/script.php?script_id=5109 –

1

Come la gestione automatica vista è innescata da :autocmd, è possibile disattivare temporaneamente il caricamento della vista tramite

:noautocmd edit myfile 

Si noti che questa si spegne anche eventuali ganci effettuate da altre plugins/personalizzazioni.


Per eliminare un file all'interno di Vim, è possibile utilizzare delete() per definire un comando personalizzato:

:command! -nargs=1 DeleteView call delete(&viewdir . '/' . <q-args>) 

Questo potrebbe essere ulteriormente migliorata con la costruzione di globbing o filespec anche di Vim fuga in esso.

+0

Disabilitare un caricamento della vista non lo cancellerà, quindi la prossima volta che modificheremo ricaricheremo la vista. Suppongo che dovrò scrivere un vimscript, ma in realtà sembra che ci dovrebbe essere un trio di comandi: mkview loadview deleteview (o qualcosa del genere) Soprattutto se si considera file di vim citando nella isn viste directory 'documentato (cosa succede se un file ha' = + 'nel percorso ??) –

+0

Anche se suppongo che potremmo aprire vim, usare ": noautocmd edit file", fare un mkview, e quindi almeno il mkview verrebbe cancellato, ma speravo di farlo come un singolo comando. Il tuo & viewdir mi ha ispirato abbastanza da scrivere un vimscript, pubblicato come risposta qui. –