zoukankan      html  css  js  c++  java
  • [20190913]完善vim的bccacl插件2.txt

    [20190913]完善vim的bccacl插件2.txt

    --//继续完善vim的bccacl插件。
    --//c 计算也可以直接使用 b 操作,这样操作更快一些。
    --//增加直接写好算式计算的快捷cc(注不用输入最后等号),这步直接调用bc,这样算式没有问题,都能计算正确。

    "" calculate expression on current line, pick a mapping, or use the Leader
    nnoremap  <Leader>bx <Esc>A <Esc>"eyy$:call CalcLines(0)<CR>
    nnoremap  <Leader>bc <Esc>A = <Esc>"eyy:call CalcLines(0)<CR>
    nnoremap  <Leader>bb <Esc>A = <Esc>"eyy:call CalcLines(0)<CR>
    noremap   <Leader>cc Yp!!bc -lq<CR>kA = <ESC>J

    --//例子:
    x=12;y=23.1;x*y  = 277.2                 (输入cc)
    a=12;b=F; a+b = 27                       (输入cc)
    scale=0;4300011211%2^32  = 5043915       (输入cc)
    4300011211%2^32 = .00000000003987734528  (输入cc)
    4300011211 = scn_wrap,scn_base(10): 1,5043915 =scn_wrap,scn_base(16): 0x1,0x4cf6cb (输入32)

    4300011211/2^32 = 1.00117437797598540782
    4300011211-1.00117437797598540782*2^32 = .00000000003987734528

    --//说明:bc -l 调用math库函数,缺省scale=20. 而一般取模运算应用都是整形,先设置scale=0再计算就ok了。

    --//windows系列不用执行这步,如果算式包含*()^, windows下会报错。
    if has("unix")
        let str = escape (str, '*();&><|^')
    endif

    --//convert hexdecimal to decimal or decimal to hexdecimal,增加hh,dd,dh,这样操作更快一些。
    nnoremap  <Leader>hd <Esc>A = <Esc>"eyy:call CalcLines(30016)<CR>
    nnoremap  <Leader>hh <Esc>A = <Esc>"eyy:call CalcLines(30016)<CR>
    nnoremap  <Leader>dd <Esc>A = <Esc>"eyy:call CalcLines(30016)<CR>
    nnoremap  <Leader>dh <Esc>A = <Esc>"eyy:call CalcLines(30016)<CR>

    --//优化函数Check_hex。
    if ss =~ "[abcdef]"
        let has_hex = 1
        return has_hex
    endif

    --//最终代码如下:
    "" calculate expression entered on command line and give answer, e.g.:
    " :Calculate sin (3) + sin (4) ^ 2
    command! -nargs=+ Calculate echo "<args> = " . Calculate ("<args>",0)

    "" calculate expression from selection, pick a mapping, or use the Leader form
    vnoremap ;bc "ey`>:call CalcLines(0)<CR>
    vnoremap ;bb "ey`>:call CalcLines(0)<CR>

    vnoremap ;10 "ey`>:call CalcLines(10)<CR>
    vnoremap ;16 "ey`>:call CalcLines(16)<CR>

    vnoremap ;22 "ey`>:call CalcLines(22)<CR>
    vnoremap ;dba "ey`>:call CalcLines(22)<CR>

    vnoremap ;32 "ey`>:call CalcLines(32)<CR>
    vnoremap ;scn "ey`>:call CalcLines(32)<CR>

    vnoremap ;ss "ey`>:call CalcLines(10016)<CR>
    vnoremap ;rr "ey`>:call CalcLines(20016)<CR>
    vnoremap ;hd "ey`>:call CalcLines(30016)<CR>
    vnoremap ;hh "ey`>:call CalcLines(30016)<CR>
    vnoremap ;dd "ey`>:call CalcLines(30016)<CR>
    vnoremap ;dh "ey`>:call CalcLines(30016)<CR>

    "" calculate expression on current line, pick a mapping, or use the Leader
    nnoremap  <Leader>bx <Esc>A <Esc>"eyy$:call CalcLines(0)<CR>
    nnoremap  <Leader>bc <Esc>A = <Esc>"eyy:call CalcLines(0)<CR>
    nnoremap  <Leader>bb <Esc>A = <Esc>"eyy:call CalcLines(0)<CR>
    noremap   <Leader>cc Yp!!bc -lq<CR>kA = <ESC>J

    " convert hexdecimal to decimal
    nnoremap  <Leader>10 <Esc>A = <Esc>"eyy:call CalcLines(10)<CR>

    " convert decimal to hexdecimal
    nnoremap  <Leader>16 <Esc>A = <Esc>"eyy:call CalcLines(16)<CR>

    " split dba(10) or dba(16) to file# and block#
    nnoremap  <Leader>22  <Esc>A = <Esc>"eyy:call CalcLines(22)<CR>
    nnoremap  <Leader>dba <Esc>A = <Esc>"eyy:call CalcLines(22)<CR>

    " split scn(10) or scn(16) into scn_wrap,scn_base
    nnoremap  <Leader>32  <Esc>A = <Esc>"eyy:call CalcLines(32)<CR>
    nnoremap  <Leader>scn <Esc>A = <Esc>"eyy:call CalcLines(32)<CR>

    " convert scn_wrap,scn_base(10) or scn_wrap,scn_base(16) to 10 or 16 base
    nnoremap  <Leader>ss <Esc>A = <Esc>"eyy:call CalcLines(10016)<CR>

    " convert file#,block# dba(10) or file#,block# dba(16) to 10 or 16 base
    nnoremap  <Leader>rr <Esc>A = <Esc>"eyy:call CalcLines(20016)<CR>

    " convert hexdecimal to decimal or decimal to hexdecimal
    nnoremap  <Leader>hd <Esc>A = <Esc>"eyy:call CalcLines(30016)<CR>
    nnoremap  <Leader>hh <Esc>A = <Esc>"eyy:call CalcLines(30016)<CR>
    nnoremap  <Leader>dd <Esc>A = <Esc>"eyy:call CalcLines(30016)<CR>
    nnoremap  <Leader>dh <Esc>A = <Esc>"eyy:call CalcLines(30016)<CR>

    "" calculate from insertmode
    inoremap =: = <Esc>"eyy:call CalcLines(0)<CR>a

    " ---------------------------------------------------------------------
    "  Calculate:
    "    clean up an expression, pass it to bc, return answer
    function! Calculate (s,flag)
        
        let has_hex = 0
        let str = a:s

        " remove newlines and trailing spaces
        let str = substitute (str, " ",   "", "g")
        let str = substitute (str, 's*$', "", "g")

        " sub common func names for bc equivalent
        let str = substitute (str, 'csins*(',  's (', 'g')
        let str = substitute (str, 'ccoss*(',  'c (', 'g')
        let str = substitute (str, 'catans*(', 'a (', 'g')
        let str = substitute (str, "clns*(",   'l (', 'g')
        let str = substitute (str, 'clogs*(',  'l (', 'g')
        let str = substitute (str, 'cexps*(',  'e (', 'g')

        " alternate exponitiation symbols
        let str = substitute (str, '**', '^', "g")
        let str = substitute (str, '`', '^',    "g")
        let str = substitute (str, '^', '^^^^',    "g")

        " escape chars for shell
        if has("unix")
            let str = escape (str, '*();&><|^')
        endif

        let preload = exists ("g:bccalc_preload") ? g:bccalc_preload : ""

        " run bc
        " return str
        " let answer = system ("echo " . str . " | bc -l " . preload)

        if a:flag == 0
             let answer = system ("echo " . str . " | bc -l " . preload)
             " let answer = answer . " --- ". str
        endif

        if a:flag == 10
            let str = substitute (str, "0x", "", "g")
            let str = toupper (str)
            let answer = system ("echo ibase=16 ;" . str .  " | bc -l " . preload)
        endif

        if a:flag == 16
            let answer = system ("echo obase=16 ;" . str .  " | bc -l " . preload)
            let answer = "0x" . tolower ( answer )
        endif

        let has_hex = Check_hex(str)

        if a:flag == 22
            if has_hex == 1
                let str = toupper (str)
                let str = substitute (str, "0x", "", "g")
                " 0x400000 hexdecimal = 4194304 (10) = 2^22(10)
                let answer  = system ("echo ibase=16 ;" . str . "/400000" . " | bc " . preload)
                let answer1 = system ("echo ibase=16 ;" . str . "%400000" . " | bc " . preload)
            else
                let answer  = system ("echo " . str . "/4194304" . " | bc " . preload)
                let answer1 = system ("echo " . str . "%4194304" . " | bc " . preload)
            endif
            " let answer = "set dba " . answer . "," . answer1
            let answer = "set dba " . answer . "," . answer1 ." = alter system dump file " . answer . " block " . answer1
        endif

        if a:flag == 32
            if has_hex == 1
                let str = toupper (str)
                let str = substitute (str, "0x", "", "g")
                " 0x100000000 hexdecimal = 4294967296(10) = 2^32(10)
                let answer  = system ("echo ibase=16 ;" . str . "/100000000" . " | bc " . preload)
                let answer1 = system ("echo ibase=16 ;" . str . "%100000000" . " | bc " . preload)
                let answer2 = system ("echo obase=16 ;ibase=16 ;" . str . "/100000000" . " | bc " . preload)
                let answer3 = system ("echo obase=16 ;ibase=16 ;" . str . "%100000000" . " | bc " . preload)
            else
                let answer  = system ("echo " . str . "/4294967296" . " | bc " . preload)
                let answer1 = system ("echo " . str . "%4294967296" . " | bc " . preload)
                let answer2 = system ("echo obase=16 ;" . str . "/4294967296" . " | bc " . preload)
                let answer3 = system ("echo obase=16 ;" . str . "%4294967296" . " | bc " . preload)
            endif
            " let answer = "scn_wrap,scn_base: " . answer . " " . answer1
            let answer = "scn_wrap,scn_base(10): " . answer . "," . answer1 . " =scn_wrap,scn_base(16): " . "0x" . tolower (answer2) . "," . "0x" . tolower(answer3)
        endif

        if a:flag == 10016
            if has_hex == 1
                let str = toupper (str)
                let str = substitute (str, "0x", "", "g")
                " 0x100000000 hexdecimal = 4294967296(10) = 2^32(10)
                let str = substitute (str, "[,.]", "*100000000+", "g")
                let answer  = system ("echo obase=10 ;ibase=16 ;" . str .  " | bc -l " . preload)
                let answer1 = system ("echo obase=16 ;ibase=16 ;" . str .  " | bc -l " . preload)
                let answer = "scn_wrap,scn_base(10): " . answer . " = scn_wrap,scn_base(16): " . "0x" . tolower (answer1)
            else
                let str = substitute (str, "[,.]", "*4294967296+", "g")
                let answer  = system ("echo " . str . " | bc -l " . preload)
                let answer1 = system ("echo obase=16 ;" . str .  " | bc -l " . preload)
                let answer = "scn_wrap,scn_base(10): " . answer . " = scn_wrap,scn_base(16): " . "0x" . tolower (answer1)
            endif
        endif

        if a:flag == 20016
            if has_hex == 1
                let str = toupper ( str )
                let str = substitute (str, "0x", "", "g")
                " 0x400000 hexdecimal = 4194304 (10) = 2^22(10)
                let str = substitute (str, "[,.]", "*400000+", "g")
                let answer  = system ("echo obase=10 ;ibase=16 ;" . str .  " | bc -l " . preload)
                let answer1 = system ("echo obase=16 ;ibase=16 ;" . str .  " | bc -l " . preload)
                let answer = "file#,block# dba(10): " . answer . " = file#,block# dba(16): " . "0x" . tolower (answer1)     
            else
                let str = substitute (str, "[,.]", "*4194304+", "g")
                let answer  = system ("echo " . str . " | bc -l " . preload)
                let answer1 = system ("echo obase=16 ;" . str .  " | bc -l " . preload)
                let answer = "file#,block# dba(10): " . answer . " = file#,block# dba(16): " . "0x" . tolower (answer1)
            endif
        endif

        if a:flag == 30016
            if has_hex == 1
                let str = substitute (str, "0x", "", "g")
                let str = toupper ( str )
                let answer = system ("echo ibase=16 ;" . str .  " | bc -l " . preload)
            else
                let answer = system ("echo obase=16 ;" . str .  " | bc -l " . preload)
                let answer = "0x" . tolower ( answer )
            endif
        endif

        " strip newline
        let answer = substitute (answer, " ", "", "g")

        " strip trailing 0s in decimals
        let answer = substitute (answer, '.(d*[1-9])0+$', '.1', "")

        return answer
    endfunction

    " ---------------------------------------------------------------------
    " CalcLines:
    "
    " take expression from lines, either visually selected or the current line,
    " pass to calculate function, echo or past answer after '='
    function! CalcLines(flag)

        let has_equal = 0

        " remove newlines and trailing spaces
        let @e = substitute (@e, " ", "",   "g")
        let @e = substitute (@e, 's*$', "", "g")

        " if we end with an equal, strip, and remember for output
        if @e =~ "=$"
            let @e = substitute (@e, '=$', "", "")
            let has_equal = 1
        endif

        " if there is another equal in the line, assume chained equations, remove
        " leading ones
        let @e = substitute (@e, '^.+=', '', '')

        let answer = Calculate (@e,a:flag)

        " append answer or echo
        if has_equal == 1
            exec "normal a" . answer
        else
            echo "answer = " . answer
        endif
    endfunction

    " ---------------------------------------------------------------------
    " Check_hex:
    "
    " Check if the string contains 0x, a, b, c, d, e, f  return has_hex=1
    function! Check_hex(str)
        let has_hex = 0
        let ss = a:str
        let ss = tolower ( ss )

        if ss =~ "0x"
            let has_hex = 1
            return has_hex
        endif

        if ss =~ "[abcdef]"
            let has_hex = 1
            return has_hex
        endif

    endfunction

  • 相关阅读:
    Unix命令大全
    vs2008 与 IE8出现的兼容性问题
    Java 创建文件、文件夹以及临时文件
    如何修改Wamp中mysql默认空密码
    PAT 乙级真题 1003.数素数
    Tags support in htmlText flash as3
    DelphiXE4 FireMonkey 试玩记录,开发IOS应用 还是移植
    10 Great iphone App Review sites to Promote your Apps!
    HTML tags in textfield
    Delphi XE4 IOS 开发, "No eligible applications were found“
  • 原文地址:https://www.cnblogs.com/lfree/p/11517681.html
Copyright © 2011-2022 走看看