From 3863ea63812e2bcebf2c3af4e8835399ce93f040 Mon Sep 17 00:00:00 2001 From: Kun Lin <5350867+NamelessUzer@users.noreply.github.com> Date: Mon, 13 Dec 2021 21:50:38 +0800 Subject: [PATCH] feat(chinese): add key binding to convert Chinese number to digit --- autoload/SpaceVim/layers/chinese.vim | 101 +++++++++++++++++++++++++++ docs/cn/layers/chinese.md | 7 ++ docs/layers/chinese.md | 7 ++ 3 files changed, 115 insertions(+) diff --git a/autoload/SpaceVim/layers/chinese.vim b/autoload/SpaceVim/layers/chinese.vim index 0e2bec293..0997028cc 100644 --- a/autoload/SpaceVim/layers/chinese.vim +++ b/autoload/SpaceVim/layers/chinese.vim @@ -23,6 +23,10 @@ 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 @@ -32,3 +36,100 @@ function! SpaceVim#layers#chinese#health() abort call SpaceVim#layers#chinese#config() return 1 endfunction + +function! s:ConvertChineseNumberUnderCursorToDigit() abort + let cword = expand('') + 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 diff --git a/docs/cn/layers/chinese.md b/docs/cn/layers/chinese.md index 32376dfb1..062935800 100644 --- a/docs/cn/layers/chinese.md +++ b/docs/cn/layers/chinese.md @@ -11,6 +11,7 @@ lang: zh - [模块描述](#模块描述) - [启用模块](#启用模块) - [模块配置](#模块配置) +- [快捷键](#快捷键) @@ -36,3 +37,9 @@ lang: zh [options] vim_help_language = "cn" ``` + +## 快捷键 + +| 快捷键 | 功能描述 | +| ----------- | ------------------ | +| `SPC n c d` | 将中文数字转为数字 | diff --git a/docs/layers/chinese.md b/docs/layers/chinese.md index b81a063d4..faaa4d5eb 100644 --- a/docs/layers/chinese.md +++ b/docs/layers/chinese.md @@ -10,6 +10,7 @@ description: "Layer for chinese users, include chinese docs and runtime messages - [Description](#description) - [Install](#install) - [Configuration](#configuration) +- [Key bindings](#key-bindings) @@ -34,3 +35,9 @@ Add the following snippet to your custom config file to enable this feature. [options] vim_help_language = "cn" ``` + +## Key bindings + +| Key Binding | Description | +| ----------- | ------------------------------- | +| `SPC n c d` | Convert Chinese Number to Digit |