[20190913]完善vim的bccacl插件2.txt
--//继续完善vim的bccacl插件。
--//\bc 计算也可以直接使用 \bb 操作,这样操作更快一些。
--//增加直接写好算式计算的快捷\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 L