如何在使用vim创建时设置基于后缀的文件的权限?

如何在使用vim创建时设置基于后缀的文件的权限?,vim,Vim,当我创建一个新的python脚本时,我通常希望它是可执行的。我可以分两步完成:首先使用vim创建文件;使用chmod设置权限。问题是:是否有可能将这两个步骤合并为一个步骤 我希望看到的是:当我从vim创建文件时,它将检查后缀并设置适当的权限(可配置)。我希望它也适用于.sh、.exe等文件。。。谢谢 我使用以下方法;它检查文件的shebang(例如#!/usr/bin/python)而不是文件扩展名 " On the initial save, make the file executable

当我创建一个新的python脚本时,我通常希望它是可执行的。我可以分两步完成:首先使用
vim
创建文件;使用
chmod
设置权限。问题是:是否有可能将这两个步骤合并为一个步骤


我希望看到的是:当我从vim创建文件时,它将检查后缀并设置适当的权限(可配置)。我希望它也适用于.sh、.exe等文件。。。谢谢

我使用以下方法;它检查文件的shebang(例如
#!/usr/bin/python
)而不是文件扩展名

" On the initial save, make the file executable if it has a shebang line,
" e.g. #!/usr/bin/env ...
" This uses the user's umask for determining the executable bits to be set.
function! s:GetShebang()
    return matchstr(getline(1), '^#!\S\+')
endfunction
function! s:MakeExecutable()
    if exists('b:executable') | return | endif
    let l:shebang = s:GetShebang()
    if empty(l:shebang) ||
    \   executable(expand('%:p')) ||
    \   ! executable('chmod')
        return
    endif

    call system('chmod +x ' . shellescape(expand('%')))
    if v:shell_error
        echohl ErrorMsg
        echomsg 'Cannot make file executable: ' . v:shell_error
        echohl None
        let b:executable = 0
    else
        echomsg 'Detected shebang' l:shebang . '; made file executable as' getfperm(expand('%'))
        let b:executable = 1
    endif
endfunction
augroup ExecutableFileDetect
    autocmd!
    autocmd BufWritePost * call <SID>MakeExecutable()
augroup END
“在初始保存时,如果文件有shebang行,则使其可执行,
“例如#/usr/bin/env。。。
“这使用用户的umask来确定要设置的可执行位。
函数!s:GetShebang()
返回matchstr(getline(1),'^#!\S\+'))
端功能
函数!s:MakeExecutable()
如果存在('b:executable')|返回| endif
设l:shebang=s:GetShebang()
如果为空(l:shebang)||
\可执行文件(展开('%:p'))||
\!可执行文件('chmod')
返回
恩迪夫
调用系统('chmod+x'.shellescape(展开('%'))
如果v:shell\u错误
echohl ErrorMsg
echomsg“无法使文件可执行:”。v:shell\u错误
无回声
设b:executable=0
其他的
echomsg“检测到shebang”l:shebang。“;使文件可执行为“getfperm(展开(“%”))
设b:executable=1
恩迪夫
端功能
augroup ExecutableFileDetect
自动驾驶!
autocmd BufWritePost*调用MakeExecutable()
螺旋端

您可以使用getfperm和setfperm实现平台兼容性。似乎这对我来说应该是可行的…我如何才能让它起作用?将此代码段插入我的.vimrc?谢谢。只需将其添加到.vimrc即可。谢谢。但另一个小问题是:似乎它在每次保存文件时都会执行,而不仅仅是在首次保存时执行“.这是已知的吗?虽然目前对我来说这不是一个问题,但我在想,有时候我们确实想让它不可执行。@ingo karkat为什么不
Echorr
?是的,每次都会执行,但在后续的操作中,文件已经可执行了,所以不会发生任何事情。您可以引入缓冲区本地标志来限制首次保存;通过设置它,您还可以避免使文件成为可执行文件。中有一个脚本,它可能很有用,但我还没有设法使它工作。。。