" Vim plugin file " Maintainer: G-HAL " Last Change: 2006 Aug 19 Sat - 2006 Sep 04 Mon " Last Change: 2006 Dec,27 Wed, Tue,09 Jan,2007 " Last Change: Tue,11 Mar,2008 - Wed,12 Mar,2008 " Remark: Word search & jump, support multi_byte. " ~/.vim/after/plugin/matchit2.vim " Only for vim7.0 or later. " vim で日本語でも単語移動とか単語検索とかするスクリプト " " Note: " 日本語対応 matchit.vim スクリプト " " 文字種別判定アルゴリズムの都合により、 " このファイルのエンコーディングは EUC-JP(JISx0212)にしないと、 " 正しく処理できません。 " " ロケールは EUC-JP(JISx0212, JISx0213), UTF-8, " ShiftJIS(cp932) のみ対応です。 " " vim7.0 とそれ以降でしか使えません。 " 配列変数返しの箇所を修正すれば、 " vim6.x でも使える様になる筈ですが。 " " % 対応する括弧の検索 " w 前方へ単語移動 " e 前方へ単語末尾移動 " b 後方へ単語先頭移動 " * 前方へ単語検索 " # 後方へ単語検索 " y{motion} {motion} まで yank。 " d{motion} {motion} まで削除。 " c{motion} {motion} まで削除して insert モードへ移行。 " " visual mode にも対応しています。 " " 上記コマンドの共通設定: " 変数 g:iskeyword2 に、空白文字と等価とみなす文字範囲を設定して下さい。 " " % コマンドの設定の仕方: " (1) 変数 g:match2_words に、対応する括弧を記述します。 " 先頭に「,」を入れて下さい。 " 1セットを " 「左括弧」:「右括弧」, " と記述します。 " JIS X0201 スペース、:(JIS X0201 コロン)、,(JIS X0201 カンマ)は " 指定できません。 " (2) 長いキーワードの先頭部分が、短いキーワードと一致する場合、 " vim の検索優先順位に従って選択します(先取り優先)。 " (3) カレント検索文字列が更新されない " (n や N で、検索結果の検索続行ができない)のは、仕様です。 " オリジナルもそうだし。 " (4) " 日本語に対して % した時、コメントや引用符の中まで検索するのは、 " 仕様です。 " (5) 備考: " english1 日本語1「日本語2 eng2 ( eng3 ) eng4 日本語3」日本語4 " と言う行があって、english1 の位置で % しても、 " 「に対応する括弧を検索します。 " 但し、コメント内括弧や引用符付き括弧が混じっている場合、 " かなりデタラメな選択をします。 " (6) 備考: " テスト:({[({[({[({[)}])}]]})]}) " テスト:(「(「(「(「(「」)」)」)」)」) " テスト:「{『(「{『」}』」}』 " ネストは、検索対象の括弧だけ、数える仕様らしい。 " " 面倒なので、 " ~{motion} g~{motion} gU{motion} gu{motion} " g?{motion} " <{motion} >{motion} !{motion} ={motion} " gq{motion} gw{motion} " 辺りの複合?コマンドまでは実装していません。 " 大文字小文字変換は、スクリプトで実装するのはつらいので勘弁。 " それ以外の複合?コマンドは、普段は行ベースだけで使うし。 " " W E B " 辺りは、空白までの区切り、であって、動作は変わらない筈なので、 " 実装していません。 " " Bugs: " (1) " visual line モードで、 " ビジュアルモードを始めた位置より上側に移動してから、 " % w e b * # どれかのコマンドを実行したあと、 " v や Ctrl-v でモード切換すると、 " ビジュアルモードの開始カラム位置が狂う。 " (visual line モードの時、開始位置より上側に移動してから " スクリプトを実行すると、スクリプトからカラム位置を取得できない)。 " " (2) " # やったあと、n や N をやると、検索方向が逆になっている。 " (スクリプトから検索方向を設定する方法が判らん) " (そもそも viminfo でさえ、検索方向は保存されていないし) " " (3) " 起動後に set hlsearch、set nohlsearch の設定を変更しても無視する。 " (頻繁に変更するものでもないので、対応するのが面倒) " if exists("loaded_matchit2") finish endif if version < 700 finish endif let loaded_matchit2 = 1 " EUC-JPでの文字コード取得 function s:ENC_EUCchar2nr(c) if &encoding =~? 'euc-j' return EUC_EUCchar2nr(a:c) else let new_c = iconv(a:c,&enc,'euc-jp') return EUC_EUCchar2nr(new_c) endif endfunction function s:EUC_EUCchar2nr(c) let cn = char2nr(a:c[0]) if cn <= 0x7F return [ cn, 1 ] elseif (0xA1 <= cn && cn <= 0xFE) || (0x8E == cn) return [ (cn * 0x100 + char2nr(a:c[1])), 2 ] elseif 0x8F == cn return [ (cn * 0x10000 + char2nr(a:c[1]) * 0x100 + char2nr(a:c[2])) , 3 ] else return [ cn, 1 ] endif endfunction " 文字種判定 " ISO-2022, EUC-JP 以外では文字コードが文字種類順になっていないので " ISO-2022, EUC-JP に変換してからでないと判定できない。 " ISO-2022 はロッキングシフトがあって面倒なので EUC-JP を使う。 function s:CheckCharType_ByChar(c) let cn = ENC_EUCchar2nr(a:c)[0] return CheckCharType_ByCode(a:c,cn) endfunction function s:CheckCharType_ByCode(c,cn) if a:cn == 0 return -128 " 入力無し endif if a:c =~# g:iskeyword2_enc return 0 " スペース endif if a:cn <= 0x7F " JIS X 0201 if a:c =~# '\k' return 1 " iskeyword " テスト: "abc0def@ghi9jkl_mno" endif return 2 " iskeyword 以外のANK endif if a:cn <= 0xFF return -1 " 未定義 endif if a:cn < 0xA1A1 " EUC_EUCchar2nr(' ') return -2 " 未定義 endif if a:cn == 0xA1BC " EUC_EUCchar2nr('ー') return 6 " 拗音はカタカナ扱い endif if a:cn < 0xA3B0 " EUC_EUCchar2nr('0') return 3 " 記号 endif if a:cn < 0xA4A1 " EUC_EUCchar2nr('ぁ') return 4 " 数字、アルファベット endif if a:cn < 0xA5A1 " EUC_EUCchar2nr('ァ') return 5 " ひらがな endif if a:cn < 0xA6C1 " EUC_EUCchar2nr('Α') return 6 " カタカナ endif if a:cn < 0xA7A1 " EUC_EUCchar2nr('А') return 7 " ギリシャ文字 endif if a:cn < 0xA8A1 " EUC_EUCchar2nr('─') return 8 " キリル文字 endif if a:cn < 0xB0A1 " EUC_EUCchar2nr('亜') return 3 " JIS X 0213 で拡張された記号 endif return 9 " 漢字 endfunction " 文字列から次の1文字取得 function s:GetForwChar2(str,col) let str = strpart(a:str, a:col-1) if strlen(str) < 1 return [ '', 0, -128 ] endif if &encoding =~? 'euc-j' let cn = EUC_EUCchar2nr(str) let c = strpart(str, 0, cn[1]) "echo c.' '.cn[1].' '.CheckCharType_ByCode(c,cn[0]) return [ c, cn[1], CheckCharType_ByCode(c,cn[0]) ] elseif &encoding =~? 'utf-8' let cn0 = char2nr(str[0]) if (0xC0 <= cn0 && cn0 <= 0xDF) let n = 2 elseif (0xE0 <= cn0 && cn0 <= 0xEF) let n = 3 elseif (0xF0 <= cn0 && cn0 <= 0xF7) let n = 4 else let n = 1 endif let c = strpart(str, 0, n) "echo c.' '.n.' '.CheckCharType_ByChar(c) return [ c, n, CheckCharType_ByChar(c) ] elseif &encoding =~? '\%(932\|sjis\|shift\|ms_kanji\)' let cn0 = char2nr(str[0]) if ((0x81 <= cn0) && (cn0 <= 0x9F)) || ((0xE0 <= cn0) && (cn0 <= 0xFC)) let n = 2 " 手抜きで CP932 と SJIS の差異は無視 else let n = 1 endif let c = strpart(str, 0, n) "echo c.' '.n.' '.CheckCharType_ByChar(c) return [ c, n, CheckCharType_ByChar(c) ] else let c = strpart(str, 0, 1) return [ c, 1, CheckCharType_ByChar(c) ] endif endfunction " 文字列から1文字前の1文字取得 " ※ multi_byte系の後方パースは、やってはいけません。 function s:GetBackChar2(str,col) if a:col <= 1 return [ '', 0, -128 ] endif if &encoding =~? 'euc-j' let cn1 = char2nr(a:str[a:col-1 -1]) let cn = 0 if (0xA1 <= cn1) && (cn1 <= 0xFE) let cn2 = char2nr(a:str[a:col-1 -2]) if (0xA1 <= cn2) && (cn2 <= 0xFE) let cn3 = char2nr(a:str[a:col-1 -3]) if (0x8F != cn3) let n = 2 let cn = cn2 * 0x100 + cn1 else let n = 3 let cn = cn3 * 0x10000 + cn2 * 0x100 + cn1 endif elseif (0x8E == cn2) let n = 2 let cn = cn2 * 0x100 + cn1 else let n = 1 let cn = cn1 endif else let n = 1 let cn = cn1 endif let c = strpart(a:str, a:col-1 -n, n) "echo c.' '.n.' '.CheckCharType_ByCode(c,cn) return [ c, n, CheckCharType_ByCode(c,cn) ] elseif &encoding =~? 'utf-8' let cn = char2nr(a:str[a:col-1 -1]) if !((0x80 <= cn) && (cn <= 0xBF)) let n = 1 else let cn = char2nr(a:str[a:col-1 -2]) if !((0x80 <= cn) && (cn <= 0xBF)) let n = 2 else let cn = char2nr(a:str[a:col-1 -3]) if !((0x80 <= cn) && (cn <= 0xBF)) let n = 3 else let cn = char2nr(a:str[a:col-1 -4]) if !((0x80 <= cn) && (cn <= 0xBF)) let n = 4 else let n = 1 endif endif endif endif let c = strpart(a:str, a:col-1 -n, n) "echo c.' '.n.' '.CheckCharType_ByChar(c) return [ c, n, CheckCharType_ByChar(c) ] elseif &encoding =~? '\%(932\|sjis\|shift\|ms_kanji\)' let cn1 = char2nr(a:str[a:col-1 -1]) " Trail Byte " 手抜きで CP932 と SJIS の差異は無視 if ((0x40 <= cn1) && (cn1 <= 0x7E)) || ((0x80 <= cn1) && (cn1 <= 0xFC)) let cn2 = char2nr(a:str[a:col-1 -2]) " Lead Byte if ((0x81 <= cn2) && (cn2 <= 0x9F)) || ((0xE0 <= cn2) && (cn2 <= 0xFC)) let n = 2 else let n = 1 endif else let n = 1 endif let c = strpart(a:str, a:col-1 -n, n) "echo c.' '.n.' '.CheckCharType_ByChar(c) return [ c, n, CheckCharType_ByChar(c) ] else let c = strpart(a:str, a:col-1 -1, 1) return [ c, 1, CheckCharType_ByChar(c) ] endif endfunction " 単語抽出 function s:Get_cword2(str, col) let str_len = strlen(a:str) " 開始位置抽出 let cur_col = a:col let w = GetForwChar2(a:str, cur_col) let type = w[2] let old_col = cur_col let done = 0 while !done let done = 1 " 移動 while type == w[2] if cur_col <= 1 let old_col = 1 break endif let w = GetBackChar2(a:str, cur_col) let old_col = cur_col let cur_col = cur_col - w[1] endwhile " " 終了判定 " let old_type = type " let type = w[2] " if (old_type == 5) && (type == 9) " let done = 0 " endif endwhile let start_col = old_col " 終了位置抽出 let cur_col = a:col let w = GetForwChar2(a:str, cur_col) let type = w[2] let old_col = cur_col let done = 0 while !done let done = 1 " 移動 while type == w[2] if str_len < cur_col let old_col = str_len + 1 break endif let w = GetForwChar2(a:str, cur_col) let old_col = cur_col let cur_col = cur_col + w[1] endwhile " " 終了判定 " let old_type = type " let type = w[2] " if (old_type == 9) && (type == 5) " let done = 0 " endif endwhile let end_col = old_col " let word = strpart(a:str, start_col-1, end_col - start_col ) if CheckCharType_ByChar(word) == 1 return [ "\\<" . word . "\\>", start_col, end_col ] endif return [ word, start_col, end_col ] endfunction " ビジュアルモードの開始位置を抽出 function s:Get_Vmode_top(mode, st, ed, cur ) if a:st[1] == a:ed[1] if a:st[2] == a:cur[2] if a:ed[2] < 1 let a:ed[2] = 1 endif return a:ed else return a:st endif else if a:st[1] == a:cur[1] if a:ed[2] < 1 let a:ed[2] = 1 endif return a:ed else return a:st endif endif return a:cur endfunction " 複合?モードの開始処理 function s:Start_argmode(arg_mode) let vm = '' let st = getpos(".") if a:arg_mode ==? "v" let vm = visualmode() let st = Get_Vmode_top(vm, getpos("'<"), getpos("'>"), getpos(".") ) endif return [ vm, st ] endfunction " 複合?モードの終了処理 function s:Finish_argmode(arg_mode, st, cur) if a:arg_mode ==? "y" call setpos(".", a:st[1]) execute "normal! v" call cursor(a:cur[1],a:cur[2]) execute "normal! y" call setpos(".", a:st[1]) elseif a:arg_mode ==? "d" call setpos(".", a:st[1]) execute "normal! v" call cursor(a:cur[1],a:cur[2]) execute "normal! d" elseif a:arg_mode ==? "c" call setpos(".", a:st[1]) execute "normal! v" call cursor(a:cur[1],a:cur[2]) elseif a:arg_mode ==? "v" call setpos(".", a:st[1]) execute "normal! ". a:st[0] call cursor(a:cur[1],a:cur[2]) else call cursor(a:cur[1],a:cur[2]) endif return endfunction " 正規表現に被る文字をエスケープ function s:EscapeChar(arg) let in_pat = a:arg let out_pat = "" let n = match(in_pat, "[\]\[\*\]") while 0 <= n let out_pat = out_pat . strpart(in_pat, 0, n) . "\\" . strpart(in_pat, n, 1) let in_pat = strpart(in_pat, n+1) let n = match(in_pat, "[\]\[\*\]") endwhile return out_pat . in_pat endfunction " SearchPair2 用下準備 function s:ConvertMatchWords(arg) let list = [] call add(list,'') let n = 0 let ptr = match(a:arg, '[,:][^ :,]\+[:,]', 0) while 0 <= ptr let str = matchstr(a:arg, '[^ :,]\+', ptr) let ptr = match(a:arg, '[,:][^ :,]\+[:,]', ptr + strlen(str) + 1) let str = EscapeChar(str) call add(list,str) let n = n + 1 endwhile " if 2 <= n let list[0] = '\(' . list[1] let i = 2 while i <= n let list[0] = list[0] . '\|' . list[i] let i = i + 1 endwhile let list[0] = list[0] . '\)' elseif 1 == n let list[0] = '\(' . list[1] . '\)' else endif return list endfunction " 対応する括弧検索 function s:SearchPair2(arg_mode) let st = Start_argmode(a:arg_mode) " let begin = getpos('.') let cur = begin let str = strpart(getline(cur[1]), begin[2] - 1) let str_len = strlen(str) " let n1 = match(str, s:match1_words_list[0] ) let n2 = match(str, s:match2_words_list[0] ) "echo n1 .":". n2 "echo matchstr(str, s:match1_words_list[0] ) . ":" "echo matchstr(str, s:match2_words_list[0] ) . ":" " if (n2 < 0) || ((0 <= n1) && (n1 < n2)) " Original Mode if s:searchpair2_oldmap == "" execute "normal! %" else execute s:searchpair2_oldmap endif call Finish_argmode(a:arg_mode,st,getpos(".")) return endif " " Extended Mode " Search SearchWord call search(s:match2_words_list[0], 'cs', cur[1] ) " p オプションは、10単語までしか対応していなかった。 let nest_in = matchstr(str, s:match2_words_list[0] ) " Get type, Left or Right let n = match(g:match2_words_enc, ',[^ :,]\+:' . nest_in . ',') if 0 <= n let nest_left = EscapeChar(matchstr(g:match2_words_enc, '[^ :,]\+', n)) let nest_right = nest_in let search_opt = 'bW' let mode_msg = '?' else let n = match(g:match2_words_enc, ',' . nest_in . ':[^ :,]\+,') if 0 <= n let nest_left = nest_in let n = match(g:match2_words_enc, ':', n) let nest_right = EscapeChar(matchstr(g:match2_words_enc, '[^ :,]\+', n)) let search_opt = 'W' let mode_msg = '/' else echo "*** BUG in matchit2.vim ***" return endif endif " Exec Main Search "echo nest_left . ":" . nest_right . ":" . search_opt if 0 < strlen(search_opt) let [cur[1], cur[2]] = searchpairpos(nest_left, "", nest_right, search_opt) if (cur[1] == 0) && (cur[2] == 0) let cur = begin echo mode_msg . nest_left . ":" . nest_right . ": Pair was not found." else echo mode_msg . nest_left . ":" . nest_right endif else echo "There are no brackets." endif " call Finish_argmode(a:arg_mode,st,cur) return endfunction " 前方へ単語移動 function s:SearchWWord2(arg_mode) let st = Start_argmode(a:arg_mode) " let begin = getpos('.') let cur = begin let str = getline(cur[1]) let str_len = strlen(str) let done = 0 " let w = GetForwChar2(str, cur[2]) let type = w[2] while !done let done = 1 " 移動 while type == w[2] let new_col = cur[2] + w[1] if str_len < new_col " 行変更:単語先頭と等価 let new_row = cur[1] + 1 if line('$') < new_row let w = [ '', 0, -128 ] let type = -127 break endif let cur[1] = new_row let cur[2] = 1 let w = [ '', 0, -128 ] let type = -127 break endif let cur[2] = new_col let w = GetForwChar2(str, cur[2]) endwhile " 終了判定 let old_type = type let type = w[2] if (old_type == 9) && (type == 5) let done = 0 endif if (old_type != 0) && (type == 0) let done = 0 endif endwhile " call Finish_argmode(a:arg_mode,st,cur) return endfunction " 前方へ単語末尾移動 function s:SearchEWord2(arg_mode) let st = Start_argmode(a:arg_mode) " while 1 let begin = getpos('.') let cur = begin let str = getline(cur[1]) let str_len = strlen(str) let done = 0 " let w = GetForwChar2(str, cur[2]) let new_row = cur[1] let new_col = cur[2] + w[1] while str_len < new_col let new_row = new_row + 1 if line('$') < new_row let done = 1 break " 二重ブレイク endif let str = getline(new_row) let str_len = strlen(str) let new_col = 1 let cur[1] = new_row let cur[2] = new_col endwhile " while !done let done = 1 let w = GetForwChar2(str, new_col) let type = w[2] " 移動 while type == w[2] " echo "a:". cur[2] .":". new_col .":". w[0] .":". w[1] .":". w[2] .";" let cur[1] = new_row let cur[2] = new_col let new_col = cur[2] + w[1] if new_col <= str_len let w = GetForwChar2(str, new_col) else " 行変更:空白と等価 let new_row = new_row + 1 if line('$') < new_row let w = [ '', 0, -128 ] let type = -127 break " 三重ブレイク endif let str = getline(new_row) let str_len = strlen(str) let new_col = 1 let w = [ '', 0, 0 ] endif endwhile " 終了判定 if (type == 0) && (w[2] != 0) let done = 0 endif if (type == 9) && (w[2] == 5) let done = 0 endif let old_type = type endwhile break endwhile " call Finish_argmode(a:arg_mode,st,cur) return endfunction " 後方へ単語先頭移動 function s:SearchBWord2(arg_mode) let st = Start_argmode(a:arg_mode) " while 1 let begin = getpos('.') let cur = begin let str = getline(cur[1]) let str_len = strlen(str) let done = 0 " if cur[2] <= 1 if cur[1] <= 1 break endif let cur[1] = cur[1] - 1 let str = getline(cur[1]) let str_len = strlen(str) let cur[2] = str_len+1 endif " let w = GetBackChar2(str, cur[2]) let new_col = cur[2] - w[1] " echo "a:". cur[2] .":". new_col .":". w[0] .":". w[1] .":". w[2] .";" let type = w[2] while !done let done = 1 " 移動 while type == w[2] let cur[2] = new_col if cur[2] <= 1 " 行頭:単語先頭と等価 let w = [ '', 0, -128 ] let type = -127 break " 二重ブレイク endif let w = GetBackChar2(str, cur[2]) let new_col = cur[2] - w[1] endwhile " 終了判定 let old_type = type let type = w[2] if (old_type == 0) && (type != 0) let done = 0 endif if (old_type == 5) && (type == 9) let done = 0 endif endwhile break endwhile " if a:arg_mode ==? "c" let st[1][2] = st[1][2] -1 endif call Finish_argmode(a:arg_mode,st,cur) return endfunction " 前方へ単語検索 function s:SearchSFWord2(arg_mode) let st = Start_argmode(a:arg_mode) " let begin = getpos('.') let cur = begin let str = getline(cur[1]) let w = GetForwChar2(str, cur[2]) if w[2] == 0 call SearchWWord2("r") let cur = getpos('.') let str = getline(cur[1]) endif let cword = Get_cword2(str, cur[2]) let @/ = cword[0] let [lnum, col] = searchpos(cword[0], '') if (0 != lnum) && (0 != col) let cur[1] = lnum let cur[2] = col call setpos("'`", begin) endif " if a:arg_mode ==? "c" let cur[2] = cur[2] -1 endif call Finish_argmode(a:arg_mode,st,cur) return endfunction " 後方へ単語検索 function s:SearchSBWord2(arg_mode) let st = Start_argmode(a:arg_mode) " let begin = getpos('.') let cur = begin let str = getline(cur[1]) let w = GetForwChar2(str, cur[2]) if w[2] == 0 call SearchWWord2("r") let cur = getpos('.') let str = getline(cur[1]) endif let cword = Get_cword2(str, cur[2]) if cword[1] < cur[2] call SearchBWord2("r") endif let @/ = cword[0] let [lnum, col] = searchpos(cword[0], 'b') if (0 != lnum) && (0 != col) let cur[1] = lnum let cur[2] = col call setpos("'`", begin) endif " call Finish_argmode(a:arg_mode,st,cur) return endfunction " Config if !exists("g:iskeyword2") let g:iskeyword2 = '[\  、。,.・…‥]' endif if !exists("g:iskeyword2_enc") if &encoding =~? 'euc-j' let g:iskeyword2_enc = g:iskeyword2 else let g:iskeyword2_enc = iconv(g:iskeyword2,'euc-jp',&enc) endif endif if !exists("g:match2_words") let g:match2_words = ',(:),【:】,「:」,『:』,[:],〔:〕,{:},<:>,〈:〉,《:》,‘:’,“:”,' endif if !exists("g:match2_words_enc") if &encoding =~? 'euc-j' let g:match2_words_enc = g:match2_words else let g:match2_words_enc = iconv(g:match2_words,'euc-jp',&enc) endif endif let g:match1_words = ','. &matchpairs .',/*:*/,#if:#ifdef:#else:#elif:#endif,' let s:match1_words_list = ConvertMatchWords( g:match1_words ) let s:match2_words_list = ConvertMatchWords( g:match2_words_enc ) " Key Bind let s:searchpair2_oldmap = maparg("%",'n') "let s:searchwword2_oldmap = maparg("w",'n') "let s:searcheword2_oldmap = maparg("e",'n') "let s:searchbword2_oldmap = maparg("b",'n') "let s:searchsfword2_oldmap = maparg("*",'n') "let s:searchsbword2_oldmap = maparg("#",'n') nnoremap ,w w nnoremap ,yw yw nnoremap ,dw dw nnoremap ,cw cw vnoremap ,w w nnoremap ,e e nnoremap ,ye ye nnoremap ,de de nnoremap ,ce ce vnoremap ,e e nnoremap ,b b nnoremap ,yb yb nnoremap ,db db nnoremap ,cb cb vnoremap ,b b nnoremap ,* * nnoremap ,y* y* nnoremap ,d* d* nnoremap ,c* c* vnoremap ,* * nnoremap ,# # nnoremap ,y# y# nnoremap ,d# d# nnoremap ,c# c# vnoremap ,# # nnoremap ,% % nnoremap ,y% y% nnoremap ,d% d% nnoremap ,c% c% vnoremap ,% % nmap w :call SearchWWord2("n") nmap yw :call SearchEWord2("y") nmap dw :call SearchEWord2("d") nmap cw :call SearchEWord2("c")c vmap w :call SearchWWord2("v") nmap e :call SearchEWord2("n") nmap ye :call SearchEWord2("y") nmap de :call SearchEWord2("d") nmap ce :call SearchEWord2("c")c vmap e :call SearchEWord2("v") nmap b :call SearchBWord2("n") nmap yb :call SearchBWord2("y") nmap db :call SearchBWord2("d") nmap cb :call SearchBWord2("c")c vmap b :call SearchBWord2("v") if &hlsearch nmap * :set hlsearch:call SearchSFWord2("n") nmap y* :set hlsearch:call SearchSFWord2("y") nmap d* :set hlsearch:call SearchSFWord2("d") nmap c* :set hlsearch:call SearchSFWord2("c")c vmap * :set hlsearch:call SearchSFWord2("v") nmap # :set hlsearch:call SearchSBWord2("n") nmap y# :set hlsearch:call SearchSBWord2("y") nmap d# :set hlsearch:call SearchSBWord2("d") nmap c# :set hlsearch:call SearchSBWord2("c")c vmap # :set hlsearch:call SearchSBWord2("v") else nmap * :call SearchSFWord2("n") nmap y* :call SearchSFWord2("y") nmap d* :call SearchSFWord2("d") nmap c* :call SearchSFWord2("c")c vmap * :call SearchSFWord2("v") nmap # :call SearchSBWord2("n") nmap y# :call SearchSBWord2("y") nmap d# :call SearchSBWord2("d") nmap c# :call SearchSBWord2("c")c vmap # :call SearchSBWord2("v") endif nmap % :call SearchPair2("n") nmap y% :call SearchPair2("y") nmap d% :call SearchPair2("d") nmap c% :call SearchPair2("c")c vmap % :call SearchPair2("v") " [ End of File ]