| 1 | scriptencoding utf-8 " {{{ {{{ |
| 2 | if &cp || exists("g:loaded_expr") |
| 3 | finish |
| 4 | endif |
| 5 | let g:loaded_expr = 1 |
| 6 | |
| 7 | let s:save_cpo = &cpo |
| 8 | set cpo&vim " }}} |
| 9 | |
| 10 | " function! s:selected_text(...) {{{ |
| 11 | " return selected text in visual mode. |
| 12 | function! s:selected_text(...) |
| 13 | let [visual_p, pos] = [mode() =~# "[vV\<C-v>]", getpos('.')] |
| 14 | let [r_, r_t] = [@@, getregtype('"')] |
| 15 | let [r0, r0t] = [@0, getregtype('0')] |
| 16 | |
| 17 | if visual_p |
| 18 | execute "normal! \<Esc>" |
| 19 | endif |
| 20 | silent normal! gvy |
| 21 | let [_, _t] = [@@, getregtype('"')] |
| 22 | |
| 23 | call setreg('"', r_, r_t) |
| 24 | call setreg('0', r0, r0t) |
| 25 | if visual_p |
| 26 | normal! gv |
| 27 | else |
| 28 | call setpos('.', pos) |
| 29 | endif |
| 30 | return a:0 && a:1 ? [_, _t] : _ |
| 31 | endfunction " }}} |
| 32 | |
| 33 | " function! s:split(selected) {{{ |
| 34 | " split text, and return found number array. |
| 35 | function! s:split(selected) |
| 36 | " split |
| 37 | let l:splitted = split(a:selected, '\W\+') |
| 38 | |
| 39 | " to number |
| 40 | let l:list = [] |
| 41 | for l:i in l:splitted |
| 42 | if match(l:i, '^.\{-\}\([0-9]\+\).*$') >= 0 |
| 43 | let l:num = substitute(l:i, '^.\{-\}\([0-9]\+\).*$', '\1', '') |
| 44 | call add(l:list, str2nr(l:num, 10)) |
| 45 | endif |
| 46 | endfor |
| 47 | return l:list |
| 48 | endfunction " }}} |
| 49 | |
| 50 | " function! s:sum(numberes) {{{ |
| 51 | " return sum. |
| 52 | function! s:sum(numberes) |
| 53 | let l:sum = 0 |
| 54 | for l:i in a:numberes |
| 55 | let l:sum += l:i |
| 56 | endfor |
| 57 | return l:sum |
| 58 | endfunction " }}} |
| 59 | |
| 60 | " function! s:average(numberes) {{{ |
| 61 | " return average. |
| 62 | function! s:average(numberes) |
| 63 | let l:sum = s:sum(a:numberes) |
| 64 | let l:len = len(a:numberes) |
| 65 | if (l:len < 1) |
| 66 | return 0 |
| 67 | endif |
| 68 | return l:sum / l:len |
| 69 | endfunction " }}} |
| 70 | |
| 71 | " function! s:max(numberes) {{{ |
| 72 | " return max. |
| 73 | function! s:max(numberes) |
| 74 | return max(a:numberes) |
| 75 | endfunction " }}} |
| 76 | |
| 77 | " function! s:min(numberes) {{{ |
| 78 | " return max. |
| 79 | function! s:min(numberes) |
| 80 | return min(a:numberes) |
| 81 | endfunction " }}} |
| 82 | |
| 83 | " function! s:subtract(numberes) {{{ |
| 84 | " return subtract result. |
| 85 | function! s:subtract(numberes) |
| 86 | if len(a:numberes) < 1 |
| 87 | return 0 |
| 88 | endif |
| 89 | |
| 90 | let l:first = a:numberes[0] |
| 91 | let l:subs = a:numberes[1:] |
| 92 | |
| 93 | for l:i in l:subs |
| 94 | let l:first -= l:i |
| 95 | endfor |
| 96 | return l:first |
| 97 | endfunction " }}} |
| 98 | |
| 99 | " function! s:all(numberes) {{{ |
| 100 | " return all numbers. |
| 101 | function! s:all(numberes) |
| 102 | return string(a:numberes) |
| 103 | endfunction " }}} |
| 104 | |
| 105 | " function! g:expr(...) {{{ |
| 106 | " main function. |
| 107 | " get selected text, |
| 108 | " split to number list, and |
| 109 | " calculate number list. |
| 110 | function! g:expr(...) |
| 111 | let l:selected = s:selected_text() |
| 112 | let l:splitted = s:split(l:selected) |
| 113 | |
| 114 | if len(a:000) > 0 && tolower(a:1) == 'sum' |
| 115 | return 'SUM: ' . s:sum(l:splitted) |
| 116 | elseif len(a:000) > 0 && tolower(a:1) == 'average' |
| 117 | return 'AVERAGE: ' . s:average(l:splitted) |
| 118 | elseif len(a:000) > 0 && tolower(a:1) == 'max' |
| 119 | return 'MAX: ' . s:max(l:splitted) |
| 120 | elseif len(a:000) > 0 && tolower(a:1) == 'min' |
| 121 | return 'MIN: ' . s:min(l:splitted) |
| 122 | elseif len(a:000) > 0 && tolower(a:1) == 'subtract' |
| 123 | return 'SUBTRACT: ' . s:subtract(l:splitted) |
| 124 | elseif len(a:000) > 0 && tolower(a:1) == 'all' |
| 125 | return 'ALL: ' . s:all(l:splitted) |
| 126 | else |
| 127 | return 'SUM: ' . s:sum(l:splitted) |
| 128 | endif |
| 129 | endfunction " }}} |
| 130 | |
| 131 | " commnad Expr {{{ |
| 132 | " main commnad. |
| 133 | command! -range -nargs=? Expr :echo g:expr(<f-args>) |
| 134 | " }}} |
| 135 | |
| 136 | let &cpo = s:save_cpo " {{{ |
| 137 | finish |
| 138 | " }}} }}} |
| 139 | ============================================================================== |
| 140 | expr.vim : 算術スクリプト |
| 141 | ------------------------------------------------------------------------------ |
| 142 | $VIMRUNTIMEPATH/plugin/expr.vim |
| 143 | ============================================================================== |
| 144 | author : 小見 拓 |
| 145 | url : http://nanasi.jp/ |
| 146 | email : mail@nanasi.jp |
| 147 | version : 2009/12/19 16:00:00 |
| 148 | ============================================================================== |
| 149 | 選択範囲のテキストに含まれている数値のリストに対して、 |
| 150 | 合計値、平均値算出などの計算処理を行うコマンドを提供するスクリプトです。 |
| 151 | Excelに数字を貼り付けて計算する手間を省くためにあります。 |
| 152 | |
| 153 | |
| 154 | ------------------------------------------------------------------------------ |
| 155 | 1. 数値の含まれる範囲をビジュアルモードで選択します。 |
| 156 | 2. 「:Expr {計算処理名}」コマンドを実行します。 |
| 157 | 3. 空白文字、改行、カンマで文章を分割し、数字のリストが作成されます。 |
| 158 | 4. 数字のリストに対して、指定された計算処理が実行されます。 |
| 159 | |
| 160 | 例. 次の数値を選択し、Exprコマンドを実行してみてください。 |
| 161 | |
| 162 | \20000 |
| 163 | \25000 |
| 164 | \10200 |
| 165 | \8000 |
| 166 | |
| 167 | |
| 168 | ------------------------------------------------------------------------------ |
| 169 | '<,'>Expr |
| 170 | '<,'>Expr sum |
| 171 | 選択範囲に含まれる数値全ての合計値を返します。 |
| 172 | |
| 173 | '<,'>Expr average |
| 174 | 選択範囲に含まれる数値全ての平均値を返します。 |
| 175 | |
| 176 | '<,'>Expr max |
| 177 | 選択範囲に含まれる数値の最大値を返します。 |
| 178 | |
| 179 | '<,'>Expr min |
| 180 | 選択範囲に含まれる数値の最小値を返します。 |
| 181 | |
| 182 | '<,'>Expr subtract |
| 183 | 選択範囲で最初に現れる数値から、 |
| 184 | 選択範囲に含まれる残りの数値を引いた結果値を返します。 |
| 185 | |
| 186 | '<,'>Expr all |
| 187 | 選択範囲に含まれる数値全てを表示します。 |
| 188 | |
| 189 | ============================================================================== |
| 190 | " vim: set et ft=vim nowrap foldmethod=marker : |
| 191 | |