Conserver les bits d'autorisation lors de l'écriture d'un nouveau fichier avec VIM

8

Dans Vim, lorsque j'écris une copie du tampon actuel dans un nouveau fichier à l'aide :w [filename], il semble que Vim utilise les autorisations de fichier par défaut (c'est-à-dire définies par umask ou autre) pour le nouveau fichier. Si le tampon actuel a été chargé à partir d'un fichier existant, le "bon" comportement ne devrait-il pas être de dupliquer les autorisations de ce fichier? Par exemple, si j'édite un fichier exécutable et que j'écris une nouvelle copie du fichier, pourquoi Vim n'écrit-il pas un nouvel exécutable ? Existe-t-il un moyen de forcer Vim à se comporter comme je le décris, à part faire simplement quelque chose comme ! chmod --reference % [newfilename]après avoir écrit le nouveau fichier?

Kyle Strand
la source
Peut-être lié: unix.stackexchange.com/q/58880/22703
allquixotic
Je pense que la réponse est déjà dans la question - vous devez créer une macro ou une liaison de touches qui le fait chmodpour vous. AFAIK, vim n'a pas cela intégré.
Kevin Panko

Réponses:

3

Vous pourriez faire quelque chose comme ça. Commencez par capturer le nom du fichier d'origine.

au BufRead * let b:oldfile = expand("<afile>")

Ensuite, lorsque vous enregistrez le nouveau fichier, modifiez ses autorisations pour qu'elles soient identiques à celles du fichier d'origine.

au BufWritePost * if exists("b:oldfile") | let b:newfile = expand("<afile>") | if b:newfile != b:oldfile | echo system("chmod --reference=".b:oldfile." ".b:newfile) | endif |endif

Mettez simplement ces deux commandes automatiques dans votre ~ / .vimrc.

garyjohn
la source
Cette réponse est impressionnante, mais j'ai une suggestion: changer echo system(etc. en silent echo system(etc. Cela évite le blocage "appuyez sur ENTRÉE pour continuer".
Kyle Strand
@KyleStrand: J'aurais également pu call system(...éviter d'imprimer quoi que ce soit sur l'écran, mais j'essayais d'éviter le problème de l'échec silencieux de la commande. Si vous ne pensez pas que cela échouera un jour, ou si vous préférez vivre avec l'échec occasionnel plutôt qu'avec l'ennuyeux Press ENTER..., alors je suis d'accord avec votre suggestion. Je pense qu'une meilleure solution, cependant, serait d'écrire une fonction qui capture la sortie de system () et ne l'écho que si elle n'est pas vide. Je l'ai fait dans des plugins et cela fonctionne assez bien.
garyjohn
C'est suffisant. Je ne comprends pas très bien Vimscript, donc je suis juste resté "silencieux" pour voir si ça marcherait, et quand ça a semblé bien, j'ai laissé mon .vimrc comme ça. Je préférerais certainement l'échec occasionnel au persistant Press ENTER,, donc je pense que je vais m'en tenir silentou utiliser call. Merci encore pour les suggestions!
Kyle Strand
0

Assurez-vous qu'il n'y a pas de modifications non enregistrées dans le fichier, puis utilisez cppour effectuer une copie. Cela se traduira par une copie avec les mêmes autorisations que l'original.

Roland Smith
la source