【问题标题】:How to get the (automatic) wrapping column ↔ the width of the view in columns?如何获得(自动)包装列↔列中视图的宽度?
【发布时间】:2020-12-04 23:10:39
【问题描述】:

我想获取文本将在“自动”自动换行宽度中换行的列。换句话说,我需要的是列中文本窗口的宽度。我尝试了以下代码,但是 window_to_text 方法似乎返回 0 不管其输入...

max_size = ex_view.viewport_extent()
max_size = (max_size[0] - 5, 1)
print(str(ex_view.rowcol(ex_view.window_to_text(max_size))[0]))

【问题讨论】:

    标签: python sublimetext3 sublime-text-plugin


    【解决方案1】:

    这里的主要问题是 API 方法 view.window_to_text() 会根据特定的窗口位置告诉您 point 所指的文本是什么,但文本 point 并不是您认为的那样(或者更确切地说,不是您认为的那样)。

    缓冲区的内容作为一个长字符串向 API 显示,其长度表示正在显示的字符数,point 是该字符串的偏移量。例如,如果缓冲区包含文本“Hello”,则有效文本 points 的范围为 0 到 4(含)。

    由于 view.window_to_text() 必须返回 0-4 范围内的文本点(在此示例中),它的作用是确定最接近该位置的字符是什么。例如,行中最右边字符右侧的位置返回表示行中最后一个字符的点,文件中所有内容下方的位置返回文件中的最后一个字符。

    为了使用此方法来确定缓冲区的宽度(或高度,就此而言),您需要通过向缓冲区添加足够的文本来进行测试,以确保在您提供的位置下有文本,即可能不是你想要的。

    要计算view 的视口在一般意义上的字符大小,您需要使用view.em_width()view.line_height(),它们分别告诉您dip 中字符的宽度和高度。从中您可以轻松准确地计算出当前可能可见的列数和行数:

    >>> view.em_width()
    10.0
    >>> view.line_height()
    22.0
    >>> view.viewport_extent()
    (1215.0, 775.0)
    >>> 1215 // 10
    121
    >>> 775 // 22
    35
    

    【讨论】:

    • 我尝试在缓冲区的第一行添加超过最后一列的文本,然后在控制台中对max_size = view.viewport_extent(); max_size = (max_size[0] - 5, 5) 值调用print(str(view.rowcol(view.window_to_text(max_size))[0])),结果仍然为0 . 你知道为什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多