You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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())

关键说明

  1. 扩大钩子触发范围:将re_key改为r'.*',让所有行都触发该补全钩子,后续在函数内判断是否属于目标Cell Magic的单元格。
  2. 上下文校验:通过event.info.cell获取当前单元格完整内容,检查是否以%%magic开头,确保仅在目标Cell Magic的单元格内触发补全。
  3. 分场景补全:利用event.info.line_number区分光标所在行是Cell Magic起始行还是主体行,返回对应补全列表。

内容的提问来源于stack exchange,提问作者user1061721

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:21:30