# 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')