1 " vim:set ts=8 sts=2 sw=2 tw=0 nowrap:
3 " hz_ja.vim - Convert character between HANKAKU and ZENKAKU
5 " Last Change: 06-Feb-2006.
6 " Written By: MURAOKA Taro <koron@tka.att.ne.jp>
9 " :Hankaku Convert to HANKAKU.
10 " :Zenkaku Convert to ZENKAKU.
11 " :ToggleHZ Toggole convert between HANKAKU and ZENKAKU.
14 " ToHankaku(str) Convert given string to HANKAKU.
15 " ToZenkaku(str) Convert given string to ZENKAKU.
17 " To make vim DO NOT LOAD this plugin, write next line in your .vimrc:
18 " :let plugin_hz_ja_disable = 1
20 " Japanese Description:
25 " :[range]HzjaConvert {target}
28 " ˆÈ‰º‚̓rƒWƒ…ƒAƒ‹‘I‘ð—̈æ‚ɑ΂·‚é‘€�ì‚Å‚·�B‚Ü‚½()“à‚ÍHzjaConvertƒRƒ}ƒ“ƒh
29 " ‚ÆŠÖ�”‚É“n‚·�Atarget‚ÉŽw’è‰Â”\‚È•¶Žš—ñ‚Å‚·�B
30 " gHL ‰Â”\‚È•¶Žš‚ð‘S‚Ä”¼Šp‚É•ÏŠ·‚·‚é (han_all)
31 " gZL ‰Â”\‚È•¶Žš‚ð‘S‚Ä‘SŠp‚É•ÏŠ·‚·‚é (zen_all)
32 " gHA ASCII•¶Žš‚ð‘S‚Ä”¼Šp‚É•ÏŠ·‚·‚é (han_ascii)
33 " gZA ASCII•¶Žš‚ð‘S‚Ä‘SŠp‚É•ÏŠ·‚·‚é (zen_ascii)
34 " gHM ‹L�†‚ð‘S‚Ä”¼Šp‚É•ÏŠ·‚·‚é (han_kigou)
35 " gZM ‹L�†‚ð‘S‚Ä‘SŠp‚É•ÏŠ·‚·‚é (zen_kigou)
36 " gHW ‰p�”Žš‚ð‘S‚Ä”¼Šp‚É•ÏŠ·‚·‚é (han_eisu)
37 " gZW ‰p�”Žš‚ð‘S‚Ä‘SŠp‚É•ÏŠ·‚·‚é (zen_eisu)
38 " gHJ ƒJƒ^ƒJƒi‚ð‘S‚Ä”¼Šp‚É•ÏŠ·‚·‚é (han_kana)
39 " gZJ ƒJƒ^ƒJƒi‚ð‘S‚Ä‘SŠp‚É•ÏŠ·‚·‚é (zen_kana)
40 " ˆÈ‰º‚ÍŽg—p•p“x‚Ì�‚‚³‚ð�l—¶‚µ‚Ä�A�ã‹L‚Æ�d•¡‚µ‚½‹@”\‚Æ‚µ‚ÄŠ„‚è“–‚Ä‚ç‚ꂽ
42 " gHH ASCII•¶Žš‚ð‘S‚Ä”¼Šp‚É•ÏŠ·‚·‚é (han_ascii)
43 " gZZ ƒJƒ^ƒJƒi‚ð‘S‚Ä‘SŠp‚É•ÏŠ·‚·‚é (zen_kana)
46 " ToHankaku(str) •¶Žš—ñ‚𔼊p‚Ö•ÏŠ·‚·‚é
47 " ToZenkaku(str) •¶Žš—ñ‚ð‘SŠp‚Ö•ÏŠ·‚·‚é
48 " HzjaConvert(str, target)
49 " •¶Žš—ñ‚ðtarget‚É�]‚¢•ÏŠ·‚·‚é�Btarget‚̈Ӗ¡‚̓L�[ƒ}ƒb
50 " ƒsƒ“ƒO‚Ì�€–Ú‚ðŽQ�Æ�B
53 " GUIŠÂ‹«‚ł̓rƒWƒ…ƒAƒ‹‘I‘ðŽž‚Ìƒ|ƒbƒvƒAƒbƒvƒ�ƒjƒ…�[(‰EƒNƒŠƒbƒNƒ�ƒjƒ…�[)‚É
54 " •ÏŠ·—p‚̃Rƒ}ƒ“ƒh‚ª’ljÁ‚³‚ê‚Ü‚·�B
56 " ‚±‚̃vƒ‰ƒOƒCƒ“‚ð“Ç�ž‚Ý‚½‚‚È‚¢Žž‚Í.vimrc‚ÉŽŸ‚̂悤‚É�‘‚‚±‚Æ:
57 " :let plugin_hz_ja_disable = 1
61 if exists('plugin_hz_ja_disable')
68 command! -nargs=0 -range Hankaku <line1>,<line2>call <SID>ToggleLineWise('Hankaku')
69 command! -nargs=0 -range Zenkaku <line1>,<line2>call <SID>ToggleLineWise('Zenkaku')
70 command! -nargs=0 -range ToggleHZ <line1>,<line2>call <SID>ToggleLineWise('Toggle')
71 command! -nargs=1 -range -complete=custom,HzjaConvertComplete HzjaConvert <line1>,<line2>call <SID>HzjaConvert(<q-args>)
73 vnoremap <silent> gHL <C-\><C-N>:call <SID>HzjaConvertVisual('han_all')<CR>
74 vnoremap <silent> gZL <C-\><C-N>:call <SID>HzjaConvertVisual('zen_all')<CR>
75 vnoremap <silent> gHA <C-\><C-N>:call <SID>HzjaConvertVisual('han_ascii')<CR>
76 vnoremap <silent> gZA <C-\><C-N>:call <SID>HzjaConvertVisual('zen_ascii')<CR>
77 vnoremap <silent> gHM <C-\><C-N>:call <SID>HzjaConvertVisual('han_kigou')<CR>
78 vnoremap <silent> gZM <C-\><C-N>:call <SID>HzjaConvertVisual('zen_kigou')<CR>
79 vnoremap <silent> gHW <C-\><C-N>:call <SID>HzjaConvertVisual('han_eisu')<CR>
80 vnoremap <silent> gZW <C-\><C-N>:call <SID>HzjaConvertVisual('zen_eisu')<CR>
81 vnoremap <silent> gHJ <C-\><C-N>:call <SID>HzjaConvertVisual('han_kana')<CR>
82 vnoremap <silent> gZJ <C-\><C-N>:call <SID>HzjaConvertVisual('zen_kana')<CR>
84 vnoremap <silent> gHH <C-\><C-N>:call <SID>HzjaConvertVisual('han_ascii')<CR>
85 vnoremap <silent> gZZ <C-\><C-N>:call <SID>HzjaConvertVisual('zen_kana')<CR>
88 vnoremenu 1.120 PopUp.-SEP3- <Nop>
89 vnoremenu 1.130.100 PopUp.‘SŠp�¨”¼Šp(&H).‘S•”(&L) <C-\><C-N>:call <SID>HzjaConvertVisual('han_all')<CR>
90 vnoremenu 1.130.110 PopUp.‘SŠp�¨”¼Šp(&H).ASCII(&A) <C-\><C-N>:call <SID>HzjaConvertVisual('han_ascii')<CR>
91 vnoremenu 1.130.120 PopUp.‘SŠp�¨”¼Šp(&H).‹L�†(&M) <C-\><C-N>:call <SID>HzjaConvertVisual('han_kigou')<CR>
92 vnoremenu 1.130.130 PopUp.‘SŠp�¨”¼Šp(&H).‰p�”(&W) <C-\><C-N>:call <SID>HzjaConvertVisual('han_eisu')<CR>
93 vnoremenu 1.130.140 PopUp.‘SŠp�¨”¼Šp(&H).ƒJƒ^ƒJƒi(&J) <C-\><C-N>:call <SID>HzjaConvertVisual('han_kana')<CR>
94 vnoremenu 1.140.100 PopUp.”¼Šp�¨‘SŠp(&Z).‘S•”(&L) <C-\><C-N>:call <SID>HzjaConvertVisual('zen_all')<CR>
95 vnoremenu 1.140.110 PopUp.”¼Šp�¨‘SŠp(&Z).ASCII(&A) <C-\><C-N>:call <SID>HzjaConvertVisual('zen_ascii')<CR>
96 vnoremenu 1.140.120 PopUp.”¼Šp�¨‘SŠp(&Z).‹L�†(&M) <C-\><C-N>:call <SID>HzjaConvertVisual('zen_kigou')<CR>
97 vnoremenu 1.140.130 PopUp.”¼Šp�¨‘SŠp(&Z).‰p�”(&W) <C-\><C-N>:call <SID>HzjaConvertVisual('zen_eisu')<CR>
98 vnoremenu 1.140.140 PopUp.”¼Šp�¨‘SŠp(&Z).ƒJƒ^ƒJƒi(&J) <C-\><C-N>:call <SID>HzjaConvertVisual('zen_kana')<CR>
101 function! HzjaConvertComplete(argleand, cmdline, curpos)
106 function! s:HzjaConvert(target) range
107 let nline = a:firstline
108 while nline <= a:lastline
109 call setline(nline, HzjaConvert(getline(nline), a:target))
110 let nline = nline + 1
114 " —^‚¦‚ç‚ꂽ•¶Žš—ñ‚Ì”¼Šp‘SŠp•¶Žš‚𑊌݂ɕϊ·‚·‚é�B•ÏŠ·‚Ì•û–@‚͈ø�”target‚Å•¶
115 " Žš—ñ‚Æ‚µ‚ÄŽw’è‚·‚é�BŽw’è‚Å‚«‚镶Žš—ñ‚͈ȉº‚Ì‚Æ‚¨‚è�B
117 " han_all ‘S‚Ä‚Ì‘SŠp•¶Žš�¨”¼Šp
118 " han_ascii ‘SŠpƒAƒXƒL�[�¨”¼Šp
119 " han_kana ‘SŠpƒJƒ^ƒJƒi�¨”¼Šp
120 " han_eisu ‘SŠp‰p�”�¨”¼Šp
121 " han_kigou ‘SŠp‹L�†�¨”¼Šp
122 " zen_all ‘S‚Ä‚Ì”¼Šp•¶Žš�¨‘SŠp
123 " zen_ascii ”¼ŠpƒAƒXƒL�[�¨‘SŠp
124 " zen_kana ”¼ŠpƒJƒ^ƒJƒi�¨‘SŠp
125 " zen_eisu ”¼Šp‰p�”�¨‘SŠp
126 " zen_kigou ”¼Šp‹L�†�¨‘SŠp
128 function! HzjaConvert(line, target)
130 if !exists('s:mx_'.a:target)
133 let mode = a:target =~# '^han_' ? 'Hankaku' : 'Zenkaku'
134 return substitute(a:line, s:mx_{a:target}, '\=s:ToggleLine(submatch(0),0,0,mode)', 'g')
138 function! s:HzjaConvertVisual(target)
140 let save_regcont = @"
141 let save_regtype = getregtype('"')
143 call setreg('"', HzjaConvert(@", a:target), getregtype('"'))
145 call setreg('"', save_regcont, save_regtype)
149 function! s:Initialize()
155 let s:match_character = '\%([³¶·¸¹º»¼½¾¿ÀÁÂÃÄÊËÌÍÎ]Þ\|[ÊËÌÍÎ]ß\|.\)'
156 let s:match_hankaku = '\%([³¶·¸¹º»¼½¾¿ÀÁÂÃÄÊËÌÍÎ]Þ\|[ÊËÌÍÎ]ß\|[ -~¡¢£¤¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß]\)'
158 let zen_ascii = '�@�I�h�”���“�•�f�i�j�–�{�C�|�D�^‚O‚P‚Q‚R‚S‚T‚U‚V‚W‚X�F�G�ƒ���„�H�—‚`‚a‚b‚c‚d‚e‚f‚g‚h‚i‚j‚k‚l‚m‚n‚o‚p‚q‚r‚s‚t‚u‚v‚w‚x‚y�m���n�O�Q�e‚�‚‚‚ƒ‚„‚…‚†‚‡‚ˆ‚‰‚Š‚‹‚Œ‚�‚Ž‚�‚�‚‘‚’‚“‚”‚•‚–‚—‚˜‚™‚š�o�b�p�`'
159 let zen_kana = '�B�u�v�Aƒ’ƒ@ƒBƒDƒFƒHƒƒƒ…ƒ‡ƒb�[ƒAƒCƒEƒGƒIƒJƒLƒNƒPƒRƒTƒVƒXƒZƒ\ƒ^ƒ`ƒcƒeƒgƒiƒjƒkƒlƒmƒnƒqƒtƒwƒzƒ}ƒ~ƒ€ƒ�ƒ‚ƒ„ƒ†ƒˆƒ‰ƒŠƒ‹ƒŒƒ�ƒ�ƒ“�J�Kƒ”ƒKƒMƒOƒQƒSƒUƒWƒYƒ[ƒ]ƒ_ƒaƒdƒfƒhƒoƒrƒuƒxƒ{ƒpƒsƒvƒyƒ|'
160 let han_ascii = " !\"#$%&'()*+,\\-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
161 let han_kana = '¡¢£¤¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß'
162 let s:mx_han_all = "[".zen_ascii.zen_kana."]\\+"
163 let s:mx_zen_all = "[".han_ascii.han_kana."]\\+"
164 let s:mx_han_ascii = "[".zen_ascii."]\\+"
165 let s:mx_zen_ascii = "[".han_ascii."]\\+"
166 let s:mx_han_kana = "[".zen_kana."]\\+"
167 let s:mx_zen_kana = "[".han_kana."]\\+"
168 let s:mx_han_eisu = '[‚O‚P‚Q‚R‚S‚T‚U‚V‚W‚X‚`‚a‚b‚c‚d‚e‚f‚g‚h‚i‚j‚k‚l‚m‚n‚o‚p‚q‚r‚s‚t‚u‚v‚w‚x‚y‚�‚‚‚ƒ‚„‚…‚†‚‡‚ˆ‚‰‚Š‚‹‚Œ‚�‚Ž‚�‚�‚‘‚’‚“‚”‚•‚–‚—‚˜‚™‚š]\+'
169 let s:mx_zen_eisu = '[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]\+'
170 let s:mx_han_kigou = '[�I�h�”���“�•�f�i�j�–�{�C�|�D�^�F�G�ƒ���„�H�—�m���n�O�Q�e�o�b�p�`]\+'
171 let s:mx_zen_kigou = "[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~]\\+"
172 let s:targetlist = "han_all\<NL>zen_all\<NL>han_ascii\<NL>zen_ascii\<NL>han_kana\<NL>zen_kana\<NL>han_eisu\<NL>zen_eisu\<NL>han_kigou\<NL>zen_kigou"
174 " ”¼Šp�¨‘SŠpƒe�[ƒuƒ‹�ì�¬
176 let tmp = tmp . " �@!�I\"�h#�”$��%�“&�•'�f(�i)�j*�–+�{,�C-�|.�D/�^"
177 let tmp = tmp . '0‚O1‚P2‚Q3‚R4‚S5‚T6‚U7‚V8‚W9‚X:�F;�G<�ƒ=��>�„?�H'
178 let tmp = tmp . '@�—A‚`B‚aC‚bD‚cE‚dF‚eG‚fH‚gI‚hJ‚iK‚jL‚kM‚lN‚mO‚n'
179 let tmp = tmp . 'P‚oQ‚pR‚qS‚rT‚sU‚tV‚uW‚vX‚wY‚xZ‚y[�m\��]�n^�O_�Q'
180 let tmp = tmp . '`�ea‚�b‚‚c‚ƒd‚„e‚…f‚†g‚‡h‚ˆi‚‰j‚Šk‚‹l‚Œm‚�n‚Žo‚�'
181 let tmp = tmp . 'p‚�q‚‘r‚’s‚“t‚”u‚•v‚–w‚—x‚˜y‚™z‚š{�o|�b}�p~�`'
182 let tmp = tmp . '¡�B¢�u£�v¤�A¦ƒ’§ƒ@¨ƒB©ƒDªƒF«ƒH¬ƒƒƒ…®ƒ‡¯ƒb'
183 let tmp = tmp . '°�[±ƒA²ƒC³ƒE´ƒGµƒI¶ƒJ·ƒL¸ƒN¹ƒPºƒR»ƒT¼ƒV½ƒX¾ƒZ¿ƒ\'
184 let tmp = tmp . 'Àƒ^Áƒ`ƒcÃeăgŃiƃjǃkȃlɃmʃn˃q̃t̓w΃zσ}'
185 let tmp = tmp . 'Ѓ~у€Òƒ�Óƒ‚Ôƒ„Õƒ†Öƒˆ×ƒ‰ØƒŠÙƒ‹ÚƒŒÛƒ�܃�݃“Þ�Jß�K'
186 let tmp = tmp . '³Þƒ”¶ÞƒK·ÞƒM¸ÞƒO¹ÞƒQºÞƒS»ÞƒU¼ÞƒW½ÞƒY¾Þƒ[¿Þƒ]'
187 let tmp = tmp . 'ÀÞƒ_ÁÞƒaÂÞƒdÃÞƒfÄÞƒhÊÞƒoËÞƒrÌÞƒuÍÞƒxÎÞƒ{'
188 let tmp = tmp . 'Ê߃pË߃sÌ߃vÍ߃yÎ߃|'
190 let s:table_h2z = tmp
192 " ‘SŠp�¨”¼Šp•ÏŠ·ƒe�[ƒuƒ‹‚ð�ì�¬‚·‚é�B
195 let endcol = strlen(s:table_h2z)
197 let mx = '^\(' . s:match_hankaku . '\)\(.\)'
198 while curcol < endcol
199 let char = matchstr(s:table_h2z, mx, curcol)
200 let s:table_z2h = s:table_z2h . substitute(char, mx, '\2\1', '')
201 let curcol = curcol + strlen(char)
206 " ƒRƒ}ƒ“ƒh‚ÅŽw’肳‚ꂽ—̈æ‚ð•ÏŠ·‚·‚é
208 function! s:ToggleLineWise(operator) range
211 let ncurline = a:firstline
212 while ncurline <= a:lastline
213 call setline(ncurline, s:ToggleLine(getline(ncurline), 0, 0, a:operator))
214 let ncurline = ncurline + 1
219 " —^‚¦‚ç‚ꂽ•¶Žš—ñ‚ð•ÏŠ·‚µ‚Ä•Ô‚·�B
221 function! s:ToggleLine(line, startcolumn, endcolumn, operator)
222 let endcol = ((a:endcolumn > 0 && a:endcolumn < strlen(a:line))? a:endcolumn : strlen(a:line)) - 1
223 let startcol = a:startcolumn > 0 ? a:startcolumn - 1: 0
224 let curcol = startcol
226 while curcol <= endcol
227 let char = matchstr(a:line, s:match_character, curcol)
228 let newline = newline . s:{a:operator}Char(char)
229 let curcol = curcol + strlen(char)
231 return strpart(a:line, 0, startcol) . newline . strpart(a:line, curcol)
234 function! ToHankaku(str)
236 return s:ToggleLine(a:str, 0, 0, 'Hankaku')
239 function! ToZenkaku(str)
241 return s:ToggleLine(a:str, 0, 0, 'Zenkaku')
245 " “ü—Íchar‚ð‰Â”\‚È‚ç‚Δ¼Šp/‘SŠp•ÏŠ·‚µ‚Ä•Ô‚·�B•ÏŠ·‚Å‚«‚È‚¢�ê�‡‚Í‚»‚Ì‚Ü‚Ü�B
247 function! s:ToggleChar(char)
248 return (s:IsHankaku(a:char)) ? (s:ZenkakuChar(a:char)) : (s:HankakuChar(a:char))
252 " “ü—Íchar‚ð‰Â”\‚È‚ç‚ΑSŠp‚É•ÏŠ·‚µ‚Ä•Ô‚·�B•ÏŠ·‚Å‚«‚È‚¢�ê�‡‚Í‚»‚Ì‚Ü‚Ü�B
254 function! s:ZenkakuChar(char)
255 if s:IsHankaku(a:char)
256 let pos = matchend(s:table_h2z, '\V\C' . escape(a:char, '\'))
258 return matchstr(s:table_h2z, '.', pos)
265 " “ü—Íchar‚ð‰Â”\‚È‚ç‚Δ¼Šp‚É•ÏŠ·‚µ‚Ä•Ô‚·�B•ÏŠ·‚Å‚«‚È‚¢�ê�‡‚Í‚»‚Ì‚Ü‚Ü�B
267 function! s:HankakuChar(char)
268 if !s:IsHankaku(a:char)
269 let pos = matchend(s:table_z2h, '\V\C' . escape(a:char, '\'))
271 return matchstr(s:table_z2h, s:match_hankaku, pos)
278 " —^‚¦‚ç‚ꂽ•¶Žš‚ª”¼Šp‚©‚Ç‚¤‚©‚ð”»’è‚·‚é�B
280 function! s:IsHankaku(char)
281 return a:char =~ '^' . s:match_hankaku . '$'