1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
var PLUGIN_INFO =
<VimperatorPlugin>
<name> Auto Source </name>
<description>Sourcing automatically when the specified file is modified.</description>
<description lang="ja">指定のファイルが変更されたら自動で :so する。</description>
<version>1.4</version>
<author mail="anekos@snca.net" homepage="http://d.hatena.ne.jp/nokturnalmortum/">anekos</author>
<minVersion>2.0pre</minVersion>
<maxVersion>2.0pre</maxVersion>
<updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/auto_source.js</updateURL>
<license document="http://creativecommons.org/licenses/by-sa/3.0/">
Creative Commons Attribution-Share Alike 3.0 Unported
</license>
<detail><![CDATA[
== Commands ==
Start watching:
- :aso taro.js
- :autoso[urce] taro.js
Stop watching:
- :aso! taro.js
- :autoso[urce]! taro.js
]]></detail>
<detail lang="ja"><![CDATA[
== Commands ==
監視を開始:
- :aso taro.js
- :autoso[urce] taro.js
- :autoso[urce] -c[ommand] 'colorscheme mycolors' taro.js
- :autoso[urce] -c[ommand] -force 'js alert("reload!")' taro.js
監視を中止:
- :aso! taro.js
- :autoso[urce]! taro.js
]]></detail>
</VimperatorPlugin>;
// Links:
// http://d.hatena.ne.jp/nokturnalmortum/20081114#1226652163
// http://p-pit.net/rozen/
(function () {
let files = [];
let firstTime = window.eval(liberator.globalVariables.auto_source_first_time || 'false');
let interval = window.eval(liberator.globalVariables.auto_source_interval || '500');
function getFileModifiedTime (filepath) {
let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
file.initWithPath(filepath);
return file.lastModifiedTime;
}
function exists (filepath)
files.some(function (it) (it.path.indexOf(filepath) === 0))
function remove (filepath, func)
(files = files.filter(function (it) (!(it.path.indexOf(filepath) === 0 && func(it)+'-'))));
function expandPath (filepath) {
filepath = io.expandPath(filepath);
if (filepath.match(/\/|\w:[\\\/]/))
return filepath;
let cur = io.getCurrentDirectory();
cur.appendRelativePath(filepath);
return cur.path;
}
function startWatching (filepath, command, force) {
if (exists(filepath)) {
if (force) {
killWatcher(filepath);
} else {
throw 'The file has already been watched: ' + filepath;
}
}
let last = firstTime ? null : getFileModifiedTime(filepath);
let handle = setInterval(function () {
try {
let current = getFileModifiedTime(filepath);
if (last != current) {
liberator.log('sourcing: ' + filepath);
last = current;
io.source(filepath);
if (command) {
liberator.log('command execute: ' + command);
liberator.execute(command);
}
}
} catch (e) {
liberator.echoerr('Error! ' + filepath);
killWatcher(filepath);
}
}, interval);
liberator.log('filepath: ' + filepath + (command ? ('; command: ' + command) : ''));
files.push({handle: handle, path: filepath});
}
function killWatcher (filepath) {
if (!exists(filepath))
throw 'The file is not watched: ' + filepath;
remove(filepath, function (it) clearInterval(it.handle));
liberator.echo('stopped the watching for the file');
}
commands.addUserCommand(
['autoso[urce]', 'aso'],
'Sourcing automatically when the specified file is modified.',
function (arg, bang) {
(bang ? killWatcher : startWatching)(expandPath(arg[0]), arg['-command'], arg['-force']);
},
{
bang: true,
argCount: '1',
options: [
[['-command', '-c'], commands.OPTION_STRING],
[['-force', '-f'], commands.OPTION_NOARG]
],
completer: function (context, args) {
if (args.bang) {
context.title = ['Path'];
context.completions = files.map(function (it) ([it.path, '']));
} else {
completion.file(context);
}
}
},
true
);
})();
// vim:sw=2 ts=2 et si fdm=marker:
|