"view.window().run_command"和"view.run_command"的区别



view.window().run_command(...)view.run_command(...)有什么实际区别?

以下是同一插件的两个版本,有两个小改动:

(它会在保存时将制表符转换为空格。您需要在首选项中"expand_tabs_on_save": true(。

一:

# https://coderwall.com/p/zvyg7a/convert-tabs-to-spaces-on-file-save
import sublime, sublime_plugin, os
class ExpandTabsOnSave(sublime_plugin.EventListener):
def on_pre_save(self, view):
if view.settings().get('expand_tabs_on_save') == 1:
view.window().run_command('expand_tabs')

二:

# https://github.com/bubenkoff/ExpandTabsOnSave-SublimeText
import sublime_plugin # <---------- `sublime` and `os` removed
class ExpandTabsOnSave(sublime_plugin.EventListener):
def on_pre_save(self, view):
if view.settings().get('expand_tabs_on_save') == 1:
view.run_command('expand_tabs') # <--------- `window()` removed

这些变化改变了它的行为?

在Sublime Text中,命令可以定义为在Application级别(ApplicationCommand(,Window级别(WindowCommand(或View级别(TextCommand(进行操作。

通常只有TextCommand修改缓冲区或仅影响当前缓冲区的设置,WindowCommand当前窗口布局或其他相关设置,以及ApplicationCommand全局首选项等。

根据我的经验,对View对象执行WindowCommand没有任何作用。例:

view.run_command('set_layout', {"cells": [[0, 0, 1, 1], [1, 0, 2, 1]], "cols": [0.0, 0.5, 1.0], "rows": [0.0, 1.0]})

但是,对Window对象执行TextCommand会隐式定位该窗口的当前活动视图。从 ST 控制台执行时,它会影响 ST 控制台的输入文本区域。

window.run_command('insert', { 'characters': 'testing123' })

因此,答案是,根据命令的类型以及要执行命令的View是否为活动命令,可能会有所不同。


就删除import而言,没有影响,因为这些导入未在插件中使用。

最新更新