回答:
Sublime Text 2は、Python APIを備えた拡張可能なエディターです。新しいコマンド(Plugins)を作成し、UIから使用できるようにすることができます。
Sublime Text 2で、[ ツール]» [ 新しいプラグイン]を選択し、次のテキストを入力します。
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)
名前を付けて保存filter.py
で~/Library/Application Support/Sublime Text 2/Packages/User
このプラグインを[ 編集 ]メニューに追加するには、[ 設定...]» [ パッケージの参照 ]を選択し、User
フォルダーを開きます。呼び出されたファイルMain.sublime-menu
が存在しない場合は、作成します。そのファイルに次のテキストを追加または設定します。
[
{
"id": "edit",
"children":
[
{"id": "wrap"},
{ "command": "filter" }
]
}
]
これにより、filter
コマンドのすぐ下にコマンド呼び出しが挿入されます(基本的に、プラグイン呼び出し用にfilter
変換され、メニューラベル用にフィルター処理されます)。その理由の詳細については、ステップ11を参照してください。FilterCommand().run(…)
wrap
キーボードショートカットを割り当てるには、Default (OSX).sublime-keymap
OS Xまたは他のシステムの同等のファイルを開いて編集し、次のように入力します。
[
{
"keys": ["ctrl+shift+f"], "command": "filter"
}
]
これにより⌃⇧F、このコマンドにショートカットが割り当てられます。
コマンドパレットにコマンドを表示するにはDefault.sublime-commands
、User
フォルダーに名前のファイルを作成(または既存のファイルを編集)する必要があります。構文は、編集したばかりのメニューファイルに似ています。
[
{ "caption": "Filter Lines in File", "command": "filter" }
]
複数のエントリ(中括弧で囲まれている)は、コンマで区切る必要があります。
実装されたコマンドは、選択の一部であるすべての行(選択された部分だけでなく、行全体)、または入力フィールドに入力された部分文字列の選択が存在しない場合はバッファ全体をフィルタリングします(デフォルトは、コマンドがトリガーされた後の—おそらく役に立たない複数行—クリップボード)です。簡単に拡張して、たとえば正規表現をサポートしたり、特定の表現に一致しない行のみを残したりすることができます。
正規表現のサポートを追加するには、代わりに次のスクリプトとスニペットを使用します。
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"
}
]
2番目のプラグインコマンド、正規表現を使用したフィルターが、フィルターメニューエントリの下に追加されます。
Default.sublime-commands
:
[
{ "caption": "Filter Lines in File", "command": "filter" },
{ "caption": "Filter Lines in File Using Regular Expression", "command": "filter_using_regular_expression" }
]
貧乏人のラインフィルタリングアルゴリズムもあります(または、怠け者ですか?)。
現在、行をフィルタリングするためのプラグインがあります:https
: //github.com/davidpeckham/FilterLines
文字列または正規表現に基づいたフィルタリングとコードの折りたたみを可能にします。
Sublimeの組み込み機能を使用して、3〜7回のキーストロークでこれを行うことができます(一致する正規表現は含まれません)。
オプション1:部分文字列を含むすべての行を複数選択するには
オプション2:正規表現に一致するすべての行を複数選択するには
オプション1:選択されていないすべての行を削除するには
オプション2:選択されているすべての行を削除するには
オプション3:選択した行を新しいファイルに抽出するには