代码之家  ›  专栏  ›  技术社区  ›  john c. j.

保留反向选择“拆分成行”命令

  •  1
  • john c. j.  · 技术社区  · 6 年前

    如果选择几行文本并按Ctrl-Shilf-L(或Menu>Selection>Split into lines),则会看到每行的末尾都有多个光标。

    这是一个插件,它试图完成类似的任务,但现在光标应该位于行首。

    这个插件可以工作,但我想稍微改进一下——它应该保留选择,就像默认的Ctrl-Shift-L行为一样。

    import sublime_plugin
    
    class SplitIntoLinesReverseCommand(sublime_plugin.TextCommand):
        def run(self, edit):
            self.view.run_command("split_selection_into_lines")
            # Seems to be redundant:
            # self.view.run_command("expand_selection", {"to": "line"})
            self.view.run_command("move", {"by": "characters", "forward": False})
            # Already tried this:
            # self.view.run_command("move", {"by": "characters", "forward": False, "extend": True})
    

    测试文本:

    foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo
    bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar
    baz baz baz baz baz baz baz baz baz baz baz baz baz baz baz baz
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   OdatNurd    6 年前

    听起来你想要这样的东西:

    import sublime_plugin
    
    class SplitIntoLinesReverseCommand(sublime_plugin.TextCommand):
        def run(self, edit):
            self.view.run_command("split_selection_into_lines")
            self.view.run_command("move", {"by": "characters", "forward": True})
            self.view.run_command("move_to", {"to": "bol", "extend": True})
    

    这里的步骤是:

    1. 使用现有命令将选择拆分为行
      • 这将使光标位于行尾的每一行都处于选中状态
    2. 将光标向前移动一个字符
      • 当有选定的文本时,按字符前后移动光标会将插入符号移到选定内容的那一端并删除选定内容;这会将插入符号留在行的末端并删除选定内容。
    3. 将光标移到行的开头,扩展所选内容
      • 这会将光标放在所需的位置,并将所选内容放回原处。

    可以通过直接操作选择来做同样的事情,但在现有的命令上构建通常更容易、更快,就像在这里所做的一样。


    如果启用了字换行,并且所选内容中的任何行正在换行,则上述解决方案将无法按预期工作。这是因为当换行时,用于跳转到行首和行尾的移动命令将跳转到插入符号所在行的逻辑(可视)行尾,而不是跳转到行首和行尾。

    为了在单词包装的情况下工作,你需要考虑到这一点。同样,这也可以通过手动修改所选内容来实现,但更简单的方法是在命令执行期间暂时关闭换行,以便移动按预期工作:

    import sublime_plugin
    
    class SplitIntoLinesReverseCommand(sublime_plugin.TextCommand):
        def run(self, edit):
            # Save the state of word wrap and ensure that it's turned off
            word_wrap = self.view.settings().get("word_wrap", None)
            self.view.settings().set("word_wrap", False)
    
            self.view.run_command("split_selection_into_lines")
            self.view.run_command("move", {"by": "characters", "forward": True})
            self.view.run_command("move_to", {"to": "bol", "extend": True})
    
            # Replace the setting as long as it existed.
            if word_wrap is not None:
                self.view.settings().set("word_wrap", word_wrap)