質問: sublime text 2で文字列を含む行のファイルをフィルタ処理する方法を教えてください。 sublime text 2で編集中のファイルを、可能であれば正規表現を含めて特定の文字列が含まれている行に絞り込みます。次のファイルを検討してください。foo bar baz qux quuux baz baに対してフィルタ処理されると、結果は以下のようになります。foo bar baz quuux baz どうやってやるの?
回答: sublime text 2は python api を持つ拡張可能なエディタです。新しいコマンド(pluginsと呼ばれる)を作成して、それらをuiから使用できるようにすることができます。基本的なフィルタリングtextcommandプラグインを追加する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として保存しますuiとの統合このプラグインをeditメニューに追加するには、preferences..."browse packagesを選択してuserフォルダを開きます。 main.sublime-menuというファイルが存在しない場合は作成します。そのファイルに次のテキストを追加または設定します。[ { "id": "edit", "children": [ {"id": "wrap"}, { "command": "filter" } ] } ] これはfilterコマンド呼び出しのすぐ下にfilterコマンド呼び出しを挿入します(基本的に、プラグイン呼び出しの場合はwrapはfiltercommand().run(...)に、メニューラベルの場合はfilterに変換されます)。その理由については、 ここのステップ11 を参照してください。キーボードショートカットを割り当てるには、os xの場合はファイルdefault (osx).sublime-keymap、または他のシステムの場合は同等のファイルを開いて編集し、次のように入力します。[ { "keys": ["ctrl+shift+f"], "command": "filter" } ] これはショートカットを割り当てます ⌃⇧f このコマンドに。コマンドをcommands paletteに表示するには、userフォルダーにdefault.sublime-commandsという名前のファイルを作成する(または既存のファイルを編集する)必要があります。構文は、先ほど編集したメニューファイルと似ています。[ { "caption": "filter lines in file", "command": "filter" } ] 複数のエントリ(中括弧で囲まれている)は、カンマで区切る必要があります。動作とui統合のスクリーンショットこのコマンドは、実装されているとおり、入力フィールドに入力された部分文字列について、選択範囲の一部であるすべての行(選択された部分だけでなく、行全体)、またはバッファ全体をフィルタリングします。コマンドが起動された後のデフォルトは - おそらく無駄な複数行 - クリップボード)です。それは容易に拡張することができます。正規表現をサポートするか、またはnotが特定の表現に一致する行だけを残します。メニュー項目コマンドパレット入力編集者正規表現のサポートを追加する正規表現のサポートを追加するには、代わりに次のスクリプトとスニペットを使用してください。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番目のプラグインコマンド、正規表現を使用したフィルタは、filterメニューエントリの下に追加されます。default.sublime-commands:[ { "caption": "filter lines in file", "command": "filter" }, { "caption": "filter lines in file using regular expression", "command": "filter_using_regular_expression" } ]