1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-14 04:07:59 +08:00
SpaceVim/autoload/SpaceVim/layers/chinese.vim
2023-03-26 13:44:47 +08:00

172 lines
5.9 KiB
VimL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"=============================================================================
" chinese.vim --- SpaceVim chinese layer
" Copyright (c) 2016-2023 Wang Shidong & Contributors
" Author: Wang Shidong < wsdjeg@outlook.com >
" URL: https://spacevim.org
" License: GPLv3
"=============================================================================
""
" @section Chinese, layers-chinese
" @parentsection layers
" `chinese` layer provides Chinese specific function for SpaceVim.
" This layer is not loaded by default, to use this layer, add following
" snippet into your SpaceVim configuration file.
" >
" [[layers]]
" name = 'chinese'
" <
"
" @subsection key bindings
" >
" Key binding Description
" SPC l c check with ChineseLinter
" SPC x g t translate current word
" SPC n c d convert chinese number to digit
" <
"
function! SpaceVim#layers#chinese#plugins() abort
let plugins = [
\ ['yianwillis/vimcdoc' , {'merged' : 0}],
\ ['voldikss/vim-translator' , {'merged' : 0, 'on_cmd' : ['Translate', 'TranslateW', 'TranslateR', 'TranslateX']}],
\ ['wsdjeg/ChineseLinter.vim' , {'merged' : 0, 'on_cmd' : 'CheckChinese', 'on_ft' : ['markdown', 'text']}],
\ ]
if SpaceVim#layers#isLoaded('ctrlp')
call add(plugins, ['vimcn/ctrlp.cnx', {'merged' : 0}])
endif
return plugins
endfunction
function! SpaceVim#layers#chinese#config() abort
let g:_spacevim_mappings_space.x.g = {'name' : '+translate'}
call SpaceVim#mapping#space#def('nnoremap', ['x', 'g', 't'], 'Translate' , 'translate current word' , 1)
call SpaceVim#mapping#space#def('nnoremap', ['l', 'c'] , 'CheckChinese', 'Check with ChineseLinter', 1)
let g:_spacevim_mappings_space.n.c = {'name' : '+Convert'}
call SpaceVim#mapping#space#def('nmap', ['n', 'c', 'd'], '<Plug>ConvertChineseNumberToDigit', 'convert Chinese number to digit', 0, 1)
" do not load vimcdoc plugin
let g:loaded_vimcdoc = 1
endfunction
function! SpaceVim#layers#chinese#health() abort
call SpaceVim#layers#chinese#plugins()
call SpaceVim#layers#chinese#config()
return 1
endfunction
command! -nargs=0 -range ConvertChineseNumberToDigit :<line1>,<line2>call s:ConvertChineseNumberToDigit()
nnoremap <silent> <Plug>ConvertChineseNumberToDigit :ConvertChineseNumberToDigit<cr>
vnoremap <silent> <Plug>ConvertChineseNumberToDigit :ConvertChineseNumberToDigit<cr>
function! s:ConvertChineseNumberToDigit() range
let save_cursor = getcurpos()
let ChineseNumberPattern = '[〇一二三四五六七八九十百千万亿兆零壹贰叁肆伍陆柒捌玖拾佰仟萬億两点]\+'
if mode() ==? 'n' && a:firstline == a:lastline
let cword = expand('<cword>')
let cword = substitute(cword, ChineseNumberPattern, '\=s:Chinese2Digit(submatch(0))', "g")
let save_register_k = getreg("k")
call setreg("k", cword)
normal! viw"kp
call setreg("k", save_register_k)
else
silent execute a:firstline . "," . a:lastline . 'substitute/' . ChineseNumberPattern . '/\=s:Chinese2Digit(submatch(0))/g'
endif
call setpos('.', save_cursor)
endfunction
function! s:Chinese2Digit(cnDigitString)
let CN_NUM = {
\ '': 0, '一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9,
\ '零': 0, '壹': 1, '贰': 2, '叁': 3, '肆': 4, '伍': 5, '陆': 6, '柒': 7, '捌': 8, '玖': 9,
\ '貮': 2, '两': 2, '点': '.'
\ }
let CN_UNIT = {
\ '十': 10, '拾': 10, '百': 100, '佰': 100, '千': 1000, '仟': 1000, '万': 10000, '萬': 10000,
\ '亿': 100000000, '億': 100000000, '兆': 1000000000000
\ }
if a:cnDigitString =~ '^[点两貮〇一二三四五六七八九零壹贰叁肆伍陆柒捌玖]\+$'
let result = substitute(a:cnDigitString, ".", {m -> CN_NUM[m[0]]}, 'g')
else
let cnList = split(a:cnDigitString, "点")
let integer = map(str2list(cnList[0]), 'nr2char(v:val)') " 整数部分
let decimal = len(cnList) == 2 ? cnList[1] : [] " 小数部分
let unit = 0 " 当前单位
let parse = [] " 解析数组
while !empty(integer)
let x = remove(integer, -1)
if has_key(CN_UNIT, x)
" 当前字符是单位
let unit = CN_UNIT[x]
if unit == 10000 " 万位
call add(parse, "w")
let unit = 1
elseif unit == 100000000 " 亿位
call add(parse, "y")
let unit = 1
elseif unit == 1000000000000 " 兆位
call add (parse, "z")
let unit = 1
endif
continue
else
" 当前字符是数字
let dig = CN_NUM[x]
if unit
let dig *= unit
let unit = 0
endif
call add(parse, dig)
endif
endwhile
if unit == 10 " 处理10-19的数字
call add(parse, 10)
endif
let result = 0
let tmp = 0
while !empty(parse)
let x = remove(parse, -1)
if type(x) == type("")
if x == 'w'
let tmp *= 10000
let result += tmp
let tmp = 0
elseif x == 'y'
let tmp *= 100000000
let result += tmp
let tmp = 0
elseif x == 'z'
let tmp *= 1000000000000
let result += tmp
let tmp = 0
endif
else
let tmp += x
endif
endwhile
let result += tmp
if !empty(decimal)
let decimal = substitute(decimal, ".", {m -> CN_NUM[m[0]]}, 'g')
let result .= "." . decimal
endif
endif
return result
endfunction
" function() wrapper
if v:version > 703 || v:version == 703 && has('patch1170')
function! s:_function(fstr) abort
return function(a:fstr)
endfunction
else
function! s:_SID() abort
return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze__SID$')
endfunction
let s:_s = '<SNR>' . s:_SID() . '_'
function! s:_function(fstr) abort
return function(substitute(a:fstr, 's:', s:_s, 'g'))
endfunction
endif
" vim:set et nowrap sw=2 cc=80: