[Moscow.pm] Указание кодировки файла

Павел Тимонин gg.error на gmail.com
Чт Сен 4 07:36:35 PDT 2008


это лишнее действие в виме биндится на одну кнопку. если надо ниже приведу
как это делается.
кроме того это же добавляется в меню. и это тоже приведу.
и у вима есть способ автоматического определения кодировки. и это приведу.
а ещё если он автоматически определяет то обычно не видно, какая же у файла
кодировка. чтобы вим это показал надо настроить немного статус-строку.. ну я
так сделал.

итак, код.
это должно быть в файле .vimrc в домашней директории (*nix) или (кажется) в
файле _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> изменение открываемой кодировки на лету
" 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> переоткрытие файла в другой кодировке (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#"
        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> изменение кодировки для сохранения файла
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#"
        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

-------------------------------------------------------------------------------------

" Меню выбора кодировки текста (koi8-r, cp1251, cp866, utf8)
set wildmenu
set wcm=<Tab>
menu Encoding.koi8-r :e ++enc=koi8-r<CR>
menu Encoding.windows-1251 :e ++enc=cp1251<CR>
menu Encoding.cp866 :e ++enc=cp866<CR>
menu Encoding.utf-8 :e ++enc=utf8 <CR>

-------------------------------------------------------------------------------------

set fileencodings=utf-8,cp1251,cp866,koi8-r " это список кодировок, которые
вим будет пробовать,
                                                                " открывая
файл.

-------------------------------------------------------------------------------------

set statusline=%<%f%h%m%r%=format=%{&fileformat}\ file=%{&fileencoding}\
enc=%{&encoding}\ %b\ 0x%B\ %l,%c%V\ %P " достаточно очевидно.

извините, если слишком длинно :)
да, от терминала и настроек будет зависеть, как работают кнопки F8 в
сочетании с shift и ctrl.
ещё очень полезно почитать :help по всем непонятным словам в самом виме.


4 сентября 2008 г. 12:49 пользователь Shrub Alexey <ashrub на agava.com>написал:

>
>
> Maxim Vuets wrote:
>
>> 04.09.08, Shrub Alexey<ashrub на agava.com> написал(а):
>>
>>  Осталось пропатчить vim и получим унифицированный формат указания
>>> кодировки файла
>>>
>>
>> Там ведь свой синтаксис для переопределения параметров буффера,
>> вряд ли такой патч будет принят.
>>
>
> Это и плохо, что у всех свой синтаксис
>
>
>>  Надоедает в терминале переключаться, думаю это правильно указывать везде
>>> кодировку
>>>
>>
>> А зачем переключать что-то в эмуляторе терминала?
>> Ведь сам редактор умеет перекодировать файл. В лучшем
>> случае -- автоматически.
>>
>
> Если кодировка в файле указана, то переключать ничего не нужно, а если нет,
> то где-то переключать придёться, а это лишнее действие
>
> --
> Шруб Алексей
> Технический руководитель проектов
> icq: 345894734
> http://www.agava.ru/
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено&hellip;
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20080904/a5bb6d39/attachment.html>


Подробная информация о списке рассылки Moscow-pm