Vimエディタのステータスバーに新しいファイルの権限を表示するには?

Vimエディタのステータスバーに新しいファイルの権限を表示するには?

次のコードを使用すると、既存のファイルに対する権限を取得できます。

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""elsexorumask0777rwxrwxrwx

所有者(0)、グループ(1)、および他のすべての人の権限()に対して、設定()の各読み取り()、書き込み()、および実行()ビットを2確認することを繰り返し()します。対応するビットが設定されている場合、()とがそれぞれ変数に追加されます。 else を追加すると、その操作が許可されていないことを示します。for421and.="r""w""x"c"-"

関連情報