3636
3737
3838KEYWORD_WITH_ARGS_TEMPLATE = Template (
39- """\n
39+ """\
4040 ${name}
4141 [Arguments] ${args}
42- Fail Not implemented
42+ Fail
4343"""
4444)
4545
4646KEYWORD_TEMPLATE = Template (
47- """\n
47+ """\
4848 ${name}
49- Fail Not implemented
49+ Fail
5050"""
5151)
5252
@@ -117,6 +117,7 @@ async def create_keyword(self, document_uri: DocumentUri, range: Range, context:
117117 TestTemplate ,
118118 )
119119 from robot .utils .escaping import split_from_equals
120+ from robot .variables .search import contains_variable
120121
121122 document = await self .parent .documents .get (document_uri )
122123 if document is None :
@@ -142,7 +143,7 @@ async def create_keyword(self, document_uri: DocumentUri, range: Range, context:
142143
143144 for t in node .get_tokens (RobotToken .ARGUMENT ):
144145 name , value = split_from_equals (cast (Token , t ).value )
145- if value is not None :
146+ if value is not None and not contains_variable ( name , "$@&%" ) :
146147 arguments .append (f"${{{ name } }}" )
147148 else :
148149 arguments .append (f"${{arg{ len (arguments )+ 1 } }}" )
@@ -159,10 +160,24 @@ async def create_keyword(self, document_uri: DocumentUri, range: Range, context:
159160 if keyword_section is not None :
160161 node_range = range_from_node (keyword_section )
161162
162- insert_range = Range (node_range .end , node_range .end )
163+ insert_pos = Position (node_range .end .line + 1 , 0 )
164+ insert_range = Range (insert_pos , insert_pos )
165+
166+ insert_text = f"\n { insert_text } "
163167 else :
164- insert_text = f"\n \n \n *** Keywords ***\n { insert_text } "
165- doc_pos = Position (len (document .get_lines ()), 0 )
168+ if namespace .languages is None or not namespace .languages .languages :
169+ keywords_text = "Keywords"
170+ else :
171+ keywords_text = namespace .languages .languages [- 1 ].keywords_header
172+
173+ insert_text = f"\n \n *** { keywords_text } ***\n { insert_text } "
174+
175+ lines = document .get_lines ()
176+ end_line = len (lines ) - 1
177+ while end_line >= 0 and not lines [end_line ].strip ():
178+ end_line -= 1
179+ doc_pos = Position (end_line + 1 , 0 )
180+
166181 insert_range = Range (doc_pos , doc_pos )
167182
168183 we = WorkspaceEdit (
@@ -176,3 +191,10 @@ async def create_keyword(self, document_uri: DocumentUri, range: Range, context:
176191 )
177192
178193 await self .parent .workspace .apply_edit (we , "Rename Keyword" )
194+
195+ lines = insert_text .rstrip ().splitlines ()
196+ insert_range .start .line += len (lines ) - 1
197+ insert_range .start .character = 4
198+ insert_range .end = Position (insert_range .start .line , insert_range .start .character )
199+ insert_range .end .character += len (lines [- 1 ])
200+ await self .parent .window .show_document (str (document .uri ), take_focus = True , selection = insert_range )
0 commit comments