如何让Jupyter自定义Cell Magic的自动补全支持单元格多行内容?
问题:自定义Cell Magic无法实现多行自动补全
已查阅相关讨论,但在实现高级自动补全时遇到瓶颈。当前使用以下代码实现自定义Cell Magic的自动补全:
def load_ipython_extension(ipython): def custom_complete(self, event): return [list of completions] ipython.set_hook('complete_command', table_complete, re_key = '%%magic') load_ipython_extension(get_ipython())
但该补全仅在同一行生效(例如%%magic word),无法在单元格主体部分生效,如何修改使其支持多行补全?
解决方案
原代码中re_key='%%magic'的正则仅匹配以%%magic开头的单行命令,导致单元格主体部分无法触发补全。要实现多行补全,需调整钩子触发逻辑,并在补全函数内判断当前上下文:
修改后的代码示例
def load_ipython_extension(ipython): def custom_complete(self, event): # 检查当前单元格是否为目标Cell Magic if hasattr(event.info, 'cell'): cell_content = event.info.cell # 判断单元格是否以%%magic开头(忽略开头空白) if cell_content.strip().startswith('%%magic'): current_line_num = event.info.line_number - 1 # 行号从1开始计数,转为索引 # 区分起始行和主体行的补全逻辑 if current_line_num == 0: # 返回%%magic所在行的补全项 return ['option1', 'option2'] else: # 返回单元格主体部分的补全项 return ['body_item1', 'body_item2', 'body_item3'] return [] # 设置钩子匹配所有行,后续在函数内过滤上下文 ipython.set_hook('complete_command', custom_complete, re_key=r'.*') load_ipython_extension(get_ipython())
关键说明
- 扩大钩子触发范围:将
re_key改为r'.*',让所有行都触发该补全钩子,后续在函数内判断是否属于目标Cell Magic的单元格。 - 上下文校验:通过
event.info.cell获取当前单元格完整内容,检查是否以%%magic开头,确保仅在目标Cell Magic的单元格内触发补全。 - 分场景补全:利用
event.info.line_number区分光标所在行是Cell Magic起始行还是主体行,返回对应补全列表。
内容的提问来源于stack exchange,提问作者user1061721
相关产品推荐
相关产品推荐

