【问题标题】:Move line to next section with SublimeText使用 SublimeText 将行移动到下一部分
【发布时间】:2019-08-12 02:23:38
【问题描述】:

我正在寻找一种使用 SublimeText 将一行移动到“下一部分”的方法。如果是文本,则可能在“下一段”中(见下文),如果是 XML,则可能在“下一个节点”中,如果是代码,则可能在“下一个代码块”中,等等。

目前我正在多次使用 CTRLSHIFTDOWN ARROW 将其移至下一部分,但我认为 SublimeText 可能有这个开箱即用的功能。

主要用例示例:

&section1
abcdef
ghijkl    <--- if the cursor is in this line, pressing CTRL+DOWN would move this line...
sqfdsdfqsdfjq

&section2         <--- ...here!  just between "&section2" and "Lorem".
Lorem ipsum dolor sit amet

&somethingelse    <--- one more CTRL+DOWN would move it here
tempor incididunt ut labore et dolore magna aliqua
t enim ad minim veniam
quis nostrud exercitation

【问题讨论】:

    标签: sublimetext2 sublimetext sublime-text-plugin


    【解决方案1】:

    我终于设法为此编写了一个插件:

    # Put this file in "C:\Users\User\AppData\Roaming\Sublime Text 2\Packages\User\"
    # Add this to "C:\Users\User\AppData\Roaming\Sublime Text 2\Packages\User\Default (Windows).sublime-keymap": 
    #     { "keys": ["ctrl+up"], "command": "movesection", "args": {"direction": "up"}},
    #     { "keys": ["ctrl+down"], "command": "movesection", "args": {"direction": "down"}}
    
    import sublime, sublime_plugin
    import subprocess
    
    class MovesectionCommand(sublime_plugin.TextCommand):
        def run(self, edit, direction):
            # select current line, save it and delete it
            currentcursor = self.view.sel()[0].begin()
            thisline = self.view.substr(self.view.full_line(currentcursor))
            self.view.erase(edit, self.view.full_line(currentcursor))
    
            # find the next/previous & and move there
            if direction == 'down':
                beg = self.view.sel()[0].begin()
                end = self.view.size()
            else:
                beg = 0
                end = self.view.sel()[0].begin()
            contents = self.view.substr(sublime.Region(beg, end))  # https://stackoverflow.com/questions/20182008/sublime-text-3-api-get-all-text-from-a-file            
            offset = contents.find('&') if direction == 'down' else contents.rfind('&', 0, contents.rfind('&'))  # down: first occurence, up: second-to-last occurence
            cursors = self.view.sel()
            cursors.clear()
            location = sublime.Region(beg+offset, beg+offset)
            cursors.add(location)
    
            # move to the next line
            (row, col) = self.view.rowcol(self.view.sel()[0].begin())  # go to the next line
            self.view.run_command("goto_line", {"line": row+2})
    
            # insert the text here
            self.view.insert(edit, self.view.sel()[0].begin(), thisline)
    
            # move to the line currently pasted (because of inserting the line usually including \n, it would go to next line, thus the following code is needed)
            (row, col) = self.view.rowcol(self.view.sel()[0].begin())
            self.view.run_command("goto_line", {"line": row})
    

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2010-10-13
      • 2020-03-31
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多