Sublime Text 2 ist ein erweiterbarer Editor mit einer Python-API . Sie können neue Befehle (sogenannte Plugins ) erstellen und über die Benutzeroberfläche verfügbar machen.
Hinzufügen des TextCommand-Plugins für die Grundfilterung
Wählen Sie in Sublime Text 2 Extras »Neues Plugin und geben Sie den folgenden Text ein:
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)
Speichern wie filter.py
in~/Library/Application Support/Sublime Text 2/Packages/User
Integration mit der Benutzeroberfläche
Um dieses Plugin zum Menü Bearbeiten hinzuzufügen , wählen Sie Einstellungen… »Pakete durchsuchen und öffnen Sie den User
Ordner. Wenn eine aufgerufene Datei Main.sublime-menu
nicht existiert, erstellen Sie sie. Fügen Sie dieser Datei den folgenden Text hinzu oder legen Sie ihn fest:
[
{
"id": "edit",
"children":
[
{"id": "wrap"},
{ "command": "filter" }
]
}
]
Dadurch wird der filter
Befehlsaufruf (der im Wesentlichen filter
in FilterCommand().run(…)
für den Plug-in-Aufruf und Filter für die Menübeschriftung umgewandelt wird) direkt unter dem wrap
Befehl eingefügt. In Schritt 11 finden Sie eine ausführlichere Erklärung, warum dies so ist.
Um eine Tastenkombination zuzuweisen, öffnen und bearbeiten Sie die Datei Default (OSX).sublime-keymap
unter OS X oder einer Entsprechung für andere Systeme und geben Sie Folgendes ein:
[
{
"keys": ["ctrl+shift+f"], "command": "filter"
}
]
Dadurch wird die Verknüpfung ⌃⇧Fzu diesem Befehl zugewiesen .
Damit der Befehl in der Befehlspalette angezeigt wird , müssen Sie eine Datei mit dem Namen Default.sublime-commands
(oder einer vorhandenen) im User
Ordner erstellen . Die Syntax ähnelt der soeben bearbeiteten Menüdatei:
[
{ "caption": "Filter Lines in File", "command": "filter" }
]
Mehrere Einträge (in geschweiften Klammern) müssen durch Kommas getrennt werden.
Screenshots zu Verhalten und UI-Integration
Der Befehl filtert, wie implementiert, alle Zeilen, die Teil einer Auswahl sind (die gesamten Zeilen, nicht nur die ausgewählten Teile), oder, falls keine Auswahl vorhanden ist, den gesamten Puffer für eine Teilzeichenfolge, die in das Eingabefeld eingegeben wird ( Standard ist die - möglicherweise unbrauchbare - mehrzeilige Zwischenablage, nachdem der Befehl ausgelöst wurde. Es kann leicht erweitert werden, um zB reguläre Ausdrücke zu unterstützen oder nur Zeilen zu belassen, die nicht mit einem bestimmten Ausdruck übereinstimmen.
Menüpunkt
Befehlspaletteneintrag
Editor
Unterstützung für reguläre Ausdrücke hinzufügen
Verwenden Sie stattdessen die folgenden Skripts und Snippets, um Unterstützung für reguläre Ausdrücke hinzuzufügen:
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"
}
]
Ein zweiter Plugin-Befehl, Filter Using Regular Expression, wird unter dem Menüeintrag Filter hinzugefügt .
Default.sublime-commands
:
[
{ "caption": "Filter Lines in File", "command": "filter" },
{ "caption": "Filter Lines in File Using Regular Expression", "command": "filter_using_regular_expression" }
]