117 votes

Vim: Créer des répertoires parents lors de la sauvegarde

Si j'invoque vim foo/bar/somefile mais que foo/bar n'existe pas déjà, Vim refuse de sauvegarder.

Je sais que je pourrais passer à un shell ou faire :!mkdir foo/bar de Vim mais je suis paresseux :) Y a-t-il un moyen de faire que Vim le fasse automatiquement quand il enregistre le tampon?

89voto

ZyX Points 26516
 augroup BWCCreateDir
    autocmd!
    autocmd BufWritePre * if expand("<afile>")!~#'^\w\+:/' && !isdirectory(expand("%:h")) | execute "silent! !mkdir -p ".shellescape(expand('%:h'), 1) | redraw! | endif
augroup END
 

Notez les conditions: expand("<afile>")!~#'^\w\+:/' empêchera vim de créer des répertoires pour des fichiers tels que ftp://* et !isdirectory empêchera les appels coûteux mkdir.

Mise à jour : solution légèrement meilleure qui vérifie également le type de fichier non vide et utilise mkdir() :

 function s:MkNonExDir(file, buf)
    if empty(getbufvar(a:buf, '&buftype')) && a:file!~#'\v^\w+\:\/'
        let dir=fnamemodify(a:file, ':h')
        if !isdirectory(dir)
            call mkdir(dir, 'p')
        endif
    endif
endfunction
augroup BWCCreateDir
    autocmd!
    autocmd BufWritePre * :call s:MkNonExDir(expand('<afile>'), +expand('<abuf>'))
augroup END
 

19voto

Damien Pollet Points 3254

Sur la base des suggestions à ma question, voici ce que j'ai fini avec:

 function WriteCreatingDirs()
    execute ':silent !mkdir -p %:h'
    write
endfunction
command W call WriteCreatingDirs()
 

Ceci définit la commande :W . Idéalement, j'aimerais que tous les :w! , :wq , :wq! , :wall etc. fonctionnent de la même manière, mais je suis Je ne sais pas si c'est possible sans les réimplémenter avec des fonctions personnalisées.

6voto

Asa Ayers Points 1873

J'ai ajouté ceci à mon ~ / .vimrc

cnoremap mk. !mkdir -p <c-r>=expand("%:h")<cr>/

Si j'ai besoin de créer le répertoire dans lequel je suis, je tape :mk. et il le remplace par "! Mkdir -p / chemin / vers / mon / fichier /" et me permet de revoir la commande avant d'appeler il.

3voto

Henrik N Points 4447

J'ai fait :saveas! créer le répertoire s'il manque: https://github.com/henrik/dotfiles/commit/54cc9474b345332cf54cf25b51ddb8a9bd00a0bb

1voto

kikito Points 23229

Je pense que j'ai réussi à le faire en trois lignes, en combinant ce que disent les autres sur cette réponse.

Ce qui semble faire l'affaire:

if has("autocmd")
  autocmd BufWritePre * :silent !mkdir -p %:p:h
end

Il tente de créer le dossier automatiquement lors de l'enregistrement d'un tampon. Si quelque chose se passe mal (c'est à dire les problèmes d'autorisation), il va juste se taire et de laisser le fichier échec de l'écriture.

Si quelqu'un voit tous les défauts évidents, s'il vous plaît poster un commentaire. Je ne suis pas très versé dans vimscript.

EDIT: Notes grâce à ZyX

  • Cela ne fonctionnera pas si vos dossiers sont séparés par des espaces (apparemment, ils ne sont pas correctement échappé ou quelque chose)
  • Ou si vous effectuez des pseudo-fichiers.
  • Ou si vous de trouver votre vimrc.
  • Mais le fils, c'est court.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X