Skip to content

Commit

Permalink
Better keybinding for interactive interpreter
Browse files Browse the repository at this point in the history
  • Loading branch information
JuneRousseau committed Aug 10, 2023
1 parent 9c89c64 commit 1d4a440
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 49 deletions.
19 changes: 18 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,21 @@ For a version of Cerise without these features, use `./interpreter --version van

For more information about the options, `./interpreter --help`.

Press `SPACE` to take a step, and `ESC` to exit.
## Interactive interpreter
For an interactive version of the interpreter: `./interpreter -I <file>`

| Binding | Effect |
|-------------------------|----------------------------------|
| `ESC` or `q` | exit |
| `SPACE` | next step |
| `n` | next 10 steps |
| `BACKSPACE` | cancel the last step(s) |
| `Arrow Up` | navigate up memory (1 adresse) |
| `Arrow Down` | navigate down memory (1 adresse) |
| `Arrow Left` | navigate up memory (1 page) |
| `Arrow Right` | navigate down memory (1 page) |
| `Arrow Left` + `SHIFT` | navigate up memory (10 pages) |
| `Arrow Right` + `SHIFT` | navigate down memory (10 pages) |

The `Arrow` keybindings can be combined with `CTLR` for navigating in the stack.
It is possible to scroll for navigating through the memory and the stack (depending on the position of cursor of the mouse). Combine mouse scroll + `CTLR` for navigating faster.
126 changes: 87 additions & 39 deletions lib/interactive_ui.ml
Original file line number Diff line number Diff line change
Expand Up @@ -428,57 +428,105 @@ module MkUi (Cfg: MachineConfig) : Ui = struct
match Term.event term with
| `End | `Key (`Escape, _) | `Key (`ASCII 'q', _) -> Term.release term
(* Heap *)
| `Key (`ASCII 'k', _) ->
loop ~update_prog:(Program_panel.previous_addr)
show_stack m history
| `Key (`ASCII 'j', _) ->
loop ~update_prog:(Program_panel.next_addr)
show_stack m history
| `Key (`ASCII 'h', _) ->
loop ~update_prog:(Program_panel.previous_page 1)
show_stack m history
| `Key (`ASCII 'H', _) ->
loop ~update_prog:(Program_panel.previous_page 10)
show_stack m history
| `Key (`ASCII 'l', _) ->
loop ~update_prog:(Program_panel.next_page 1)
show_stack m history
| `Key (`ASCII 'L', _) ->
loop ~update_prog:(Program_panel.next_page 10)
show_stack m history

(* Stack *)
| `Key (`Arrow `Up, _) ->
loop ~update_stk:(Program_panel.previous_addr)
show_stack m history
| `Key (`Arrow `Down, _) ->
loop ~update_stk:(Program_panel.next_addr)
show_stack m history
| `Key (`Arrow `Left, _) ->
loop ~update_stk:(Program_panel.previous_page 1)
show_stack m history
| `Key (`Arrow `Right, _) ->
loop ~update_stk:(Program_panel.next_page 1)
show_stack m history
| `Key (`Arrow `Up, l) ->
begin
match l with
| [`Ctrl] ->
loop ~update_stk:(Program_panel.previous_addr) show_stack m history
| [] ->
loop ~update_prog:(Program_panel.previous_addr) show_stack m history
| _ -> ()
end

| `Key (`Arrow `Down, l) ->
begin
match l with
| [`Ctrl] ->
loop ~update_stk:(Program_panel.next_addr) show_stack m history
| [] ->
loop ~update_prog:(Program_panel.next_addr) show_stack m history
| _ -> ()
end

| `Key (`Arrow `Left, l) ->
begin
match l with
| [`Shift;`Ctrl]
| [`Ctrl;`Shift] ->
loop ~update_stk:(Program_panel.previous_page 10) show_stack m history
| [`Ctrl] ->
loop ~update_stk:(Program_panel.previous_page 1) show_stack m history
| [`Shift] ->
loop ~update_prog:(Program_panel.previous_page 10) show_stack m history
| [] ->
loop ~update_prog:(Program_panel.previous_page 1) show_stack m history
| _ -> ()
end

| `Key (`Arrow `Right, l) ->
begin
match l with
| [`Shift;`Ctrl]
| [`Ctrl;`Shift] ->
loop ~update_stk:(Program_panel.next_page 10) show_stack m history
| [`Ctrl] ->
loop ~update_stk:(Program_panel.next_page 1) show_stack m history
| [`Shift] ->
loop ~update_prog:(Program_panel.next_page 10) show_stack m history
| [] ->
loop ~update_prog:(Program_panel.next_page 1) show_stack m history
| _ -> ()
end

| `Key (`Page `Down, _) ->
loop ~update_prog:(Program_panel.previous_page 1) show_stack m history
| `Key (`Page `Up, _) ->
loop ~update_prog:(Program_panel.next_page 1) show_stack m history

| `Mouse (`Press (`Scroll `Down), (x,_), l) ->
let stack_x = (fst @@ Term.size term)/2 in
let upd_fnt =
(match l with
| [`Ctrl] -> (Program_panel.next_page 1)
| _ -> (Program_panel.next_addr))
in
if (x >= stack_x) && !Parameters.flags.stack
then loop ~update_stk:upd_fnt show_stack m history
else loop ~update_prog:upd_fnt show_stack m history
| `Mouse (`Press (`Scroll `Up), (x,_), l) ->
let stack_x = (fst @@ Term.size term)/2 in
let upd_fnt =
(match l with
| [`Ctrl] -> (Program_panel.previous_page 1)
| _ -> (Program_panel.previous_addr))
in
if (x >= stack_x) && !Parameters.flags.stack
then loop ~update_stk:upd_fnt show_stack m history
else loop ~update_prog:upd_fnt show_stack m history

| `Key (`ASCII 's', _) ->
loop ~update_prog:Program_panel.id
(toggle_show_stack show_stack) m history

| `Key (`ASCII ' ', _) ->
begin match Machine.step m with
begin
match Machine.step m with
| Some m' -> loop show_stack m' (m::history)
| None -> (* XX *) loop show_stack m history
end
| `Key (`ASCII 'n', _) ->
begin match Machine.step_n m 10 with
| Some m' -> loop show_stack m' (m::history)
| None -> (* XX *) loop show_stack m history
begin
match Machine.step_n m 10 with
| Some m' when m != m'-> loop show_stack m' (m::history)
| _ -> (* XX *) loop show_stack m history
end

| `Key (`Backspace, _) ->
(match history with
| [] -> loop show_stack m history
| m'::h' -> loop show_stack m' h')
begin
match history with
| [] -> loop show_stack m history
| m'::h' -> loop show_stack m' h'
end
| `Resize (_, _) -> loop show_stack m history
| _ -> process_events ()
in
Expand Down
9 changes: 5 additions & 4 deletions lib/machine.ml
Original file line number Diff line number Diff line change
Expand Up @@ -583,10 +583,11 @@ let step (m: mchn): mchn option =
| (Failed | Halted), _ -> None

let rec step_n (m: mchn) n : mchn option =
if n > 0 then
(match (step m) with
| Some m' -> step_n m' (n-1)
| None -> None)
if n > 0
then
(match (step m) with
| Some m' -> step_n m' (n-1)
| None -> Some m)
else Some m

let rec run (m : mchn) : mchn =
Expand Down
5 changes: 0 additions & 5 deletions src/dune
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,6 @@
(modules interpreter)
(libraries libinterp notty notty.unix containers))

; (executable
; (name interactive)
; (modules interactive)
; (libraries libinterp notty notty.unix containers))

(executable
(name awkward_ucaps)
(modules awkward_ucaps)
Expand Down

0 comments on commit 1d4a440

Please sign in to comment.