删除直到 Sublime Text 中的空格

问题描述

有没有办法删除所有字符,直到 Sublime 中的第一个空格。我知道您可以使用 ctrl+delete 来执行此操作,但它会在非单词字符("、:、&、* 等)处停止。当您尝试从末尾删除 aaa aaa 2+a 时,它会将删除 2+a 直到 + 符号,但它会删除 aaa 直到空格。我需要更改它,以便它会删除 2+a 直到第一个空格。解决方案可以是任何东西;更改设置、插件

解决方法

我找到了解决方案。这是通过这个插件:

https://packagecontrol.io/packages/KeyboardNavigation

它的关键是:

{ "keys": ["ctrl+backspace"],"command": "delete_to_beg_of_contig_boundary","args": {"forward": false} }

它从右到左删除任何字符,直到第一个空格。

,

我编写了一个 Sublime Text 插件,可以根据需要删除文本。它几乎与 ST 的 delete_word 命令相同,但仅在空格/非空格处中断。

当插件被调用时,该插件会删除从光标到下一组或上一组字符的文本,该分组被定义为空白字符或非空白字符。因此,如果连续运行多次,它将在删除光标前后的空白和非空白字符组之间交替。 run() 方法的 forwards 参数(即命令的 arg)控制删除方向。

将插件保存在配置 Packages 文件夹层次结构中的某个位置。例如

.../sublime-text-3/Packages/User/DeleteToWhitespace.py

将键绑定添加到您的用户 .sublime-keymap 文件。例如

// 
// These key bindings override the ST 'delete_word' keys but use whatever keys you want.
// You could use `super+delete` and `super+backspace` and keep ST's delete keys intact.
// 
{ "keys": ["ctrl+delete"],"command": "delete_to_whitespace","args": {"forwards": true} },{ "keys": ["ctrl+backspace"],"args": {"forwards": false} },

下面是 DeleteToWhitespace.py 插件。它已上传到 this GitHub Gist - 这直接链接到 the raw source code

#
# Name:        Delete To Whitespace
# Requires:    Plugin for Sublime Text v3
# Command:     delete_to_whitespace
# Args:        forwards: bool (delete backwards if false)
# License:     MIT License
#

import sublime,sublime_plugin,re

class DeleteToWhitespaceCommand(sublime_plugin.TextCommand):
    """
    A Sublime Text plugin that deletes text from the cursor to the next or
    previous group of characters,the grouping being defined as either
    whitespace or non-whitespace characters. Thus if run several times in
    succession it will alternate between deleting groups of whitespace and
    non-whitespace ahead or behind the cursor. The forwards parameter of the
    run() method (i.e. the command's arg) controls the deletion direction.
    """

    def run(self,edit,forwards=True):
        self.edit = edit
        self.forwards = forwards

        if forwards:
            self.delete_forwards()
        else:
            self.delete_backwards()

    def delete_forwards(self):
        whitespace_regex = "^\s+"
        non_whitespace_regex = "^\S+"

        for sel in self.view.sel():

            if sel.size() > 0:
                self.view.erase(self.edit,sel)
                continue

            # ∴ sel.a == sel.b == sel.begin() == sel.end()
            # view.full_line() includes the trailing newline (if any).
            cursor = sel.a
            line = self.view.full_line(cursor)
            cursor_to_eol = sublime.Region(cursor,line.end())
            cursor_to_eol_str = self.view.substr(cursor_to_eol)

            match = re.search(whitespace_regex,cursor_to_eol_str)
            if match:
                self.erase_matching_characters(cursor,match)
                continue

            match = re.search(non_whitespace_regex,match)
                continue

    def delete_backwards(self):
        whitespace_regex = "\s+$"
        non_whitespace_regex = "\S+$"

        for sel in self.view.sel():

            if sel.size() > 0:
                self.view.erase(self.edit,sel)
                continue

            # ∴ sel.a == sel.b == sel.begin() == sel.end()
            # view.line() excludes the trailing newline (if any).
            cursor = sel.a
            line = self.view.line(cursor)
            cursor_to_bol = sublime.Region(cursor,line.begin())
            cursor_to_bol_str = self.view.substr(cursor_to_bol)

            # Delete the newline of the 'previous' line.
            if cursor_to_bol.size() == 0 and cursor > 0:
                erase_region = sublime.Region(cursor,cursor - 1)
                self.view.erase(self.edit,erase_region)
                continue

            match = re.search(whitespace_regex,cursor_to_bol_str)
            if match:
                self.erase_matching_characters(cursor,match)
                continue

    def erase_matching_characters(self,cursor,match):
        match_len = match.end() - match.start()
        if self.forwards:
            erase_region = sublime.Region(cursor,cursor + match_len)
        else:
            erase_region = sublime.Region(cursor,cursor - match_len)
        self.view.erase(self.edit,erase_region)