Автор Гілка: vim із перекодуванням та редагув. koi8/cp1251/utf8  (Прочитано 3412 раз)

Відсутній 235

  • Кореспондент
  • ***
  • дописів: 238
  • Карма: +0/-0
доводиться віддалено правити файли й краще vim для цього нічого немає, із кодуваннями набридло поритися, тому пошукав методи, як розширити його до підтримки роботи із різними кодовими сторінками.
як результат - http://lists.debian.org/debian-russian/2005/11/msg00228.html

Ось приведений сценарій для vim, що займається конвертацією файлу за клавішними комбінаціями.
Оригінал від Dmitry-T <dmitry-t@yandex.ru> 8 Nov 2005:
Цитата
<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
 

Необхідно створити файл ~/.vimrc з наступним вмістом:
" <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-u#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-u#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-u#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-u
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

- від мене лише заміна koi8-r на koi8-u.
Примітка - в останніх рядках необхідно виставити системну локаль для корентної роботи, замінивши значення
   set encoding=utf-8
   set termencoding=utf-8
на відповідно локальні. Для мене це був koi8-u


Якщо ж у когось наявні інші методи, діліться, буде цікаво.
« Змінено: 2007-01-30 01:20:17 від uran »
Олександр Приймак |  Google Web Toolkit

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Затягнути файл на свою машину, відредагувати чим захочеться: kate - наприклад, відправити на місце  ;)
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній miwa

  • Літератор
  • ******
  • дописів: 1111
  • Карма: +0/-0
Банальна лінь - на біса робити 3 операції (scp remote@/file/name local_filename && kale local_filaneme && scp local_filename remote@file/name), якщо доволі часто сидиш по ssh в консолі і можна просто зробити vi /file/name.

Автору гілки:
Доречний рецепт, спасибі.
Читайте документацію - вона кермує.

Відсутній 235

  • Кореспондент
  • ***
  • дописів: 238
  • Карма: +0/-0
та немає за що. Маю тепер сказати, що дуже довго лінивий був, аби знайти рецепт лікування цієї хвороби. А щодо правки на локальному комп'ютері - для невеличних задач це страшенно криво, так не попрацюєш. Раніше доводилося гратися із icov, але це вже швидше чим копіювати.
« Змінено: 2007-01-31 14:26:44 від uran »
Олександр Приймак |  Google Web Toolkit

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Цікаво, яким чином воно само визначає кодування файлу (яка саме стрічка ~/.vimrc це робить). Дописав те діло в кінець ~/.vimrc - vim перетворився в "штірліца" - була така прога під офтопіком - сама вгадувала кодування тексту.
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.