在 Vim 中,当我使用 将当前缓冲区的副本写入新文件时:w [filename]
,Vim 似乎使用新文件的默认(即由 umask 或其他设置)文件权限。但是,如果当前缓冲区是从现有文件加载的,那么“正确”的行为难道不应该是复制来自那文件?例如,如果我正在编辑一个可执行文件,并且我写入了该文件的新副本,为什么 Vim 不会写入新的可执行文件? 除了! chmod --reference % [newfilename]
在写入新文件后执行类似操作外,还有什么方法可以强制 Vim 按照我描述的方式运行?
答案1
您可以这样做。首先,捕获原始文件的名称。
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 即可。
答案2
确保文件中没有未保存的更改,然后使用它cp
进行复制。这将产生与原始文件具有相同权限的副本。