Mantenere i bit delle autorizzazioni quando si scrive un nuovo file con VIM


8

In Vim, quando scrivo una copia del buffer corrente su un nuovo file utilizzando :w [filename], sembra che Vim utilizzi le autorizzazioni predefinite (ovvero impostate da umask o altro) per il nuovo file. Se il buffer corrente è stato caricato da un file esistente, tuttavia, il comportamento "giusto" non dovrebbe essere quello di duplicare le autorizzazioni da quel file? Ad esempio, se sto modificando un file eseguibile e scrivo una nuova copia del file, perché Vim non scrive un nuovo eseguibile ? C'è un modo per forzare Vim a comportarsi come sto descrivendo, oltre a fare qualcosa di simile ! chmod --reference % [newfilename]dopo aver scritto il nuovo file?



Penso che la risposta sia già nella domanda: dovresti creare una macro o una combinazione di tasti che lo faccia chmodper te. AFAIK, vim non ha questo integrato.
Kevin Panko,

Risposte:


3

Potresti fare qualcosa del genere. Innanzitutto, acquisisci il nome del file originale.

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

Quindi, quando si salva il nuovo file, modificare le autorizzazioni in modo che siano uguali a quelle del file originale.

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 inserire entrambi questi autocomandi nel tuo ~ / .vimrc.


Questa risposta è fantastica, ma ho un suggerimento: cambia echo system(ecc in silent echo system(ecc. Ciò evita il blocco "premere INVIO per continuare".
Kyle Strand,

@KyleStrand: avrei potuto call system(...evitare di stampare qualsiasi cosa anche sul display, ma stavo cercando di evitare che il problema del comando fallisse silenziosamente. Se non pensi che fallirà mai, o preferiresti convivere con il fallimento occasionale piuttosto che con il fastidio Press ENTER..., allora sono d'accordo con il tuo suggerimento. Penso che una soluzione migliore sarebbe scrivere una funzione che catturi l'output di system () e lo faccia eco solo se non è vuoto. L'ho fatto nei plugin e funziona abbastanza bene.
Garyjohn,

Giusto. Non capisco molto bene il vimscript, quindi mi sono semplicemente bloccato in "silenzio" per vedere se avrebbe funzionato, e quando sembrava andare bene ho lasciato il mio .vimrc in quel modo. Preferirei sicuramente il fallimento occasionale al persistente Press ENTER,, quindi penso che mi atterrerò silento utilizzerò call. Grazie ancora per i suggerimenti!
Kyle Strand,

0

Assicurarsi che non vi siano modifiche non salvate nel file, quindi utilizzare cpper effettuare una copia. Ciò comporterà una copia con le stesse autorizzazioni dell'originale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.