使用VIM写入新文件时,请保留权限位


8

在Vim中,当我使用写入当前缓冲区的副本到新文件时:w [filename],似乎Vim 对新文件使用默认的文件权限(即,由umask或其他方式设置)。但是,如果当前缓冲区是从现有文件加载的,那么“正确”的行为不应该是从文件复制权限吗?例如,如果我正在编辑可执行文件,并且编写了文件的新副本,那么Vim为什么不编写新的可执行文件?除了只是! chmod --reference % [newfilename]在写入新文件之后做类似的事情,有没有办法强迫Vim表现我所描述的方式?



我认为答案已经在问题中了-您应该创建一个宏或键绑定chmod为您执行此操作。据我所知,Vim没有这个内置的。
凯文Panko

Answers:


3

你可以做这样的事情。首先,捕获原始文件的名称。

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

然后,当您保存新文件时,将其权限更改为与原始文件相同。

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

只需将这两个自动命令都放入〜/ .vimrc中即可。


这个答案很棒,但是我有一个建议:将echo system(etc 更改为silent echo system(etc。这样可以避免“按Enter继续”挂起。
凯尔·斯特兰德

@KyleStrand:我本来也call system(...可以避免将任何内容打印到显示器上,但是我试图避免命令静默失败的问题。如果您不认为它会失败,或者宁愿承受偶尔的失败而不是讨厌Press ENTER...,那么我同意您的建议。我认为,更好的解决方案是编写一个捕获system()输出并仅在不为空的情况下回显该函数的函数。我已经在插件中做到了,并且效果很好。
garyjohn

很公平。我根本不太了解vimscript,所以我只是停留在“静默”中以查看它是否可以工作,并且在看起来还可以的时候,我就这样离开了.vimrc。我肯定会偶尔遇到失败而不是持续失败Press ENTER,,因此我认为我会坚持使用silent或使用call。再次感谢您的建议!
Kyle Strand

0

确保文件中没有未保存的更改,然后用于cp制作副本。这将导致副本具有与原始副本相同的权限。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.