summaryrefslogtreecommitdiffstats
path: root/parser.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-09-17 06:31:26 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-09-17 06:31:26 -0700
commita5ce85ec38c7cb6e4e11e599fb9ed37c871947c1 (patch)
tree785a66a6e1c0b317c494a4f8dee0367b8a78abb4 /parser.c
parent4e9ce389c2ccb3677957c7903bb633ebb503f394 (diff)
downloadtxr-a5ce85ec38c7cb6e4e11e599fb9ed37c871947c1.tar.gz
txr-a5ce85ec38c7cb6e4e11e599fb9ed37c871947c1.tar.bz2
txr-a5ce85ec38c7cb6e4e11e599fb9ed37c871947c1.zip
Listener configuration variables.
* linenoise/linenoise.c (lino_get_multiline): New function. * linenoise/linenoise.h (lino_get_multiline): Declared. * parser.c (listener_hist_len, listener_multi_line_p_s): New symbol global variables. (repl): Set linenoise history length and multi-line mode from the *listener-hist-len* and *listener-multi-line-p* variables on each call. Set the *listener-multi-line* variable from the lino_t object's current state after each linenoise call. (parse_init): Initialize new global variables and register them as special variables. * txr.1: Update sentence which says that history is fixed at 100 lines. Document listener configuration variables.
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/parser.c b/parser.c
index a9a20841..a8d42593 100644
--- a/parser.c
+++ b/parser.c
@@ -56,6 +56,7 @@
#endif
val parser_s, unique_s;
+val listener_hist_len_s, listener_multi_line_p_s;
static val stream_parser_hash;
@@ -578,6 +579,8 @@ val repl(val bindings, val in_stream, val out_stream)
char *histfile_u8 = utf8_dup_to(c_str(histfile));
val rcfile = if2(home, format(nil, lit("~a/.txr_profile"), home, nao));
val old_sig_handler = set_sig_handler(num(SIGINT), func_n2(repl_intr));
+ val hist_len_var = lookup_global_var(listener_hist_len_s);
+ val multi_line_var = lookup_global_var(listener_multi_line_p_s);
reg_varl(result_hash_sym, result_hash);
@@ -598,12 +601,17 @@ val repl(val bindings, val in_stream, val out_stream)
char *prompt_u8 = utf8_dup_to(c_str(prompt));
+ lino_hist_set_max_len(ls, c_num(cdr(hist_len_var)));
+ lino_set_multiline(ls, cdr(multi_line_var) != nil);
+
reg_varl(counter_sym, counter);
reg_varl(var_counter_sym, var_counter);
line_u8 = linenoise(ls, prompt_u8);
free (prompt_u8);
prompt_u8 = 0;
+ rplacd(multi_line_var, tnil(lino_get_multiline(ls)));
+
if (line_u8 == 0) {
switch (lino_get_error(ls)) {
case lino_intr:
@@ -721,9 +729,13 @@ val parser_eof(val parser)
void parse_init(void)
{
parser_s = intern(lit("parser"), user_package);
+ listener_hist_len_s = intern(lit("*listener-hist-len*"), user_package);
+ listener_multi_line_p_s = intern(lit("*listener-multi-line-p*"), user_package);
unique_s = gensym(nil);
prot1(&stream_parser_hash);
prot1(&unique_s);
stream_parser_hash = make_hash(t, nil, nil);
parser_l_init();
+ reg_var(listener_hist_len_s, num_fast(500));
+ reg_var(listener_multi_line_p_s, nil);
}