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

IPython自定义补全器如何获取完整单元格内容与光标位置?

获取完整单元格内容与光标位置的自定义补全方案

在IPython 5.3.0和Jupyter Notebook 5.0.0b2的环境下,set_custom_completer默认传递的参数确实只有光标前的文本片段,但我们可以通过访问IPython内核的内部属性来获取完整的单元格代码和光标位置。

解决方案代码

import IPython

def custom_completer(self, text):
    # 获取当前IPython实例与内核
    ipython = IPython.get_ipython()
    kernel = ipython.kernel
    
    # 从补全请求头中提取完整代码和全局光标位置
    request_content = kernel._parent_header['content']
    full_cell_code = request_content['code']
    global_cursor_pos = request_content['cursor_pos']
    
    # 将全局光标位置转换为1-based行号和行内位置
    lines = full_cell_code.split('\n')
    current_line_num = 1
    line_inner_pos = global_cursor_pos
    
    for idx, line in enumerate(lines):
        # 每行长度包含换行符(\n),所以加1
        line_total_len = len(line) + 1
        if line_inner_pos <= line_total_len:
            current_line_num = idx + 1
            # 修正行内位置:如果光标在行尾则对齐到行长度(去掉换行符影响)
            line_inner_pos = line_inner_pos if line_inner_pos <= len(line) else len(line)
            break
        line_inner_pos -= line_total_len
    
    # 这里可以根据完整代码和光标位置编写自定义补全逻辑
    # 示例:打印获取到的上下文信息
    print(f"完整单元格代码: {repr(full_cell_code)}")
    print(f"光标全局位置: {global_cursor_pos}")
    print(f"当前行号: {current_line_num}")
    print(f"行内光标位置: {line_inner_pos}")
    
    # 返回你的自定义补全结果列表
    return ['bar', 'baz', 'qux']

# 注册自定义补全器
IPython.get_ipython().set_custom_completer(custom_completer)

关键说明

  • 我们通过kernel._parent_header获取补全请求的原始内容,其中包含code(完整的单元格代码)和cursor_pos(光标在整个代码字符串中的字符索引)。
  • 虽然_parent_header是IPython内核的私有属性,但在你无法升级版本的情况下,这是该环境下获取完整补全上下文的可行方案。
  • 代码中额外处理了全局光标位置到行号、行内位置的转换,方便你针对特定行编写补全逻辑。

比如你提到的场景:单元格内容为foo bar<TAB>baz(光标位于bar和baz之间),full_cell_code会是输入的完整文本,global_cursor_pos会指向光标所在的准确位置,后续转换会得到对应的行号和行内位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:48:49