O Sublime Text 2 é um editor extensível com uma API Python . Você pode criar novos comandos (chamados Plugins ) e disponibilizá-los na interface do usuário.
Adicionando filtro básico TextCommand plugin
No Sublime Text 2, selecione Ferramentas »Novo plug - in e digite o seguinte texto:
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)
Salvar como filter.py
em~/Library/Application Support/Sublime Text 2/Packages/User
Integração com UI
Para adicionar este plug-in ao menu Editar , selecione Preferências ... »Procurar pacotes e abra a User
pasta. Se um arquivo chamado Main.sublime-menu
não existir, crie-o. Adicione ou defina o seguinte texto para esse arquivo:
[
{
"id": "edit",
"children":
[
{"id": "wrap"},
{ "command": "filter" }
]
}
]
Isso irá inserir a filter
chamada de comando (essencialmente, filter
é transformada FilterCommand().run(…)
para a chamada do plugin e Filtro para o rótulo do menu) logo abaixo do wrap
comando. Consulte a etapa 11 aqui para obter uma explicação mais detalhada sobre o motivo.
Para atribuir um atalho de teclado, abra e edite o arquivo Default (OSX).sublime-keymap
no OS X ou o equivalente para outros sistemas e digite o seguinte:
[
{
"keys": ["ctrl+shift+f"], "command": "filter"
}
]
Isso atribuirá o atalho ⌃⇧Fpara este comando.
Para que o comando seja exibido na Paleta de comandos , você precisa criar um arquivo chamado Default.sublime-commands
(ou editar um existente) na User
pasta. A sintaxe é semelhante ao arquivo de menu que você acabou de editar:
[
{ "caption": "Filter Lines in File", "command": "filter" }
]
Várias entradas (entre colchetes) precisam ser separadas por vírgulas.
Capturas de tela de comportamento e integração da interface do usuário
O comando, conforme implementado, filtrará todas as linhas que fazem parte de uma seleção (as linhas inteiras, não apenas as partes selecionadas) ou, se não houver seleção, o buffer inteiro, para uma substring inserida no campo de entrada ( o padrão é a área de transferência - possivelmente inútil de várias linhas -) depois que o comando é acionado. Pode ser facilmente estendido para, por exemplo, suportar expressões regulares ou deixar apenas linhas que não correspondem a uma determinada expressão.
Item do menu
Entrada da paleta de comandos
editor
Adicionando suporte para expressões regulares
Para adicionar suporte a expressões regulares, use os seguintes scripts e trechos:
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"
}
]
Um segundo comando do plugin, Filter Using Regular Expression , será adicionado abaixo da entrada do menu Filter .
Default.sublime-commands
:
[
{ "caption": "Filter Lines in File", "command": "filter" },
{ "caption": "Filter Lines in File Using Regular Expression", "command": "filter_using_regular_expression" }
]