Skip to content

Commit 1b45b03

Browse files
committed
support starship
1 parent 1c97666 commit 1b45b03

File tree

5 files changed

+148
-10
lines changed

5 files changed

+148
-10
lines changed

ansi2/src/lex.rs

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::color::{AnsiColor, Color8};
22
use nom::branch::alt;
3-
use nom::bytes::complete::{tag, tag_no_case, take_until};
3+
use nom::bytes::complete::{tag, tag_no_case, take_until, take_while1};
44
use nom::character::complete::{anychar, digit0};
55
use nom::combinator::opt;
66
use nom::multi::many0;
@@ -18,7 +18,8 @@ pub enum Sgr {
1818
FormFeed,
1919
CarriageReturn,
2020
Title(String),
21-
21+
Cwd(String),
22+
Prompt,
2223
CursorUp(i32),
2324
CursorDown(i32),
2425
CursorForward(i32),
@@ -305,6 +306,30 @@ fn parse_title(input: &str) -> IResult<&str, Token> {
305306
))
306307
}
307308

309+
fn parse_cwd(input: &str) -> IResult<&str, Token> {
310+
let (rem, (_, s, _)) = (tag("\x1b]7;"), take_until("\x07"), tag("\x07")).parse(input)?;
311+
Ok((
312+
rem,
313+
Token {
314+
range: (input.chars().count(), rem.chars().count()),
315+
sgr: Sgr::Cwd(s.into()),
316+
},
317+
))
318+
}
319+
fn parse_prompt(input: &str) -> IResult<&str, Token> {
320+
let (rem, (_, _)) = (
321+
tag("\x1b]133;"),
322+
take_while1(|c: char| !(c.is_control() || c.is_whitespace())),
323+
)
324+
.parse(input)?;
325+
Ok((
326+
rem,
327+
Token {
328+
range: (input.chars().count(), rem.chars().count()),
329+
sgr: Sgr::Prompt,
330+
},
331+
))
332+
}
308333
fn parse_bold(input: &str) -> IResult<&str, Token> {
309334
let (rem, _) = tag("\x1b(B").parse(input)?;
310335
Ok((
@@ -1032,7 +1057,13 @@ pub(crate) fn parse_ansi(input: &str) -> IResult<&str, Vec<Token>> {
10321057
parse_sgr7,
10331058
parse_sgr10,
10341059
)),
1035-
alt((parse_link_with_title, parse_link_no_title, parse_link_ll)),
1060+
alt((
1061+
parse_link_with_title,
1062+
parse_link_no_title,
1063+
parse_link_ll,
1064+
parse_cwd,
1065+
parse_prompt,
1066+
)),
10361067
parse_unknown,
10371068
parse_anychar,
10381069
)))

ansi2/src/lib.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,4 +262,12 @@ mod test {
262262
assert_debug_snapshot!(canvas);
263263
assert_debug_snapshot!(canvas.minify());
264264
}
265+
266+
#[test]
267+
fn test_starship() {
268+
let s =
269+
"]7;file://win/c/code/ansi2]0;/c/c/ansi2(B]133;A;special_key=1";
270+
let r = parse_ansi(s).unwrap();
271+
assert_debug_snapshot!(r);
272+
}
265273
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
---
2+
source: ansi2/src/lib.rs
3+
expression: r
4+
---
5+
(
6+
"",
7+
[
8+
Token {
9+
sgr: Cwd(
10+
"file://win/c/code/ansi2",
11+
),
12+
range: (
13+
0,
14+
28,
15+
),
16+
},
17+
Token {
18+
sgr: Title(
19+
"/c/c/ansi2",
20+
),
21+
range: (
22+
28,
23+
43,
24+
),
25+
},
26+
Token {
27+
sgr: ColorForeground(
28+
Color8(
29+
Black,
30+
),
31+
),
32+
range: (
33+
43,
34+
48,
35+
),
36+
},
37+
Token {
38+
sgr: Bold,
39+
range: (
40+
48,
41+
51,
42+
),
43+
},
44+
Token {
45+
sgr: ColorReset,
46+
range: (
47+
51,
48+
54,
49+
),
50+
},
51+
Token {
52+
sgr: EraseInLine(
53+
0,
54+
),
55+
range: (
56+
54,
57+
57,
58+
),
59+
},
60+
Token {
61+
sgr: Prompt,
62+
range: (
63+
57,
64+
78,
65+
),
66+
},
67+
Token {
68+
sgr: Bell,
69+
range: (
70+
78,
71+
79,
72+
),
73+
},
74+
Token {
75+
sgr: EraseInDisplay(
76+
0,
77+
),
78+
range: (
79+
79,
80+
82,
81+
),
82+
},
83+
],
84+
)

assets/starship.ans

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
]7;file://win/c/code/ansi2]0;/c/c/ansi2(B]133;A;special_key=1
2+
 win…\ansi2   oxvg ? 
3+
[?2004h[>4;1m[=5u=[?2004l[>4;0m[=0u>[?2004h[>4;1m[=5u=[?2004l[>4;0m[=0u>]0;/c/c/ansi2(B]133;A;special_key=1
4+
 win…\ansi2   oxvg ? 
5+
[?2004h[>4;1m[=5u=[?2004l[>4;0m[=0u>[?2004h[>4;1m[=5u=[?2004l[>4;0m[=0u>]0;/c/c/ansi2(B]133;A;special_key=1
6+
 win…\ansi2   oxvg !? 
7+
[?2004h[>4;1m[=5u=[?2004l[>4;0m[=0u>[?2004h[>4;1m[=5u=[?2004l[>4;0m[=0u>]0;/c/c/ansi2(B]133;A;special_key=1
8+
 win…\ansi2   oxvg !? 
9+
[?2004h[>4;1m[=5u=[?2004l[>4;0m[=0u>[?2004h[>4;1m[=5u=[?2004l[>4;0m[=0u>]0;/c/c/ansi2(B]133;A;special_key=1
10+
 win…\ansi2   oxvg !? 
11+
[?2004h[>4;1m[=5u=[?2004l[>4;0m[=0u>[?2004h[>4;1m[=5u=[?2004l[>4;0m[=0u>]0;/c/c/ansi2(B]133;A;special_key=1
12+
 win…\ansi2   oxvg !? 
13+
[?2004h[>4;1m[=5u=[?2004l[>4;0m[=0u>[?2004h[>4;1m[=5u=[?2004l[>4;0m[=0u>]0;/c/c/ansi2(B]133;A;special_key=1
14+
 win…\ansi2   oxvg !? 
15+
[?2004h[>4;1m[=5u=

package.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)