Jeśli nie jesteś użytkownikiem edytora Vim, to ten artykuł może nie być dla Ciebie. Jeśli jednak ciekawi Cię co chciałbym Ci dziś pokazać to zapraszam do niniejszego artykułu.
Vim
Nie będę w tym artykule rozpisywał się dlaczego jestem użytkownikiem tego edytora. Nie chcę też pisać o jego korzyściach (pomimo tego, że jest to pierwszy artykuł na jego temat).
Chcę Ci powiedzieć jak przyjemnie zaczęło mi się korzystać z edytora, kiedy ustawiłem w konfiguracji pewną opcję. Dzięki jednej linijce konfiguracji dałem sobie kolejny zastrzyk empatii dla tego edytora.
Przechodząc do sedna.
Jestem przekonany, że wiele razy wpadałeś w konsternację kiedy widziałeś / widziałaś (oczywiście nie piszę artykułów tylko do mężczyzn, jednak nie będę za każdym razem pisał obu form) sytuację podobną do tej:
Po co są pliki *.swp
?
Edytor Vim w domyślnej konfiguracji tworzy pliki kopii zapasowej w tym samym katalogu co plik źródłowy. Po to, aby móc przywrócić oryginalną wersję pliku, kiedy np. komputer się wyłączy (np. z powodu braku amunicji w baterii).
Z jednej strony jest to sympatyczne, bo wiesz gdzie jest taki plik z kopią. Jednak z drugiej strony widzisz “prawie”1 zawsze zdublowaną strukturę plików, kiedy otworzysz np. kilka instancji edytora.
Jak sobie poradzić?
Możemy ustawić, aby edytor zapisywał pliki z backupami gdzieś indziej,
np. w katalogu z konfiguracjami edytora - w katalogu domowym użytkownika
tj. ~/.vim/swp/
.
Wskazówka
Przed dodaniem magicznej linijki, zobacz co aktualnie kryje się pod zmienną
directory
wydając polecenie (w otworzonym edytorze):
set directory
# albo
echo &directory
Dla przykładu mój wynik:
directory=.,~/tmp,/var/tmp,/tmp
Jeśli chciałbyś dopisać katalog na początek listy to możesz to zrobić za pomocą polecenia:
set directory^=$HOME/.vim/swp/
# Poskutkuje to zmianą wartości w zmiennej "directory" na:
directory=$HOME/.vim/swp/,.,~/tmp,/var/tmp,/tmp
Aby dopisać na koniec listy, wykorzystaj operator +=
, np.
set directory+=$HOME/.vim/swp/
# Poskutkuje to zmianą wartości w zmiennej "directory" na:
directory=.,~/tmp,/var/tmp,/tmp,$HOME/.vim/swp/
Druga opcja nie rozwiąże problemu. Edytor
będzie sprawdzał, czy może zapisać pliki tymczasowe w kolejnych katalogach.
Zacznie od .
, czyli od katalogu w którym edytowany jest plik.
Czy mogę wyświetlić moje pliki tymczasowe?
Oczywiście. Uruchom narzędzie, które jest schowane pod przełącznikiem -r
:
Copy + paste
vim -r
Polecenie przeszukuje katalogi (ustawione w zmiennej directory
)
oraz prezentuje stan plików o rozszerzeniu .swp
.
Kiedy narzędzie nie znajdzie nic, zwróci coś w tym stylu:
Swap files found:
In directory ~/.vim/swp/:
-- none --
In current directory:
-- none --
In directory ~/tmp:
-- none --
In directory /var/tmp:
-- none --
In directory /tmp:
-- none --
Ups… mamy problem
W tej sytuacji w katalogu ~/.vim/swp/
edytor będzie tworzyły pliki z
prefiksem kropki (.
) oraz z rozszerzeniem .swp
.
Gdy głębiej się zastanowisz, to sytuacja nie przewiduje pewnego przypadku.
Co jeśli będę chciał edytować dwa pliki
index.html
?
Czy utworzą się wtedy dwa pliki.index.html.swp
?
Nie. No bo jakim cudem mogły by istnieć dwa pliki o tej samej nazwie w tym samym katalogu?
Naszym oczom ukaże się błąd w stylu:
E325: ATTENTION
Found a swap file by the name "~/.vim/swp/index.html.swp"
...
Edytor da nam możliwość przywrócenia poprzedniej wersji pliku - tej przed otworzeniem.
Więcej na temat błędu znajdziesz w pomocy
:h e325
.
Co teraz? Czy nie będę mógł edytować dwóch plików index.html
?
Spokojnie. Wystarczy drobna poprawka i będzie śmigać.
Dodaj “slesza” (/
) do Twojej ścieżki. Vim rozpozna, że chcesz by pliki
tymczasowe posiadały w nazwie strukturę katalogów w której się znajdują. Tym
samym unikniesz kolizji!
Poprawne ustawienie katalogu z plikami tymczasowymi:
set directory^=$HOME/.vim/swp//
Dodaj powyższą linijkę do pliku ~/.vimrc
.
Droga na skróty
Jeśli chcesz mieć święty spokój to najlepiej jest uruchomić Vima z opcją
-n
. Opcja ta powoduje, że plik tymczasowy nigdy nie zostanie stworzony
przez uruchomioną instancję programu. Tym samym nigdy nie będziesz mieć
możliwości przywrócenie stanu pliku do poprzedniego. Coś za coś.
Copy + paste
vim -n
Albo!
Podczas uruchomionego edytora możesz zmienić opcję updatecount
na 0
, co
daje podobny efekt, tzn. nie są rejestrowane zmiany w pliku. Co ciekawe,
już stworzony plik .swp
nie zostanie usunięty.
set uc=0
Albo…
Możesz zastosować nową opcję w konfiguracji, aby nie tworzyć tego rodzaju
plików tymczasowych. Dodaj następującą linijkę w pliku .vimrc
:
set noswapfile
Teraz będziesz mieć święty spokój.
•
Podsumowanie
Aby wydzielić pliki *.swp
do zewnętrznego katalogu:
1) Stwórz katalog na pliki tymczasowe:
Copy + paste
mkdir ~/.vim/swp/
2) Dopisz do pliku .vimrc
:
set directory^=$HOME/.vim/swp//
Bibliografia
Wersja angielska artykułu dostępna jest tutaj: vi.stackexchange.com/a/179/13884
•