vim ustawia domyślne zapisywanie bufora po otrzymaniu sygnału TERM

1

Używam wielu wystąpień vima. Obecnie używam funkcji bash

kv(){ a=($(pgrep vim)); kill ${a[@]}; }  

aby zakończyć wszystkie działające instancje vima. Ma to tę wadę, że pozostawia nierozstrzygnięte pliki .swp wszędzie tam, gdzie vim został zabity niezapisanymi zmianami. Czy istnieje sposób na ustawienie vima, aby zapisywał swoje bufory, jeśli zostanie wysłany sygnał zabicia?

użytkownik985675
źródło
Nie próbowałem ten sam, więc ja nie czy to zrobi, co trzeba, ale :help VimLeavei :help v:dyingsugerują, że zdarzenie VimLeave jest wyzwalany ilekroć wyjścia Vima, nawet ze względu na sygnale.
garyjohn

Odpowiedzi:

2

Nie możesz specjalnie uwięzić sygnału TERM, ale możesz „złapać” prawie każdy sygnał, który daje Vimowi szansę na pełne wdzięku wyjście. Zobacz przykład w:

:help v:dying

Możesz zmodyfikować :echopolecenie w tym przykładzie do czegoś podobnego :wqall(patrz „ :help :wqall”).

Nie polecam tego jednak. Możesz łatwo zapisać plik (nad), gdy nie chcesz, aby tak się stało.

Heptyt
źródło
Dziękuję wam obojgu za pomoc i na siłę: dodałem elementy pomocy
user985675
0

Myślę, że nie można zapisywać buforów VimLeave. Wypróbowałem poniższy kod

autocmd VimLeave * :!touch ~/logs/vim-leave
autocmd VimLeave * :wall

Ten kod pomyślnie touchplik, ale nie zapisuje buforów. Znalazłem ten wątek z listy mailingowej vim

Vim wywołuje funkcję deathtrap (), która zamyka wszystkie bufory, a następnie wywołuje getout (), w której przetwarzane są wszystkie polecenia automatyczne (BufWinLeave, BufUnLoad, VimLeavePre i wreszcie VimLeave). Ale do tego czasu nie można już zabezpieczyć żadnych buforów.

Zanim Vim poradzi sobie z zabójczym sygnałem, nie będzie już wywoływał niebezpiecznych funkcji (np. Przydzielania pamięci), więc wątpię, czy uda się osiągnąć to, co chcesz.

Sanghyun Lee
źródło