首页 > 解决方案 > 如何让我的插件将一行复制到剪贴板?

问题描述

这个 Sublime Text 插件随机选择文本文件中的一个位置并将光标放在那里,就好像用户使用鼠标单击了该位置一样。

我还希望它将该随机位置的行复制到剪贴板中。是否可以在同一个程序中做到这一点?

import sublime, sublime_plugin
import random

class JumpToRandomPositionCommand(sublime_plugin.TextCommand):
    """
    When invoked, randomly select a character in the current
    file and jump the cursor to that position. Does nothing
    if the current file is empty or if the current view does
    not represent a file.
    """
    def run(self, edit):
        view = self.view

        if view.size() > 0 and view.settings().get("is_widget", False) == False:
            view.sel().clear()

            pos = random.randrange(0, view.size())
            view.sel().add(sublime.Region(pos, pos))

            view.show(pos)

标签: sublimetext3

解决方案


有几种方法可以在这里做你想做的事情。因此,这里有一些代码片段,您可以添加到您在问题中提供的插件中。在每种情况下,这些代码位将作为最后一行进入您最终if语句中的插件(即在调用view.show().第一个片段)它必须在光标移动到新位置后发生。

第一,最简单的。Sublime 在默认首选项中包含以下设置:

    // If true, the copy and cut commands will operate on the current line
    // when the selection is empty, rather than doing nothing.
    "copy_with_empty_selection": true,

当它打开时(默认情况下如此处所示),如果您在没有选择的情况下尝试触发copyor命令,则每个命令都会假定您打算在整行上工作。cut

如果您以这种方式工作,那么添加到插件中的以下行就足以完成这项工作:

view.run_command('copy')

也就是说,要求视图运行copy命令,如果您手动按下键绑定会发生这种情况。该插件将单个光标设置到带有空选择的随机位置的行中,因此这将对该空选择进行操作并复制该行。

另一方面,如果您不使用此设置,或者您希望命令无论设置为什么都可以工作,那么您需要做更多的工作。看起来像这样:

line = view.full_line(pos)
text = view.substr(line)
sublime.set_clipboard(text)

在这里,我们要求 Sublime 告诉我们文本的跨度代表随机位置所在的行。然后我们从缓冲区中提取该文本并将其添加到剪贴板。


推荐阅读