删除unicode组合字符 - vim

时间:2017-09-10 13:12:03

标签: vim unicode

我找到了一个很棒的提示如何为gVim中的unicode字符实现删除线 - http://vim.wikia.com/wiki/Create_underlines,_overlines,_and_strikethroughs_using_combining_characters

它对我很有用,但我仍然坚持创造"反向功能"我想要达成的最终结果将是例如t to striketrough characters并重复这个将删除字符中的striketrough。 我想我可以创建这样的功能,但我错过了一个核心的东西,那就是如何删除组合字符。在提到的文章中提到你可以

:set delcombine

可以让您删除' x'只有组合字符。但这不是我想做的事情:)

那么是否有人能够更改该文章中所述的以下脚本以添加其他功能以从选择中删除删除线?

" modify selected text using combining diacritics
command! -range -nargs=0 Overline        call s:CombineSelection(<line1>, <line2>, '0305')
command! -range -nargs=0 Underline       call s:CombineSelection(<line1>, <line2>, '0332')
command! -range -nargs=0 DoubleUnderline call s:CombineSelection(<line1>, <line2>, '0333')
command! -range -nargs=0 Strikethrough   call s:CombineSelection(<line1>, <line2>, '0336')

function! s:CombineSelection(line1, line2, cp)
  execute 'let char = "\u'.a:cp.'"'
  execute a:line1.','.a:line2.'s/\%V[^[:cntrl:]]/&'.char.'/ge'
endfunction

我真的很感激:)

1 个答案:

答案 0 :(得分:0)

此功能要么删除传递的组合字符,要么将其添加到文本中。

function! ToggleCombining( character, text )
    let l:cleanedText = ''
    let l:idx = 0
    while l:idx < len(a:text)
        let l:codepoint = nr2char(char2nr(a:text[l:idx :]))
        if l:codepoint !=# a:character
            let l:cleanedText .= l:codepoint
        endif

        let l:idx += len(l:codepoint)
    endwhile

    if l:cleanedText !=# a:text
        return l:cleanedText
    else
        return substitute(a:text, '[^[:cntrl:]]', '&' . a:character, 'g')
    endif
endfunction

调用

:call ToggleCombining("\u0332", "sample text")