aboutsummaryrefslogtreecommitdiffstats
path: root/every.js
blob: 4a00ac223b51e17803440600d844a38580fa983e (plain)
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
// @name           every.js
// @description    to run a specified command every time at specified interval.
// @description-ja 指定のコマンドを指定の間隔で実行する。
// @license        Creative Commons 2.1 (Attribution + Share Alike)
// @version        1.0
// @author         anekos (anekos@snca.net)
// ==/VimperatorPlugin==
//
// Usage:
//    :[INTERVAL]every <COMMAND>
//      run <COMMAND> every time at [INTERVAL] sec.
//
//    :[INTERVAL]delay <COMMAND>
//      run <COMMAND> after [INTERVAL] sec.
//
//    :every! <PROCESS-ID>
//      kill specified process.
//
//    The default value of [INTERVAL] is 1 sec.
//    While Vimperator's focus is at command-line,
//    these commands does not run.
//
// Usage-ja:
//    :[INTERVAL]every <COMMAND>
//      [INTERVAL] 間隔で <COMMAND> を走らせる。
//
//    :[INTERVAL]delay <COMMAND>
//      [INTERVAL] 秒後に <COMMAND> を走らせる。
//
//    :every! <PROCESS-ID>
//      指定のプロセスを殺す。
//
//    [INTERVAL] のデフォルトは 1秒。
//    コマンドラインにいるときには、実行されないようになっている。
//
// Links:
//    http://d.hatena.ne.jp/nokturnalmortum/20081102#1225552718


(function () {

  let ps = [];

  function run (command, interval) {
    let fun = function () {
      if (liberator.mode != liberator.modules.modes.COMMAND_LINE)
        liberator.execute(command);
    };
    ps.push({
      handle: setInterval(fun, interval),
      command: command
    });
  }

  function kill (index) {
    if (index == '*') {
      ps.forEach(function (process) clearInterval(process.handle));
      liberator.echo(ps.length + ' processes were killed!');
      ps = [];
    } else {
      let process = ps[index];
      if (process) {
        clearInterval(process.handle);
        ps.splice(index, index);
        liberator.echo('process "' + process.command + '" was killed!');
      } else {
        liberator.echoerr('unknown process');
      }
    }
  }

  function msec (count) {
    return (count > 0) ? count * 1000 : 1000;
  }

  liberator.modules.commands.addUserCommand(
    ['every', 'ev'],
    'every',
    function (arg, bang, count) {
      if (bang) {
        kill(arg.arguments[0]);
      } else {
        run(arg.string, msec(count));
      }
    },
    {
      count: true,
      bang: true,
      argCount: '+',
      completer: function (str, bang) {
        return bang ? [0, [['*', 'kill em all']].concat(ps.map(function (p, i) ([i, p.command])))]
                    : liberator.modules.completion.ex(str);
      }
    }
  );


  liberator.modules.commands.addUserCommand(
    ['delay'],
    'delay',
    function (arg, bang, count) {
      let cmd = arg.string;
      let f = function () {
        if (liberator.mode == liberator.modules.modes.COMMAND_LINE) {
          setTimeout(f, 500);
        } else {
          liberator.execute(cmd);
        }
      };
      setTimeout(f, msec(count));
    },
    {
      count: true,
      argCount: '+',
      completer: liberator.modules.completion.ex
    }
  );

})();