Skip to content

Instantly share code, notes, and snippets.

@AndrewHoos
Created April 19, 2018 16:55
Show Gist options
  • Save AndrewHoos/63a06a465c28050fac63ee3ea83abbe7 to your computer and use it in GitHub Desktop.
Save AndrewHoos/63a06a465c28050fac63ee3ea83abbe7 to your computer and use it in GitHub Desktop.
import sublime
import sublime_plugin
import itertools
class LogFilterCommand(sublime_plugin.WindowCommand):
def run(self, search_type = 'string', invert_search=False):
self.search_type = search_type
self.invert_search = invert_search
self.search_text = ''
if invert_search:
prompt = 'Filter to exclude lines containing:'
else:
prompt = 'Filter to include lines containing:'
sublime.active_window().show_input_panel(prompt, self.search_text, self.on_search_text_entered, None, None)
def on_search_text_entered(self, search_text):
self.search_text = search_text
if self.window.active_view():
self.window.active_view().run_command('filter_lines', {
'search_text': self.search_text,
'search_flags': sublime.LITERAL if self.search_type == 'string' else 0,
'invert_search': self.invert_search})
class FilterLinesCommand(sublime_plugin.TextCommand):
def run(self, edit, search_text, search_flags, invert_search):
lines = itertools.groupby(self.view.find_all(search_text, search_flags), self.view.line)
self.invert_search = invert_search
self.show_filtered_lines(edit, lines)
def show_filtered_lines(self, edit, lines):
results_view = self.view.window().new_file()
results_view.set_name('Filter Results')
results_view.set_scratch(True)
results_view.settings().set('word_wrap', self.view.settings().get('word_wrap'))
if self.invert_search:
source_lines = self.view.lines(sublime.Region(0, self.view.size()))
filtered_line_numbers = [self.view.rowcol(line.begin())[0] for line, _ in lines]
for line_number in reversed(filtered_line_numbers):
del source_lines[line_number]
text = ''
for line in source_lines:
text += self.prepare_output_line(line, None)
results_view.run_command('append', {'characters': text, 'force': True, 'scroll_to_end': False})
else:
text = ''
for line, matches in lines:
text += self.prepare_output_line(line, matches)
results_view.run_command('append', {'characters': text, 'force': True, 'scroll_to_end': False})
results_view.set_syntax_file(self.view.settings().get('syntax'))
def prepare_output_line(self, line, matches):
return '%s\n' % (self.view.substr(line))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment