Move line to next section with SublimeText

*爱你&永不变心* 提交于 2019-12-24 20:30:04

问题


I'm looking for a way to move a line to the "next section" with SublimeText. It could be in the "next paragraph" if it's text (see below), in the "next node" if it's XML, in the "next code block" if it's code, etc.

Currently I'm using CTRLSHIFTDOWN ARROW many times to move it to the next section, but I think SublimeText might have this feature out-of-the-box.

Example of main use case:

&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

回答1:


I finally managed to write a plugin for this:

# 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})


来源:https://stackoverflow.com/questions/55276904/move-line-to-next-section-with-sublimetext

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!