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

Difference between "view.window().run_command" and "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), a Window level (WindowCommand), or a View level (TextCommand) 运行。

通常只有 TextCommands 修改缓冲区,或只影响当前缓冲区的设置,WindowCommands 当前 window 布局或其他相关设置,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]})

But executing a TextCommand on a Window object implicitly targets that window's currently active view.从ST控制台执行时,会影响ST控制台的输入文本区

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

所以,答案是可能会有所不同,具体取决于命令的类型,以及您要对其执行命令的 View 是否是活动命令。


就删除的 import 而言,没有任何效果,因为插件中未使用这些导入。