changeset 22:b2c16cd71d95

Add math plugin
author zegervdv <zegervdv@me.com>
date Sun, 23 Mar 2014 18:08:34 +0100
parents bf5c5093bad9
children 4112c6eb9f47
files .hgsubstate vim/bundle/math/plugin/vmath.vim vimrc
diffstat 3 files changed, 155 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/.hgsubstate	Sun Mar 16 19:28:11 2014 +0100
+++ b/.hgsubstate	Sun Mar 23 18:08:34 2014 +0100
@@ -1,44 +1,44 @@
 2cbe946206ec622d9d8cf2c99317f204c4d41885 vim/bundle/a
 068db2694bb7de9cac71c864b85bfb38ee1016e3 vim/bundle/abolish
-456ee1d0675097f23eeebdc28dfbe03cbed5338e vim/bundle/ack
+0292109f1f87497c7cf9b0994db47c8e95bd252c vim/bundle/ack
 0c5612fa31ee434ba055e21c76f456244b3b5109 vim/bundle/addon-mw-utils
 a93df9ceb842a0058507e2149e4b332e15c13845 vim/bundle/ag
-799e5e028fc48f8035cabef1eb92b02a2d52cbfa vim/bundle/airline
+5a2daf6dfbd6e0df21612a20f95b4285ae8a2603 vim/bundle/airline
 c2f60ca2e57fb65d2230c6fe58e7aba5ab065b2e vim/bundle/auto-pairs
-51b00aeba9476b1acf31034a5aaa6fc82f22331a vim/bundle/bundler
+0def4f8ef6238f7e32a57e605303a8639f91761e vim/bundle/bundler
 b5d3fe66a58a13d2ff8b6391f4387608496a030f vim/bundle/ctrlp
 a2ec838f3cb1fc292f9dd0bf46fc966b99db91ac vim/bundle/ctrlp-cmdpalette
 9e686ad36da43eae7462612fb8123bd47ea16171 vim/bundle/cucumber
-7d930dd7347dc832ed9874f996dae4cf20302ba7 vim/bundle/easy-motion
+a65668c468f32f0a4e80bf5609ad65e6dc7e5f28 vim/bundle/easy-motion
 6577e0e68740b60f768bda3d47fb0efd05944ebb vim/bundle/emmet
 c3d8fe0207d572047f8cde913b70e07f34758392 vim/bundle/endwise
-bec881f3048ee38a44c6668e54a51ae06aeffdb8 vim/bundle/eunuch
-152c9195aecea8b4549205bc810081ee26c14d9a vim/bundle/fugitive
+e3f3b6f1be3084e0f0811f77a68be0d91a0b14b8 vim/bundle/eunuch
+d6f17608ddbae06ed5867f58e322a16806fa7248 vim/bundle/fugitive
 3975ac871565115e3769dc69c06bc88ddc1369af vim/bundle/gundo
 90048c732a5362b1813c98f8089893b4fd2ce211 vim/bundle/hybrid
 eec1b629dc4cfa3986d20f21d4b4489732cd3f5a vim/bundle/indent-guides
 eaa765eeadb51c3a8e2caf16d1e67359bf89cab9 vim/bundle/latex
-355c8e9bb550ac36a39d1e4c3e08324b6f9a9a58 vim/bundle/markdown
-d8536084f81ede90730d515208e0cfb9f179a65f vim/bundle/neocomplete
+b02182ebbd9c18f3a4e1761c67cf0be10d9062ec vim/bundle/markdown
+0b1e06cef9db78058cbdcf95852684d5b469f44e vim/bundle/neocomplete
 883b0e2efbed810aa7774089242a15e7d88154ab vim/bundle/neosnippet
 281c851275c9b4e3c42bbb383d3e9c5d42c66786 vim/bundle/neosnippet-snippets
 b0bb781fc73ef40365e4c996a16f04368d64fc9d vim/bundle/nerdtree
-f6948a888c4a29b327eb4f64c25e664031582e12 vim/bundle/rails
-6b763058436964f1e20243200060ae78c0bd7a1d vim/bundle/rake
+c096bf1b59ae1d4a5977f65e6b6187232e2991ea vim/bundle/rails
+31ac0c1106cf652c9c20f5053f9c35c9808a2350 vim/bundle/rake
 2a3c5f8e3c26a57b8eb4cfc4be79615a1c508ef6 vim/bundle/repeat
 09415121a88d68d0ff57f8e2810726a966e323ad vim/bundle/rspec
 3ffc0aaf966647090b03ebe9804986760c176655 vim/bundle/ruby
 01854b14c7ad4aab9b574bbcb159b59502a10746 vim/bundle/sensible
-38151ca68b8942f825308fcedae9ccdf9b62fe14 vim/bundle/signature
+5a1d5b5ede65124f4f2076d30b94d8fe2ab7b1bc vim/bundle/signature
 8e2466a3de21d832cd9c19f309a9cec6c2f2e039 vim/bundle/slim
 ebf75c0bdb691e36ff09f88e76eaba89cf5ad43d vim/bundle/smalls
 42e9b46e7a20a2f394664874c7bbd9d6f6c39e8a vim/bundle/surround
-5e275c45313cd9a5441343d25c8207d03861fc9d vim/bundle/syntastic
+f6d584bc639c2b799d5d7897d1e681b4e57cd476 vim/bundle/syntastic
 60f25648814f0695eeb6c1040d97adca93c4e0bb vim/bundle/tabular
-fdceb4ea7112fe58c25556c3f7b06485cf0337cb vim/bundle/tagbar
+b2c5f0b9284f85e92d98efc97c780ad01ba81e0c vim/bundle/tagbar
 413aee121785b492e5934509d65ead21c7401519 vim/bundle/tcomment
 f9ba6df8838be0fcf8fb763459bfac35c5df2e78 vim/bundle/textmanip
-fc1dc793f04dae57bb7f92442440fe5301969642 vim/bundle/tlib
+6c74937cd3ad8ceaa2caaba4ff781e5150520336 vim/bundle/tlib
 7bfdda29120dbab0787c966dd35db025305675e1 vim/bundle/tomdoc
 6c7b03a2a0abdfd0dabd26602f8a32955abe0181 vim/bundle/vhdl
 22fa4e57fa3b0e4c9a83de51717b621fe9ca8cd7 vim/bundle/vis
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vim/bundle/math/plugin/vmath.vim	Sun Mar 23 18:08:34 2014 +0100
@@ -0,0 +1,140 @@
+" Vim global plugin for math on visual regions
+" Maintainer:	Damian Conway
+" License:	This file is placed in the public domain.
+
+"######################################################################
+"##                                                                  ##
+"##  To use:                                                         ##
+"##                                                                  ##
+"##     vmap <expr>  ++  VMATH_YankAndAnalyse()                      ##
+"##     nmap         ++  vip++                                       ##
+"##                                                                  ##
+"##  (or whatever keys you prefer to remap these actions to)         ##
+"##                                                                  ##
+"######################################################################
+
+
+" If already loaded, we're done...
+if exists("loaded_vmath")
+    finish
+endif
+let loaded_vmath = 1
+
+" Preserve external compatibility options, then enable full vim compatibility...
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Grab visual selection and do simple math on it...
+function! VMATH_YankAndAnalyse ()
+    return "y:call VMATH_Analyse()\<CR>gv"
+endfunction
+
+" What to consider a number...
+let s:NUM_PAT = '^[+-]\?\d\+\%([.]\d\+\)\?\([eE][+-]\?\d\+\)\?$'
+
+" How widely to space the report components...
+let s:REPORT_GAP = 5  "spaces between components
+
+" Do simple math on current yank buffer...
+function! VMATH_Analyse ()
+    " Extract data from selection...
+    let selection = getreg('')
+    let raw_numbers = filter(split(selection), 'v:val =~ s:NUM_PAT')
+    let numbers = map(copy(raw_numbers), 'str2float(v:val)')
+
+    " Results include a newline if original selection did...
+    let newline = selection =~ "\n" ? "\n" : ""
+
+    " Calculate and en-register various interesting metrics...
+    let summation = len(numbers) ? join( numbers, ' + ') : '0'
+    call setreg('s', s:tidy( eval( summation )      ))   " Sum     --> register s
+    call setreg('a',         s:average(raw_numbers)  )   " Average --> register a
+    call setreg('x', s:tidy( s:max(numbers)         ))   " Max     --> register x
+    call setreg('n', s:tidy( s:min(numbers)         ))   " Min     --> register n
+    call setreg('r',         @n . ' to ' . @x        )   " Range   --> register r
+
+    " Default paste buffer should depend on original contents (TODO)
+    call setreg('', @s )
+
+    " Report...
+    let gap = repeat(" ", s:REPORT_GAP)
+    highlight NormalUnderlined term=underline cterm=underline gui=underline
+    echohl NormalUnderlined
+    echo  's'
+    echohl NONE
+    echon  'um: ' . @s . gap
+    echohl NormalUnderlined
+    echon 'a'
+    echohl NONE
+    echon  'vg: ' . @a . gap
+    echon 'mi'
+    echohl NormalUnderlined
+    echon   'n'
+    echohl NONE
+    echon    ': ' . @n . gap
+    echon 'ma'
+    echohl NormalUnderlined
+    echon   'x'
+    echohl NONE
+    echon    ': ' . @x . gap
+
+endfunction
+
+" Prettify numbers...
+function! s:tidy (number)
+    let tidied = printf('%g', a:number)
+    return substitute(tidied, '[.]0\+$', '', '')
+endfunction
+
+" Compute average with meaningful number of decimal places...
+function! s:average (numbers)
+    " Compute average...
+    let summation = eval( len(a:numbers) ? join( a:numbers, ' + ') : '0' )
+    let avg = 1.0 * summation / s:max([len(a:numbers), 1])
+
+    " Determine significant figures...
+    let min_decimals = 15
+    for num in a:numbers
+        let decimals = strlen(matchstr(num, '[.]\d\+$')) - 1
+        if decimals < min_decimals
+            let min_decimals = decimals
+        endif
+    endfor
+
+    " Adjust answer...
+    return min_decimals > 0 ? printf('%0.'.min_decimals.'f', avg)
+    \                       : string(avg)
+endfunction
+
+" Reimplement these because the builtins don't handle floats (!!!)
+function! s:max (numbers)
+    if !len(a:numbers)
+        return 0
+    endif
+    let numbers = copy(a:numbers)
+    let maxnum = numbers[0]
+    for nextnum in numbers[1:]
+        if nextnum > maxnum
+            let maxnum = nextnum
+        endif
+    endfor
+    return maxnum
+endfunction
+
+function! s:min (numbers)
+    if !len(a:numbers)
+        return 0
+    endif
+    let numbers = copy(a:numbers)
+    let minnum = numbers[0]
+    for nextnum in numbers[1:]
+        if nextnum < minnum
+            let minnum = nextnum
+        endif
+    endfor
+    return minnum
+endfunction
+
+
+" Restore previous external compatibility options
+let &cpo = s:save_cpo
--- a/vimrc	Sun Mar 16 19:28:11 2014 +0100
+++ b/vimrc	Sun Mar 23 18:08:34 2014 +0100
@@ -27,7 +27,7 @@
 set tabstop=2 shiftwidth=2
 if has("gui_running")
   set background=dark
-  color base16-ocean
+  color hybrid
 else
   color hybrid
 endif