OILS / cpp / frontend_pyreadline.h View on Github | oils.pub

94 lines, 62 significant
1// frontend_pyreadline.h
2
3#ifndef FRONTEND_PYREADLINE_H
4#define FRONTEND_PYREADLINE_H
5
6#include "mycpp/runtime.h"
7
8// hacky forward decl
9namespace completion {
10class ReadlineCallback;
11BigStr* ExecuteReadlineCallback(ReadlineCallback*, BigStr*, int);
12} // namespace completion
13
14// hacky forward decl
15namespace comp_ui {
16class _IDisplay;
17void ExecutePrintCandidates(_IDisplay*, BigStr*, List<BigStr*>*, int);
18} // namespace comp_ui
19
20// hacky forward decl
21namespace readline_osh {
22class BindXCallback;
23} // namespace readline_osh
24
25namespace py_readline {
26
27class Readline {
28 public:
29 Readline();
30 BigStr* prompt_input(BigStr* prompt);
31 void parse_and_bind(BigStr* s);
32 void add_history(BigStr* line);
33 void read_history_file(BigStr* path);
34 void write_history_file(BigStr* path);
35 void set_completer(completion::ReadlineCallback* completer);
36 void set_completer_delims(BigStr* delims);
37 void set_completion_display_matches_hook(
38 comp_ui::_IDisplay* display = nullptr);
39 BigStr* get_line_buffer();
40 int get_begidx();
41 int get_endidx();
42 void clear_history();
43 BigStr* get_history_item(int pos);
44 void remove_history_item(int pos);
45 int get_current_history_length();
46 void resize_terminal();
47
48 // Functions added to implement the 'bind' builtin in OSH
49 void list_funmap_names();
50 void read_init_file(BigStr* s);
51 void function_dumper(bool print_readably);
52 void macro_dumper(bool print_readably);
53 void variable_dumper(bool print_readably);
54 void query_bindings(BigStr* fn_name);
55 void unbind_rl_function(BigStr* fn_name);
56 void use_temp_keymap(BigStr* fn_name);
57 void restore_orig_keymap();
58 void print_shell_cmd_map();
59 void unbind_keyseq(BigStr* keyseq);
60 void bind_shell_command(BigStr* keyseq, BigStr* cmd);
61 void set_bind_shell_command_hook(readline_osh::BindXCallback* hook);
62
63 static constexpr uint32_t field_mask() {
64 return maskbit(offsetof(Readline, completer_delims_)) |
65 maskbit(offsetof(Readline, completer_)) |
66 maskbit(offsetof(Readline, display_));
67 }
68
69 static constexpr ObjHeader obj_header() {
70 return ObjHeader::ClassFixed(field_mask(), sizeof(Readline));
71 }
72
73 int begidx_;
74 int endidx_;
75 BigStr* completer_delims_;
76 completion::ReadlineCallback* completer_;
77 comp_ui::_IDisplay* display_;
78 readline_osh::BindXCallback* bindx_cb_;
79
80 // readline will set this to NULL when EOF is received, else this will point
81 // to a line of input.
82 char* latest_line_;
83
84 // readline will set this flag when either:
85 // - it receives EOF
86 // - it has a complete line of input (it has seen "\n")
87 bool ready_;
88};
89
90Readline* MaybeGetReadline();
91
92} // namespace py_readline
93
94#endif // FRONTEND_PYREADLINE_H