Sublime Text 2 è un editor estensibile con un'API Python . Puoi creare nuovi comandi (chiamati Plugin ) e renderli disponibili dall'interfaccia utente.
Aggiunta del plug-in TextCommand di filtro di base
In Sublime Text 2, seleziona Strumenti »Nuovo plug-in e inserisci il testo seguente:
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)
Salva come filter.py
in~/Library/Application Support/Sublime Text 2/Packages/User
Integrazione con l'interfaccia utente
Per aggiungere questo plugin al menu Modifica , seleziona Preferenze ... »Sfoglia pacchetti e apri la User
cartella. Se un file chiamato Main.sublime-menu
non esiste, crealo. Aggiungi o imposta il seguente testo in quel file:
[
{
"id": "edit",
"children":
[
{"id": "wrap"},
{ "command": "filter" }
]
}
]
Ciò inserirà la filter
chiamata di comando (essenzialmente, filter
viene trasformata in FilterCommand().run(…)
per la chiamata del plug-in e Filtro per l'etichetta del menu) proprio sotto il wrap
comando. Vedere il passaggio 11 qui per una spiegazione più dettagliata del perché.
Per assegnare una scorciatoia da tastiera, apri e modifica il file Default (OSX).sublime-keymap
su OS X o l'equivalente per altri sistemi e inserisci quanto segue:
[
{
"keys": ["ctrl+shift+f"], "command": "filter"
}
]
Questo assegnerà il collegamento ⌃⇧Fa questo comando.
Per visualizzare il comando nella Tavolozza comandi , è necessario creare un file denominato Default.sublime-commands
(o modificarne uno esistente) nella User
cartella. La sintassi è simile al file di menu appena modificato:
[
{ "caption": "Filter Lines in File", "command": "filter" }
]
Le voci multiple (racchiuse tra parentesi graffe) devono essere separate da virgole.
Schermate di integrazione del comportamento e dell'interfaccia utente
Il comando, come implementato, filtrerà tutte le linee che fanno parte di una selezione (le linee intere, non solo le parti selezionate) o, se non esiste alcuna selezione, l'intero buffer, per una sottostringa immessa nel campo di input ( il default è il - forse inutile multi-line - appunti) dopo l'attivazione del comando. Può essere facilmente esteso, ad esempio, per supportare espressioni regolari o lasciare solo righe che non corrispondono a una determinata espressione.
Elemento del menu
Comanda l'inserimento della palette
editore
Aggiunta del supporto per le espressioni regolari
Per aggiungere supporto per le espressioni regolari, utilizzare invece i seguenti script e frammenti:
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"
}
]
Un secondo comando di plugin, Filter Using Regular Expression sarà aggiunto sotto la voce del 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" }
]