Até onde sei, não existe uma função do Vim que realize o que você está pedindo. Mas eu inventei minha função s:Get_file_perm
cujo resultado atribui à variável w:file_perm
:
" ...
let w:file_perm=<sid>Get_file_perm()
" ...
function! s:Get_file_perm()
let a=getfperm(expand('%:p'))
if strlen(a)
return a
else
let b=printf("%o", xor(0777,system("umask")))
let c=""
for d in [0, 1, 2]
let c.=and(b[d], 4) ? "r" : "-"
let c.=and(b[d], 2) ? "w" : "-"
let c.=and(b[d], 1) ? "x" : "-"
endfor
return c
endif
endfunction
A função verifica ( if
) para ver se existem as permissões ( getfperm
) para o caminho do arquivo atual ( '%:p'
) ( strlen
). No caso de um novo arquivo ( ""
), o else
-block bit a bit subtrai ( xor
) o octal umask
do literal octal 0777
( rwxrwxrwx
) - todos os bits de permissão definidos.
Para o proprietário- ( 0
), group- ( 1
) e permissões para outros ( 2
) iterativamente ( for
) verifica cada read- ( 4
), write- ( 2
) e execute ( 1
) bit que está definido ( and
). Se o bit correspondente for definido, ele anexará ( .=
) "r"
, "w"
e "x"
à variável c
, respectivamente. Outro "-"
é anexado para simbolizar que a respectiva operação não é permitida.