Sublime Text 2 - это расширяемый редактор с Python API. Вы можете создавать новые команды (называемые плагинами) и делать их доступными из пользовательского интерфейса.
Добавление базового плагина TextCommand для фильтрации
В Sublime Text 2 выберите Инструменты »Новый плагин и введите следующий текст:
import sublime, sublime_plugin
def filter(v, e, needle):
# get non-empty selections
regions = [s for s in v.sel() if not s.empty()]
# if there's no non-empty selection, filter the whole document
if len(regions) == 0:
regions = [ sublime.Region(0, v.size()) ]
for region in reversed(regions):
lines = v.split_by_newlines(region)
for line in reversed(lines):
if not needle in v.substr(line):
v.erase(e, v.full_line(line))
class FilterCommand(sublime_plugin.TextCommand):
def run(self, edit):
def done(needle):
e = self.view.begin_edit()
filter(self.view, e, needle)
self.view.end_edit(e)
cb = sublime.get_clipboard()
sublime.active_window().show_input_panel("Filter file for lines containing: ", cb, done, None, None)
Сохранить как filter.py
в ~/Library/Application Support/Sublime Text 2/Packages/User
Интеграция с пользовательским интерфейсом
Чтобы добавить этот плагин в меню « Правка» , выберите « Настройки» ... »Просмотреть пакеты и откройте папку« User
». Если файл с именем Main.sublime-menu
не существует, создайте его. Добавьте или установите следующий текст в этот файл:
[
{
"id": "edit",
"children":
[
{"id": "wrap"},
{ "command": "filter" }
]
}
]
Это вставит вызов команды filter
(по существу, filter
преобразуется в FilterCommand().run(…)
для вызова плагина и Filter для метки меню) чуть ниже команды wrap
. Смотрите шаг 11 здесь для более подробного объяснения, почему это так.
Чтобы назначить сочетание клавиш, откройте и измените файл Default (OSX).sublime-keymap
в OS X или эквивалент для других систем и введите следующее:
[
{
"keys": ["ctrl+shift+f"], "command": "filter"
}
]
Это назначит ярлык ⌃ ⇧ F для этой команды.
Чтобы команда появилась в палитре команд, вам нужно создать файл с именем Default.sublime-commands
(или отредактировать существующий) в папке User
. Синтаксис похож на файл меню, который вы только что отредактировали:
[
{ "caption": "Filter Lines in File", "command": "filter" }
]
Несколько записей (заключенных в фигурные скобки) должны быть разделены запятыми.
Скриншоты интеграции поведения и пользовательского интерфейса
Команда, как она реализована, отфильтрует все строки, являющиеся частью выделения (целые строки, а не только выделенные части) или, если выбор не существует, весь буфер для подстроки, введенной в поле ввода ( по умолчанию это - возможно бесполезный многострочный - буфер обмена) после запуска команды. Его можно легко расширить, например, для поддержки регулярных выражений или оставить только строки, не соответствующие определенному выражению.
Пункт меню

Ввод палитры команд

редактор


Добавление поддержки регулярных выражений
Чтобы добавить поддержку регулярных выражений, используйте вместо этого следующие сценарии и фрагменты:
filter.py
:
import sublime, sublime_plugin, re
def matches(needle, haystack, is_re):
if is_re:
return re.match(needle, haystack)
else:
return (needle in haystack)
def filter(v, e, needle, is_re = False):
# get non-empty selections
regions = [s for s in v.sel() if not s.empty()]
# if there's no non-empty selection, filter the whole document
if len(regions) == 0:
regions = [ sublime.Region(0, v.size()) ]
for region in reversed(regions):
lines = v.split_by_newlines(region)
for line in reversed(lines):
if not matches(needle, v.substr(line), is_re):
v.erase(e, v.full_line(line))
class FilterCommand(sublime_plugin.TextCommand):
def run(self, edit):
def done(needle):
e = self.view.begin_edit()
filter(self.view, e, needle)
self.view.end_edit(e)
cb = sublime.get_clipboard()
sublime.active_window().show_input_panel("Filter file for lines containing: ", cb, done, None, None)
class FilterUsingRegularExpressionCommand(sublime_plugin.TextCommand):
def run(self, edit):
def done(needle):
e = self.view.begin_edit()
filter(self.view, e, needle, True)
self.view.end_edit(e)
cb = sublime.get_clipboard()
sublime.active_window().show_input_panel("Filter file for lines matching: ", cb, done, None, None)
Main.sublime-menu
:
[
{
"id": "edit",
"children":
[
{"id": "wrap"},
{ "command": "filter" },
{ "command": "filter_using_regular_expression" }
]
}
]
Default (OSX).sublime-keymap
:
[
{
"keys": ["ctrl+shift+f"], "command": "filter"
},
{
"keys": ["ctrl+shift+option+f"], "command": "filter_using_regular_expression"
}
]
Вторая команда плагина, Filter Using Regular Expression, будет добавлена ниже пункта меню Filter .
Default.sublime-commands
:
[
{ "caption": "Filter Lines in File", "command": "filter" },
{ "caption": "Filter Lines in File Using Regular Expression", "command": "filter_using_regular_expression" }
]