zoukankan      html  css  js  c++  java
  • Vim增加一键切换当前单词为自定义内容(比如 true 切换为false)

    Vim写代码时经常会用到两个单词切换,比如 true 转成 false,on 改成 off 等,

    于是就偷懒写了个函数一键替换,内容完全自定义,并且会保留大小写方式。

    定义一个 ["up","down"],还能实现 aUp→aDown,a_Up→a_Down,a_up→a_down的转换

    vimrc 里增加两行内容

    nnoremap <silent> <M-t> ciw<C-r>=hy_string#modify#toggleWord(@")<cr><esc>
    xnoremap <silent> <M-t> s<C-r>=hy_string#modify#toggleWord(@")<cr><esc>
    

      以下函数是写在 $Vimvimfilesautoloadhy_stringmodify.vim 文件内

    "true/false, up/down切换
    "NOTE lis大小写或首字母大写,全用小写,其他情况保留原大小写
    function! hy_string#modify#toggleWord(word)
        let lis = [
                     ['!', '!'],
                     [',', ','],
                     ['.', '。'],
                     ['<^', 'LCtrl & '],
                     ['>^', 'RCtrl & '],
                     ['<+', 'LShift & '],
                     ['>+', 'RShift & '],
                     ['<!', 'LAlt & '],
                     ['>!', 'RAlt & '],
                     ['FireShot', 'mcbpblocgmgfnpjjppndjkmgjaogfceg'],
                     ['Surfingkeys', 'gfbliohnnapiefjpjlpjnehglfpaknnc'],
                     ['SwitchyOmega', 'padekgcemlokbadohgkifijomclgjgif'],
                     ['Tampermonkey', 'dhdgffkkebhmkfjojejmpbldmpobfkfo'],
                     ['from', 'to'],
                     ['yes', 'no'],
                     ['on', 'off'],
                     ['down', 'up'],
                     ['left', 'right'],
                     ['top', 'bottom'],
                     ['this', 'base'],
                     ['read', 'write'],
                     ['row', 'column'],
                     ['rows', 'columns'],
                     ['focus', 'blur'],
                     ['lower', 'upper'],
                     ['odd', 'even'],
                     ['before', 'after'],
                     ['max', 'min'],
                     ['prev', 'next'],
                     ['true', 'false'],
                     ['enable', 'disable'],
                     ['enabled', 'disabled'],
                     ['user', 'pwd'],
                     ['width', 'height'],
                     ['horizontal', 'vertical'],
                     ['username', 'password'],
                     ['hkcr', 'HKEY_CLASSES_ROOT'],
                     ['hkcu', 'HKEY_CURRENT_USER'],
                     ['hklm', 'HKEY_LOCAL_MACHINE'],
                     ['hku', 'HKEY_USERS'],
                     ['hkcc', 'HKEY_CURRENT_CONFIG'],
                     ['左', '右'],
                     ['上', '下'],
                     ['水平', '垂直'],
                     ]
        let word = a:word
        "word前后内容
        let idx0 = stridx(getline('.'), word, col('.')-strlen(word))
        let strBefore = strpart(getline('.'), 0, idx0)
        let strAfter = strpart(getline('.'), idx0+strlen(word))
        "echom strBefore .'--'. strAfter .'--'. word
        "lPair 转成 dic(相互为key,方便判断)
        let dic = {}
        for lPair in lis
            let dic[lPair[0]] = lPair[1]
            let dic[lPair[1]] = lPair[0]
        endfor
        "NOTE dic 额外增加单向的内容
        let dic['int'] = 'integer'
        let dic['integer'] = '^d+$'
        "处理单词大小写
        let upCase = hy_string#modify#upperCase(word)
        let wordFixed = upCase > 0 ? tolower(word) : word "wordFixed 用来调整大小写
        "echom word .' '. wordFixed
        if !has_key(dic,wordFixed) "不在定义列表内
            "echom 'not in dic'
            "aUp → aDown
            if word =~# '[A-Z]'
                let char = ''
                let l = hy_string#split#byUpper(word)
            else
                let char = matchstr(word, 'c[^a-z]')
                let l = split(word, 'c[^a-z]')
            endif
            for i in range(len(l))
                let upCase = hy_string#modify#upperCase(l[i])
                let wordFixed = upCase > 0 ? tolower(l[i]) : word "wordFixed 用来调整大小写
                if has_key(dic, wordFixed) "找到匹配
                    let res = dic[wordFixed]
                    "恢复大小写
                    if upCase == 1
                        let res = tolower(res)
                    elseif upCase == 2
                        let res = toupper(res)
                    elseif upCase == 3
                        let res = substitute(res, '.*', 'Lu&', '')
                    endif
                    "修改 l
                    let l[i] = res
                    return join(l, char)
                endif
            endfor
            return word
        else
            let res = dic[wordFixed]
            if upCase == 1
                let res = tolower(res)
            elseif upCase == 2
                let res = toupper(res)
            elseif upCase == 3
                let res = substitute(res, '.*', 'Lu&', '')
            endif
        endif
        return res
        "    execute "normal! ciw" . res
        "call setline(line('.'), strBefore . res . strAfter)
    endfunction
    
    "获取字符串的大小写情况
    "1为小写
    "2为大写
    "3为首字母大写
    "0为其他情况(strUpper)
    function! hy_string#modify#upperCase(str) abort
        if a:str !~ 'a' "没字母
            return 0
        elseif a:str ==# tolower(a:str)
            return 1
        elseif a:str ==# toupper(a:str)
            return 2
        elseif a:str =~# 'v^ul*$'
            return 3
        else
            return 0
    endfunction
    
    "abcUp转成 ['abc', 'Up']
    function! hy_string#split#byUpper(str) abort
        let char = '!'
        let s = substitute(a:str, 'vC[A-Z]', char.'&', 'g') "大写字母前增加符号用来 split
        if strcharpart(s, 0, 1) == char | let s = strcharpart(s, 1) | endif
        return split(s, char)
    endfunction
  • 相关阅读:
    vi编辑器
    数据发送的三种方式
    发送文件的三种方式
    提交表单提示框确定取消 点取消不会刷新页面
    input value="值栈的值"
    值栈
    struts2文件上传突破2M限制
    jsp取不到值栈的值
    站群--插件--点击量
    Java WebService 简单实例
  • 原文地址:https://www.cnblogs.com/hyaray/p/14604380.html
Copyright © 2011-2022 走看看