Usando o vim para forçar a edição de um arquivo quando você abriu sem permissões

41

Eu uso o vim para editar um arquivo. Às vezes, esqueço de ter as permissões apropriadas. Eu corro vim e o arquivo como um arquivo somente leitura. Eu posso fazer alterações, mas não posso realmente escrever as alterações. De vez em quando, acabo abrindo um arquivo e fazendo alterações nele, percebo que não o executei no sudo, gritei para mim mesmo, e então force a saída e abri-lo novamente como usuário root.

Existe uma solução para isso? Posso forçar as alterações no arquivo apesar do status somente leitura do arquivo? Posso pelo menos salvar as alterações, executar um diff e mesclar os arquivos juntos?

    
por and0rsk 29.12.2013 / 11:40

4 respostas

63

Parece haver algumas abordagens diferentes, dependendo do seu problema atual:

  1. Somente leitura pelo vi. Se o seu arquivo tiver :set readonly , você pode
    • Use :w! para forçar a gravação ou
    • Emita :set noreadonly e, em seguida, use apenas% normal:w
  2. Um problema permissão ( sudo ): você não pode escrever, mas tem direitos de sudo.
    • Problema: :w !sudo tee % . Isso gravará o buffer em tee , um comando que recebe informações sobre pipe e pode gravar em arquivos. E como tee é executado com poderes sudo, tee pode modificar o arquivo.
  3. Um problema permissão ( não sudo ): você não tem direitos para gravar o arquivo e não tem acesso de administrador.
    • Use :w! ~/tempfile.ext para gravar suas alterações em um arquivo temporário e, em seguida, tome medidas para mover o arquivo temporário para o diretório (envie o arquivo temporário para o proprietário / admin do diretório).

Você pode ler mais sobre isso aqui:

  1. Do StackOverflow
  2. De Geekyboy
  3. da Data Agaric

Atalho

Como é frequentemente o caso # 2 (problema permissão , com sudo ), você pode ao seu /etc/vim/vimrc (ou ~/.vimrc ) o seguinte atalho :

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

Em seguida, você pode digitar :w!! para salvar com os poderes sudo . Não vou explicar aqui, mas as referências acima abrangem muitos atalhos.

    
por 19.07.2014 / 00:15
3

Posso pensar em duas maneiras de fazer isso.

A primeira maneira presume que você possui o arquivo, mas o arquivo é READONLY.

Basta usar o sufixo de ponto de exclamação do vi para o comando de gravação (: w!) para forçar a sobrescrever seu próprio arquivo READONLY. Obviamente, isso pressupõe que você tenha permissão para escrever e executar na pasta atual.

:w!

fará com que o vi substitua o arquivo READONLY original.

A segunda maneira pressupõe que outra pessoa é proprietária do arquivo e você gostaria de salvar suas alterações no arquivo.

Uma maneira de conseguir isso é salvar as alterações feitas no arquivo original como um script ed a partir do vi. Este script ed pode ser aplicado ao arquivo original (ou outros arquivos semelhantes) mais tarde fora do vi com o editor de linha ed.

Uma maneira de salvar a sessão de edição atual como um script ed é passar o nome do arquivo original e o buffer vi editado como entrada padrão para o utilitário diff com a opção de linha de comando --ed, isto é, exibir diferenças como um script ed.

Portanto, assumindo um buffer vi editado, execute o seguinte

:.,$!diff --ed [original_file] -

Isso substitui todas as linhas no buffer atual (., $!) pelo script gerado pelo diff (diff --ed [original_file] -) necessário para converter o arquivo original no conteúdo do buffer atual. Em seguida, queremos salvar este script ed em um local seguro e aplicar o script a uma versão do arquivo original no qual podemos gravar. Então, salve o script em um local gravável, por exemplo, sua pasta de login:

:w ~/my_ed_script

Agora saia do vi e use este script ed para obter o arquivo editado que não pôde ser salvo em primeiro lugar. Aqui está como fazer isso a partir do prompt da linha de comando bash, '$':

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

O que essa sequência de comandos faz em palavras é catenar o script que geramos com diff e ecoa o comando ed write, 'w', para a entrada padrão do ed. Ed, em seguida, aplica esse script à cópia gravável do arquivo original e grava essas alterações de buffer modificadas de volta para o arquivo.

Então, essa é uma maneira de salvar o trabalho realizado no vi em um arquivo que era originalmente propriedade de outra pessoa usando o vi, o diff e o ed.

    
por 30.12.2013 / 01:17
0

Outra possibilidade, para o caso em que você não tem privilégios sudo, é usar :w /somewhere/where/i/have/permissions/foo.txt e, depois, lidar com o problema das permissões, conforme Ryan Fox .

    
por 29.12.2013 / 21:31
0

Só quero cobrir maiúsculas e minúsculas quando não houver permissões de gravação de arquivos.

:!chmod +w %
:w!

Entre o vim irá reclamar sobre mudanças no arquivo (por causa da mudança de flags) - obviamente é seguro ignorá-las

    
por 18.04.2018 / 13:04