download

Sign in or create your account | Project List | Help

download Git Source Tree

Root/expr.vim

1scriptencoding utf-8 " {{{ {{{
2if &cp || exists("g:loaded_expr")
3    finish
4endif
5let g:loaded_expr = 1
6
7let s:save_cpo = &cpo
8set cpo&vim " }}}
9
10" function! s:selected_text(...) {{{
11" return selected text in visual mode.
12function! 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] : _
31endfunction " }}}
32
33" function! s:split(selected) {{{
34" split text, and return found number array.
35function! 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
48endfunction " }}}
49
50" function! s:sum(numberes) {{{
51" return sum.
52function! 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
58endfunction " }}}
59
60" function! s:average(numberes) {{{
61" return average.
62function! 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
69endfunction " }}}
70
71" function! s:max(numberes) {{{
72" return max.
73function! s:max(numberes)
74    return max(a:numberes)
75endfunction " }}}
76
77" function! s:min(numberes) {{{
78" return max.
79function! s:min(numberes)
80    return min(a:numberes)
81endfunction " }}}
82
83" function! s:subtract(numberes) {{{
84" return subtract result.
85function! 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
97endfunction " }}}
98
99" function! s:all(numberes) {{{
100" return all numbers.
101function! s:all(numberes)
102    return string(a:numberes)
103endfunction " }}}
104
105" function! g:expr(...) {{{
106" main function.
107" get selected text,
108" split to number list, and
109" calculate number list.
110function! 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
129endfunction " }}}
130
131" commnad Expr {{{
132" main commnad.
133command! -range -nargs=? Expr :echo g:expr(<f-args>)
134" }}}
135
136let &cpo = s:save_cpo " {{{
137finish
138" }}} }}}
139==============================================================================
140expr.vim : 算術スクリプト
141------------------------------------------------------------------------------
142$VIMRUNTIMEPATH/plugin/expr.vim
143==============================================================================
144author : 小見 拓
145url : http://nanasi.jp/
146email : mail@nanasi.jp
147version : 2009/12/19 16:00:00
148==============================================================================
149選択範囲のテキストに含まれている数値のリストに対して、
150合計値、平均値算出などの計算処理を行うコマンドを提供するスクリプトです。
151Excelに数字を貼り付けて計算する手間を省くためにあります。
152
153
154------------------------------------------------------------------------------
1551. 数値の含まれる範囲をビジュアルモードで選択します。
1562. 「:Expr {計算処理名}」コマンドを実行します。
1573. 空白文字、改行、カンマで文章を分割し、数字のリストが作成されます。
1584. 数字のリストに対して、指定された計算処理が実行されます。
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

Archive Download this file

Branches:
master