Como posso recuperar o arquivo original de um arquivo .swp?


57

Eu tentei abrir o arquivo .swp usando vie catmas exibe lixo.


Você está usando vi ou vim?
Frabjous

Isso funciona emacs? (ou sublime, nano, ed, etc.)
frank

Respostas:


94
vim -r .swp

Isso entra no modo de recuperação e fornece mais informações. Eu acho que é isso que você quer.

.swX-files são deixados para trás se uma sessão com um arquivo não salvo for morta / travar / outra coisa ruim acontecer. Eles também estão presentes durante o tempo em que um buffer não salvo é aberto em uma sessão do Vim. vim -rlê esses arquivos temporários e recria o conteúdo. Depois de recuperá-lo, salve-o como de costume, por exemplo :w newfilename.


8
Precisamente o que eu estava procurando. Para qualquer outra pessoa, é assim que você recupera arquivos ainda não salvos . Os métodos acima funcionam bem se um arquivo já existe, mas você não pode abrir um arquivo sem nome.
Eric Hu

17

Você não precisa ter o arquivo original para recuperar o arquivo .swp. Basta abrir o arquivo como se ele existisse. O vim procurará o arquivo com a extensão .swp e se oferecerá para recuperá-lo.

por exemplo:

$ ls -a
. .. .test.txt.swp
$ vim test.txt
[...]
Swap file ".test.txt.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

Basta pressionar R para recuperá-lo e: wq o arquivo

Editar: Observe que o arquivo .swp contém apenas as alterações feitas no arquivo (consulte o comentário). Isso significa que você precisará buscar uma cópia recente do arquivo do backup e usar o vim para recuperar as alterações mais recentes. Se você não possui uma cópia de segurança do arquivo, está sem sorte.


2
Você definitivamente precisa ter o arquivo original, sem ele os dados no arquivo .swp são inúteis. Veja ": help swap-file". Há situações em que parece funcionar sem o arquivo original, mas o arquivo .swp armazena apenas as informações alteradas e requer algum ponto de partida para aplicar essas informações durante a recuperação.
Heptite 28/10/10

Você está certo, é claro. Na verdade, eu não sabia disso sobre o vim. Mas é lógico, pois armazenar uma cópia completa do arquivo original seria um grande desperdício. A resposta é: Recupere seu arquivo do backup e use o vim para recuperar as últimas modificações.
Vegar Westerlund

Armazenar o arquivo inteiro em um único swp seria um desperdício, sim, mas vejo um valor potencial na acumulação de arquivos swp (quando ativado). Pelo mesmo motivo, você edita via diff e corrige o original apenas no salvamento explícito, isso faz sentido para mim. se você puder encenar uma sequência de diferenças, gere uma soma parcial (datas anteriores a hoje -> noturnas; noturnas + hoje = atuais) etc. Encontrei ': pre [serve] `no manuel, acho que funciona dessa maneira. De qualquer forma, a linha mais importante é:The original file is no longer needed for recovery.
John P

Parece que funciona - :preservee :set cpoptions=...&deixa um arquivo .swp e .swo no diretório e oferece a recuperação de qualquer um. Usando vim -r <file>você pode escolher entre .swp e .swo. Edições adicionais geram .swn, .swm etc., que parecem ser a soma parcial de swaps até esse ponto. Você pode reverter para a versão que você gosta e editar (~ = fork) ou salvar (~ = stash). Eventualmente, você pode tarar os arquivos de troca, daemonizar seus backups, etc. Eu posso estar errado sobre os detalhes quando se trata de arquivos maiores - não tenho certeza de como isso afeta os arquivos de troca extras - veja abaixo.
John P #

(Continuação) - o buffer carrega os sinalizadores e é o buffer que produz os arquivos de troca; portanto, mesmo que os sinalizadores não sejam definidos na configuração global ou no carregamento automático, eles serão herdados durante a recuperação. Para substituir uma sequência de recuperação por um único arquivo de recuperação, você pode mover a troca que deseja .swp e ocultar o restante. Gostaria de saber mais sobre a sobreposição entre recuperação de arquivos e gerenciamento de sessões do Vim, se alguém puder preencher as lacunas.
John P


7

1 Abra o arquivo de troca .file.swpemvim

2 :recoverrecuperará seu arquivo


7

Depois de ler os comentários de Vegar Westerlund e Heptite, eu queria saber em que momento o vim precisa do arquivo original (ou de um backup) para se recuperar de um arquivo .swp. Aqui está o que fez:

Abri um arquivo de 975 linhas, editei-o na linha 949 (criando um .swparquivo) e encerrei o processo, depois excluí o original. $ vim Original_Fileperguntou se eu queria me recuperar do .swp »> yes; apenas as primeiras 68 linhas e as últimas 34 linhas (começando 8 linhas acima da minha edição) foram realmente recuperadas.

Repeti o teste com arquivos menores: de 20 a 200 linhas, o arquivo .swp continha 100% do conteúdo original . Mas em 300 linhas, apenas as primeiras 68 e 18 últimas linhas (começando 2 linhas acima da minha edição) foram incluídas no arquivo .swp.

Como conclusão, é bom saber que o vim sempre salva o "cabeçalho" e o "fundo" do arquivo nos arquivos .swp. Talvez haja uma configuração para controlar quantas linhas um .swp deve conter?

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.