2009-10-10 7 views
21

Je n'aime pas comment vim mes dossiers encombre avec les fichiers de sauvegarde, donc j'ai la ligne suivante dans mon fichier vimrc:Comment puis-je créer un dossier, s'il n'existe pas, à partir de .vimrc?

set backupdir=~/.vim_backup 

Cependant, parfois ce dossier n'existe pas à cause de nouvelles machines où Je copie mes fichiers utilisateur.

Comment puis-je créer ce dossier automatiquement, s'il n'existe pas, à partir de .vimrc? Ou y a-t-il une meilleure façon de faire face à cette situation?

Répondre

25

Vous pouvez mettre ceci dans votre .vimrc:

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

Cela va tenter de créer le répertoire ~/.vim_backup chaque fois que vous commencez à vim. S'il existe déjà, mkdir signale une erreur, mais vous ne la verrez jamais.

+9

+1: Bonne réponse. En supposant Linux, vous pouvez également faire '! Mkdir -p ~/.vim_backup' car l'option' -p' empêchera mkdir de signaler une erreur en premier lieu (ainsi que de créer des répertoires parents si nécessaire). – DrAl

+10

Pourquoi faites-vous '! Mkdir'? Il y a une fonction vim intégrée 'mkdir()' qui sert le même but et est plus portable.De plus, votre code sans entourer 'if' fait un appel de shell inutile qui ralentit le démarrage. – ZyX

+0

@ZyX ouais, alors la question est: comment pouvez-vous détecter si un dossier existe? Je connais filereadable(), y a-t-il un équivalent pour les dossiers? –

1

Je voulais une solution à cela qui fonctionne à la fois sur Linux et sur Windows (avec les binaires Cygwin sur le chemin.) - ma config Vim est partagée entre les deux. Un problème est que "mkdir" est, je pense, intégré au shell cmd sur Windows, donc il ne peut pas être remplacé en mettant l'exécutable mkdir Cygwin plus tôt dans le chemin.

Je résolu ce problème en invoquant un nouveau shell bash pour exécuter l'action: A partir de là, « mkdir » signifie toujours tout exécutable mkdir est sur le chemin:

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

Cependant, cela a le problème. sur Windows au moins, il ouvre une nouvelle fenêtre pour le shell cmd qui '!' invoque. Je ne veux pas ça chaque fois que je commence à vim. Puis j'ai découvert la fonction vim 'system', qui appelle un nouveau shell cmd (l'icône apparaît dans la barre des tâches Windows) mais la fenêtre est minimisée. Par conséquent:

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

laid, mais fonctionne.

+0

Regardez la réponse @ xer0x, vous pouvez vérifier si le répertoire existe et seulement ensuite appelle le système, ce qui rend votre solution laide mais aussi pratique que possible sur un hôte de la fenêtre –

8

Je préfère de loin les one-liners déjà affichés. Cependant, je pensais que je partage ce que je l'ai utilisé:

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

Le message "Créé" pourrait être faux si "mkdir" renvoie une erreur –

0

J'ai une commande dans mon vimrc qui me permet de faire un répertoire correspondant au tampon actuellement en avant:

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

Ceci peut être utilisé pour créer un répertoire n'importe où vous voulez en mettre un localement ou à distance via netrw si vous avez les permissions pour le faire.

+1

Hey, que signifie exactement "correspondant à"? Ce n'est pas du tout le même nom que ça, ça n'a pas vraiment de sens pour moi, alors quoi? –

59

Je pense que ce système d'exploitation est indépendant:

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

mais dans ce cas vous devez utiliser $ HOME au lieu de ~ 'silent! Mkdir ~/.vim_backup>/dev/null 2 > & 1' deviendra 'appel silencieux mkdir ($ HOME. '/. Vim_backup', 'p')' – m42e

+0

... pourquoi n'est pas la réponse acceptée? –

+0

... car seul @fragsworth peut désigner une réponse comme "acceptée". Mais nous, en tant que communauté, votons pour quelle réponse nous acceptons. –

1

Vous pouvez utiliser la fonction mkdir() Vim. Il peut également créer des répertoires intermédiaires et définir les autorisations appropriées sur le répertoire:

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

Juste curieux ... J'ai essayé cette solution, mais '~/.vim/somepath /' ne fonctionne pas tout à fait car il fonctionne sur le chemin complet au lieu du '~'. Quoi qu'il en soit, une fois que je l'ai compris, ça a fonctionné comme un charme. –

Questions connexes