Jak mogę ustawić domyślne kodowanie VIM na UTF-8?


62

Chciałbym przyczynić się do projektu open source dostarczającego przetłumaczone ciągi. Jednym z ich wymagań jest to, że autorzy muszą używać UTF-8 jako kodowania plików PO.

Używam VIM 7.3 w systemie Linux. Jak mogę się upewnić, że kodowanie VIM jest ustawione na UTF-8, aby móc poprawnie edytować i zapisywać plik .po?

Odpowiedzi:


64

Kiedy Vim odczytuje istniejący plik, próbuje wykryć kodowanie pliku. Podczas zapisywania pliku Vim używa wykrytego kodowania pliku (z wyjątkiem sytuacji, gdy powiesz inaczej). Plik wykryty jako UTF-8 jest zapisywany jako UTF-8, plik wykryty jako Latin-1 jest zapisywany jako Latin-1 i tak dalej.

Domyślnie proces wykrywania jest surowy. Zakłada się, że każdy plik otwierany za pomocą Vima to Latin-1, chyba że wykryje u góry znak kolejności bajtów Unicode. Plik UTF-8 bez znaku kolejności bajtów będzie trudny do edycji, ponieważ wszelkie znaki wielobajtowe będą wyświetlane w buforze jako sekwencje znaków zamiast pojedynczych znaków.

Co gorsza, Vim domyślnie używa Latin-1 do reprezentowania tekstu w buforze. Tak więc plik UTF-8 ze znakiem kolejności bajtów zostanie uszkodzony przez konwersję w dół do Latin-1.

Rozwiązaniem jest skonfigurowanie Vima do używania UTF-8 wewnętrznie. Jest to w rzeczywistości zalecane w dokumentacji Vima, a jedynym powodem, dla którego nie jest tak skonfigurowany, jest uniknięcie ogromnego zamieszania wśród użytkowników, którzy oczekują, że Vim będzie działał zasadniczo jako edytor Latin-1.

W swoim .vimrcdodaj set encoding=utf-8i uruchom ponownie Vima.

Lub zamiast tego ustaw LANGzmienną środowiskową, aby wskazać, że UTF-8 jest preferowanym kodowaniem znaków. Wpłynie to nie tylko na Vima, ale także na wszelkie oprogramowanie, które polega na LANGokreśleniu, jak powinien reprezentować tekst. Na przykład, aby wskazać, że tekst powinien być wyświetlany w języku angielskim ( en), jak mówi się w Stanach Zjednoczonych ( US), zakodowanym jako UTF-8 ( utf-8), ustaw LANG=en_US.utf-8.

Teraz Vim użyje UTF-8 do przedstawienia tekstu w buforze. Ponadto podejmie również bardziej zdecydowany wysiłek w celu wykrycia kodowania UTF-8 w pliku. Oprócz szukania znaku kolejności bajtów, sprawdzi także UTF-8 bez znaku kolejności bajtów, zanim wróci do Latin-1. Dlatego nie będzie już uszkadzał pliku zakodowanego w UTF-8 i powinien poprawnie wyświetlać znaki UTF-8 podczas sesji edycji.

Aby uzyskać więcej informacji na temat Vim wykrywa kodowanie pliku, patrz na fileencodingsopcję w dokumentacji Vima .

Aby uzyskać więcej informacji na temat ustawiania kodowania że Vim używa wewnętrznie, patrz na encoding opcję .

Jeśli trzeba zmienić kodowanie używane podczas zapisywania pliku na dysk, zobacz ten fileencoding opcję .


3
Właściwie wydaje się, że nawet nie muszę zawracać sobie głowy edytowaniem .vimrc; w rzeczywistości domyślna wartość kodowania to „latin1” lub wartość z $ LANG, która w moim systemie jest ustawiona na en_US.UTF-8. Z tego powodu :set encodingdaje po encoding=utf-8wyjęciu z pudełka. Zgodnie z oczekiwaniami, jeśli LANG jest rozbrojony, :set encodingdaje encoding=latin1. Dzięki za świetną odpowiedź!
Paolo

To może być ogólnie przydatne, więc dodałem go do odpowiedzi.
MetaEd

Jeśli otworzysz plik zakodowany jako latin1, czy to ustawienie nie zmieni kodowania pliku? Jak sprawić, by Vim zachował nienaruszone kodowanie pliku, ale wolałby utf-8 dla nowych plików?
David Kennedy,

@DaveKennedy Vim może traktować plik jako Latin-1 tylko wtedy, gdy plik jest jednoznacznie Latin-1. Gdy kodowanie jest niejednoznaczne, Vim musi wybrać. Na przykład plik zawierający tylko 7-bitowe kody ASCII jest prawidłowy Latin1, ale także poprawny UTF-8 i inne. Taki plik będzie zwykle traktowany jako UTF-8. Jednym ze sposobów uniknięcia tego wyniku jest jednoznaczne kodowanie pliku. Sztuką, którą widziałem, jest dodanie ciągu kodów 0xF7. W UTF-8 0xF7 jest nieprawidłowy. Ale w Latin-1 reprezentuje znak podziału (÷). Vim zwykle stwierdza, że ​​plik ma format Latin-1.
MetaEd

4

Według vimdoc vim próbuje automatycznie wykryć kodowanie plików, więc jeśli edytujesz istniejące pliki , powinieneś być dobry.

Zawsze możesz wymusić kodowanie, jeśli chcesz :set fileencodings=utf-8. Dokumentację można znaleźć tutaj .


6
fileencodings = utf-8 spowoduje, że Vim rozpozna plik wejściowy jako UTF-8, ale następnie wykona stratną konwersję do Latin-1. Dodatkowo spowoduje to, że Vim nie rozpozna UTF-16. Lepszym rozwiązaniem jest ustawienie kodowania = utf-8, które zmienia Vima z natywnego edytora jednobajtowego w natywny edytor wielobajtowy.
MetaEd

@MetaEd czy możesz odpowiedzieć na to pytanie, aby rozwinąć swój komentarz :)
hhh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.