Mantener bits de permisos al escribir un nuevo archivo con VIM

8

En Vim, cuando escribo una copia del búfer actual en un nuevo archivo usando :w [filename], parece que Vim usa los permisos de archivo predeterminados (es decir, establecidos por umask o lo que sea) para el nuevo archivo. Sin embargo, si el búfer actual se cargó desde un archivo existente, ¿no debería ser el comportamiento "correcto" duplicar los permisos de ese archivo? Por ejemplo, si estoy editando un archivo ejecutable y escribo una nueva copia del archivo, ¿por qué Vim no escribe un nuevo ejecutable ? ¿Hay alguna forma de obligar a Vim a comportarse como lo describo, aparte de hacer algo como ! chmod --reference % [newfilename]después de escribir el nuevo archivo?

Kyle Strand
fuente
Posiblemente relacionado: unix.stackexchange.com/q/58880/22703
allquixotic
Creo que la respuesta ya está en la pregunta: debe hacer una macro o combinación de teclas que lo haga chmodpor usted. AFAIK, vim no tiene esto incorporado.
Kevin Panko

Respuestas:

3

Podrías hacer algo como esto. Primero, capture el nombre del archivo original.

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

Luego, cuando guarde el nuevo archivo, cambie sus permisos para que sean los mismos que los del archivo 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

Simplemente ponga ambos comandos automáticos en su ~ / .vimrc.

garyjohn
fuente
Esta respuesta es increíble, pero tengo una sugerencia: cambiar echo system(etc. a silent echo system(etc. Esto evita que se cuelgue "presione ENTRAR para continuar".
Kyle Strand
@KyleStrand: También podría haber evitado call system(...imprimir cualquier cosa en la pantalla, pero estaba tratando de evitar el problema de que el comando fallara en silencio. Si no crees que alguna vez fallará, o preferirías vivir con el fracaso ocasional en lugar del molesto Press ENTER..., entonces estoy de acuerdo con tu sugerencia. Sin embargo, creo que una mejor solución sería escribir una función que capture la salida del sistema () y la repita solo si no está vacía. Lo hice en complementos y funciona bastante bien.
Garyjohn
Lo suficientemente justo. No entiendo muy bien vimscript, así que me quedé en silencio para ver si funcionaba, y cuando parecía estar bien, dejé mi .vimrc así. Sin duda lo prefiero el fracaso ocasional a la persistente Press ENTER,sin embargo, por lo que creo o me quedo con silento uso call. ¡Gracias de nuevo por las sugerencias!
Kyle Strand
0

Asegúrese de que no haya cambios sin guardar en el archivo y luego úselo cppara hacer una copia. Eso dará como resultado una copia con los mismos permisos que el original.

Roland Smith
fuente