понедельник, 26 мая 2008 г.

День девятый (Vim RCP)

ЗАДАЧА
Простенькое GUI приложение, позволяющее вручную определять кодировку текста.

РЕШЕНИЕ
Тексты встречаются в различных кодировках, в основном в KOI8-R и Cp1251. Для текстов больших объёмов узнать какая именно из этих кодировок встретилась можно автоматически по соотношению заглавных и прописных букв. Оставшиеся "огрызки" от СAPS и Cp866 MODE фриков обрабатываются в Vim'е:

"run as:
"gvim -U /path/to/vimrc -n /path/to/file 

"data and functions
let t:currenc=1

function LeapEncoding(i)
 set modifiable
 if a:i == 0
   e ++enc=KOI8-R
   set statusline=KOI8-R\ (k),\ Win-1251\ (w),\ UTF-8\ (u),\ DOS\ (d),\ ISO-8859-5\ (i),\ Leap\ (Space),\ Save\ (Enter),\ Quit\ silent\ (Ctrl+q).\ [Now\ KOI8-R]
 elseif a:i == 1
   e ++enc=Cp1251
   set statusline=KOI8-R\ (k),\ Win-1251\ (w),\ UTF-8\ (u),\ DOS\ (d),\ ISO-8859-5\ (i),\ Leap\ (Space),\ Save\ (Enter),\ Quit\ silent\ (Ctrl+q).\ [Now\ Win-1251]
 elseif a:i == 2
   e ++enc=UTF-8
   set statusline=KOI8-R\ (k),\ Win-1251\ (w),\ UTF-8\ (u),\ DOS\ (d),\ ISO-8859-5\ (i),\ Leap\ (Space),\ Save\ (Enter),\ Quit\ silent\ (Ctrl+q).\ [Now\ UTF-8]
 elseif a:i == 3
   e ++enc=Cp866
   set statusline=KOI8-R\ (k),\ Win-1251\ (w),\ UTF-8\ (u),\ DOS\ (d),\ ISO-8859-5\ (i),\ Leap\ (Space),\ Save\ (Enter),\ Quit\ silent\ (Ctrl+q).\ [Now\ Cp866]
 elseif a:i == 4
   e ++enc=ISO-8859-5
   set statusline=KOI8-R\ (k),\ Win-1251\ (w),\ UTF-8\ (u),\ DOS\ (d),\ ISO-8859-5\ (i),\ Leap\ (Space),\ Save\ (Enter),\ Quit\ silent\ (Ctrl+q).\ [Now\ ISO-8859-5]
 endif
 set laststatus=2
 set modifiable!
endfunction

"guard
set modifiable!

"remove toolbar
set guioptions-=T

"remove menu
aunmenu *
let no_buffers_menu=1

"make menu
menu File.Save              <ESC>:echo "save"<CR>:exit<CR>
menu File.Quit              <ESC>:echo "quit"<CR>:exit<CR>
menu Encoding.KOI8-R        <ESC>:let t:currenc=0<CR>:call LeapEncoding(t:currenc)<CR>
menu Encoding.Win-1251      <ESC>:let t:currenc=1<CR>:call LeapEncoding(t:currenc)<CR>
menu Encoding.UTF-8         <ESC>:let t:currenc=2<CR>:call LeapEncoding(t:currenc)<CR>
menu Encoding.DOS(866)      <ESC>:let t:currenc=3<CR>:call LeapEncoding(t:currenc)<CR>
menu Encoding.ISO-8859-5    <ESC>:let t:currenc=4<CR>:call LeapEncoding(t:currenc)<CR>
menu Help.what_the_duck?! <ESC>:echo "== Help."<CR>

"make status line with hints
call LeapEncoding(t:currenc)

"map keyboard actions
map k <ESC>:let t:currenc=0<CR>:call LeapEncoding(t:currenc)<CR>
map w <ESC>:let t:currenc=1<CR>:call LeapEncoding(t:currenc)<CR>
map u <ESC>:let t:currenc=2<CR>:call LeapEncoding(t:currenc)<CR>
map d <ESC>:let t:currenc=3<CR>:call LeapEncoding(t:currenc)<CR>
map i <ESC>:let t:currenc=4<CR>:call LeapEncoding(t:currenc)<CR>
map <SPACE> <ESC>:let t:currenc=(t:currenc+1)%5<CR>:call LeapEncoding(t:currenc)<CR>
map <CR>  <ESC>:echo "save"<CR>
map <C-q> <ESC>:echo "quit"<CR>

"highlight russian chars
match Normal /[\.,\?]/
2match Comment /\w/"/[A-Za-z0-9"%=\+-\*^%&$#@!~`{}\[\]\(\)]/
3match Comment /[><\/"#%@\[\]\(\)=]/

Вот скриншот:

ВЫВОД
По возможностям за Eclips'ом, может быть конечно, не угнаться, но свои достоинства тоже есть.

БОНУС
Для расцветки vimrc использовался: mensus

Комментариев нет: