@@ -115,14 +115,36 @@ impl Parser {
115115 let name_token = self . consume ( TokenType :: Name ) ?;
116116 let name_str = name_token. value . clone ( ) ;
117117 let mut binds = vec ! [ ] ;
118- binds. push ( ( Arc :: from ( name_str. as_str ( ) ) , get_rdev_key ( & name_str) ) ) ;
119118 let mut attr = Attr :: default ( & name_str) ;
120119
120+ let r_key = if self . peek ( ) ?. token_type == TokenType :: LBrace {
121+ self . consume ( TokenType :: LBrace ) ?;
122+ let spec_token = self . consume ( TokenType :: Name ) ?;
123+ let spec_key = spec_token. value . clone ( ) ;
124+ self . consume ( TokenType :: RBrace ) ?;
125+ spec_key
126+ } else {
127+ name_str. clone ( )
128+ } ;
129+
130+ binds. push ( ( Arc :: from ( name_str. as_str ( ) ) , get_rdev_key ( & r_key) ) ) ;
131+
121132 while self . peek ( ) ?. token_type == TokenType :: Comma {
122133 self . consume ( TokenType :: Comma ) ?;
123134 let name_token = self . consume ( TokenType :: Name ) ?;
124135 let name_str = name_token. value . clone ( ) ;
125- binds. push ( ( Arc :: from ( name_str. as_str ( ) ) , get_rdev_key ( & name_str) ) ) ;
136+
137+ let r_key = if self . peek ( ) ?. token_type == TokenType :: LBrace {
138+ self . consume ( TokenType :: LBrace ) ?;
139+ let spec_token = self . consume ( TokenType :: Name ) ?;
140+ let spec_key = spec_token. value . clone ( ) ;
141+ self . consume ( TokenType :: RBrace ) ?;
142+ spec_key
143+ } else {
144+ name_str. clone ( )
145+ } ;
146+
147+ binds. push ( ( Arc :: from ( name_str. as_str ( ) ) , get_rdev_key ( & r_key) ) ) ;
126148 }
127149
128150 if self . peek ( ) ?. token_type == TokenType :: LBracket {
@@ -689,4 +711,46 @@ mod tests {
689711 assert_eq ! ( button_2. binds[ 0 ] . 1 , Some ( Key :: KeyB ) ) ;
690712 assert_eq ! ( button_2. attr. width, 4 ) ;
691713 }
714+
715+ #[ test]
716+ fn test_customized_name ( ) {
717+ // Input sequence for: :| ^ {"up"} | -
718+ let tokens = vec ! [
719+ Token {
720+ token_type: TokenType :: LineHead ,
721+ value: ":" . into( ) ,
722+ } ,
723+ Token {
724+ token_type: TokenType :: Split ,
725+ value: "|" . into( ) ,
726+ } ,
727+ t_name( "^" ) ,
728+ Token {
729+ token_type: TokenType :: LBrace ,
730+ value: "{" . into( ) ,
731+ } ,
732+ t_name( "up" ) ,
733+ Token {
734+ token_type: TokenType :: RBrace ,
735+ value: "}" . into( ) ,
736+ } ,
737+ Token {
738+ token_type: TokenType :: Split ,
739+ value: "|" . into( ) ,
740+ } ,
741+ Token {
742+ token_type: TokenType :: LineTail ,
743+ value: "-" . into( ) ,
744+ } ,
745+ ] ;
746+
747+ let mut parser = Parser :: new ( tokens) ;
748+
749+ let result = parser. parse ( & mut Env :: new ( ) ) . unwrap ( ) ;
750+ assert_eq ! ( result. layer. len( ) , 1 ) ;
751+ assert_eq ! (
752+ result. layer[ 0 ] [ 0 ] . binds,
753+ [ ( Arc :: from( "^" ) , Some ( Key :: UpArrow ) ) , ]
754+ ) ;
755+ }
692756}
0 commit comments