Автоопределение кодировки в vim


arnold_shade - Posted on 27 Февраль 2007

У меня много текстовых файлов с русским текстом в разных кодировках. Какие-то остались с времен MS-DOS, какие-то взяты с примонтированных разделов Windows, а какие-то созданы и редактируются только под Linux-ом. Соответственно, зоопарк кодировок (866, 1251, koi8-r, utf-8) всем знаком. Очень удобно обучить vim автоматически подставлять используемую в файле кодировку (определенную автоматически, не переключая ее вручную кажый раз). Есть такая утилита - enca (и enconv), которая пытается распознать кодировку файла (и в большинстве случаев делает это успешно). Ей и воспользуемся... в файле ~/.vimrc:

function SetEncoding(f)
    let e = system('enca -Pe "' . a:f . '"')
    let e = substitute(e, '/.*', '', '')
    if e =~ 'unknown' || e =~ 'ASCII' || e =~ 'enca' || e =~ 'TeX'
        execute("set encoding=koi8-r")
        execute("set fileencodings=koi8-r,cp1251,cp866,utf-8,ucs-bom,ascii")
    else
        execute("set encoding=" . e)
        execute("set fileencodings=" . e)
    endif
endfunction
source $VIMRUNTIME/menu.vim
menu Options.Encoding.koi8-r :e ++enc=koi8-r<CR>;:set encoding=koi8-r<CR>:set fileencodings=koi8-r<CR>;
menu Options.Encoding.cp1251 :e ++enc=cp1251<CR>:set encoding=cp1251<CR>:set fileencodings=cp1251<CR>
menu Options.Encoding.cp866 :e ++enc=cp866<CR>:set encoding=cp866<CR>:set fileencodings=cp866<CR>
menu Options.Encoding.utf-8 :e ++enc=utf-8<CR>:set encoding=utf-8<CR>:set fileencodings=utf-8<CR>
menu Options.Encoding.ucs-bom :e ++enc=ucs-bom<CR>:set encoding=ucs-bom<CR>:set fileencodings=ucs-bom<CR>
if executable("enca")
    autocmd BufReadPre * call SetEncoding(expand('<afile>'))
endif

Удобно еще выставить показ текущей кодировки в строке статуса:

set statusline=%F\ (%Y,%{&encoding},%{&ff})%=%m%R\ %3p%%,\ %L\ lines,\ 0x%2B,\ (%l:%c)
0
Ваша оценка: Ничего

Я не использую автоматическое определение кодировки файла, но у меня есть менюшка с выбором кодировки:

set wildmenu
set wcm=<Tab>
menu Encoding.windows-1251 :e ++enc=cp1251<CR>
menu Encoding.koi8-r       :e ++enc=koi8-r<CR>
menu Encoding.ibm-866      :e ++enc=ibm866<CR>
menu Encoding.utf-8        :e ++enc=utf-8 <CR>
map <F8> :emenu Encoding.<TAB>

И отображение кодировки в статусе + формат конца строки:

set statusline+=%{&encoding},
set statusline+=%{&fileformat}]

Одно другому не мешает Ж:-) У меня тоже подобное есть. Полезно для перекодирования. Хотя я сейчас для перекодирования просто меняю fenc и сохраняю. При сохраниении автоматом перекодирует:

:set fenc=utf-8
:w

Ещё хорошо бы добавить в параметры enca: "-L russian", не у всех же русский язык по умолчанию.

а ты реально используешь с этим флажком?
если да и все нормально - я подправлю

Вот еще вариант отсюда http://trific.ath.cx/software/enca/misc/

function GetEncoding(f)
    let e = system('enca -Pe "' . a:f . '"')
    let e = substitute(e, '/.*', '', '')
    if e =~ 'unknown'
        return 'ascii'
    endif
    return e
endfunc
 
if executable("enca")
    au BufReadPre * exec "set fencs=" . GetEncoding(expand('<afile>'))
endif

--
Signature invent in progress 24% ##........

if executable("enca")
..
endif

подправил спасибо Ж:-)
--
Signature invent in progress 23% #.........

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.