From 735298e5b44e7e23d0e24361745a5b57bcab0611 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 22 Mar 2024 19:26:52 +0800 Subject: [PATCH] feat(chinese): add key bindings for translate types add key bindings to translate characters between fullwidth type and halfwidth type. Co-authored-by: Kun Lin --- autoload/SpaceVim/layers/edit.vim | 70 +++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/autoload/SpaceVim/layers/edit.vim b/autoload/SpaceVim/layers/edit.vim index 695e9ffc7..ea2eee23e 100644 --- a/autoload/SpaceVim/layers/edit.vim +++ b/autoload/SpaceVim/layers/edit.vim @@ -270,6 +270,11 @@ function! SpaceVim#layers#edit#config() abort call SpaceVim#mapping#space#def('nmap' , ['x' , 'U'] , 'Uppercase' , 'uppercase-text' , 0, 1) call SpaceVim#mapping#space#def('nmap' , ['x' , '~'] , 'ToggleCase' , 'toggle-case-text' , 0, 1) + " 定义 SpaceVim 键映射 + call SpaceVim#mapping#space#def('nmap', ['x', 'H'], 'ConvertToFullWidth', 'convert to fullWidth', 0, 1) + call SpaceVim#mapping#space#def('nmap', ['x', 'h'], 'ConvertToHalfWidth', 'convert to halfWidth', 0, 1) + call SpaceVim#mapping#space#def('nmap', ['x', 'W'], 'ToggleFullHalfWidth', 'toggle fullWidth and halfWidth', 0, 1) + " word let g:_spacevim_mappings_space.x.w = {'name' : '+Word'} call SpaceVim#mapping#space#def('vnoremap', ['x', 'w', 'c'], 'normal! ' . ":'<,'>s/\\\w\\+//gn" . "\", 'count the words in the select region', 1) @@ -992,6 +997,71 @@ function! s:parse(line) abort return s:VIM.parse_string(a:line) endfunction +" 为插件定义普通模式和视觉模式映射 +nnoremap ConvertToFullWidth :call ConvertFullHalfWidth('normal', 'fullWidth') +vnoremap ConvertToFullWidth :call ConvertFullHalfWidth('visual', 'fullWidth') + +nnoremap ConvertToHalfWidth :call ConvertFullHalfWidth('normal', 'halfWidth') +vnoremap ConvertToHalfWidth :call ConvertFullHalfWidth('visual', 'halfWidth') + +nnoremap ToggleFullHalfWidth :call ConvertFullHalfWidth('normal', 'toggleWidth') +vnoremap ToggleFullHalfWidth :call ConvertFullHalfWidth('visual', 'toggleWidth') + +" 定义转换函数 +function! s:ConvertFullHalfWidth(mode, widthType) abort + let save_cursor = getcurpos() + let save_register = getreg("k") + if a:mode == 'normal' + let cword = expand('') + if !empty(cword) + let rst = FullHalfWidthTranslator#Translate(cword, a:widthType) + if rst != cword + let @k = rst + normal! viw"kp + endif + endif + elseif a:mode == 'visual' + normal! gv + if mode() == "\" " 块选择模式 + 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 = FullHalfWidthTranslator#Translate(selectedText, a:widthType) + 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 + " 行选择或字符选择模式的处理 + normal! "ky + let selectedText = @k + let translatedText = FullHalfWidthTranslator#Translate(selectedText, a:widthType) + if translatedText != selectedText + call setreg('k', translatedText) + normal! gv"kp + endif + endif + endif + call setpos('.', save_cursor) + call setreg("k", save_register) +endfunction + function! SpaceVim#layers#edit#add_ft_head_tamplate(ft, tamp) abort call extend(s:ft_head_tp, {a:ft : a:tamp}) endfunction