Наступил на очередные vim-грабельки, на этот раз с кодировкой. Вообще-то, всё сделано логично. Есть три кодировки:
- termencoding - в какой кодировке выводить символы на терминал,
- encoding - в какой кодировке текст хранится внутри vimа,
- fileencoding - в какой кодировке записан редактируемый файл.
Если какие-то кодировки не совпадают, на лету происходит преобразование. Как правило, нет нужды трогать ничего, кроме кодировки файла. Если её поменять на ходу (:e ++enc=iso-8859-5), на экране нарисуется перекодированный текст. Отлично.
Однако же на практике vim упорно отказывался правильно показывать исошный файл, радостно сообщая в строке состояния «NOT converted». Хотя некоторые файлы в некоторых кодировках всё-таки отображались.
Сломав всю голову, пошёл гуглить и выяснил, что такое сообщение вылезает, если преобразование невозможно. Как интересно. Беглый просмотр хелпа показал, что для перекодирования используется iconv. Посмотрел man iconv, попробовал перекодировать им файл - всё отлично работает. Ну не шайтан ли?
И только со второго захода нашёл в хелпе, что виндовые версии vimа могут быть скомпилированы с некой фичей +iconv/dyn, которая заставляет vim искать iconv в соответствующей dll-ке. Причём если таковой нет, то Vim will still work but some conversions wont be possible.
Dll, естественно, отсутствовала. И стоило её найти и подсунуть vimу, как наступило счастье.
Внимание, вопрос: что заставило людей, собиравших дистрибутив vimа, не включить в него iconv? Всё, как обычно в unix: очень круто, но полдня вынь да убей.