Commit | Line | Data |
---|---|---|
4eb71990 JM |
1 | // IMPORTANT: choose one |
2 | var RL_LIB = "libreadline"; // NOTE: libreadline is GPL | |
3 | //var RL_LIB = "libedit"; | |
4 | ||
5 | var HISTORY_FILE = require('path').join(process.env.HOME, '.mal-history'); | |
6 | ||
e10ceff5 | 7 | var ffi = require('ffi-napi'), |
4eb71990 JM |
8 | fs = require('fs'); |
9 | ||
10 | var rllib = ffi.Library(RL_LIB, { | |
11 | 'readline': [ 'string', [ 'string' ] ], | |
12 | 'add_history': [ 'int', [ 'string' ] ]}); | |
13 | ||
14 | var rl_history_loaded = false; | |
15 | ||
a11a0235 | 16 | function readline(prompt) { |
4eb71990 JM |
17 | prompt = prompt || "user> "; |
18 | ||
19 | if (!rl_history_loaded) { | |
20 | rl_history_loaded = true; | |
21 | var lines = []; | |
22 | if (fs.existsSync(HISTORY_FILE)) { | |
23 | lines = fs.readFileSync(HISTORY_FILE).toString().split("\n"); | |
24 | } | |
25 | // Max of 2000 lines | |
26 | lines = lines.slice(Math.max(lines.length - 2000, 0)); | |
27 | for (var i=0; i<lines.length; i++) { | |
28 | if (lines[i]) { rllib.add_history(lines[i]); } | |
29 | } | |
30 | } | |
31 | ||
32 | var line = rllib.readline(prompt); | |
33 | if (line) { | |
34 | rllib.add_history(line); | |
35 | try { | |
36 | fs.appendFileSync(HISTORY_FILE, line + "\n"); | |
37 | } catch (exc) { | |
38 | // ignored | |
39 | } | |
40 | } | |
41 | ||
42 | return line; | |
43 | }; | |
a11a0235 JM |
44 | |
45 | //exports.readline = readline | |
46 | module.exports = {readline: readline} |