Sublime插件:查找并选择文本

4

我有一个适用于sublime text 3的插件,它可以让我通过行号移动光标:

import sublime, sublime_plugin

class prompt_goto_lineCommand(sublime_plugin.WindowCommand):

    def run(self):
        self.window.show_input_panel("Goto Line:", "", self.on_done, None, None)
        pass

    def on_done(self, text):
        try:
            line = int(text)
            if self.window.active_view():
                self.window.active_view().run_command("goto_line", {"line": line} )
        except ValueError:
            pass

class go_to_lineCommand(sublime_plugin.TextCommand):

    def run(self, edit, line):
        # Convert from 1 based to a 0 based line number
        line = int(line) - 1

        # Negative line numbers count from the end of the buffer
        if line < 0:
            lines, _ = self.view.rowcol(self.view.size())
            line = lines + line + 1

        pt = self.view.text_point(line, 0)

        self.view.sel().clear()
        self.view.sel().add(sublime.Region(pt))

        self.view.show(pt)

我希望改进它,让我能够将光标移动到包含指定字符串的第一行。这就像对文件进行搜索:例如,如果向其传递字符串"class go_to_lineCommand",插件必须将光标移动到第17行:

select line by text

并可能选择字符串class go_to_lineCommand
问题可以简化为查找regionWithGivenString,然后我可以选择它:
self.view.sel().add(regionWithGivenString)

但是不知道如何获取 regionWithGivenString 方法。

我尝试了以下操作:

  1. 在 Google 上查找:Sublime 插件查找和选择文本类似于 Vim
  2. 检查 API

但仍然没有结果。


你为什么需要插件呢?你不能只使用 Ctrl+G/Ctrl+F 吗? - igor
这只是一个快速导航的大型插件的一部分:假设我在 iced coffee script 中有以下代码:a = (require './c/d/e/file.js').doMethod()。我将光标移动到此行,按下快捷键,这个 Sublime 插件就会打开文件 file.js 并为我选择 doMethod 方法。 - Maxim Yefremov
2
我知道你已经有了解决方案,但我想指出文档方面的正确方向。请查看view#findview#find_all。它们分别返回一个区域和一个区域数组。当然,最终结果与lhuang提供的插件相同。 - skuroda
3个回答

3

我不确定典型的方法。但是,您可以按照以下方式实现:

  1. 获取当前文档的内容。
  2. 搜索目标字符串以查找其起始和结束位置。现在您已经有了起点和终点。
  3. Region(start, end) 添加到选择中。

示例:

def run(self, edit, target):
    if not target or target == "":
        return

    content = self.view.substr(sublime.Region(0, self.view.size()))
    begin = content.find(target)
    if begin == -1:
        return
    end = begin + len(target)
    target_region = sublime.Region(begin, end)
    self.view.sel().clear()
    self.view.sel().add(target_region)

2

1
一种可能的改进方法是在目标行添加移动光标。
class FindcustomCommand(sublime_plugin.TextCommand):
    def _select(self):
        self.view.sel().clear()
        self.view.sel().add(self._target_region)

    def run(self, edit):
        TARGET = 'http://nabiraem'

        # if not target or target == "":
        #   return

        content = self.view.substr(sublime.Region(0, self.view.size()))
        begin = content.find(TARGET)
        if begin == -1:
            return
        end = begin + len(TARGET)
        self._target_region = sublime.Region(begin, end)    
        self._select()
        self.view.show(self._target_region) # scroll to selection

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接