use <Down>/<Up> for j/k
[~bandali/configs] / vimperator / .vimperator / plugin / _smooziee.js
1 //
2 // _smooziee.js
3 //
4 // LICENSE: {{{
5 // Copyright (c) 2009 snaka<snaka.gml@gmail.com>
6 //
7 // distributable under the terms of an MIT-style license.
8 // http://www.opensource.jp/licenses/mit-license.html
9 // }}}
10 //
11 // INFO: {{{
12 var INFO = xml`
13 <plugin name="smooziee" version="0.10.2"
14 href="https://github.com/vimpr/vimperator-plugins/raw/master/_smooziee.js"
15 summary="j,kキーでのスクロールをスムースに"
16 lang="en_US"
17 xmlns="http://vimperator.org/namespaces/liberator">
18 <author email="snaka.gml@gmail.com" homepage="http://vimperator.g.hatena.ne.jp/snaka72/">snaka</author>
19 <project name="Vimperator" minVersion="3.6"/>
20 <license>MIT style license</license>
21 <p>j,k key scrolling to be smoothly.</p>
22 <h3 tag="smooziee_global_variables">Global vriables</h3>
23 <p>You can configure following variable as you like.</p>
24 <dl>
25 <dt>smooziee_scroll_amount</dt><dd>Scrolling amount(unit:px). Default value is 400px.</dd>
26 <dt>smooziee_interval</dt><dd>Scrolling interval(unit:ms). Default value is 20ms.</dd>
27 </dl>
28 <h3 tag="smooziee_example">Example</h3>
29 <p>Set scroll amount is 300px and interval is 10ms.</p>
30 <code><ex><![CDATA[
31 let g:smooziee_scroll_amount="300"
32 let g:smooziee_scroll_interval="10"
33 ]]></ex></code>
34 <h3 tag="smooziee_API">API</h3>
35 <code>smooziee.smoothScrollBy(amount);</code>
36 <p>Example</p>
37 <code><ex><![CDATA[
38 :js liberator.plugins.smooziee.smoothScrollBy(600)
39 :js liberator.plugins.smooziee.smoothScrollBy(-600)
40 ]]></ex></code>
41 </plugin>
42 <plugin name="smooziee" version="0.10.2"
43 href="https://github.com/vimpr/vimperator-plugins/raw/master/_smooziee.js"
44 summary="j,kキーでのスクロールをスムースに"
45 lang="ja"
46 xmlns="http://vimperator.org/namespaces/liberator">
47 <author email="snaka.gml@gmail.com" homepage="http://vimperator.g.hatena.ne.jp/snaka72/">snaka</author>
48 <project name="Vimperator" minVersion="3.6"/>
49 <license>MIT style license</license>
50 <p>普段のj,kキーのスクロールをLDRizeライクにスムースにします。</p>
51 <h3 tag="smooziee_global_variables">グローバル変数</h3>
52 <p>以下の変数を.vimperatorrcなどで設定することで動作を調整することができます。</p>
53 <dl>
54 <dt>smooziee_scroll_amount</dt>
55 <dd>1回にスクロールする幅です(単位:ピクセル)。デフォルトは"400"です。</dd>
56 <dt>smooziee_interval</dt>
57 <dd>スクロール時のアニメーションのインターバルです(単位:ミリ秒)。
58 "1"以上の値を設定します。デフォルトは"20"です。</dd>
59 </dl>
60 <h3 tag="smooziee_example">設定例</h3>
61 <p>スクロール量を300pxに、インターバルを10msに設定します。</p>
62 <code><ex><![CDATA[
63 let g:smooziee_scroll_amount="300"
64 let g:smooziee_scroll_interval="10"
65 ]]></ex></code>
66 <h3 tag="smooziee_API">API</h3>
67 <p>他のキーにマップする場合やスクリプトから呼び出せるようAPIを用意してます。</p>
68 <code>smooziee.smoothScrollBy(amount);</code>
69 <p>Example</p>
70 <code><ex><![CDATA[
71 :js liberator.plugins.smooziee.smoothScrollBy(600)
72 :js liberator.plugins.smooziee.smoothScrollBy(-600)
73 ]]></ex></code>
74 <h3 tag="soomziee_ToDo">ToDo</h3>
75 <ul>
76 <li>読み込みの順番によっては他のプラグインと競合する可能性があるのをなんとかしたい。</li>
77 </ul>
78 </plugin>`;
79 // }}}
80
81 let self = liberator.plugins.smooziee = (function(){
82
83 // Mappings {{{
84 mappings.addUserMap(
85 [modes.NORMAL],
86 ["j"],
87 "Smooth scroll down",
88 function(count){
89 self.smoothScrollBy(getScrollAmount() * (count || 1));
90 },
91 {
92 count: true
93 }
94 );
95 mappings.addUserMap(
96 [modes.NORMAL],
97 ["k"],
98 "Smooth scroll up",
99 function(count){
100 self.smoothScrollBy(getScrollAmount() * -(count || 1));
101 },
102 {
103 count: true
104 }
105 );
106
107 mappings.addUserMap(
108 [modes.NORMAL],
109 ["d"],
110 "Smooth scroll down page",
111 function(count){
112 self.smoothScrollBy(getScrollAmount() * 3.5 * (count || 1));
113 },
114 {
115 count: true
116 }
117 );
118 mappings.addUserMap(
119 [modes.NORMAL],
120 ["u"],
121 "Smooth scroll up page",
122 function(count){
123 self.smoothScrollBy(getScrollAmount() * 3.5 * -(count || 1));
124 },
125 {
126 count: true
127 }
128 );
129 // }}}
130 // PUBLIC {{{
131 var PUBLICS = {
132 smoothScrollBy: function(moment) {
133 win = Buffer.findScrollableWindow();
134 interval = window.eval(liberator.globalVariables.smooziee_scroll_interval || '20');
135 destY = win.scrollY + moment;
136 clearTimeout(next);
137 smoothScroll(moment);
138 }
139 }
140
141 // }}}
142 // PRIVATE {{{
143 var next;
144 var destY;
145 var win;
146 var interval;
147
148 function getScrollAmount() window.eval(liberator.globalVariables.smooziee_scroll_amount || '400');
149
150 function smoothScroll(moment) {
151 if (moment > 0)
152 moment = Math.floor(moment / 2);
153 else
154 moment = Math.ceil(moment / 2);
155
156 win.scrollBy(0, moment);
157
158 if (Math.abs(moment) < 1) {
159 setTimeout(makeScrollTo(win.scrollX, destY), interval);
160 destY = null;
161 return;
162 }
163 next = setTimeout(function() smoothScroll(moment), interval);
164 }
165
166 function makeScrollTo(x, y) function() win.scrollTo(x, y);
167 // }}}
168 return PUBLICS;
169 })();
170 // vim: sw=2 ts=2 et si fdm=marker: