1#[doc(hidden)]
2#[macro_export]
3macro_rules! history_up {
4 ($self:ident, $stdout:ident, $c:ident, $lines:ident, $colour:ident) => {{
5 $c.use_history = true;
6
7 let lines = match $self.history.prev() {
8 Some(s) => {
9 $self.print_lines(&mut $stdout, &mut $c, &s, $colour)?;
10 $c.lineno = s.len() - 1;
11 if $c.lineno > 0 {
12 queue!($stdout, cursor::MoveDown($c.lineno as u16))?;
13 }
14 s
15 }
16 None => match $self.history.cur() {
17 Some(s) => s,
18 None => {
19 $c.use_history = false;
20 &$lines
21 }
22 },
23 };
24
25 let s_len = lines[$c.lineno].chars().count();
26
27 if $c.charno == 0 || $c.charno > s_len {
28 $c.charno = s_len;
29 }
30 }};
31
32 (retain $self:ident, $stdout:ident, $c:ident, $lines:ident, $colour:ident) => {{
33 let lineno = $c.lineno;
34 if lineno > 0 {
35 queue!($stdout, cursor::MoveUp(lineno as u16))?;
36 $c.lineno = 0;
37 }
38
39 history_up!($self, $stdout, $c, $lines, $colour);
40 if lineno < $c.lineno {
41 queue!($stdout, cursor::MoveUp(($c.lineno - lineno) as u16))?;
42 $c.lineno = lineno;
43 };
44 }};
45}
46
47#[doc(hidden)]
48#[macro_export]
49macro_rules! history_down {
50 ($self:ident, $stdout:ident, $c:ident, $lines:ident, $colour:ident) => {{
51 let lines = match $self.history.next() {
52 Some(s) => s,
53 None => {
54 $c.use_history = false;
55 &$lines
56 }
57 };
58
59 if $c.lineno > 0 {
60 queue!($stdout, cursor::MoveUp($c.lineno as u16))?;
61 }
62 $c.lineno = 0;
63 $self.print_lines(&mut $stdout, &mut $c, lines, $colour)?;
64
65 let s_len = lines[$c.lineno].chars().count();
66
67 if $c.charno == 0 || $c.charno > s_len {
68 $c.charno = s_len;
69 }
70 }};
71
72 (retain $self:ident, $stdout:ident, $c:ident, $lines:ident, $colour:ident) => {{
73 let lineno = $c.lineno;
74 history_down!($self, $stdout, $c, $lines, $colour);
75 let lineno = min(lineno, $self.cur(&$c, &$lines).len() - 1);
76 if lineno > 0 {
77 queue!($stdout, cursor::MoveDown(lineno as u16))?;
78 $c.lineno = lineno;
79 };
80 }};
81}