Bloqueando alterações no arquivo somente leitura

14

Ao usar o Vim para editar um arquivo somente leitura, ele fornecerá apenas um aviso na primeira vez em que for editado, mas permitirá que ocorram alterações. Entendo que esse comportamento pode ser útil para alguém que pretenda salvar o arquivo com outro nome; mas às vezes abro arquivos aos quais não tenho acesso de gravação, depois esqueço e faço alterações.

É possível entrar em um modo em que o Vim permita a visualização do arquivo, mas bloqueie qualquer opção que faça alterações?

ZeroKelvinKeyboard
fonte

Respostas:

13

Eu encontrei uma solução. A configuração nomodifiableimpede que o arquivo seja editado (conforme usado nas janelas de ajuda). Eu criei uma função simples para definir ou desmarcar, modifiabledependendo se readonlyestá definido e anexado a um autocmd.

" Don't allow editing of read only files
autocmd BufRead * call RONoEdit()

function! RONoEdit()
  if &readonly == 1
    set nomodifiable
  else
    set modifiable
  endif
endfunction
ZeroKelvinKeyboard
fonte
4
Você pode let &modifiable = !&readonly
reduzi
@Carpetsmoker Muito melhor como um forro, obrigado! No entanto, ainda teria que ser: autocmd BufRead * let &modifiable = !&readonly
ZeroKelvinKeyboard
Com isso, depois de abrir um readonlyarquivo e criar um novo buffer, o novo buffer termina nomodifiable.
Praxeolitic
Obrigado por apontar isso, eu não tinha notado. Não sei como testar um novo buffer.
ZeroKelvinKeyboard
1
@Praxeolitic: Acabei de postar uma resposta que deve resolver isso, deixe-me saber se funciona.
S4y
7

Adicione isso ao seu .vimrc:

autocmd BufRead * let &l:modifiable = !&readonly
s4y
fonte
Isso se baseia na resposta do @ ZeroKelvinKeyboard para afetar apenas o buffer atual.
s4y
0

Na medida em que as respostas acima estiverem corretas, há outra coisa a ser levada em consideração: desde que o arquivo seja "somente leitura", não haverá como alterar o conteúdo do arquivo, a menos que você seja o proprietário ou tem o direito de tornar esse arquivo gravável. E mesmo assim o vim não grava alterações no arquivo, a menos que você substitua explicitamente o estado "somente leitura" por ": w!".

Se, de fato, você pode editar um arquivo que deveria ser somente leitura, convém verificar novamente os direitos, pode haver uma configuração incorreta de segurança. Se você tornar o vim incapaz de editar o arquivo, outras formas de edição ainda estarão disponíveis; portanto, se o arquivo não for alterado, ele deverá ter os direitos definidos corretamente. No Windows, você pode forçar o arquivo a ser somente leitura, negando explicitamente a alteração a todos, no Linux você pode usar o atributo estendido "imutável" (chattr + i).

mikky
fonte
2
Desculpe se eu não estava muito claro. Esta questão não era sobre alterar acidentalmente um arquivo somente leitura; Eu queria me impedir de editar o buffer de um arquivo para o qual não tinha acesso de gravação. Às vezes, eu abro acidentalmente arquivos de configuração do sistema como um usuário comum e não como usuário root. Nesse caso, não tenho acesso de gravação ao arquivo, portanto, o buffer aparece como somente leitura, mas o Vim ainda permitirá que eu edite o buffer. Quando tento salvar, não posso porque não tenho acesso de gravação. Eu queria que o Vim bloqueasse as alterações no buffer nesse caso.
ZeroKelvinKeyboard
Ah entendo. Tive a ideia de que você queria isso como à prova de falhas. Desconsidere minha resposta então :)
mikky
OP significa que, quando alguém abre um arquivo não somente leitura no sistema operacional, mas atualmente ele / ela não deseja (ou considera apropriado) fazer alterações e deseja se restringir a não fazê-lo. Estou pensando exatamente o mesmo, indo aqui do Google!
Violapterin