Manter bits de permissão ao escrever um novo arquivo com o VIM

8

No Vim, quando escrevo uma cópia do buffer atual em um novo arquivo usando :w [filename], parece que o Vim usa as permissões de arquivo padrão (isto é, definidas por umask ou qualquer outra coisa) para o novo arquivo. Se o buffer atual foi carregado de um arquivo existente, o comportamento "certo" não deveria ser duplicar as permissões desse arquivo? Por exemplo, se estou editando um arquivo executável e escrevendo uma nova cópia do arquivo, por que o Vim não grava um novo executável ? Existe alguma maneira de forçar o Vim a se comportar da maneira que estou descrevendo, além de fazer algo como ! chmod --reference % [newfilename]depois de escrever o novo arquivo?

Kyle Strand
fonte
Possivelmente relacionados: unix.stackexchange.com/q/58880/22703
allquixotic
Acho que a resposta já está na pergunta - você deve fazer uma macro ou combinação de teclas que faça isso chmodpor você. AFAIK, vim não têm esta embutido.
Kevin Panko

Respostas:

3

Você poderia fazer algo assim. Primeiro, capture o nome do arquivo original.

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

Em seguida, quando você salvar o novo arquivo, altere suas permissões para serem as mesmas do arquivo original.

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

Basta colocar os dois comandos automáticos no seu ~ / .vimrc.

garyjohn
fonte
Esta resposta é incrível, mas tenho uma sugestão: alterar echo system(etc para silent echo system(etc. Isso evita que o "pressione ENTER para continuar" seja interrompido.
Kyle Strand
@KyleStrand: Eu também poderia ter call system(...evitado imprimir qualquer coisa na tela, mas estava tentando evitar o problema do comando falhar silenciosamente. Se você acha que isso nunca vai falhar, ou prefere conviver com uma falha ocasional do que com um incômodo Press ENTER..., então concordo com a sua sugestão. Eu acho que uma solução melhor, no entanto, seria escrever uma função que captura a saída de system () e a repete apenas se não estiver vazia. Eu fiz isso em plugins e funciona muito bem.
garyjohn
Justo. Eu não entendo muito bem o vimscript, então fiquei apenas em "silêncio" para ver se funcionaria e, quando parecia bom, deixei meu .vimrc assim. Definitivamente, eu preferiria a falha ocasional à persistente Press ENTER,, então acho que vou ficar com silentou usar call. Mais uma vez obrigado pelas sugestões!
Kyle Strand
0

Verifique se não há alterações não salvas no arquivo e use cppara fazer uma cópia. Isso resultará em uma cópia com as mesmas permissões que o original.

Roland Smith
fonte