Sublime Text 2 est un éditeur extensible avec une API Python . Vous pouvez créer de nouvelles commandes (appelées Plugins ) et les rendre disponibles à partir de l'interface utilisateur.
Ajout d'un plugin TextCommand de filtrage de base
Dans Sublime Text 2, sélectionnez Outils " Nouveau plugin et saisissez le texte suivant :
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)
Enregistrer sous filter.py
sur ~/Library/Application Support/Sublime Text 2/Packages/User
Intégration avec l'interface utilisateur
Pour ajouter ce plugin au Modifier sélectionnez Préférences " Parcourir les paquets et ouvrir le User
dossier. Si un fichier appelé Main.sublime-menu
n'existe pas, créez-la. Ajoutez ou définissez le texte suivant dans ce fichier :
[
{
"id": "edit",
"children":
[
{"id": "wrap"},
{ "command": "filter" }
]
}
]
Cela permettra d'insérer le filter
appel de commande (essentiellement, filter
est transformé en FilterCommand().run(…)
pour l'appel du plugin et Filtre pour l'étiquette du menu) juste en dessous de la wrap
commandement. Voir étape 11 ici pour une explication plus détaillée de cette situation.
Pour attribuer un raccourci clavier, ouvrez et modifiez le fichier Default (OSX).sublime-keymap
sur OS X, ou l'équivalent pour les autres systèmes, et entrez ce qui suit :
[
{
"keys": ["ctrl+shift+f"], "command": "filter"
}
]
Cela permettra d'attribuer le raccourci F à cette commande.
Pour que la commande apparaisse dans le Palette de commandes vous devez créer un fichier nommé Default.sublime-commands
(ou modifiez-en un existant) dans le User
dossier. La syntaxe est similaire à celle du fichier de menu que vous venez de modifier :
[
{ "caption": "Filter Lines in File", "command": "filter" }
]
Les entrées multiples (entre crochets) doivent être séparées par des virgules.
Captures d'écran de l'intégration du comportement et de l'interface utilisateur
La commande, telle qu'elle est implémentée, filtrera toutes les lignes qui font partie d'une sélection (les lignes entières, pas seulement les parties sélectionnées), ou, si aucune sélection n'existe, le tampon entier, pour une sous-chaîne qui est entrée dans le champ de saisie (par défaut, le presse-papiers multi-lignes - peut-être inutile - après le déclenchement de la commande). Elle peut facilement être étendue pour, par exemple, supporter les expressions régulières ou ne laisser que les lignes. no correspondant à une certaine expression.
Option de menu
Entrée de la palette de commandes
Rédacteur en chef
Ajout du support pour les Expressions Régulières
Pour ajouter le support des expressions régulières, utilisez plutôt les scripts et snippets suivants :
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"
}
]
Une deuxième commande de plugin, Filtrer en utilisant une expression régulière sera ajouté sous le Filtre entrée du menu.
Default.sublime-commands
:
[
{ "caption": "Filter Lines in File", "command": "filter" },
{ "caption": "Filter Lines in File Using Regular Expression", "command": "filter_using_regular_expression" }
]