复制整行快捷键然后将其粘贴到游标下

时间:2015-09-21 07:25:42

标签: sublimetext2 sublimetext3 sublimetext shortcut

在Sublime Text 3上(但我猜它与ST2相同),我知道当你没有选择时复制(CTRL + C),整行都被复制但我需要知道如何粘贴它在我的光标下面。

它目前粘贴在它上面,对我来说似乎不合逻辑,有没有办法修改这种行为?

2 个答案:

答案 0 :(得分:1)

不是它贴在"以上"或"在"下面",它正在当前行上运行。在没有先进行选择的情况下进行复制时,它会复制当前行。当你粘贴它时,它也会在当前行上运行 - 它将缓冲区粘贴到该行中,作为副作用,该行上的任何内容都会被阻挡到下一行。它不能向上碰撞 - 文件只能增长或向下添加新行,你不能向上增长超过第1行。

至于如何修改行为,我建议尝试制作一个宏。

http://docs.sublimetext.info/en/latest/extensibility/macros.html

正如你在评论中所指出的那样,一个宏可以工作,但它有两种不同的方式来进行粘贴,一个用于正常使用,另一个用于此"整行"行为。这是不幸的,尽管有另一种(更难的)解决方案。您可以尝试编写一个Sublime插件来检测如何表现并在每种情况下执行您想要的操作。这对我来说有点超出了我的能力......但是考虑到这一点,我意识到Vintage包已经有了这个命令,因为它的 p P 分别粘贴光标前后的键。我看着Vintage包里找到了他们做的地方。这是他们的代码,但我无法向你解释它是如何工作的。您可能希望尝试模拟ViPasteRight

class ViPrefixableCommand(sublime_plugin.TextCommand):
    # Ensure register and repeat are picked up from g_input_state, and that
    # it'll be recorded on the undo stack
    def run_(self, edit_token, args):
        if not args:
            args = {}

        if g_input_state.register:
            args['register'] = g_input_state.register
            g_input_state.register = None

        if g_input_state.prefix_repeat_digits:
            args['repeat'] = digits_to_number(g_input_state.prefix_repeat_digits)
            g_input_state.prefix_repeat_digits = []

        if 'event' in args:
            del args['event']

        edit = self.view.begin_edit(edit_token, self.name(), args)
        try:
            return self.run(edit, **args)
        finally:
            self.view.end_edit(edit)

class ViPasteRight(ViPrefixableCommand):
    def advance(self, pt):
        if self.view.substr(pt) == '\n' or pt >= self.view.size():
            return pt
        else:
            return pt + 1

    def run(self, edit, register = '"', repeat = 1):
        visual_mode = self.view.has_non_empty_selection_region()
        if not visual_mode:
            transform_selection(self.view, lambda pt: self.advance(pt))
        self.view.run_command('paste_from_register', {'forward': not visual_mode,
                                                      'repeat': repeat,
                                                      'register': register})

class ViPasteLeft(ViPrefixableCommand):
    def run(self, edit, register = '"', repeat = 1):
        self.view.run_command('paste_from_register', {'forward': False,
                                                      'repeat': repeat,
                                                      'register': register})

以下是他们如何将它们绑定到键上。如果你想尝试适应这个,你可能不需要context,这是他们需要的东西,因为Vintage模式的模态性质。

{ "keys": ["P"], "command": "vi_paste_left",
    "context": [{"key": "setting.command_mode"}]
},

{ "keys": ["p"], "command": "vi_paste_right",
    "context": [{"key": "setting.command_mode"}]
},

以下是有关插件的文档部分,如果您想尝试以这种方式解决它。

http://docs.sublimetext.info/en/latest/extensibility/plugins.html

答案 1 :(得分:1)

按照Dan Lowe的回答,我做了这个文件:
http://pastebin.com/7nPWZCPh
并添加了这一行
{ "keys": ["ctrl+shift+v"], "command": "run_macro_file", "args": {"file": "res://Packages/User/paste_no_line.sublime-macro"}},
到我的用户的键绑定。
按预期工作,但我现在有两个不同的“粘贴命令”。