160 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Written by Eric Martel (emartel@gmail.com / www.ericmartel.com)
 | |
| 
 | |
| import sublime
 | |
| import sublime_plugin
 | |
| 
 | |
| import subprocess
 | |
| import webbrowser
 | |
| import threading
 | |
| import os
 | |
| import json
 | |
| 
 | |
| searchanywhere_dir = os.getcwdu()
 | |
| 
 | |
| # Helper functions
 | |
| def SearchFor(view, text, searchurl):
 | |
|     if not searchurl:
 | |
|         # see if we have an extension match first, then use default
 | |
|         settings = sublime.load_settings(__name__ + '.sublime-settings')
 | |
| 
 | |
|         filename, ext = os.path.splitext(view.file_name())
 | |
|         typesettings = settings.get('searchanywhere_type_searchengine', [])
 | |
| 
 | |
|         foundsetting = False
 | |
|         for typesetting in typesettings:
 | |
|             if typesetting['extension'] == ext:
 | |
|                 foundsetting = True
 | |
|                 searchurl = typesetting['searchurl']
 | |
| 
 | |
|         if not foundsetting:
 | |
|             if settings.has('searchanywhere_searchurl'):
 | |
|                 searchurl = settings.get('searchanywhere_searchurl')
 | |
|             else:
 | |
|                 sublime.error_message(__name__ + ': No Search Engine selected')
 | |
|                 return
 | |
|     else:
 | |
|         # search url is provided by the caller
 | |
|         pass
 | |
| 
 | |
|     url = searchurl.replace('{0}', text.replace(' ','%20'))
 | |
|     webbrowser.open_new_tab(url)
 | |
| 
 | |
| def ShowSearchEnginesList(window, callback):
 | |
|     searchengines = []
 | |
|     if os.path.exists(searchanywhere_dir + os.sep + 'searchengines.json'):
 | |
|         f = open(searchanywhere_dir + os.sep + 'searchengines.json')
 | |
|         searchengineslist = json.load(f)
 | |
|         f.close()
 | |
| 
 | |
|         for entry in searchengineslist.get('searchengines'):
 | |
|             formattedentry = []
 | |
|             formattedentry.append(entry.get('name'))
 | |
|             formattedentry.append(entry.get('baseurl'))
 | |
|             searchengines.append(formattedentry)
 | |
| 
 | |
|     window.show_quick_panel(searchengines, callback)
 | |
| 
 | |
| def GetSearchEngineEntry(picked):
 | |
|     f = open(searchanywhere_dir + os.sep + 'searchengines.json')
 | |
|     searchengineslist = json.load(f)
 | |
|     entry = searchengineslist.get('searchengines')[picked]
 | |
|     f.close()
 | |
|     return entry
 | |
| 
 | |
| class SearchAnywhereFromSelectionAskCommand(sublime_plugin.TextCommand):
 | |
|     def run(self, edit):
 | |
|         ShowSearchEnginesList(self.view.window(), self.on_select_done)
 | |
| 
 | |
|     def on_select_done(self, picked):
 | |
|         entry = GetSearchEngineEntry(picked)
 | |
| 
 | |
|         for selection in self.view.sel():
 | |
|             # if the user didn't select anything, search the currently highlighted word
 | |
|             if selection.empty():
 | |
|                 selection = self.view.word(selection)
 | |
| 
 | |
|             text = self.view.substr(selection)
 | |
|             SearchFor(self.view, text, entry.get('searchurl'))
 | |
| 
 | |
| class SearchAnywhereFromInputAskCommand(sublime_plugin.WindowCommand):
 | |
|     def run(self):
 | |
|         ShowSearchEnginesList(self.window, self.on_select_done)
 | |
| 
 | |
|     def on_select_done(self, picked):
 | |
|         self.entry = GetSearchEngineEntry(picked)
 | |
| 
 | |
|         self.window.show_input_panel('Search on ' + self.entry.get('name') + ' for', '', self.on_done, self.on_change, self.on_cancel)
 | |
| 
 | |
|     def on_done(self, input):
 | |
|         SearchFor(self.window.active_view(), input, self.entry.get('searchurl'))
 | |
| 
 | |
|     def on_change(self, input):
 | |
|         pass
 | |
| 
 | |
|     def on_cancel(self):
 | |
|         pass
 | |
| 
 | |
| 
 | |
| class SearchAnywhereFromSelectionCommand(sublime_plugin.TextCommand):
 | |
|     def run(self, edit):
 | |
|         for selection in self.view.sel():
 | |
|             # if the user didn't select anything, search the currently highlighted word
 | |
|             if selection.empty():
 | |
|                 selection = self.view.word(selection)
 | |
|             
 | |
|             text = self.view.substr(selection)
 | |
|             SearchFor(self.view, text, None)
 | |
| 
 | |
| class SearchAnywhereFromInputCommand(sublime_plugin.WindowCommand):
 | |
|     def run(self):
 | |
|         settings = sublime.load_settings(__name__ + '.sublime-settings')
 | |
|         if settings.has('searchanywhere_searchengine'):
 | |
|             engine = settings.get('searchanywhere_searchengine')
 | |
|             self.window.show_input_panel('Search on ' + engine + ' for', '', self.on_done, self.on_change, self.on_cancel)
 | |
|         else:
 | |
|             sublime.error_message(__name__ + ': No Search Engine selected')
 | |
| 
 | |
|     def on_done(self, input):
 | |
|         SearchFor(self.window.active_view(), input, None)
 | |
| 
 | |
|     def on_change(self, input):
 | |
|         pass
 | |
| 
 | |
|     def on_cancel(self):
 | |
|         pass
 | |
| 
 | |
| # Sets the default Search Engine to use
 | |
| class SearchAnywhereSelectDefaultSearchEngineCommand(sublime_plugin.WindowCommand):
 | |
|     def run(self):
 | |
|         ShowSearchEnginesList(self.window, self.on_select_done)
 | |
| 
 | |
|     def on_select_done(self, picked):
 | |
|         entry = GetSearchEngineEntry(picked)
 | |
| 
 | |
|         settings = sublime.load_settings(__name__ + '.sublime-settings')
 | |
|         settings.set('searchanywhere_searchengine', entry.get('name'))
 | |
|         settings.set('searchanywhere_searchurl', entry.get('searchurl'))
 | |
|         sublime.save_settings(__name__ + '.sublime-settings')
 | |
| 
 | |
| # Sets the default Search Engine to use for files sharing the view's extension
 | |
| class SearchAnywhereSelectSearchEngineForTypeCommand(sublime_plugin.WindowCommand):
 | |
|     def run(self):
 | |
|         self.filename, self.ext = os.path.splitext(self.window.active_view().file_name())
 | |
|         ShowSearchEnginesList(self.window, self.on_select_done)
 | |
| 
 | |
|     def on_select_done(self, picked):
 | |
|         entry = GetSearchEngineEntry(picked)
 | |
| 
 | |
|         settings = sublime.load_settings(__name__ + '.sublime-settings')
 | |
| 
 | |
|         typesettings = settings.get('searchanywhere_type_searchengine', [])
 | |
| 
 | |
|         newsetting = {}
 | |
|         newsetting['extension'] = self.ext
 | |
|         newsetting['name'] = entry.get('name')
 | |
|         newsetting['searchurl'] = entry.get('searchurl')
 | |
| 
 | |
|         typesettings.append(newsetting)
 | |
| 
 | |
|         settings.set('searchanywhere_type_searchengine', typesettings)
 | |
|         sublime.save_settings(__name__ + '.sublime-settings') |