在新视图(未保存的缓冲区)中打印文本,而不是在控制台中

Print text in new view (unsaved buffer), not in console

1。简要

我没有找到如何在新视图中获取输出,而不是在 Sublime Text 控制台中。


2。预期行为

比如我有倒计时:

import time

seconds = 10

while seconds >= 0:
    time.sleep(1)
    if seconds == 5:
        print("5 seconds")
    elif seconds == 0:
        print("Time over!")
        time.sleep(5)
    else:
        print(seconds)
    seconds -= 1

Ctrl+Shift+P (⌘⇧p for Mac) → SublimeREPL: Python RUN current file → 我明白了预期行为:


3。实际行为

Sublime Text 插件中的相同倒数计时器:

import time

import sublime_plugin

seconds = 10


class LovernaStandardCommand(sublime_plugin.TextCommand):

    def run(self, edit):
        current_id = self.view.id()
        if current_id:
            global seconds
            while seconds >= 0:
                time.sleep(1)
                if seconds == 5:
                    print("5 seconds")
                elif seconds == 0:
                    print("Time over!")
                    time.sleep(5)
                else:
                    print(seconds)
                seconds -= 1

I 运行 命令 loverna_standard → 我在 Sublime Text 控制台中看到输出,而不是在新视图中。


4。没有帮助

  1. Python write() method 适用于文件,不适用于未保存的缓冲区。
  2. 我在 Sublime Text 3 API documentation 中找到如何打开新视图 — sublime.active_window().new_file() — 但我没有找到如何在此视图中打印文本。

您可以使用 append 命令将文本附加到 Sublime Text 视图。 例如,如果您希望视图在添加新文本时自动滚动到底部:

view.run_command('append', { 'characters': str(seconds) + '\n', 'scroll_to_end': True })

不过最好设置成每秒回调一次,而不是休眠,否则ST会在命令运行时无响应。

import sublime
import sublime_plugin

class LovernaStandardCommand(sublime_plugin.TextCommand):

    def run(self, edit, seconds=10):
        self.print_seconds(sublime.active_window().new_file(), seconds)

    def print_seconds(self, view, seconds):
        text = ''
        if seconds > 0:
            text = str(seconds)
            if seconds == 5:
                text += ' seconds'
            sublime.set_timeout_async(lambda: self.print_seconds(view, seconds - 1), 1000) 
        else:
            text = 'Time over!'
        view.run_command('append', { 'characters': text + '\n', 'scroll_to_end': True })