Qual é a maneira mais fácil de excluir os arquivos de troca do Vim dos quais eu já me recuperei?


84

Às vezes, o Vim falha e me deixa um arquivo de troca. Fantástico. Em seguida, abro o arquivo que estava editando e o Vim pergunta se eu quero recuperar. Eu faço obrigado. Quando estiver pronto, Vim me diz:

You may want to delete the .swp file now.

Por que sim, eu faço. Como faço isso? Eu imaginei que ele apenas começaria a usar o arquivo de swap antigo como um arquivo de swap novamente e o limparia quando eu saísse, mas isso não é verdade. Ele cria um novo, limpa esse e, quando abro o arquivo novamente, solicita novamente que eu me recupere do primeiro.

Certamente estou perdendo alguma coisa.


Veja aqui vi.stackexchange.com/questions/13518/… "A opção" Excluir "não será exibida se o processo do Vim ainda estiver em execução" e observe o comentário nas sessões do TMUX, ou seja, verifique se o Vim ainda não está em execução. (também, tela GNU) em segundo plano em algum lugar, veja aqui vi.stackexchange.com/questions/13518/…
zenaan

Respostas:


81

Uma maneira um pouco mais simples:

No emulador de terminal:

vim filename

Em seguida, escolha recuperar e, se desejar excluir a troca, escreva (salve) e faça isso no vim:

:e          // no argument needed. It assumes the current buffer.

... e escolha excluir desta vez.

Acabei de descobrir sobre isso e acho que farei isso a partir de agora. Também não substituirei acidentalmente um arquivo de trabalho, se a recuperação estiver corrompida (embora eu nunca tenha tentado isso antes).

Também há dicas relevantes sobre essa questão no Stack Overflow (onde encontrei essa dica).


16
Eu não tenho uma deleteopção, existe apenas: [O] caneta (E) dit (R) ecover (Q) uit (A) bort, o que devo fazer?
Arne

4
@Arne: Pela minha experiência, isso geralmente significa que o arquivo está aberto no momento em outra instância do vim?
miyalys

11
O [D] opção elete só apareceu depois que eu atualizado para Vim 7.4
jmlarson

@ Arne Eu tive o mesmo problema. Mas depois de algum tempo, mais ou menos uma hora, reiniciei o vim e a opção estava disponível. O PC não foi reiniciado nesse período. O vim pode pensar que outro processo do vim está em execução. É por isso que não mostra a opção.
ka3ak

6
Para aqueles que dizem que não vêem uma (D)eleteopção, veja :help swap-exists; quote On Unix this choice is only offered when the process that created the swap file does not appear to be running.Ou seja, talvez você tenha outro processo vim em execução, que está ocultando essa opção. Também pode explicar por que você tem um swparquivo em primeiro lugar!
Lqueryvg 01/04

39

Para limpar TODOS os arquivos de troca do vim em um diretório:

Se você tem certeza de que não precisa de nenhum arquivo de troca do vim em uma árvore de diretórios e deseja se livrar deles, pode usar o seguinte comando no diretório enquanto o vim não estiver em execução (nem mesmo em outra janela ou mesmo em um login diferente) sessão):

find . -type f -name "*.sw[klmnop]" -delete

Algumas inspirações e idéias vieram de Removendo arquivos .swp indesejados nos Grupos do Google. Isto irá apagar todos os arquivos cujos nomes terminam com .swk, .swl, .swm, .swn, .swo, ou .swp na árvore do diretório atual.

Pode não ser o que você deseja, por vários motivos:

  • Como afirmado, ele pesquisa na árvore de diretórios atual  ; ou seja, o diretório atual e todos os subdiretórios, recursivamente. Isso vai além do que a pergunta pede e pode ser considerado um exagero.
  • Como foi dito, ele irá apagar todos os arquivos cujos nomes terminam com .swk, .swl, .swm, .swn, .swo, ou .swp, e não só .swpGary Johnson diz ,

    Além disso, nem todos os arquivos de troca terminam em .swp. Se o Vim precisar criar um arquivo de troca e já existir um terminado em .swp, o Vim usará a extensão .swo para o novo e .swn depois disso. Eu acho que continua apenas ao contrário através do alfabeto. Então, usando algo como

      \*.sw[nop] 
    

    ou mesmo

      \*.sw? 
    

    seria mais completo.

    O autor original deste post diz:

    'klmnop' pode ser um exagero, mas isso geralmente garante que eu recebo todos eles.

  • Por outro lado, pode ser pouco.  rublo sugere

    find . -type f \( -name ".*.s[a-v][a-z]" -o -name ".*.sw[a-p]" \) -delete
    

    que corresponde a todas as extensões de três letras (em minúsculas) que variam de .saaaté .swp. Ele acrescenta: “Cuidado, embora essa seja uma solução mais completa, ela removerá qualquer arquivo de imagem .svg e arquivo flash .swf adobe flash. Você pode querer modificar o regex se você trabalhar com esses arquivos.”Ele também corresponde .sav, .snd(dados de som), .sql, .src, .srt(SubRip formato de vídeo de legenda), e muitas outras extensões comuns.

  • Pode ser um exagero. Como foi dito, ele irá apagar todos os arquivos cujos nomes terminam com .swk, .swl, .swm, .swn, .swo, ou .swp. Mas, aparentemente, os arquivos de troca do vim são geralmente arquivos de "ponto". Se você editar hello.cpp, o arquivo de troca pode ser .hello.cpp.swp. Como mostrado (mas não explicado) na resposta do rouble , é mais seguro excluir apenas os arquivos cujos nomes começam com um ponto; por exemplo, com

    find . -type f -name ".*.sw[klmnop]" -delete
    

14

Tipo ls -aque lista TODOS os arquivos no diretório

digite rm .whatever.your.swpe pressioneenter

É simples assim.

Qualquer arquivo que aparece .na frente é um arquivo oculto e normalmente não é visto.

Lembre-se de que as mudanças são imediatas e permanentes, portanto, tenha cuidado.


4
Isso não é muito simples, no entanto. Eu tenho que sair do Vim, navegar no diretório de troca, lembrar o nome do arquivo e possivelmente decidir se é file.swpou não file.swo. Então eu tenho que voltar para onde eu estava. Bater :eé uma solução muito mais simples.
Peeja

11
ls: cannot access +A: No such file or directory
Jonathan

isto é o que eu preciso
user5510975

7

Btw. alguns plugins fazem isso automaticamente para você: autoswap.vim

da descrição:

  1. O arquivo já está aberto em outra sessão do Vim em alguma outra janela?
  2. Nesse caso, troque para a janela em que estamos editando esse arquivo.
  3. Caso contrário, se o swapfile for mais antigo que o próprio arquivo, basta se livrar dele.
  4. Caso contrário, abra o arquivo somente leitura, para que possamos dar uma olhada e salvá-lo.

6
Alguém pode me dizer por que o vim não pode ter um comportamento sensível por padrão, sem plugins?
Pavel Šimerda 13/08/19

6

Não, AFAIK você não está perdendo nada. Vimcontinua mantendo o arquivo de troca como um backup até que você o exclua explicitamente.

Simplesmente salve, feche e reabra o mesmo arquivo novamente. Você será solicitado (novamente) com

[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it

Agora basta pressionar d:)


11
Realmente? Quero dizer, eu sabia disso. Mas isso é estúpido. Certamente não é "simples".
Peeja

11
A propósito, qual é a diferença entre sair e abortar?
trusktr

5
Não há opção Excluir no meu caso. O que devo fazer? (I salvo, saia, e reaberto)
Paschalis

Você não precisa parar vim primeiro, basta digitar: e <return> depois de ter escolhido "editar qualquer maneira" ou "recuperar" no arquivo, e você terá a opção de excluí-lo
00prometheus

2

O Vim, como a maioria dos comandos do Unix, é simples e explícito, ao invés de assumido e implícito.

Você se recupera com (r). Se você não gostar da recuperação ou a recuperação estiver corrompida, você pode descartá-la. Se você gosta, pode salvar o arquivo. O arquivo de recuperação não foi excluído para você porque isso não é explícito e não estará correto em 100% das situações.

Então, você (r) ecover, (w) rite e (q) uit, edite novamente e escolha (d) elete ou "rm .myfile.js.swp" e edite novamente. Isso é rápido e sempre é, do ponto de vista de Vim, 100% de comportamento correto.


Ok, existe uma maneira de obter o vim para me fornecer o caminho para o arquivo de troca? Estou feliz por executar um segundo comando para excluir o arquivo de swap (na verdade, eu gosto da explicação disso), mas eu gostaria de um comando para excluir o arquivo de swap onde quer que esteja. Por exemplo, eu tenho um diretório swapfile separado. Se dois arquivos abertos tiverem o mesmo nome de base, não posso decidir programaticamente qual é o arquivo de troca correto para o buffer atual.
Peeja

11
É verdade, mas fornecer uma opção simples "Recuperar e excluir" seria bom. Provavelmente também é fácil de implementar. Farei isso algum dia quando terminar de ir à escola, se ainda não tiver sido feito.
trusktr

11
A maioria dos comandos unix é simples, explícita e possui um comportamento padrão sensível. A recuperação do Vim não é simples, o UX é tão ruim quanto no LibreOffice, o comportamento é totalmente errado e o resultado, em muitos casos, é a perda de dados.
Pavel Šimerda 13/08/19

1

Esses arquivos também eram irritantes para mim, mas eu configurei a opção no .vimrc - set noswapfile para evitar que o vim o crie e, em vez disso, mantenha os arquivos na memória.


De acordo com o OP, os arquivos de troca são úteis, portanto, desativá-los pode não ser a melhor opção.
Kusalananda

Não desative os arquivos de troca. Se sua máquina travar, você perderá seu trabalho.
Lqueryvg 01/04/19

Claro que esta opção implica riscos e, como eu sei, esses arquivos de troca foram criados no surgimento dos editores do vi * quando ocorrem falhas com muita frequência. Agora eu poderia dizer que o vim funciona de maneira estável e eles existem como coisa herdada, imho.
Dmitrii

1

Aqui está um regex mais completo para limpar todos os arquivos de troca do vim com base no próprio arquivo gitignore do Github para o Vim

$ find ./ -type f \( -name "\.*\.s[a-v][a-z]" -o -name "\.*\.sw[a-p]" \) -delete

Porém, tenha cuidado, embora essa seja uma solução mais completa, ela removerá todos os arquivos de imagem .svg e arquivos flash .swf adobe. Você pode modificar a regex se trabalhar com esses arquivos.


1

Aqui está um trecho para adicionar .vimrc. Exclui todos os arquivos de troca associados ao buffer de arquivo atual e redefine a extensão de troca.

function! DeleteFileSwaps()
    write
    let l:output = ''
    redir => l:output 
    silent exec ':sw' 
    redir END 
    let l:current_swap_file = substitute(l:output, '\n', '', '')
    let l:base = substitute(l:current_swap_file, '\v\.\w+$', '', '')
    let l:swap_files = split(glob(l:base.'\.s*'))
    " delete all except the current swap file
    for l:swap_file in l:swap_files
        if !empty(glob(l:swap_file)) && l:swap_file != l:current_swap_file 
            call delete(l:swap_file)
            echo "swap file removed: ".l:swap_file
        endif
    endfor
    " Reset swap file extension to `.swp`.
    set swf! | set swf!
    echo "Reset swap file extension for file: ".expand('%')
endfunction
command! DeleteFileSwaps :call DeleteFileSwaps()

Uma vez encontrado o problema, pode-se executar :DeleteFileSwaps Isso é ótimo se combinar com :windoou :tabdocomandos.

:tabdo DeleteFileSwaps 

Mais detalhes : Um arquivo pode ter mais de um arquivo de troca. O motivo porque o arquivo de troca, com extensão de .swp, ainda existe e vimcontinuará criando novos por causa dele. Para descobrir se .swpexiste:

  • Com o arquivo de destino aberto no vim, execute :swpara obter o arquivo de troca atual.
  • Verifique o diretório em que o arquivo de troca atual está contido.
  • Em seguida, verifique se o diretório contém um arquivo de troca com o nome do arquivo aberto e se possui uma extensão .swp.

O trecho acima segue o mesmo processo, mas remove todos os arquivos de troca.

Espero que isto ajude.


0

Do manual :h swap:

Você pode ver o nome do arquivo de troca atual sendo usado com o comando: :sw[apname]


Aviso ... provavelmente esse não é o nome do arquivo que você precisa excluir. Até você excluir o .swparquivo, o :swcomando provavelmente fornecerá o nome do .swoarquivo - que não é o que você deseja excluir.
Lqueryvg 01/04/19

0

se você for solicitado, pressione Dpara excluir o arquivo de troca do arquivo atual.

se você não for, precisará fazê-lo manualmente.

uma maneira alternativa de fazer isso é:

para localizar / pesquisar arquivo:

find | grep ".searchRefineVertTabs.jsp.swp"

e exclua este arquivo:

rm ./.searchRefineVertTabs.jsp.swp

11
Eu estou perguntou, mas a minha escolha é para recuperar . A questão é como excluí-lo logo após a recuperação, pois não é mais necessário. Parece um fracasso do vim não fazer isso por mim. Mas a resposta aceita é o fluxo de trabalho mais limpo que encontrei até agora.
Peeja

-1

Você pode usar,

rm -f .<filename>.<ext>.swp

Exemplo:

rm -f .rc.local.swp

Tecnicamente, isso funciona, mas não é nem de longe tão fácil na resposta atualmente aceita.
Peeja

O Plus <ext>é redundante aqui, pois um nome de arquivo pelo menos no Linux inclui zero ou mais extensões.
Pavel Šimerda 13/08/19
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.