2009-10-10 14 views
21

Non mi piace come ingombra le mie cartelle con i file di backup vim, quindi ho la seguente riga nel mio file Vimrc:Come posso creare una cartella, se non esiste, da .vimrc?

set backupdir=~/.vim_backup 

Tuttavia, a volte questa cartella non esiste a causa di nuove macchine in cui Sto copiando i miei file utente.

Come posso creare questa cartella automaticamente, se non esiste, all'interno di .vimrc? O c'è un modo migliore per affrontare questa situazione?

risposta

25

Si può mettere questo nella vostra Vimrc:

silent !mkdir ~/.vim_backup > /dev/null 2>&1 

Questo tenterà di creare il file ~/.vim_backup ogni volta che si avvia vim. Se esiste già, mkdir segnalerà un errore, ma non lo vedrai mai.

+9

+1: buona risposta. Supponendo che Linux, potresti anche fare '! Mkdir -p ~/.vim_backup' come l'opzione' -p' impedirà a mkdir di riportare un errore in primo luogo (oltre a creare directory madri se necessario). – DrAl

+10

Perché fai '! Mkdir'? C'è una funzione vim integrata 'mkdir()' che ha lo stesso scopo ed è più portabile.Di più, il tuo codice senza circondare 'if' sta facendo una chiamata shell inutile che rallenta l'avvio. – ZyX

+0

@ZyX sì, quindi la domanda è: come si rileva se esiste una cartella? So filereadable(), c'è un equivalente per le cartelle? –

1

Volevo una soluzione a questo che funzioni sia su Linux che su Windows (con i binari Cygwin sul percorso). La mia configurazione Vim è condivisa tra i due.

Un problema è che 'mkdir' è, penso, integrato nella shell di cmd su Windows, quindi non può essere sovrascritto mettendo l'eseguibile Cygwin mkdir prima nel percorso.

Ho risolto questo chiamando una nuova shell bash per eseguire l'azione: Da lì, 'mkdir' significa sempre qualunque eseguibile mkdir è sul percorso:

!bash -c "mkdir -p ~/.vim-tmp" 

Tuttavia, ciò ha il problema che. su Windows almeno, si apre una nuova finestra per la shell cmd che '!' invoca. Non voglio che ogni volta che inizio vim. Poi ho scoperto la funzione vim 'sistema', che richiama una nuova shell cmd (l'icona appare nella barra delle applicazioni di Windows) ma la finestra è ridotta a icona. Quindi:

call system("bash -c \"mkdir -p ~/.vim-tmp\"") 

Brutto ma funziona.

+0

Guarda @ risposta xer0x, puoi controllare se la directory esiste e solo allora chiama il sistema, rendendo la tua soluzione brutta ma più pratica possibile su un host di finestra –

8

Preferisco di gran lunga le one-liner già pubblicate. Tuttavia, ho pensato di condividere ciò che ho usato:

function! EnsureDirExists (dir) 
    if !isdirectory(a:dir) 
    if exists("*mkdir") 
     call mkdir(a:dir,'p') 
     echo "Created directory: " . a:dir 
    else 
     echo "Please create directory: " . a:dir 
    endif 
    endif 
endfunction 

call EnsureDirExists($HOME . '/.vim_backup') 
+0

Il messaggio "Creato" potrebbe essere falso se 'mkdir' genera un errore –

0

ho un comando nella mia vimrc che mi permette di fare una directory corrispondente al buffer attualmente in primo piano:

nmap <silent> ,md :!mkdir -p %:p:h<CR>

Questo può essere usato per creare una directory in qualunque posto tu voglia importarne uno localmente o remotamente via netrw se hai i permessi per farlo.

+1

Hey. Che cosa significa esattamente 'corrispondente a'? Non si chiama 'lo stesso come', che non ha senso per me. E allora? –

59

penso che questo sistema sia operativo indipendente:

if !isdirectory("/my/directory") 
    call mkdir("/my/directory", "p") 
endif 
+8

ma in questo caso devi usare $ HOME invece di ~ 'silent! Mkdir ~/.vim_backup>/dev/null 2 > & 1' diventerà 'chiamata silenziosa mkdir ($ HOME. '/. Vim_backup', 'p')' – m42e

+0

... perché non è QUESTA la risposta accettata ??? –

+0

... perché solo @fragsworth può designare una risposta come "accettata". Ma noi, mentre la comunità arriva a votare per quale risposta accettiamo. –

1

è possibile utilizzare la funzione di mkdir() Vim. Può creare directory intermedie e impostare le autorizzazioni appropriate anche sulla directory:

if !isdirectory($HOME . "/.vim/backup") 
    call mkdir($HOME . "/.vim/backup", "p", 0700) 
endif 
+0

Solo curioso ... Ho provato questa soluzione, ma '~/.vim/somepath /' non funziona come funziona invece del '' '. Ad ogni modo, una volta capito, ha funzionato come un incantesimo. –

Problemi correlati