Skip to content

Commit

Permalink
Make LineEdit and the REPL re-entrant
Browse files Browse the repository at this point in the history
Previously, the keymap functions were assigned a name with the eval macro (in global scope). This changes the keymap macro to instead return an anonymous function so that additional instances of the REPL don't clobber the keymap functions of previous ones.
  • Loading branch information
mbauman committed Apr 4, 2014
1 parent d4c5da4 commit 186c9ff
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 13 deletions.
9 changes: 4 additions & 5 deletions base/LineEdit.jl
Original file line number Diff line number Diff line change
Expand Up @@ -788,11 +788,11 @@ function keymap_unify(keymaps)
return ret
end

macro keymap(func, keymaps)
macro keymap(keymaps)
dict = keymap_unify(keymap_prepare(keymaps))
body = keymap_gen_body(dict, dict)
esc(quote
function $(func)(s, data)
(s, data) -> begin
$body
return :ok
end
Expand Down Expand Up @@ -978,8 +978,7 @@ function setup_search_keymap(hp)
"\e[F" => s->(accept_result(s, p); move_input_end(s)),
"*" => :(LineEdit.edit_insert(data.query_buffer, c1); LineEdit.update_display_buffer(s, data))
}
@eval @LineEdit.keymap keymap_func $([pkeymap, escape_defaults])
p.keymap_func = keymap_func
p.keymap_func = @eval @LineEdit.keymap $([pkeymap, escape_defaults])
keymap = {
"^R" => s->(enter_search(s, p, true)),
"^S" => s->(enter_search(s, p, false)),
Expand Down Expand Up @@ -1212,7 +1211,7 @@ function reset_state(s::MIState)
end
end

@LineEdit.keymap default_keymap_func [LineEdit.default_keymap, LineEdit.escape_defaults]
const default_keymap_func = @LineEdit.keymap [LineEdit.default_keymap, LineEdit.escape_defaults]

function Prompt(prompt;
first_prompt = prompt,
Expand Down
7 changes: 2 additions & 5 deletions base/REPL.jl
Original file line number Diff line number Diff line change
Expand Up @@ -598,9 +598,8 @@ function setup_interface(d::REPLDisplay, req, rep; extra_repl_keymap = Dict{Any,

a = Dict{Any,Any}[hkeymap, repl_keymap, LineEdit.history_keymap(hp), LineEdit.default_keymap, LineEdit.escape_defaults]
prepend!(a, extra_repl_keymap)
@eval @LineEdit.keymap repl_keymap_func $(a)

main_prompt.keymap_func = repl_keymap_func
main_prompt.keymap_func = @eval @LineEdit.keymap $(a)

const mode_keymap = {
'\b' => function (s)
Expand All @@ -625,9 +624,7 @@ function setup_interface(d::REPLDisplay, req, rep; extra_repl_keymap = Dict{Any,

b = Dict{Any,Any}[hkeymap, mode_keymap, LineEdit.history_keymap(hp), LineEdit.default_keymap, LineEdit.escape_defaults]

@eval @LineEdit.keymap mode_keymap_func $(b)

shell_mode.keymap_func = help_mode.keymap_func = mode_keymap_func
shell_mode.keymap_func = help_mode.keymap_func = @eval @LineEdit.keymap $(b)

ModalInterface([main_prompt, shell_mode, help_mode,hkp])
end
Expand Down
6 changes: 3 additions & 3 deletions test/lineedit.jl
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const bar_keymap = {
'b' => :( global b_bar; b_bar += 1)
}

@eval @LineEdit.keymap test1_func $foo_keymap
test1_func = @eval @LineEdit.keymap $foo_keymap

function run_test(f,buf)
global a_foo, a_bar, b_bar
Expand All @@ -33,13 +33,13 @@ end
run_test(test1_func,IOBuffer("aa"))
@test a_foo == 2

@eval @LineEdit.keymap test2_func $([foo2_keymap, foo_keymap])
test2_func = @eval @LineEdit.keymap $([foo2_keymap, foo_keymap])

run_test(test2_func,IOBuffer("aaabb"))
@test a_foo == 3
@test b_foo == 2

@eval @LineEdit.keymap test3_func $([bar_keymap, foo_keymap])
test3_func = @eval @LineEdit.keymap $([bar_keymap, foo_keymap])

run_test(test3_func,IOBuffer("aab"))
@test a_bar == 2
Expand Down

0 comments on commit 186c9ff

Please sign in to comment.