возвышенный плагин: найдите и выберите текст

У меня есть плагин для 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:

выбрать строку по тексту

и, возможно, выберите строку class go_to_lineCommand.

Проблема сводится к поиску regionWithGivenString, а потом я могу его выбрать:

self.view.sel().add(regionWithGivenString)

Но не знаю, как получить regionWithGivenString.

Я попытался

  1. найти в Google: sub nofollow плагин найти и выделить текст
  2. проверьте api

Но все равно безрезультатно.


person Maxim Yefremov    schedule 01.11.2013    source источник
comment
какого черта для этого нужен плагин? Почему нельзя просто использовать Ctrl + G / Ctrl + F?   -  person igor    schedule 01.11.2013
comment
это просто часть большого плагина для быстрой навигации: представьте, у меня есть код в iced coffee script: a = (require './c/d/e/file.js').doMethod(). Я перемещаю курсор на эту строку, нажимаю короткую клавишу, и этот великолепный плагин открывает файл file.js и выбирает для меня метод doMethod.   -  person Maxim Yefremov    schedule 01.11.2013
comment
Я знаю, что у вас уже есть решение для этого, но просто подумал, что я также укажу вам правильное направление с точки зрения документации. Взгляните на view#find и view#find_all. Они возвращают регион и массив регионов соответственно. Конечно, конечный результат будет таким же, как у плагина, предоставленного lhuang.   -  person skuroda    schedule 02.11.2013


Ответы (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)
person longhua    schedule 01.11.2013

там у вас есть это в API, используйте метод view.find (regex, pos).

s = self.view.find("go_to_lineCommand", 0)
self.view.sel().add(s)

http://www.sublimetext.com/docs/3/api_reference.html

person Ivan Ferrer Villa    schedule 18.12.2013

Возможное улучшение ответа longhua - добавление движущегося курсора к целевой строке.

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
person sergzach    schedule 25.10.2017