【问题标题】:Sublime Text plugin - how to find all regions in selectionSublime Text 插件 - 如何找到选择中的所有区域
【发布时间】:2016-07-28 09:50:56
【问题描述】:

如何找到选择中的所有区域(也包括区域类型)? 如果我们调用这个方法:

def chk_links(self,vspace):
    url_regions = vspace.find_all("https?://[^\"'\s]+")

    i=0
    for region in url_regions:
        cl = vspace.substr(region)
        code = self.get_response(cl)
        vspace.add_regions('url'+str(i), [region], "mark", "Packages/User/icons/"+str(code)+".png")
        i = i+1
    return i

在视图上下文中,例如:

chk_links(self.view)

一切正常,但以这种方式:

chk_links(self.view.sel()[0])

我收到错误:AttributeError: 'Region' object has no attribute 'find_all'

插件的完整代码你可以找到here

Sublime "View" method documentation

【问题讨论】:

    标签: python sublimetext2 sublimetext3 sublimetext sublime-text-plugin


    【解决方案1】:

    Selection 类(由View.sel() 返回)本质上只是代表当前选择的Region 对象列表。 Region 可以为空,因此列表始终包含至少一个长度为 0 的区域。

    唯一的methods available on the Selection class 是修改和查询它的范围。类似methods are available on the Region class

    可以做的是找到代码当前正在执行的所有有趣区域,然后在您迭代它们以执行检查时,查看它们是否包含在选择中与否。

    这是您上面示例的精简版本来说明这一点(为清楚起见,您的一些逻辑已被删除)。首先收集整个 URL 列表,然后在迭代列表时,仅在存在 NO 选择或 THERE IS 时才考虑每个区域 选择 AND URL 区域包含在选择范围内。

    import sublime, sublime_plugin
    
    class ExampleCommand(sublime_plugin.TextCommand):
        # Check all links in view
        def check_links(self, view):
            # The view selection list always has at least one item; if its length is
            # 0, then there is no selection; otherwise one or more regions are
            # selected.
            has_selection = len(view.sel()[0]) > 0
    
            # Find all URL's in the view
            url_regions = view.find_all ("https?://[^\"'\s]+")
    
            i = 0
            for region in url_regions:
                # Skip any URL regions that aren't contained in the selection.
                if has_selection and not view.sel ().contains (region):
                    continue
    
                # Region is either in the selection or there is no selection; process
                # Check and
                view.add_regions ('url'+str(i), [region], "mark", "Packages/Default/Icon.png")
                i = i + 1
    
        def run(self, edit):
            if self.view.is_read_only() or self.view.size () == 0:
                return
            self.check_links (self.view)
    

    【讨论】:

    • 这是进行“包含在选择中”检查的好主意。非常感谢。
    猜你喜欢
    • 2012-08-23
    • 2018-01-26
    • 2016-03-06
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多