Behalten Sie die Berechtigungsbits bei, wenn Sie eine neue Datei mit VIM schreiben

8

Wenn ich in Vim eine Kopie des aktuellen Puffers mit in eine neue Datei schreibe :w [filename], scheint es, dass Vim die Standard-Dateiberechtigungen (dh durch umask oder was auch immer festgelegt) für die neue Datei verwendet. Wenn der aktuelle Puffer jedoch aus einer vorhandenen Datei geladen wurde, sollte das "richtige" Verhalten nicht darin bestehen, die Berechtigungen aus dieser Datei zu duplizieren ? Wenn ich beispielsweise eine ausführbare Datei bearbeite und eine neue Kopie der Datei schreibe, warum schreibt Vim dann keine neue ausführbare Datei ? Gibt es eine Möglichkeit, Vim zu zwingen, sich so zu verhalten, wie ich es beschreibe, außer einfach so etwas wie ! chmod --reference % [newfilename]nach dem Schreiben der neuen Datei zu tun ?

Kyle Strand
quelle
Möglicherweise verwandt: unix.stackexchange.com/q/58880/22703
allquixotic
Ich denke, die Antwort ist bereits in der Frage - Sie sollten ein Makro oder eine Tastenkombination erstellen, die das chmodfür Sie erledigt . AFAIK, vim hat dies nicht eingebaut.
Kevin Panko

Antworten:

3

Sie könnten so etwas tun. Erfassen Sie zunächst den Namen der Originaldatei.

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

Wenn Sie dann die neue Datei speichern, ändern Sie ihre Berechtigungen so, dass sie mit denen der Originaldatei übereinstimmen.

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

Fügen Sie einfach diese beiden Auto-Befehle in Ihr ~ / .vimrc ein.

Garyjohn
quelle
Diese Antwort ist fantastisch, aber ich habe einen Vorschlag: Ändern echo system(usw. zu silent echo system(usw. Dadurch wird vermieden, dass "ENTER drücken, um fortzufahren" hängt.
Kyle Strand
@KyleStrand: Ich hätte auch call system(...vermeiden können, etwas auf das Display zu drucken, aber ich habe versucht, das Problem zu vermeiden, dass der Befehl stillschweigend fehlschlägt. Wenn Sie nicht glauben, dass es jemals scheitern wird, oder lieber mit gelegentlichem Versagen als mit lästigem leben möchten Press ENTER..., dann stimme ich Ihrem Vorschlag zu. Ich denke jedoch, eine bessere Lösung wäre, eine Funktion zu schreiben, die die Ausgabe von system () erfasst und nur dann wiedergibt, wenn sie nicht leer ist. Ich habe das in Plugins gemacht und es funktioniert ziemlich gut.
Garyjohn
Meinetwegen. Ich verstehe Vimscript überhaupt nicht sehr gut, also blieb ich einfach "still", um zu sehen, ob es funktionieren würde, und als es in Ordnung zu sein schien, ließ ich meine .vimrc einfach so. Ich würde definitiv das gelegentliche Versagen dem hartnäckigen vorziehen Press ENTER,, also denke ich, dass ich entweder dabei bleiben silentoder es verwenden werde call. Nochmals vielen Dank für die Vorschläge!
Kyle Strand
0

Stellen Sie sicher, dass die Datei keine nicht gespeicherten Änderungen enthält, und erstellen Sie dann cpeine Kopie. Dies führt zu einer Kopie mit den gleichen Berechtigungen wie das Original.

Roland Smith
quelle