我想过滤我在 Sublime Text 2 中编辑的文件,查找包含特定字符串的行,如果可能的话包括正则表达式。
考虑以下文件:
foo bar
baz
qux
quuux baz
当对 进行过滤时ba
,结果应为:
foo bar
baz
quuux baz
我怎样才能做到这一点?
答案1
还有一个穷人的线路过滤算法(或者是懒惰?):
- 选择感兴趣的字符串
- 在所有情况下按Alt+F3进入多光标模式
- 按Control+L选择整行(在每条光标行上)
- 点击Esc离开搜索输入字段。
- 将选择内容复制粘贴到另一个缓冲区。
- (如果需要)删除空行。例如,通过对行进行排序并删除空行,或使用
Edit -> Permute Lines -> Unique
并删除剩余的单行。
答案2
Sublime Text 2 是一款可扩展的编辑器,具有Python API。您可以创建新的命令(称为插件) 并使其可从 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 集成
要将此插件添加到编辑菜单,选择偏好设置… » 浏览软件包并打开User
文件夹。如果不存在名为的文件Main.sublime-menu
,请创建它。向该文件添加或设置以下文本:
[
{
"id": "edit",
"children":
[
{"id": "wrap"},
{ "command": "filter" }
]
}
]
这将插入filter
命令调用(本质上,filter
转换FilterCommand().run(…)
为插件调用和筛选(菜单标签)位于wrap
命令下方。请参阅步骤 11以获得更详细的解释。
Default (OSX).sublime-keymap
要分配键盘快捷键,请在 OS X 或其他系统的同等系统中打开并编辑文件,然后输入以下内容:
[
{
"keys": ["ctrl+shift+f"], "command": "filter"
}
]
这会将快捷方式分配⌃⇧F给该命令。
要使命令显示在命令面板,您需要Default.sublime-commands
在文件夹中创建一个名为的文件(或编辑现有文件)User
。语法类似于您刚刚编辑的菜单文件:
[
{ "caption": "Filter Lines in File", "command": "filter" }
]
多个条目(用花括号括起来)需要用逗号分隔。
行为和 UI 集成屏幕截图
该命令在实施后将过滤所有属于选择的行(整行,而不仅仅是选定的部分),或者,如果不存在选择,则过滤整个缓冲区,以获取触发命令后输入到输入字段的子字符串(默认是 — 可能无用的多行 — 剪贴板)。它可以轻松扩展以支持正则表达式,或者仅保留行不是匹配某个特定的表达式。
菜单项
命令面板条目
编辑
添加对正则表达式的支持
要添加对正则表达式的支持,请改用以下脚本和代码片段:
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"
}
]
第二个插件命令,使用正则表达式进行过滤将添加至筛选菜单项。
Default.sublime-commands
:
[
{ "caption": "Filter Lines in File", "command": "filter" },
{ "caption": "Filter Lines in File Using Regular Expression", "command": "filter_using_regular_expression" }
]
答案3
现在有一个插入对于过滤线:https://github.com/davidpeckham/FilterLines
它允许基于字符串或正则表达式进行过滤和代码折叠。
答案4
您可以使用 Sublime 的内置功能通过 3 到 7 次击键完成此操作(不包括要匹配的正则表达式)。
步骤 1:多选所有匹配的行
选项 1:多选包含子字符串的所有行
- 选择感兴趣的字符串。
- 按“ Alt+”F3可选择所有出现的项。
- 点击Ctrl+ L(将选择扩展至行)。
选项 2:选择与正则表达式匹配的所有行
- 按“ Ctrl+”F打开“查找”抽屉。
- 确保正则表达式匹配已启用(Alt+R切换)。
- 输入正则表达式。
- 按“ Alt+”Enter可选择所有匹配项。
- 点击Ctrl+ L(将选择扩展至行)。
第 2 步:用这些线条做一些事情
选项 1:删除所有不是已选择
- 按Ctrl+C进行复制。
- 按Ctrl+A选择全部。
- 按Ctrl+V用匹配的行替换选择。
选项 2:删除所有是已选择
- 按Ctrl+ Shift+ K(删除行)。
选项 3:将选定的行提取到新文件
- 按Ctrl+C进行复制。
- 按Ctrl+N打开一个新文件。
- 按Ctrl+V粘贴。