Jak wykryć, czy pliki SWP zawierają niezapisane zmiany?

11

Podczas edycji kodu źródłowego przy użyciu gvim (v.7.4.488), chcę wprowadzić pewne zmiany w vcs (używam git 2.1.4 z wiersza poleceń w systemie Ubuntu Linux).

git --status

pokazuje, które pliki zmieniłem. Pokazuje jednak także vim .*.swpaktualnie widocznych buforów (zarówno jeśli plik zawiera niezapisane zmiany, jak i gdy edytowany plik jest taki sam jak .*.swpplik -file). Oczywiście git może zignorować te pliki lub vim może przechowywać pliki wymiany w innej lokalizacji (patrz vim.wikia lub to pytanie w Stackoverflow ). Ale podoba mi się, że .*.swppliki-wyświetlają się, git --statusgdy zawierają niezapisane zmiany, ponieważ sygnalizuje mi, że zatwierdzam pliki w innym stanie niż to, co myślę.

W jaki sposób można uniknąć fałszywych alarmów o .*.swp-files ukazujących się git --statusgdy zapisany plik jest taka sama jak .*.swp-file, będąc w stanie zobaczyć, że plik do popełniania są w innym stanie niż te, które mam do edycji z vim?

  • Czy można mieć tylko .*.swp-files, gdy plik na dysku i plik w vimie są różne?
  • Czy istnieje inny sposób wykrywania niezapisanych plików?

Połączenie komentarzy @elyashiv i @VanLaser daje prostszą metodę niż wykrywanie, czy pliki wymiany oznaczają niezapisane pliki:

  1. nie pozwól gitowi ignorować plików. *. sw [po];
  2. podczas zatwierdzania, jeśli git --statusujawnia jakiekolwiek .*.sw[po]-file, robi :wain in vi; i,
  3. dodaj i zatwierdź.
Kasper van den Berg
źródło
1
możesz użyć, :waaby upewnić się, że nie ma żadnych niezapisanych plików.
elyashiv,
2
tak naprawdę to znacznie „zdrowsze”, aby upewnić się, że wszystkie pliki zostały zapisane przed tobą git commit...
VanLaser

Odpowiedzi:

8

vim -rw wierszu polecenia wyświetli się lista wszystkich plików wymiany w bieżącym katalogu i katalogach tymczasowych oraz informacja, czy zawierają one niezapisane zmiany. Poszukaj linii, która mówi modified: no/YES.

Nie wiem, jak powiedzieć Vimowi, aby szukał w innym katalogu, więc musisz przejść do każdego katalogu zawierającego plik wymiany i uruchomić vim -r. Możesz wymyślić skrypt, który przeanalizuje dane wyjściowe git statuslub użyje go find -name '.*.sw[po]', a następnie uruchomi vim -rw każdym katalogu, aby wyświetlić wszystkie pliki wymiany z niezapisanymi zmianami.

(Używam .*.sw[po]zamiast .*.swp, ponieważ czasami .swopliki są tworzone oprócz .swpplików, gdy edytujesz plik, który już ma plik wymiany. .swnPliki można również utworzyć, jeśli edytujesz plik z dwoma istniejącymi plikami wymiany, ale nie sądzę Widziałem kiedyś jednego na wolności. Jeśli jesteś naprawdę paranoikiem, możesz go użyć .*.sw[a-p]lub po prostu .*.sw?.)

Zobacz :help -r(trochę) więcej informacji na temat -ropcji lub :help recover.txtwięcej informacji na temat nazw plików odzyskiwania i wymiany.

Lithis
źródło
1
Cóż, pliki wymiany Vima są plikami ukrytymi (wiodącymi .w nazwie pliku), więc właściwym wzorem byłby .*.sw[a-p](chociaż w przypadkach patologicznych można faktycznie dostać się do samego końca .foo.saa). To powinno również wykluczać dopasowanie plików Flash, ponieważ wątpię, aby były to zwykle pliki ukryte.
jamessan,
@jamessan Prowadzenie .jest wymagane w globu powłoki, ale *.swpdziała jako argument dla find. Ale prowadzenie .ułatwia sprawy. Dzięki!
Lithis,
8
  • Czy można mieć tylko .*.swp-files, gdy plik na dysku i plik w vimie są różne?

Tak. Poniższy fragment kodu (zaadaptowany z vimrc tpope ) wyłączy plik wymiany dla bufora, gdy nie jest modyfikowany, więc pliki wymiany istnieją tylko dla zmodyfikowanych plików.

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

Zastrzeżenie : Ponieważ plik wymiany istnieje tylko wtedy, gdy bufor jest modyfikowany, tracisz użycie pliku wymiany jako blokady doradczej. Jeśli bufor nie jest zmodyfikowany, inny Vim może rozpocząć jego edycję bez powiadomienia, że ​​jest już otwarty. Jeśli drugi Vim zapisze, zanim pierwszy wprowadzi więcej zmian, nie zostaną zauważeni, dopóki użytkownik nie spróbuje zapisać lub coś sprawi, że Vim sprawdzi, czy plik jest zmodyfikowany.

jamessan
źródło