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
|
// ==VimperatorPlugin==
// @name Auto Source
// @description Sourcing automatically when the specified file is modified.
// @description-ja 指定のファイルが変更されたら自動で :so する。
// @license Creative Commons 2.1 (Attribution + Share Alike)
// @version 1.1
// @author anekos (anekos@snca.net)
// @minVersion 2.0pre
// @maxVersion 2.0pre
// ==/VimperatorPlugin==
//
// Usage:
// Start watching
// :aso taro.js
// :autoso[urce] taro.js
// Stop watching
// :aso! taro.js
// :autoso[urce]! taro.js
//
// Usage-ja:
// 監視を開始
// :aso taro.js
// :autoso[urce] taro.js
// 監視を中止
// :aso! taro.js
// :autoso[urce]! taro.js
//
// 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 startWatching (filepath) {
if (exists(filepath))
throw 'The file has already been watched: ' + filepath;
let last = firstTime ? null : getFileModifiedTime(filepath);
let handle = setInterval(function () {
let current = getFileModifiedTime(filepath);
if (last != current) {
liberator.log('sourcing: ' + filepath);
last = current;
io.source(filepath);
}
}, interval);
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)(io.expandPath(arg.string));
},
{
bang: true,
argCount: '1',
completer: function (context, arg, bang) {
if (bang) {
context.title = ['Path'];
context.items = files.map(function (it) ([it.path]));
} else {
completion.file(context);
}
}
},
true
);
})();
|