1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-02 22:30:04 +08:00

fix(chinese): fix translating function between numerals

Co-authored-by: Kun Lin <Kun.Lin@qq.com>
This commit is contained in:
Eric Wong 2024-03-22 19:22:28 +08:00
parent 887943dc84
commit a1596e9f20

View File

@ -65,50 +65,122 @@ function! SpaceVim#layers#chinese#health() abort
return 1 return 1
endfunction endfunction
command! -nargs=0 -range ConvertChineseNumberToDigit :<line1>,<line2>call s:ConvertChineseNumberToDigit()
nnoremap <silent> <Plug>ConvertChineseNumberToDigit :ConvertChineseNumberToDigit<cr> " 定义快捷键映射
vnoremap <silent> <Plug>ConvertChineseNumberToDigit :ConvertChineseNumberToDigit<cr> nnoremap <silent> <Plug>ConvertChineseNumberToDigit :call <sid>ConvertChineseNumberToDigit('normal')<cr>
function! s:ConvertChineseNumberToDigit() range vnoremap <silent> <Plug>ConvertChineseNumberToDigit :call <sid>ConvertChineseNumberToDigit('visual')<cr>
" 函数定义
function! s:ConvertChineseNumberToDigit(mode) range
let save_cursor = getcurpos() let save_cursor = getcurpos()
let ChineseNumberPattern = '[〇一二三四五六七八九十百千万亿兆零壹贰叁肆伍陆柒捌玖拾佰仟萬億两点]\+' let save_register = @k
if mode() ==? 'n' && a:firstline == a:lastline if a:mode == 'normal'
" 正常模式处理
let cword = expand('<cword>') let cword = expand('<cword>')
let cword = substitute(cword, ChineseNumberPattern, '\=Zh2Num#Translator(submatch(0))', "g") let rst = substitute(cword, Zh2Num#getZhNumPattern(), '\=Zh2Num#Translator(submatch(0))', "g")
let save_register_k = getreg("k") if rst != cword
call setreg("k", cword) let @k = rst
normal! viw"kp normal! viw"kp
call setreg("k", save_register_k) endif
else else
silent execute a:firstline . "," . a:lastline . 'substitute/' . ChineseNumberPattern . '/\=Zh2Num#Translator(submatch(0))/g' " 可视模式处理
normal! gv
if mode() == "\<C-V>"
" 块选择模式
let [line_start, column_start] = getpos("'<")[1:2]
let [line_end, column_end] = getpos("'>")[1:2]
if column_end < column_start
let [column_start, column_end] = [column_end, column_start]
endif
for line_num in range(line_start, line_end)
let line = getline(line_num)
let line_utf8 = iconv(line, &encoding, 'UTF-8')
let selectedText = line_utf8[column_start - 1: column_end - 1]
let translatedText = substitute(selectedText, Zh2Num#getZhNumPattern(), '\=Zh2Num#Translator(submatch(0))', 'g')
let newLine = line[:column_start - 2] . translatedText . line[column_end:]
call setline(line_num, newLine)
endfor
else
" 其他可视模式
normal! "ky
let selectedText = iconv(@k, &encoding, 'UTF-8')
let translatedText = substitute(selectedText, Zh2Num#getZhNumPattern(), '\=Zh2Num#Translator(submatch(0))', 'g')
if translatedText != selectedText
call setreg('k', translatedText)
normal! gv"kp
endif
endif
endif endif
call setpos('.', save_cursor) call setpos('.', save_cursor)
let @k = save_register
endfunction endfunction
command! -nargs=0 -range ConvertDigitToChineseNumberLower :<line1>,<line2>call s:ConvertDigitToChineseNumber("lower") nnoremap <silent> <Plug>ConvertDigitToChineseNumberLower :call <sid>ConvertDigitToChineseNumber('normal', "lower")<cr>
nnoremap <silent> <Plug>ConvertDigitToChineseNumberLower :ConvertDigitToChineseNumberLower<cr> vnoremap <silent> <Plug>ConvertDigitToChineseNumberLower :call <sid>ConvertDigitToChineseNumber('visual', "lower")<cr>
vnoremap <silent> <Plug>ConvertDigitToChineseNumberLower :ConvertDigitToChineseNumberLower<cr>
command! -nargs=0 -range ConvertDigitToChineseNumberUpper :<line1>,<line2>call s:ConvertDigitToChineseNumber("upper") nnoremap <silent> <Plug>ConvertDigitToChineseNumberUpper :call <sid>ConvertDigitToChineseNumber('normal', "upper")<cr>
nnoremap <silent> <Plug>ConvertDigitToChineseNumberUpper :ConvertDigitToChineseNumberUpper<cr> vnoremap <silent> <Plug>ConvertDigitToChineseNumberUpper :call <sid>ConvertDigitToChineseNumber('visual', "upper")<cr>
vnoremap <silent> <Plug>ConvertDigitToChineseNumberUpper :ConvertDigitToChineseNumberUpper<cr>
function! s:ConvertDigitToChineseNumber(style) range function! s:ConvertDigitToChineseNumber(mode, caseType) abort
let save_cursor = getcurpos() let save_cursor = getcurpos()
let NumberPattern = '\v\d+(\.\d+)?' let save_register = @k
if mode() ==? 'n' && a:firstline == a:lastline let cword = expand('<cword>')
let cword = expand('<cword>') if a:mode == 'normal'
" 在这里使用双引号和 . 连接符来正确地引用 a:style if !empty(cword)
let cword = substitute(cword, NumberPattern, '\=Num2Zh#Translator(submatch(0), "'.a:style.'")', "g") let rst = substitute(cword, Num2Zh#getNumberPattern(), '\=Num2Zh#Translator(submatch(0), "'. a:caseType .'")', "g")
let save_register_k = getreg("k") if rst != cword
call setreg("k", cword) let @k = rst
normal! viw"kp normal! viw"kp
call setreg("k", save_register_k) endif
else endif
" 在执行替换的字符串中正确使用 a:style 参数 " 如果是block模式则特别处理
silent execute a:firstline . "," . a:lastline . 'substitute/' . NumberPattern . '/\=Num2Zh#Translator(submatch(0), "'.a:style.'")/g' elseif a:mode == 'visual'
normal! gv
if mode() == "\<C-V>"
let [line_start, column_start] = getpos("'<")[1:2]
let [line_end, column_end] = getpos("'>")[1:2]
if column_end < column_start
let [column_start, column_end] = [column_end, column_start]
endif
for line_num in range(line_start, line_end)
let line = getline(line_num)
" 将行文本转换为UTF-8编码
let line_utf8 = iconv(line, &encoding, 'UTF-8')
let selectedText = line_utf8[column_start - 1: column_end - 1]
let translatedText = substitute(selectedText, Num2Zh#getNumberPattern(), '\=Num2Zh#Translator(submatch(0), "' . a:caseType . '")', 'g')
let newLine = line[:column_start - 2] . translatedText . line[column_end:]
call setline(line_num, newLine)
endfor
else
" 对其他模式的处理
if mode() == 'line'
normal! '[V']
elseif mode() == 'char'
normal! `[v`]
elseif mode() ==? 'v'
normal! gv
else
normal! '[v']
endif
" 获取选择的文本将其保存在寄存器t中
normal! "ky
let selectedText = iconv(@k, &encoding, 'UTF-8')
" 转换文本
let translatedText = substitute(selectedText, Num2Zh#getNumberPattern(), '\=Num2Zh#Translator(submatch(0), "' . a:caseType . '")', 'g')
if translatedText != selectedText
" 替换原文本
call setreg('k', translatedText)
normal! gv"kp
endif
endif
endif endif
call setpos('.', save_cursor) call setpos('.', save_cursor)
let @k = save_register
endfunction endfunction
" function() wrapper " function() wrapper
if v:version > 703 || v:version == 703 && has('patch1170') if v:version > 703 || v:version == 703 && has('patch1170')
function! s:_function(fstr) abort function! s:_function(fstr) abort