Files
2013-04-04 08:54:47 -04:00

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