mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-03-13 02:05:40 +08:00
136 lines
4.3 KiB
VimL
136 lines
4.3 KiB
VimL
"=============================================================================
|
||
" chinese.vim --- SpaceVim chinese layer
|
||
" Copyright (c) 2016-2021 Wang Shidong & Contributors
|
||
" Author: Wang Shidong < wsdjeg at 163.com >
|
||
" URL: https://spacevim.org
|
||
" License: GPLv3
|
||
"=============================================================================
|
||
|
||
|
||
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('nnoremap', ['n', 'c', 'd'], 'silent call call('
|
||
\ . string(s:_function('s:ConvertChineseNumberUnderCursorToDigit')) . ', [])',
|
||
\ 'Convert Chinese Number to Digit', 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
|
||
|
||
function! s:ConvertChineseNumberUnderCursorToDigit() abort
|
||
let cword = expand('<cword>')
|
||
let ChineseNumberPattern = "[〇一二三四五六七八九零壹贰叁肆伍陆柒捌玖貮两点]\+"
|
||
while cword =~ ChineseNumberPattern
|
||
let matchword = matchstr(cword, ChineseNumberPattern)
|
||
let cword = substitute(cword, matchword, s:Chinese2Digit(matchword))
|
||
endif
|
||
if !empty(cword)
|
||
let save_register = @k
|
||
let save_cursor = getcurpos()
|
||
let @k = cword
|
||
normal! viw"kp
|
||
call setpos('.', save_cursor)
|
||
let @k = save_register
|
||
endif
|
||
endfunction
|
||
|
||
let s:list = SpaceVim#api#import('data#list')
|
||
function! s:Chinese2Digit(cnDigitString) abort
|
||
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
|
||
}
|
||
|
||
let cnList = split(a:cnDigitString, "点")
|
||
let integer = cnList[0] # 整数部分
|
||
let decimal = len(cnList) == 2 ? cnList[1] : [] # 小数部分
|
||
let unit = 0 # 当前单位
|
||
let parse = [] # 解析数组
|
||
let i = len(integer)
|
||
while i >= 0
|
||
let i -= 1
|
||
let x = integer[i]
|
||
if has_key(CN_UNIT, x)
|
||
# 当前字符是单位
|
||
let unit = CN_UNIT[x]
|
||
if unit == 10000 # 万位
|
||
s:list.push(parse, "w")
|
||
let unit = 1
|
||
elseif unit == 100000000 # 亿位
|
||
s:list.push(parse, "y")
|
||
let unit = 1
|
||
elseif unit == 1000000000000 # 兆位
|
||
s:list.push(parse, "z")
|
||
let unit = 1
|
||
continue
|
||
else
|
||
# 当前字符是数字
|
||
let dig = CN_NUM[x]
|
||
if unit
|
||
let dig = dig * unit
|
||
let unit = 0
|
||
endif
|
||
s:list.push(parse, dig)
|
||
endif
|
||
endwhile
|
||
|
||
if unit == 10: # 处理10-19的数字
|
||
s:list.push(parse, 10)
|
||
endif
|
||
let result = 0
|
||
let tmp = 0
|
||
while parse
|
||
let x = s:list.pop(parse)
|
||
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
|
||
else:
|
||
let tmp += x
|
||
endif
|
||
let result += tmp
|
||
endwhile
|
||
|
||
if !empth(decimal)
|
||
for [k, v] in items(CN_NUM)
|
||
let decimal = substitute(decimal, k, v, 'g')
|
||
endfor
|
||
let decimal = "0." + decimal
|
||
let result += eval(decimal)
|
||
endif
|
||
return result
|
||
endfunction
|