次のコードを使用すると、既存のファイルに対する権限を取得できます。
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ビット単位は8進数リテラル()から8進数を減算します()。すべての許可ビットがセットされます。getfperm
'%:p'
strlen
""
else
xor
umask
0777
rwxrwxrwx
所有者(0
)、グループ(1
)、および他のすべての人の権限()に対して、設定()の各読み取り()、書き込み()、および実行()ビットを2
確認することを繰り返し()します。対応するビットが設定されている場合、()とがそれぞれ変数に追加されます。 else を追加すると、その操作が許可されていないことを示します。for
4
2
1
and
.=
"r"
"w"
"x"
c
"-"