Vim и файлы с текстом в русских кодировках

Когда я стал искать способы просмотра русских файлов с помощью vim, то мне посоветовали скрипт который можно увидеть в статье называющейся: “Привязка к клавише переключения кодировки текста в vim”. Поскольку после экспериментов и расширения скрипта получилось очень удобно, выкладываю кусок своего .vimrc со следующими возможностями:

меняет по очереди формат концов строк (dos - , unix - , mac - )

переоткрывает файл в разных кодировках через :e ++enc=кодировка

тоже что и , но предварительно меняет внутреннюю кодировку vim на равную кодировке файла. Это нужно когда vim умничает и команда :e ++enc=кодировка для него не указ. Минус этого метода в том что когда внутренняя кодировка равна 8bit-cp866, то vim некоторые русские буквы неверно показывает, но именно показывает поскольку если конвертировать то ничего не портится (сравнить можно с результатом работы ).

меняет кодировку файла, то есть после его сохранения он будет конвертирован

В fileencodings задан наиболее удобный на мой взгляд вариант автораспознавания кодировок.

Статусная строка позволяет контролировать происходящее. Показывает и формат файла и кодировки, заодно в нормальном режиме показывает код текущего символа в десятичном и шестнадцатиричном виде.

Перебираемые по кругу кодировки: koi8-r cp1251 8bit-cp866 utf-8 ucs-2le. где ucs-2le - MS Windows unicode encoding (можно например посмотреть содержимое вордовского файла, правда мотать неудобно из-за длинных строк)

Строки:

        set encoding=utf-8
        set termencoding=utf-8

можно раскомментировать и указать свою кодировку, но у меня и без них всё вполне работает. Аппробация проводилась в ru_RU.UTF-8. Поскольку текущую кодировку termencoding статусная строка не показывает, то её можно посмотреть командой :set termencoding

"set encoding=utf-8
"set termencoding=utf-8

set fileencodings=utf-8,cp1251,cp866,koi8-r

" <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 statusline=%<%f%h%m%r%=format=%{&fileformat}\ file=%{&fileencoding}\ enc=%{&encoding}\ %b\ 0x%B\ %l,%c%V\ %P
set laststatus=2

source: opennet.ru