Como funciona o `: w! Sudo tee%`

27

Se você abrir um arquivo no qual você não tem permissão para gravar no vim, e decidir que precisa alterá-lo, poderá gravar suas alterações sem sair do vim, :w !sudo tee %
não entendo como isso pode funcionar. Você pode dissecar isso?
Eu entendo a :wparte, ele grava o buffer atual no disco, assumindo que já existe um nome de arquivo associado a ele, certo?
Eu também entendo o !que executa o sudo teecomando e %representa o conteúdo atual do buffer, certo?
Mas ainda não entendo como isso funciona.

Todos
fonte

Respostas:

30

A estrutura :w !cmdsignifica "escreva o buffer atual canalizado através do comando". Então você pode fazer, por exemplo, :w !cate ele irá canalizar o buffer cat.

Agora %é o nome do arquivo associado ao buffer

Então :w !sudo tee %, canalizará o conteúdo do buffer sudo tee FILENAME. Isso efetivamente grava o conteúdo do buffer no arquivo.

Stephen Harris
fonte
2

Não muito certo!

!commandexecuta o comando como um comando de filtro , que obtém texto stdin, faz alguma coisa e envia para stdout.

Ao usar w, você empurrou o conteúdo do arquivo para stdinde sudo tee %. %é um registro especial no vim, que contém o nome do arquivo atual.

Então você conseguiu sudo tee FILENAME, que enviará o tee stdinconteúdo do arquivo para o arquivo atual.

cuonglm
fonte
2
:!commandé um filtro (cf. :h !), enquanto :w !commandnão é, apenas é executado commandcom o arquivo atual como stdin(cf. :h :w_c). Ou seja: :w !sed /./dnão altera o conteúdo do buffer atual. Mas a receita é realmente não muito bem por outra razão, %precisa ser escapado: :exec 'w !sudo tee ' . shellescape(expand('%', 1)). O comando original não funciona com, por exemplo, nomes de arquivos com espaços.
Satō Katsura