O Sublime Text 2 é um editor extensível com uma API do Python . Você pode criar novos comandos (chamados Plugins ) e disponibilizá-los a partir da interface do usuário.
Adicionando o plugin TextCommand básico de filtragem
Em 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 interface do usuário
Para adicionar este plugin ao menu Editar , selecione Preferências… »Procurar Pacotes e abra a pasta User
. Se um arquivo chamado Main.sublime-menu
não existir, crie-o. Adicione ou defina o seguinte texto ao arquivo:
[
{
"id": "edit",
"children":
[
{"id": "wrap"},
{ "command": "filter" }
]
}
]
Isso irá inserir a chamada de comando filter
(essencialmente, filter
é transformado em FilterCommand().run(…)
para a chamada do plugin e Filter para o rótulo do menu) logo abaixo do comando wrap
. Veja passo 11 aqui para mais explicação detalhada porque isso é.
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"
}
]
Isto irá atribuir o atalho ⌃ ⇧ F a este comando.
Para que o comando apareça na Paleta de Comandos , você precisa criar um arquivo chamado Default.sublime-commands
(ou editar um existente) na pasta User
. A sintaxe é semelhante ao arquivo de menu que você acabou de editar:
[
{ "caption": "Filter Lines in File", "command": "filter" }
]
Várias entradas (colocadas entre chaves) precisam ser separadas por vírgulas.
Capturas de tela de integração de comportamento e 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, todo o buffer, para uma subseqüência inserida na campo de entrada (o padrão é o - possivelmente inútil multi-linha - área de transferência) após o comando ser acionado. Pode ser facilmente estendido para, e. suporta expressões regulares ou apenas deixa linhas não correspondentes a uma determinada expressão.
Item de menu
Entradadapaletadecomandos
Editor
Adicionando suporte para expressões regulares
Para adicionar suporte a expressões regulares, use os seguintes scripts e snippets:
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 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" }
]