let g:mi#ft#key_table = { \ '1': '!1!①', \ '2': '@2@②', \ '3': '#3#③', \ '4': '$4$④', \ '5': '%5%⑤', \ '6': '^6^⑥', \ '7': '&7&⑦', \ '8': '*8*⑧', \ '9': '(9(⑨', \ '0': ')0)', \ '`': '~〜', \ 'a': 'AaAぁあァア', \ 'b': 'BbBばびぶべぼバビブベボ', \ 'c': 'CcC', \ 'd': 'DdDだぢづでどダヂヅデド', \ 'e': 'EeEぇえェエ', \ 'f': 'FfF', \ 'g': 'GgGがぎぐげごガギグゲゴ', \ 'h': 'HhHはひふへほハヒフヘホ', \ 'i': 'IiIぃいィイ', \ 'j': 'JjJじジ〄', \ 'k': 'KkKかきくけこカキクケコヵヶ', \ 'l': 'LlL', \ 'm': 'MmMまみむめもマミムメモ', \ 'n': 'NnNなにぬねのナニヌネノんン', \ 'o': 'OoOぉおォオ', \ 'p': 'PpPぱぴぷぺぽパピプペポ', \ 'q': 'QqQ', \ 'r': 'RrRらりるれろラリルレロ', \ 's': 'SsSさしすせそサシスセソ', \ 't': 'TtTたちっつてとタチッツテト', \ 'u': 'UuUぅうゥウ', \ 'v': 'VゔvVヴ', \ 'w': 'WwWゎわゐゑをヮワヰヱヲ', \ 'x': 'XxX', \ 'y': 'Yyzゃやゅゆょよャヤュユョヨ', \ 'z': 'ZYZざじずぜぞザジズゼゾ', \ '=': '++=', \ '\': '|\|', \ '|': '|', \ ';': '::;', \ "'": '"゜゛', \ ',': '<、,〈《', \ '.': '>。.〉》', \ '/': '?・?/', \ '-': '_ー_', \ '[': '{{「『【〔〖', \ ']': '}}」』】〕〗', \ ' ': ' ', \ } let s:defaults = { \ 'fix_direction': 0, \ 'multiline': 0, \ 'digraph_marker': "\", \ } " # variables " " when enable this, ';' always search forward, ',' always search backward. " let g:mi#ft#fix_direction = 0 " " when enable this, search char in visible lines, not only current line. " let g:mi#ft#multiline = 0 " " the key to use digraph " let g:mi#ft#digraph_marker = "\" function! mi#ft#repeat(key) abort if a:key != ';' && a:key != ',' return endif let charsearch = getcharsearch() let char = charsearch.char if char == '' return endif if get(g:, 'mi#ft#fix_direction', s:defaults.fix_direction) let direction = a:key == ';' ? 1 : -1 else let direction = (charsearch.forward && a:key == ';') || \ (!charsearch.forward && a:key == ',') ? 1 : -1 endif let pattern = escape(char, '$^*~\') if has_key(g:mi#ft#key_table, char) let pattern = '[' .. char .. g:mi#ft#key_table[char] .. ']' endif if direction > 0 let flag = 'W' if charsearch.until let pattern = '\_.\ze' .. pattern endif else let flag = 'beW' if charsearch.until let pattern = pattern .. '\@<=\_.' endif endif if !get(g:, 'mi#ft#multiline', s:defaults.multiline) " in current line let stopline = line('.') elseif direction > 0 " to visible bottom let stopline = line('w$') else " to visible top let stopline = line('w0') endif for i in range(v:count1) let [lnum, col] = searchpos(pattern, flag, stopline) if lnum == 0 " not found return endif endfor call cursor(lnum, col) endfunction function! s:echo_one(...) abort echo a:1 let s:message_enable = 1 endfunction function! mi#ft#smart(key) abort if a:key !=? 'f' && a:key !=? 't' return endif if !exists('g:mi#dot_repeating') let timer_id = timer_start(1000, funcref('s:echo_one', ['[ft] input search char:'])) let char = nr2char(getchar()) call timer_stop(timer_id) if char == get(g:, 'mi#ft#digraph_marker', s:defaults.digraph_marker) unlet! s:message_enable redraw echo '[ft] input digraph:' let d1 = nr2char(getchar()) redraw if d1 !~ '\p' return endif echo '[ft] input digraph:' d1 let d2 = nr2char(getchar()) redraw if d2 !~ '\p' return endif let char = get(split(digraph_get(d1 .. d2)), 0, '') echo '[ft] input digraph:' d1 d2 '->' char endif if char !~ '\p' return endif if exists('s:message_enable') redraw echo '[ft] input search char:' char unlet! s:message_enable endif call setcharsearch({'char': ''}) call setcharsearch({'char': char, 'forward': a:key =~# '\l', 'until': a:key ==? 't'}) let s:lastchar = char endif call mi#ft#repeat(';') endfunction function! mi#ft#smart_expr(key) abort return $"v\call mi#ft#smart('{a:key}')\" endfunction function! mi#ft#repeat_expr(key) abort return $"v\call mi#ft#repeat('{a:key}')\" endfunction " :h getchar() " https://github.com/echasnovski/mini.nvim/blob/main/lua/mini/jump.lua