shelp/
macros.rs

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}