Sublimetext3 在eof打开文件的插件

Sublimetext3 在eof打开文件的插件,sublimetext3,Sublimetext3,我正在尝试创建一个插件,打开一个与我正在编辑的文件关联的.log文件。我可以打开文件,但无法将光标移动到文件的末尾,除非在文件已打开时再次运行代码 import sublime import sublime_plugin class OpenlogCommand(sublime_plugin.TextCommand): def run(self, edit): if os.path.isfile(self.view.file_name()[:-3]+"log"):

我正在尝试创建一个插件,打开一个与我正在编辑的文件关联的.log文件。我可以打开文件,但无法将光标移动到文件的末尾,除非在文件已打开时再次运行代码

import sublime
import sublime_plugin

class OpenlogCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        if os.path.isfile(self.view.file_name()[:-3]+"log"):
            a=sublime.active_window().open_file(self.view.file_name()[:-3]+"log")
        a.run_command("move_to", {"to": "eof"})

有人知道怎么做吗?

除非文件已经打开,否则这不起作用的原因是加载文件是异步的;打开文件的命令会立即返回,如果文件尚未打开,则会在后台加载该文件

import sublime
import sublime_plugin

class OpenlogCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        if os.path.isfile(self.view.file_name()[:-3]+"log"):
            a=sublime.active_window().open_file(self.view.file_name()[:-3]+"log")
        a.run_command("move_to", {"to": "eof"})
因此,第一次运行该命令时,
move_to
命令不会执行任何操作,因为它已经位于空缓冲区的末尾,但是当文件已经加载时,它会执行您期望的操作

为了避免这种情况,您需要检测文件是否仍在加载,并将跳转到文件末尾的调用推迟到文件完成之后。这方面的一个例子如下:

导入升华
导入升华插件
导入操作系统
类OpenLogCommand(升华插件.TextCommand):
def运行(自我,编辑):
log_name=self.view.file_name()[:-3]+“log”
log\u view=self.view.window()。打开日志文件(日志名称)
如果log\u view.is\u loading():
log\u view.settings().set(“\u goto\u eol”,True)
其他:
log_view.run_命令(“move_to”、{“to”:“eof”})
def已启用(自):
fname=self.view.file_name()
如果fname不是None,也不是fname.endswith(“.log”):
返回os.path.isfile(fname[:-3]+“log”)
返回错误
类OpenLogListener(升华插件.EventListener):
def on_加载(自身、视图):
if view.settings().get(“\u goto\u eol”,False):
view.settings().erase(“\u goto\u eol”)
view.run_命令(“move_to”,{“to”:“eof”})
现有版本的问题在于,如果文件尚未保存到磁盘,则
file\u name()
方法返回
None
。因此,如果在未保存的文件上运行该命令,将在控制台中生成错误。这是无害的,但有点不干净,因为如果您有其他问题,并且碰巧在控制台中看到这些错误,那么这可能是一个麻烦

在这里,只有保存文件以停止此类问题时,命令才会自动启用。只有当它还不是一个日志文件(因为这是多余的)并且关联的日志文件实际存在时,它才会启用自身

当命令被禁用时,您无法执行它。这意味着它也不会显示在命令选项板中,并且会在菜单中显示为灰色(假设您已将其添加到其中任何一个菜单中)

运行该命令时,它首先调用
open\u file
打开关联的日志文件,然后询问视图“您还在加载吗?”。当视图显示否时,表示文件已经打开,因此我们可以立即跳到文件的末尾

如果视图对此问题回答“是”,则我们在视图中设置一个临时设置,以便我们知道当此视图的内容加载完毕时,我们希望跳转到缓冲区的末尾

事件侦听器在完成加载时询问每个视图是否设置了此设置,如果设置了此设置,则会删除该设置,然后跳转到文件末尾


[编辑]

如下面的注释所述,
move_to
命令对于已打开的文件与刚完成加载的文件的行为略有不同

我不完全确定为什么会这样,但我怀疑当文件内容已经加载但尚未显示时,加载时的
通知
之间会有一些微妙的相互作用,或者类似的东西,尽管这只是一个猜测

在任何情况下,最方便的修复方法是对事件侦听器进行轻微修改,将上面的代码部分替换为以下内容:

class OpenLogListener(升华插件.EventListener):
def on_加载(自身、视图):
if view.settings().get(“\u goto\u eol”,False):
view.settings().erase(“\u goto\u eol”)
set_timeout(lambda:view.run_命令(“move_to”,{“to”:“eof”}),1)

这会稍微改变一些情况,以便在所有事件处理完成后有效地调用
move_to
命令。至少在我的测试机上,这似乎解决了这个问题

谢谢你的解释!我对移动到eof命令有点问题。如果在任何缓冲区中按Ctrl+end,它会将光标放在最后一行,最后一行保持在页面底部,从而最大限度地增加屏幕上的文本量。对于这段代码,如果.log文件已经打开,它将以这种方式工作。如果它还没有打开,它会将最后一行文本放在屏幕的第一行,根本不显示任何文本,我必须向上滚动才能看到文本。我在谷歌上做了很多搜索,到目前为止都没有成功。你知道怎么解决这个问题吗?嗯,很有趣。我不知道为什么会发生这种情况,尽管这似乎很可疑。我编辑了答案,以提供可能的解决方法。让我知道这对你是否有效。太好了!非常感谢。