Como detectar se os arquivos swp contêm alterações não salvas?

11

Ao editar o código-fonte usando o gvim (v.7.4.488), quero confirmar algumas alterações no vcs (estou usando o git 2.1.4 na linha de comando no Ubuntu linux).

git --status

mostra quais arquivos eu alterei. No entanto, ele também mostra o vim .*.swpdo (s) buffer (s) atualmente visível (s), se o arquivo contiver alterações não salvas e quando o arquivo editado for igual ao arquivo .*.swp-file. Obviamente, o git pode ignorar esses arquivos ou o vim pode armazenar os arquivos de troca em um local diferente (consulte vim.wikia ou esta pergunta no stackoverflow ). Mas eu gosto que os .*.swparquivos - apareçam git --statusquando contêm alterações não salvas, pois isso indica que estou enviando arquivos em um estado diferente daquele em que eles estão.

Como posso evitar que os falsos positivos de .*.swp-files apareçam git --statusquando o arquivo salvo é o mesmo que .*.swp-file, enquanto posso ver que o arquivo a ser confirmado está em um estado diferente daquele que estou editando com o vim?

  • É possível ter apenas .*.swp-files quando o arquivo no disco e o arquivo no vim são diferentes?
  • Existe outra maneira de detectar arquivos não salvos?

Combinar os comentários de @elyashiv e @VanLaser resulta em um método mais simples do que detectar se os arquivos de troca implicam arquivos não salvos:

  1. não deixe o git ignorar os arquivos. *. sw [po];
  2. ao confirmar, se git --statusrevela algum .*.sw[po]arquivo -fazer a :wano vi; e,
  3. adicionar e confirmar.
Kasper van den Berg
fonte
1
você pode usar :wapara garantir que não haja arquivos não salvos.
Elyashiv
2
realmente, é muito "mais saudável" para garantir que todos os seus arquivos são salvos antes de git commit...
VanLaser

Respostas:

8

vim -rna linha de comando, listará todos os arquivos de troca no diretório atual e nos diretórios temporários e se eles contêm alterações não salvas. Procure a linha que diz modified: no/YES.

Não sei como dizer ao Vim para procurar em um diretório diferente; portanto, você precisará mudar para cada diretório que contém um arquivo de troca e executar vim -r. Você pode criar um script que analise a saída git statusou use find -name '.*.sw[po]'e execute vim -rem cada diretório para mostrar todos os arquivos de troca com alterações não salvas.

(Eu uso em .*.sw[po]vez de .*.swp, porque às vezes os .swoarquivos são criados além dos .swparquivos, quando você edita um arquivo que já possui um arquivo de troca. Os .swnarquivos também podem ser criados se você editar um arquivo com dois arquivos de troca existentes, mas acho que Eu já vi um na natureza. Se você é realmente paranóico, pode usar .*.sw[a-p]ou simplesmente .*.sw?.)

Consulte :help -r(um pouco) mais informações sobre a -ropção ou :help recover.txtmais informações sobre recuperação e troca de nomes de arquivos.

Lithis
fonte
1
Bem, os arquivos de permuta do Vim são arquivos ocultos ( .à frente do nome do arquivo), portanto o padrão correto seria .*.sw[a-p](embora em casos patológicos, você possa realmente chegar até lá .foo.saa). Isso também deve impedir a correspondência de arquivos Flash, pois duvido que esses normalmente sejam um arquivo oculto.
jamessan
@jamessan A liderança .é necessária em um shell glob, mas *.swpfunciona como argumento para find. Mas a liderança .torna as coisas mais simples. Obrigado!
Lithis 10/08/15
8
  • É possível ter apenas .*.swp-files quando o arquivo no disco e o arquivo no vim são diferentes?

Sim. O trecho abaixo (adaptado do vimrc do tpope ) desativará o arquivo de troca para um buffer quando não for modificado, portanto, os arquivos de troca existem apenas para arquivos modificados.

autocmd CursorHold,BufWritePost,BufReadPost,BufLeave *
  \ if isdirectory(expand("<amatch>:h")) | let &swapfile = &modified | endif

Advertência : Como o arquivo de troca existe apenas quando o buffer é modificado, você perde o uso do arquivo de troca como um bloqueio consultivo. Se o buffer não for modificado, outro Vim poderá começar a editá-lo sem aviso prévio que ele já está aberto. Se o segundo Vim salvar antes que o primeiro faça mais alterações, elas não serão notadas até que o usuário tente salvar ou algo acione o Vim para verificar se o arquivo foi modificado.

jamessan
fonte