2013-11-01 52 views
2

我插件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. 找到關於谷歌:sublime plugin find and select text
  2. 檢查api

但還是沒有結果。

+0

爲什麼你需要插件的地獄?爲什麼你不能只使用Ctrl + G/Ctrl + F? – igor

+0

它只是快速導航的大插件的一部分:想象一下我在'冰咖啡腳本中獲得代碼:'a =(require'./c/d/e/file.js')。doMethod()'。我將光標移動到這一行上,按下快捷鍵,這個崇高的插件打開文件'file.js'併爲我選擇'doMethod'方法。 –

+2

我知道你已經有了一個解決方案,但只是想我也會指出你在文檔方面的正確方向。看看'view#find'和'view#find_all'。他們分別返回一個地區和一系列地區。當然,最終結果將與lhuang提供的插件相同。 – skuroda

回答

2

我不確定典型的方式。但是,您可以通過以下方式實現此目的:

  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) 
0

一個可能的改善龍華的答案 - 將光標移動到目標線。

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