diff options
Diffstat (limited to 'auto_source.js')
-rw-r--r-- | auto_source.js | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/auto_source.js b/auto_source.js new file mode 100644 index 0000000..19bbace --- /dev/null +++ b/auto_source.js @@ -0,0 +1,83 @@ +// ==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.0 +// @author anekos (anekos@snca.net) +// @maxVersion 2.0pre +// @minVersion 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 startWatching (filepath) { + if (files[filepath] !== undefined) + throw "The file has already been watched: " + filepath; + let last = firstTime ? null : getFileModifiedTime(filepath); + files[filepath] = setInterval(function () { + let current = getFileModifiedTime(filepath); + if (last != current) { + liberator.log('sourcing: ' + filepath); + last = current; + io.source(filepath); + } + }, interval); + } + + function killWatcher (filepath) { + if (files[filepath] === undefined) + throw "The file is not watched: " + filepath; + clearInterval(files[filepath]); + delete files[filepath]; + } + + commands.addUserCommand( + ['autoso[urce]', 'aso'], + 'Sourcing automatically when the specified file is modified.', + function (arg, bang) { + liberator.log(arg); + liberator.log(io.expandPath(arg.string)); + (bang ? killWatcher : startWatching)(io.expandPath(arg.string)); + }, + { + bang: true, + completer: function (arg, bang) { + return bang ? [0, [[filepath, ''] for (filepath in files)]] + : completion.file.apply(this, arguments); + } + }, + true + ); + +})(); |