Com "wq", "!" pede ao Vim para ignorar o atributo somente leitura. De a documentação :
:wq [++opt] Write the current file and quit. Writing fails when the file is read-only or the buffer does not have a name. Quitting fails when the last file in the argument list has not been edited.
:wq! [++opt] Write the current file and quit. Writing fails when the current buffer does not have a name.
Observe a diferença: sem "!", "falha quando o arquivo é somente leitura ..."; que não se aplica mais com "!".
Por que isso acontece tecnicamente, já que você é o proprietário do arquivo, o Vim pode efetivamente ignorar as permissões nele (na pior das hipóteses, isso pode mudá-los e restaurá-los ). Na prática, o Vim suporta algumas maneiras de escrever arquivos somente para leitura:
- se o diretório for gravável, ele renomeará o arquivo existente (adicionando
~
ao seu nome), criará um novo arquivo, gravará o novo conteúdo nesse arquivo e restaurará as permissões do arquivo original (isso funciona mesmo usuário executando o Vim não é o proprietário do arquivo); - se o diretório não for gravável, ele fará um backup do arquivo em um diretório gravável (
~/tmp
normalmente), alterará as permissões do arquivo para torná-lo gravável, gravará o novo conteúdo no arquivo e restaurará seu arquivo. permissões originais (o único funciona se o usuário que está executando o Vim for o proprietário do arquivo).