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 du plugin TextCommand de filtrage de base
Dans Sublime Text 2, sélectionnez Outils »Nouveau plug-in et entrez 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 comme filter.py
dans~/Library/Application Support/Sublime Text 2/Packages/User
Intégration avec l'interface utilisateur
Pour ajouter ce plugin au menu Edition , sélectionnez Préférences… »Parcourir les packages et ouvrez le User
dossier. Si un fichier appelé Main.sublime-menu
n'existe pas, créez-le. Ajoutez ou définissez le texte suivant dans ce fichier:
[
{
"id": "edit",
"children":
[
{"id": "wrap"},
{ "command": "filter" }
]
}
]
Cela insérera l' filter
appel de commande (essentiellement filter
transformé en FilterCommand().run(…)
appel de plugin et Filtre pour le libellé du menu) juste en dessous de la wrap
commande. Voir l' étape 11 ici pour une explication plus détaillée pourquoi.
Pour attribuer un raccourci clavier, ouvrez et modifiez le fichier Default (OSX).sublime-keymap
sous OS X, ou l’équivalent pour d’autres systèmes, puis entrez les informations suivantes:
[
{
"keys": ["ctrl+shift+f"], "command": "filter"
}
]
Cela assignera le raccourci ⌃⇧Fà cette commande.
Pour que la commande apparaisse dans la palette Commandes , vous devez créer un fichier nommé Default.sublime-commands
(ou modifier un fichier 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 accolades) 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 mise en œuvre, filtrera toutes les lignes qui font partie d’une sélection (les lignes entières, pas seulement les parties sélectionnées) ou, s’il n’ya pas de sélection, la totalité du tampon pour une sous-chaîne entrée dans le champ d’entrée ( La valeur par défaut est le presse-papiers éventuellement éventuellement multi-lignes) une fois la commande déclenchée. Il peut facilement être étendu pour prendre en charge, par exemple, les expressions régulières ou ne laisser que des lignes ne correspondant pas à une expression donnée.
Élément du menu
Entrée de la palette de commandes
Éditeur
Ajout du support pour les expressions régulières
Pour ajouter la prise en charge des expressions régulières, utilisez plutôt les scripts et extraits 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 plug-in, Filtre utilisant une expression régulière, sera ajoutée sous l' entrée de menu Filtre .
Default.sublime-commands
:
[
{ "caption": "Filter Lines in File", "command": "filter" },
{ "caption": "Filter Lines in File Using Regular Expression", "command": "filter_using_regular_expression" }
]