vim и файлы в русских кодировках (success story)
Ранее я здесь спрашивал про то как просмотреть файл в различных русских
кодировках. Попробовав разные варианты остановился на доработке скрипта
предложенного Denis Golubev со ссылкой на www.linuxforum.ru. Получилось
на мой взгляд очень удобно поэтому и решил выложить кусок своего .vimrc
(во вложении) со следующими возможностями:
<F7> меняет по очереди формат концов строк (dos - <CR> <NL>, unix -
<NL>, mac - <CR>)
<F8> переоткрывает файл в разных кодировках через :e ++enc=кодировка
<Shift+F8> тоже что и <F8>, но предварительно меняет внутреннюю
кодировку vim на равную кодировке файла. Это нужно когда vim умничает и
команда :e ++enc=кодировка для него не указ. Минус этого метода в том
что когда внутренняя кодировка равна 8bit-cp866, то vim некоторые
русские буквы неверно показывает, но именно показывает поскольку если
конвертировать то ничего не портится (сравнить можно с результатом
работы <F8>).
<Ctrl+F8> меняет кодировку файла, то есть после его сохранения он будет
конвертирован
Статусная строка позволяет контролировать происходящее. Показывает и
формат файла и кодировки, заодно в нормальном режиме показывает код
текущего символа в дес. и шестнадцатиричном виде.
Кодировки: koi8-r cp1251 8bit-cp866 utf-8 ucs-2le.
где ucs-2le - MS Windows unicode encoding (можно посмотреть содержимое вордовского файла, правда мотать неудобно из-за длинных строк)
Опробация проводилась в ru_RU.UTF-8
--
С уважением
Телегин Дмитрий
" <F7> File fileformat (dos - <CR> <NL>, unix - <NL>, mac - <CR>)
map <F7> :execute RotateFileFormat()<CR>
vmap <F7> <C-C><F7>
imap <F7> <C-O><F7>
let b:fformatindex=0
function! RotateFileFormat()
let y = -1
while y == -1
let encstring = "#unix#dos#mac#"
let x = match(encstring,"#",b:fformatindex)
let y = match(encstring,"#",x+1)
let b:fformatindex = x+1
if y == -1
let b:fformatindex = 0
else
let str = strpart(encstring,x+1,y-x-1)
return ":set fileformat=".str
endif
endwhile
endfunction
" <F8> File encoding for open
" ucs-2le - MS Windows unicode encoding
map <F8> :execute RotateEnc()<CR>
vmap <F8> <C-C><F8>
imap <F8> <C-O><F8>
let b:encindex=0
function! RotateEnc()
let y = -1
while y == -1
let encstring = "#koi8-r#cp1251#8bit-cp866#utf-8#ucs-2le#"
let x = match(encstring,"#",b:encindex)
let y = match(encstring,"#",x+1)
let b:encindex = x+1
if y == -1
let b:encindex = 0
else
let str = strpart(encstring,x+1,y-x-1)
return ":e ++enc=".str
endif
endwhile
endfunction
" <Shift+F8> Force file encoding for open (encoding = fileencoding)
map <S-F8> :execute ForceRotateEnc()<CR>
vmap <S-F8> <C-C><S-F8>
imap <S-F8> <C-O><S-F8>
let b:encindex=0
function! ForceRotateEnc()
let y = -1
while y == -1
let encstring = "#koi8-r#cp1251#8bit-cp866#utf-8#ucs-2le#"
let x = match(encstring,"#",b:encindex)
let y = match(encstring,"#",x+1)
let b:encindex = x+1
if y == -1
let b:encindex = 0
else
let str = strpart(encstring,x+1,y-x-1)
:execute "set encoding=".str
return ":e ++enc=".str
endif
endwhile
endfunction
" <Ctrl+F8> File encoding for save (convert)
map <C-F8> :execute RotateFEnc()<CR>
vmap <C-F8> <C-C><C-F8>
imap <C-F8> <C-O><C-F8>
let b:fencindex=0
function! RotateFEnc()
let y = -1
while y == -1
let encstring = "#koi8-r#cp1251#8bit-cp866#utf-8#ucs-2le#"
let x = match(encstring,"#",b:fencindex)
let y = match(encstring,"#",x+1)
let b:fencindex = x+1
if y == -1
let b:fencindex = 0
else
let str = strpart(encstring,x+1,y-x-1)
return ":set fenc=".str
endif
endwhile
endfunction
set fileencodings=utf-8,cp1251,cp866,koi8-r
set encoding=utf-8
set termencoding=utf-8
set statusline=%<%f%h%m%r%=format=%{&fileformat}\ file=%{&fileencoding}\ enc=%{&encoding}\ %b\ 0x%B\ %l,%c%V\ %P
set laststatus=2
Reply to: