Files
ChocolateyPackages/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/open_search_result.py
2013-04-04 08:54:47 -04:00

127 lines
4.1 KiB
Python

import os
import sublime, sublime_plugin
import util
class HighlightFilePaths(sublime_plugin.EventListener):
HIGHLIGHT_REGION_NAME = 'HighlightFilePaths'
HIGHLIGHT_ENABLED_KEY = 'highlight_search_results'
SCOPE_SETTINGS_KEY = 'highlight_search_scope'
ICON_SETTINGS_KEY = 'highlight_search_icon'
DEFAULT_SCOPE = 'search_result_highlight'
DEFAULT_ICON = ''
def show_highlight(self, view):
valid_regions = []
show_highlight = view.settings().get(self.HIGHLIGHT_ENABLED_KEY, False)
scope = view.settings().get(self.SCOPE_SETTINGS_KEY, self.DEFAULT_SCOPE)
icon = view.settings().get(self.ICON_SETTINGS_KEY, self.DEFAULT_ICON)
if view.name() != 'Find Results':
return
for s in view.sel():
line = view.line(s)
line_str = view.substr(view.line(s))
line_num = util.parse_line_number(line_str)
if util.is_file_path(line_str) or line_num:
valid_regions.append(line)
if valid_regions:
if show_highlight:
options = sublime.DRAW_EMPTY | sublime.DRAW_OUTLINED
else:
options = sublime.HIDDEN
view.add_regions(
self.HIGHLIGHT_REGION_NAME, valid_regions, scope, icon, options)
else:
view.erase_regions(self.HIGHLIGHT_REGION_NAME)
def on_selection_modified(self, view):
highlight_enabled = (view.settings().get(self.HIGHLIGHT_ENABLED_KEY)
or view.settings().get(self.ICON_SETTINGS_KEY))
if view.settings().get('is_widget') \
or not view.settings().get('command_mode') \
or not highlight_enabled:
view.erase_regions(self.HIGHLIGHT_REGION_NAME)
return
self.show_highlight(view)
def on_deactivated(self, view):
view.erase_regions(self.HIGHLIGHT_REGION_NAME)
def on_activated(self, view):
if view.settings().get('highlight_file_paths'):
self.show_highlight(view)
class OpenSearchResultCommand(sublime_plugin.TextCommand):
"""
Open a file listed in the Find In File search results at the line the
cursor is on, or just open the file if the cursor is on the file path.
"""
def open_file_from_line(self, line, line_num):
"""
Attempt to parse a file path from the string `line` and open it in a
new buffer.
"""
if ':' not in line:
return
file_path = line[0:-1]
if os.path.exists(file_path):
self.view.window().open_file(
"%s:%s" % (file_path, line_num), sublime.ENCODED_POSITION)
def previous_line(self, region):
""" `region` should be a Region covering the entire hard line """
if region.begin() == 0:
return None
else:
return self.view.full_line(region.begin() - 1)
def open_file_path(self, line_str):
"""
Parse a file path from a string `line_str` of the format: "<path>:"
"""
file_path = line_str[0:-1]
if os.path.exists(file_path):
self.view.window().open_file(file_path)
def open_file_at_line_num(self, cur_line, line_num):
"""
Starting at the position `cur_line` (a `Region`), count backwards
until we find a path or the beginning of the file. If we find a file
path, open it in a new tab at `line_num`.
"""
prev = cur_line
while True:
prev = self.previous_line(prev)
if prev is None:
break
line = self.view.substr(prev).strip()
if util.is_file_path(line):
return self.open_file_from_line(line, line_num)
def run(self, edit):
for cursor in self.view.sel():
cur_line = self.view.line(cursor)
line_str = self.view.substr(cur_line).strip()
line_num = util.parse_line_number(line_str)
if self.view.name() != 'Find Results':
return
if util.is_file_path(line_str):
self.open_file_path(line_str)
elif line_num:
self.open_file_at_line_num(cur_line, line_num)