Como exibir as permissões de um novo arquivo na linha de status do editor Vim?

3

Com o seguinte trecho de código, recebo as permissões para um arquivo existente:

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}

Infelizmente, a função getfperm retorna a string vazia ( "" ) para o caminho do arquivo atual ( '%:p' ), se ele não existir. Eu esperava que as permissões de arquivo fossem calculadas a partir do umask .

    
por Tim Friske 12.12.2012 / 18:46

1 resposta

1

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.

    
por 12.12.2012 / 18:46