Como se livrar dos avisos ao abrir um arquivo que possui um arquivo .swp?

46

Como posso me livrar dos avisos irritantes quando abro um arquivo que possui um arquivo .swp? Ou, como eu não gero os arquivos .swp? Exemplo de aviso:

E325: ATTENTION
Found a swap file by the name ".notes.swp"
          owned by: james   dated: Fri Dec  3 17:38:07 2010
         file name: ~james/school/se/project-dir/rottencucumber/doc/notes
          modified: no
         user name: james   host name: james-laptop
        process ID: 2251 (still running)
While opening file "notes"
             dated: Fri Dec  3 18:46:10 2010
      NEWER than swap file!

(1) Another program may be editing the same file.
    If this is the case, be careful not to end up with two
    different instances of the same file when making changes.
    Quit, or continue with caution.

(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r notes"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".notes.swp"
    to avoid this message.

Swap file ".notes.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
James
fonte

Respostas:

44

Essa mensagem é realmente muito importante se você se preocupa em não perder o texto que não salvou. Ele deve não ser considerado irritante, e deve não causar-lhe para apagar rapidamente o arquivo de swap ou configure vima correr sem ele.

Qualquer arquivo com o qual você editar vimterá um arquivo de troca correspondente enquanto você edita , vimusado para acompanhar as alterações. Quando você parar de editar um arquivo, vimdescartará automaticamente o arquivo de troca correspondente. Portanto, a existência de um arquivo de troca e sua tentativa de gravar sobre o arquivo original devem ser motivo de consideração e ação apropriada.

Os dois cenários apresentados na mensagem ( E325: ATTENTION Found a swap file) são bastante comuns: (1) qualquer outro vimprograma está editando o mesmo arquivo que você está tentando editar (que poderia realmente ser outra pessoa - caso em que realmente não faria sentido excluir apenas cegamente o arquivo de troca - ou pode ser você em outra janela ou guia do terminal) ou (2) uma vimsessão anterior travou (na maioria das vezes isso acontece quando você está editando remotamente e a sessão de rede é cortada), na qual caso a sessão vim não tenha sido encerrada normalmente e o .swparquivo permaneça atrasado; outro exemplo desse segundo cenário é que você acidentalmente fechou a janela ou guia do terminal que possuía uma vimsessão ativa ou em segundo plano ).

Quando encontro essa mensagem, penso primeiro se estou editando esse arquivo em outra janela ou guia do terminal, pois normalmente opero com várias janelas do terminal com várias guias cada:

insira a descrição da imagem aqui

Se eu perceber que estou editando em outro local e puder retornar a ele , pressione a qtecla para (Q)uitesta sessão adicional e retornarei à edição pela vimsessão original .

Às vezes, se não tiver certeza, (Q)uitcorro jobspara verificar se estou executando vimexatamente no mesmo terminal; se nada acontecer, corro ps -ef | grep vimpara verificar se estou executando em vimoutro local (ou seja, em outra janela ou guia do terminal). O ponto é que sempre tento retomar a edição através da vimsessão original .


Se tiver certeza de que não posso retornar à sessão de edição original e ainda assim me apresentarem as seguintes opções, pressione rpara (R)ecover.

Swap file ".notes.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:

Pressionando r, você verá uma mensagem como esta:

Swap file ".notes.swp" already exists!
"notes" 18L, 46C
Using swap file ".notes.swp"
Original file "/private/tmp/notes"
Recovery completed. Buffer contents equals file contents.
You may want to delete the .swp file now.

Press ENTER or type command to continue

Se, por outro lado, não estiver mais com essas opções, porque estou no prompt do shell, então corro vimcom a -ropção, da seguinte maneira:

vim -r notes

A mensagem resultante será semelhante:

Using swap file ".notes.swp"
Original file "/private/tmp/notes"
Recovery completed. Buffer contents equals file contents.
You may want to delete the .swp file now.

Press ENTER or type command to continue

De qualquer forma, pressione ENTERpara continuar e você verá seu arquivo.

Nota: Se o Vim tiver dúvidas sobre o que encontrou, ele emitirá uma mensagem de erro e inserirá linhas com "???" No texto. Se você vir uma mensagem de erro durante a recuperação, procure no arquivo "???" para ver o que está errado. Você pode recortar e colar para obter o texto necessário.

A observação mais comum é "??? LINHAS AUSENTES". Isso significa que o Vim não pode ler o texto do arquivo original. Isso pode acontecer se o sistema travar e partes do arquivo original não forem salvas.

Dito isto, nunca vi essas ???marcas, portanto essa deve ser uma ocorrência verdadeiramente rara .


Em seguida, salve (ou seja, escreva) o conteúdo em outro arquivo (normalmente apenas adiciono "2" ao final do nome do arquivo original):

:w notes2

Em seguida, saia da força nesta vimsessão:

:q!

Em seguida, compare os dois arquivos:

diff notes notes2

Se o valor diffnão retornar nada , isso significa que não há diferença e é seguro remover o arquivo de permuta e o segundo arquivo:

rm .notes.swp notes2

Nesse ponto, abra o arquivo original e continue como se nunca houvesse um problema:

vim notes

Se o valor diffretornar algo , isso significa que o arquivo original (via arquivo de troca) teve alterações que, graças à recuperação, foram salvas no segundo arquivo.

Como essas alterações são capturadas no segundo arquivo, é seguro excluir o arquivo de troca e substituir o arquivo original pelo segundo:

rm .notes.swp
remove .notes.swp? y

mv notes2 notes
overwrite notes? (y/n [n]) y

Nesse ponto, abra o arquivo original e continue como se nunca houvesse um problema:

vim notes

Parece muito trabalho, mas depois que você se acostuma com o fluxo de trabalho, leva 20 segundos no máximo.

user664833
fonte
2
Não posso acreditar que esta não é a resposta aceita. É perfeito. +1
David
muito melhor do que a resposta aceita. Gostaria que tivéssemos uma maneira de resolver isso!
precisa
1
Nem sempre é o caso de a mensagem ser útil. Se estou editando um arquivo, me importo se o arquivo foi alterado desde que comecei a editar , no momento em que tento salvá-lo , não se também estou editando em outra janela do vim. É perfeitamente bom abrir um arquivo em dois terminais, desde que os salvos no arquivo não sejam intercalados. O Vim só precisa me incomodar quando tento salvar, não quando o abro.
Ken Simon
Infelizmente, isso não responde à pergunta, apenas diz que não devo ignorar a tela do nag. MEU cenário é que eu já abri o arquivo no vim (talvez para edição), quero ver diferentes partes do arquivo ao mesmo tempo lado a lado e não quero buffers divididos porque clang_complete continua redimensionando os buffers . Nesse caso, eu realmente quero saber como abrir um arquivo somente leitura no Vim e fazer com que ele ignore o arquivo de troca.
Lelanthran
@Lelanthranvim -n file_name
user664833 de
19

A mensagem colada sugere que você ainda tem o arquivo "notes" aberto em outra sessão do Vim. Definitivamente, não é uma boa ideia editar um arquivo que está sendo editado em outro lugar.

Se essa mensagem estiver errada, você precisará determinar como sua sessão do Vim saiu incorretamente e evitá-la no futuro.

Quanto à recuperação, isso pode ser um problema nesta instância, pois "notes" é mais recente que o arquivo .swp do Vim associado a ele, mas você ainda pode tentar. Apenas certifique-se de copiar o arquivo "notas" para um local de backup primeiro.

Seria uma boa ideia ler " :help recover.txt".

A lição aqui é que você não deveria estar vendo esta mensagem e que significa que algo deu errado em algum lugar. (Provavelmente) não é culpa do Vim.

Se, nesse ponto, você ainda estiver absolutamente determinado a não permitir que o Vim crie arquivos .swp para poder se recuperar de falhas e outros problemas relacionados, você pode " set noswapfile" inserir ~/.vimrc.

Heptite
fonte
1
SEJA CUIDADOSO! Eu quase perdi todo o meu trabalho brincando com o VIM. Copie seu código antes de tentar qualquer coisa.
precisa saber é o seguinte
Eu sugiro fortemente que os leitores rever a resposta por user664833 ( Esta mensagem é realmente muito importante ... ) como eu acho que dá muito melhor informatgion e conselhos que esta resposta imho
Michael Durrant
11

Você pode usar -n para abrir o vim sem usar um arquivo de troca :

Para fazer isso o tempo todo, basta colocar

alias vim='vim -n' 

no seu arquivo .bashrc ou .bash_aliases

se você precisar executar o vim sem a opção -n, basta executar

\vim
Brad Parks
fonte
3
Eu não recomendaria sempre executar sem um arquivo de troca, mas "-n" é exatamente o que eu precisava. Eu uso um arquivo de troca, normalmente. No entanto, ao usar o Vim como uma ferramenta diff, eu gostaria de poder visualizar diferenças de arquivos que estou editando sem que essas diferenças me transmitam essa mensagem ou interfiram no meu arquivo de troca.
Agentlien 14/07/2015
1
Eu gosto desta resposta - é curta, precisa e responde à pergunta real!
Lelanthran
2

O vim removerá o arquivo .swp gerado quando você o sair corretamente.

Ignacio Vazquez-Abrams
fonte
1

Como posso me livrar dos avisos irritantes quando abro um arquivo que possui um arquivo .swp?

Use a opção de mensagem curta em seu ~/.vimrc:

set shortmess=A

Qual também é o padrão ao executar o modo POSIX.

No entanto, não faça isso : é como remover os airbags do seu carro para aumentar a eficiência de combustível. A longo prazo, você gastará mais tempo se recuperando do que nunca, respondendo à pergunta.

bispo
fonte
1
Assumindo um sistema de usuário único, não é uma configuração tão horrível. Eu gosto de ter muitas abas de terminal abertas e, às vezes, quero editar um arquivo que já enterrei em outra aba. Se eu quiser fazer algumas edições rápidas, tudo bem. Se eu me encontrar de volta na outra janela vim, a beleza é que ele vai me avisar em seguida que o arquivo foi alterado antes de salvá-lo, e eu posso fazer uma rápida :epara ver o que aconteceu (incluindo um rápido upara trás desfazer o que Eu tinha no buffer.) Eu gosto muito mais do que ficar chateado por já ter um arquivo aberto.
Ken Simon
1

Isso aconteceu comigo quando meu terminal inesperadamente fechou minha conexão com o vi open.

Felizmente, não tive alterações perdidas.

Para remover esse aviso e descartar a troca:

  1. Encontre o ID de processo de olhar para process ID: 2251 (still running), neste caso, é 2,251
  2. Verifique se você obteve o ID certops 2251
  3. Mate o processo usandokill 2251

E é isso.

Lembre-se de que os arquivos de troca existem para protegê-lo, e você não deve desativá-los completamente.

kintsukuroi
fonte
Mas e se não houver vi(m)processo?
Scott
-2

Resolvi esse problema em três etapas simples:

1 :) Execute "ls -la" onde o arquivo existe para que você possa visualizar o arquivo .swp para o mesmo.

2 :) Agora "rm -i * .swp", ou seja, remova o arquivo ".swp" do diretório.

3 :) Agora confirme se o arquivo ".swp" foi removido.

4 :) Agora aproveite esses avisos.

Ankur Srivastava
fonte
3
Por que no mundo você recomendaria rm -rfremover um arquivo? I substituído -rfcom um mais sensato-i
Nifle