The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

vim и файлы с текстом в русских кодировках (vim rus text codepage)


<< Предыдущая ИНДЕКС Правка src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: vim, rus, text, codepage,  (найти похожие документы)
From: Телегин Дмитрий <dmitry-t@yandex.ru.> Newsgroups: email Date: Mon, 15 Nov 2005 14:31:37 +0000 (UTC) Subject: vim и файлы с текстом в русских кодировках Когда я стал искать способы просмотра русских файлов с помощью vim, то мне посоветовали скрипт который можно увидеть в статье называеющейся: "Привязка к клавише переключения кодировки текста в vim". Поскольку после экспериментов и расширения скрипта получилось очень удобно, выкладываю кусок своего .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> меняет кодировку файла, то есть после его сохранения он будет конвертирован В 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

<< Предыдущая ИНДЕКС Правка src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, mr_july (?), 14:54, 14/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А можно ли в Vim'е указать кодировку файла при открытии прямо в командной строке? Я пробовал разные методы, но ничего у меня не вышло. Так и приходится до сих пор сначала открывать файл, а потом выполнять команду типа "e ++enc=cp-1251". :-(
     
     
  • 2.7, Дмитрий Т (?), 10:57, 16/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    В командной строке vim
    :e ++enc=cp1251 mytext.txt

    В командной строке sh
    vim --cmd "edit ++enc=cp1251" -- mytext.txt

     

  • 1.2, ceci_ (?), 01:35, 15/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Otlichnyj script, spasibo :)
     
  • 1.3, Vlad V. Teterya (?), 01:43, 15/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    "<F10> - вызов меню выбора колировки
    " переключение в меню с помощью Tab
    " Меню выбора кодировки
    set wildmenu
    set wcm=<Tab>
    menu Encoding.koi8-u :e ++enc=8bit-koi8-u<CR>
    menu Encoding.windows-1251 :e ++enc=8bit-cp1251<CR>
    menu Encoding.ibm-866 :e ++enc=8bit-ibm866<CR>
    menu Encoding.utf-8 :e ++enc=2byte-utf-8 <CR>
    map <F10> :emenu Encoding.<TAB>
     
     
  • 2.4, stimpack (?), 10:17, 15/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    пробовал почему-то tab не работает. :-(
     
     
  • 3.5, Vlad V. Teterya (?), 10:55, 15/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    нажимаю F10 - появляется менюшка. нажимаем Tab - переключается по кругу в менюшке. что я делаю не так? :)
     
  • 2.8, Дмитрий Т (?), 11:03, 16/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    >"<F10> - вызов меню выбора колировки
    >" переключение в меню с помощью Tab

    Ага, этот вариант я видел, притом расширенный (с возможностью
    конвертирования), но лень жать две клавиши :)

    Ваш подход очень оправдан, если надо открывать _большие_ файлы в известной кодировке.


     

  • 1.9, sg (?), 19:25, 16/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Вариант с менюшками. Лично мне нравится больше :-)

    "<F7> EOL format (dos <CR><NL>,unix <NL>,mac <CR>)
    set  wildmenu
    set  wcm=<Tab>
    menu EOL.unix :set fileformat=unix<CR>
    menu EOL.dos  :set fileformat=dos<CR>
    menu EOL.mac  :set fileformat=mac<CR>
    map  <F7> :emenu EOL.<Tab>

    "<F8> Change encoding
    set  wildmenu
    set  wcm=<Tab>
    menu Enc.cp1251     :e ++enc=cp1251<CR>
    menu Enc.koi8-r     :e ++enc=koi8-r<CR>
    menu Enc.cp866      :e ++enc=ibm866<CR>
    menu Enc.utf-8      :e ++enc=utf-8<CR>
    menu Enc.ucs-2le    :e ++enc=ucs-2le<CR>
    map  <F8> :emenu Enc.<Tab>

    "<Shift+F8> Convert file encoding
    set  wildmenu
    set  wcm=<Tab>
    menu FEnc.cp1251    :set fenc=cp1251<CR>
    menu FEnc.koi8-r    :set fenc=koi8-r<CR>
    menu FEnc.cp866     :set fenc=ibm866<CR>
    menu FEnc.utf-8     :set fenc=utf-8<CR>
    menu FEnc.ucs-2le   :set fenc=ucs-2le<CR>
    map  <S-F8> :emenu FEnc.<Tab>

     
  • 1.10, Костя (??), 14:56, 23/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    При переключении Shift+ F8
    (set encoding=8bit-cp855) досовский файл нормально показывается, но летит кодировка в строке сообщений, т.е. кракозяблы появляются там

    Как это можно исправить?

     
     
  • 2.11, Дмитрий Т (?), 22:05, 01/12/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Shift+F8 меняет внутреннюю кодировку vim, поэтому и "летит кодировка в строке сообщений".
    Vim для строки собщений почему-то именно для 8bit-cp866 не учитывает кодировку вывода на экран,
    которая остаётся всегда неизменной... видимо какая-то недоработка...

    Shift+F8 нужна для крайних случаев, когда по F8 vim неслушается.
    Если же эта кодировка нужна часто и F8 не помогает, то надо или
    работать в английской локали запуская: "LANG=C vim" или
    сменить основную кодировку операционной системы ;)

     
     
  • 3.12, Константин (??), 20:36, 03/12/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Ну если так кординально подходить к вопросу,
    то в место смены кодировки системы можно сменить
    кодировку в файле сообщений ;) , который к стати имеет
    кодировку 1251, и как раз он то и не перекдючается.
    Я в VIM не опытный, так что не могу дать гарантии
    что у меня это получится, но если получится, то поделюсь.

    К слову вопрос, можно ли настроить vim так, чтоб он поддерживал
    разные кодировки (в файле сообщений) для одного языка?

     

  • 1.13, teal (?), 00:39, 08/12/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Команда e ++enc=... конечно супер рулит, но у меня есть одна проблемка.
    На моей винде дома (ага, приходится по работе иногда и в винде ковыряться) стоит вим, который нифига не умеет в koi8-r конвертить. Во все конвертит, только не в koi8-r. Причем винда WinXP. Причем на другую машину поставили туже версию вима, для эксперимента -- тот же эффект, не конвертирует. А вот на работе все работат, под той же WinXP. Че за ерунда такая, чего ему не хватает?
    Спасиб.
     
     
  • 2.14, teal (?), 09:46, 08/12/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Нашел ответ -- iconv.dll в корне вима отсутствовала. Ну кто бы мог подумать, что все дело в ней ;)
     

  • 1.15, Костя (??), 15:16, 25/07/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Кто знает как задать набор знаков, который выводится при печати с нажатой Alt?
    (winxp)
     
  • 1.16, kos (??), 14:46, 03/03/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Справедливости ради замечу что у меня это работало только на 6м vim'е, 5й нивкакую :)
     
  • 1.17, Дмитрий (??), 11:12, 13/03/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Что касается формата файла, то все значительно проще. Vim в состоянии самостоятельно определить ее. В переменной fileformats по умолчанию установлены unix,dos. В моем случае это fileformats=dos,unix,mac. Таким образом Vim сначала ищет CRLF (dos), потом LF (unix) и, в конце-концов, CR (mac). Т.е. для правильного определения dos-формат должен стоять первым. Часто приходится работать с файлами во всех трех форматах. Это отлично работает для меня.
     
  • 1.18, dez (?), 06:35, 15/05/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    хе работает =)) вери мери гуд ;)
     
  • 1.19, lix (?), 18:42, 05/09/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо!!!
     
  • 1.20, fog (?), 18:43, 05/09/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    в kubuntu 7.04 - работает!
    Спасибо!!!
     
  • 1.21, dopen (?), 22:30, 19/11/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А как с помощью вима (или еще как) массово (из одной директории) сконвертить файлы из Cp1251 в utf-8?
     
     
  • 2.23, SolVolkov (?), 23:50, 04/03/2009 [^] [^^] [^^^] [ответить]  
  • +/
    man enconv
     

  • 1.22, Аноним (-), 15:44, 23/01/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Блин, спасибо мужики, полезная вешь!
    Добавил в закладки :)
     
  • 1.24, Артем (??), 19:53, 25/03/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Подскажите есть ли в vim кодировка iso-8859-5.
    По-документации есть, но включить её я не смог.
    Помогите плз.
     
  • 1.25, AntonGr (ok), 20:37, 26/09/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Пользуюсь gVim под Windows, задал в конфигурационном файле установку "set fileencodings=utf-8,cp1251,cp866". Создал в Far файл с кодировкой cp866, при открытии его в gVim, выскакивают кракозябры. Если в ручную сменить кодировку ":e ++enc=cpp866", то отображается нормально. Подскажите, в чем дело?
     

    игнорирование участников | лог модерирования

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру