用于替换引号的 Sublime Workflow

Sublime Workflow for replacing quotes

我使用文本编辑器 Sublime Text 3 来编辑代码,并且经常会有一个用双引号引起来的字符串文字,我想将其更改为单引号,反之亦然。现在我滚动到每个引号,并将其替换为我想要的。是否有更快的工作流程?比如说,突出显示单词或热键之类的?我会发现它非常有用。

如果您在一个文件中有大量这样的字符串并且您想要一次转换所有这些字符串,您可以使用正则表达式 find/replace 操作来查找并替换它们。您将使用 Find > Replace...Find > Find in files... 来搜索捕获引号中文本的匹配正则表达式。

例如,您可以使用 \"([^"\n]*)\" 作为搜索词,使用 '' 作为替换文本,将所有双引号字符串替换为单引号。

你不能将类似的东西直接绑定到一个键上,因为 Find/Replace 不能在宏中使用,但如果你想,你可以使用 RegReplace 包来做到这一点走那条路。

您可以通过利用多个游标来加速您当前使用的工作流程(如果您尚未这样做的话)。

例如,您可以 select 第一个引号,然后按 Ctrl+DOption+D 到 select另一个。现在您有两个光标,按 Backspace 删除两个引号,然后按新的引号字符插入新的。

这不能被宏化并绑定到一个键,因为 find_under_expand 命令不能在宏中使用,但是。

对于完整的按键解决方案,据我所知,您需要某种插件来为您完成这项工作。一个这样的例子似乎是 ChangeQuotes,虽然我从来没有亲自使用过它。

也可以编写自己的小插件,如下所示:

import sublime
import sublime_plugin


class SwapQuotesCommand(sublime_plugin.TextCommand):
    pairs = ["'", '"']

    def run(self, edit):
        self.view.run_command("expand_selection", {"to": "scope"})
        for sel in self.view.sel():
            self.toggle(edit, sel)

    def toggle(self, edit, region):
        begin = self.view.substr(region.begin())
        end = self.view.substr(region.end() - 1)

        if begin == end and begin in self.pairs:
            index = self.pairs.index(begin) + 1
            new = self.pairs[index % len(self.pairs)]

            for point in (region.begin(), region.end() - 1):
                self.view.replace(edit, sublime.Region(point, point+1), new)

这会将所有游标中的 selection 扩展到当前范围,然后如果 selection 的两端是匹配引号,则交换正在使用的引号。

在使用中,您将使用如下所示的键绑定,其中包含一个上下文,使键仅在光标位于字符串内部时触发,这样它就不会弄乱您的 selection 在肯定行不通的情况下。

{
    "keys": ["ctrl+shift+'"], "command": "swap_quotes",
    "context": [
        { "key": "selector", "operator": "equal", "operand": "string.quoted", "match_all": true }
    ]
},