通过以下代码,我获得了现有文件的权限:
augroup Get_file_perm
autocmd!
autocmd BufWinEnter,FileChangedShell * let w:file_perm=getfperm(expand('%:p'))
augroup END
" Output, e.g.: rw-rw-r--
set statusline=%{w:file_perm}
不幸的是,如果当前文件路径 ( ) 不存在,该getfperm
函数将返回空字符串 ( )。我原本期望从.""
'%:p'
umask
答案1
据我所知,不存在可以完成您所要求的功能的 Vim 功能。但我想出了我的s:Get_file_perm
函数,我将其结果分配给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
该函数检查 ( ) 以查看当前文件路径 ( ) 的if
权限 ( ) 是否存在 ( )。对于新文件 ( ),-block 按位从八进制文字( ) 中减去 ( ) 八进制——所有权限位均已设置。getfperm
'%:p'
strlen
""
else
xor
umask
0777
rwxrwxrwx
对于所有者 ( 0
)、组 ( 1
) 和其他人的权限 ( 2
),它会迭代 ( ) 检查设置 ( )for
的每个读 ( 4
)、写 ( 2
) 和执行 ( ) 位。如果设置了相应的位,则会分别将 ( )和附加到变量。附加else表示不允许相应的操作。1
and
.=
"r"
"w"
"x"
c
"-"