Si j'invoque vim foo/bar/somefile
mais foo/bar
n'existe pas déjà, Vim refuse de sauvegarder.
Je sais que je pourrais passer à un shell ou faire à :!mkdir foo/bar
partir de Vim mais je suis paresseux :) Y a-t-il un moyen de faire en sorte que Vim fasse cela automatiquement quand il enregistre le tampon?
mkdir -p %:h
est mieux car il fonctionne pour les chemins imbriqués non existants, ne génère pas d'erreur lorsque le chemin existe déjà et%:h
est le chemin complet du fichier actuel. Cependant, je ne sais pas comment l'invoquer automatiquement. Normalement, cela se fait avec des commandes automatiques, mais l'BufWritePre
événement ne semble pas fonctionner ici.write
et appelle le systèmemkdir -p
surdirname
sinon, mappez -la àW
... Je suis trop paresseux pour rechercher la syntaxe et la poster comme réponse ... Désolé:w
pourmkdir -p %:h
suivre la construction:write
Réponses:
Notez les conditions:
expand("<afile>")!~#'^\w\+:/'
empêchera vim de créer des répertoires pour des fichiers commeftp://*
et!isdirectory
évitera un appel coûteux à mkdir.Mise à jour : une solution légèrement meilleure qui vérifie également les buftype non vides et utilise
mkdir()
:la source
call mkdir(expand('%:h'), 'p')
pourrait être plus portable.Sur la base des suggestions de ma question, voici ce que j'ai obtenu:
Ceci définit la
:W
commande. Idéalement, je voudrais avoir tous:w!
,:wq
,:wq!
,:wall
etc. fonctionnent de la même, mais je ne sais pas s'il est possible sans fondamentalement les réimplémentant toutes avec des fonctions personnalisées.la source
:W
, mon écran devient presque vide. J'essaierai de supprimer mes options précédentes et je donnerai des commentaires.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
:mk.
lequel je suis, je tape et il le remplace par "! Mkdir -p / chemin / vers / mon / fichier /" et me permet de revoir la commande avant de l'invoquer.la source
J'ai fait
:saveas!
créer le répertoire s'il manquait: https://github.com/henrik/dotfiles/commit/54cc9474b345332cf54cf25b51ddb8a9bd00a0bbla source
Ce code vous demandera de créer le répertoire avec
:w
, ou simplement de le faire avec:w!
:la source
Je pense que j'ai réussi à le faire en trois lignes, combinant ce que les autres disent sur cette réponse.
Cela semble faire l'affaire:
Il tente de créer le dossier automatiquement lors de l'enregistrement d'un tampon. Si quelque chose de mauvais se produit (c'est-à-dire des problèmes d'autorisation), il se fermera et laissera l'écriture du fichier échouer.
Si quelqu'un voit des défauts évidents, veuillez poster un commentaire. Je ne connais pas très bien le vimscript.
EDIT: Notes grâce à ZyX
la source
%
dans de tels scripts. Vim ne va pas échapper à tous les symboles spéciaux: par exemple, si vous modifiez un fichier nommé ,/mnt/windows/Documents and Settings/User/_vimrc
vous finirez par avoir quatre nouveaux répertoires:/mnt/windows/Documents
,./and
,./Settings
et./Settings/User
. Et, au fait, vous n'avez pas besoin d':execute
ici.system()
fonction pour les appels shell complètement silencieux, mais vous n'avez pas besoin des deux:execute
et%:p:h
::silent !mkdir -p %:p:h
fonctionne exactement comme ce que vous avez écrit (bien que vous en ayez peut-être besoin:redraw!
à la fin, dans ce cas:execute
est pratique), mais il est préférable de l'utilisercall system('mkdir -p '.shellescape(expand('%:p:h')))
. Utilisez:execute '!command' shellescape(arg, 1)
(avec le deuxième argument de shellescape) si vous devez utiliser une frange au lieu desystem()
. Utilisez des franges si l'argument échappé contient des retours à la ligne.:source ~/.vimrc
) (c'est ce à quoiaugroup
etautocmd!
sont pour), vue supprimée après le lancement du shell commandes (c'est ce à quoi ça sertredraw!
), la création de répertoires d'ordures en cas d'utilisation de pseudo-fichiers (dans le premier code extrait, il est vérifié en faisant correspondre uniquement le nom de fichier à un modèle, mais dans le second, je vérifie également&buftype
) et un appel de shell inutile dans le répertoire de cas existe (isdirectory()
condition).%
expansion pour ne jamais suggérer de l'utiliser à personne. Les pseudo fichiers sont utilisés dans un grand nombre de plugins (par exemple fugitive ou my aurum), ils valent donc la peine d'être pris en charge. Le ressourcement de vimrc est également une pratique courante. Vous pouvez avoir tout ce que vous voulez dans le vimrc, mais ne le suggérez pas comme réponse. L'utilisation de la:silent! call mkdir(expand('%:p:h'), 'p')
variante résout deux des points que j'ai mentionnés et le troisième, je n'ai pas mentionné:!mkdir
ne fonctionnera pas sur Windows.