obgnail / typora_plugin

Typora plugin. Feature enhancement tool | Typora 插件,功能增强工具
MIT License
1.85k stars 85 forks source link

update fail #397

Closed RiftRays closed 10 months ago

RiftRays commented 10 months ago

升级中,请稍等

[1/9] new updater [2/9] check whether need update [3/9] download latest version [4/9] unzip file [5/9] adjust files

panic: open D:\Program Files\Typora\resources\plugin\custom\plugins: The system cannot find the path specified. D:/golang/src/github.com/obgnail/typora_plugin/plugin/updater/updater.go:345: D:/golang/src/github.com/obgnail/typora_plugin/plugin/updater/updater.go:580: D:/golang/src/github.com/obgnail/typora_plugin/plugin/updater/updater.go:617:

goroutine 1 [running]: main.main() D:/golang/src/github.com/obgnail/typora_plugin/plugin/updater/updater.go:617 +0x26d

image image

  1. 网络正常,但是升级失败,这个路径中是存在这个文件夹或者这个文件的。
  2. 建议:升级失败也别把配置相关的文件删除,升级失败后全部配置都被移除了
obgnail commented 10 months ago

@WilsonVincent

现在是升级操作把你的配置删了吗?那我不是成罪人了 😰

obgnail commented 10 months ago

@WilsonVincent

正常的流程是: [1/9] new updater [2/9] check whether need update [3/9] download latest version [4/9] unzip file [5/9] adjust files [6/9] adjust updater.exe [7/9] remove old dir [8/9] sync dir [9/9] delete useless file

删除配置文件是在最后一步,前面应该都是安全的,你能看看 Typora\resources\app\plugin\global\settings 目录吗?就算升级失败,配置文件应该还是安全的。

obgnail commented 10 months ago

配置是通过复制的形式在新旧版本之间传递的,理论上配置文件应该在所有情况下都是安全的。您能帮忙看下 Typora\resources\app\plugin\global\settings 目录吗,看看 各个 user.toml 文件是否有问题

RiftRays commented 10 months ago

@WilsonVincent

现在是升级操作把你的配置删了吗?那我不是成罪人了 😰

是的,所以很尴尬。

建议将配置文件放置在:C:\Users\用户名.config下。 当然也可以用户配置相对于的目录。

RiftRays commented 10 months ago

@WilsonVincent

正常的流程是: [1/9] new updater [2/9] check whether need update [3/9] download latest version [4/9] unzip file [5/9] adjust files [6/9] adjust updater.exe [7/9] remove old dir [8/9] sync dir [9/9] delete useless file

删除配置文件是在最后一步,前面应该都是安全的,你能看看 Typora\resources\app\plugin\global\settings 目录吗?就算升级失败,配置文件应该还是安全的。

这个目录下是空的!

是否是因为安装目录存在空格导致?

panic: open D:\Program Files
RiftRays commented 10 months ago

@obgnail

同时,我发现存在另外一个问题。(不想另外开issues了,我确定我写的没问题)

    { disable = false, coordinate = [0, 1], hint = "Java", size = "17px", icon = "fa fa-code",  evil = "() => this.utils.insertText(null, '```java\n```', false);" },

修改了这个配置后将会导致quickButton功能报错,报错位置:

ncaught (in promise) SyntaxError: Invalid or unexpected token
    at D:\Program Files\Typora\resources\plugin\custom\plugins\quickButton.js:44:27
    at Array.forEach (<anonymous>)
    at quickButtonPlugin.registerConfigButtons (D:\Program Files\Typora\resources\plugin\custom\plugins\quickButton.js:38:29)
    at eventHub.<anonymous> (D:\Program Files\Typora\resources\plugin\custom\plugins\quickButton.js:9:18)
    at eventHub.publishEvent (D:\Program Files\Typora\resources\plugin\global\core\plugin.js:1287:26)
    at utils.publishEvent (D:\Program Files\Typora\resources\plugin\global\core\plugin.js:53:67)
    at process.run (D:\Program Files\Typora\resources\plugin\global\core\plugin.js:2118:20)
    registerConfigButtons = () => {
        this.config.buttons.forEach(btn => {
            const {coordinate, hint, icon, size, disable, callback = "", evil} = btn || {};
            if (disable) return;

            let cb;
            if (evil) {
                cb = eval(evil);
            } else {
                const [fixedName, func] = callback.split(".");
                if (fixedName && func) {
                    const plugin = this.utils.getPlugin(fixedName) || this.utils.getCustomPlugin(fixedName);
                    cb = plugin && plugin[func];
                }
            }
            if (cb instanceof Function) {
                const style = size ? {fontSize: size} : undefined;
                const action = this.utils.randomString();
                this.register(action, coordinate, hint, icon, style, cb);
            }
        })
    }

cb = eval(evil);

evil = "() => window.confirm('this is message')" },

evil = "() => this.utils.Package.ChildProcess.exec('cmd /C calc')" },

evil = "() => this.utils.openUrl('https://github.com/obgnail/typora_plugin')" },

这三个是正常的,在光标处插入javascript代码块异常。

RiftRays commented 10 months ago

@obgnail

今天是我首次使用这个插件,所以配置文件被删除问题不大。(升级之前我有手动备份)

提一个美化相关的建议: 首次打开typora的时候,无tab时这不显示tab导航,如果有tab时在显示tab导航。

image 多出来这么一条线,看着非常不美观。

对于tab功能是否可以添加一个配置:

关闭最后一个tab后是关闭软件还是空白展示(取消按钮)。强制性的选择是否退出软件有点不知所措。

# 当关闭最后一个标签时,弹出弹窗确认是否退出Typora
RECONFIRM_WHEN_CLOSE_LAST_TAB = true
obgnail commented 10 months ago

@WilsonVincent

一个一个来,首先是 quickButton,这个很好解决,将 evil 参数改成如下

evil = '() => this.utils.insertText(null, "```javascript\n```", false);'

原因是引号混淆了,调换一下单引号和双引号的位置就行

RiftRays commented 10 months ago

evil = '() => this.utils.insertText(null, "javascript\n", false);'

@obgnail 收到,解决。没认真看,再熟悉插件的每个配置项。(尴尬)

https://github.com/obgnail/typora_plugin/blob/1c76cb5e0d30ec0b1035d0a7170e87ed83f56e6f/plugin/global/settings/custom_plugin.default.toml#L874C5-L874C170

obgnail commented 10 months ago

是否是因为安装目录存在空格导致?

panic: open D:\Program Files

其实是权限问题,windows 对于 Program Files 这个目录有特殊保护

我猜这也是 Typora\resources\app\plugin\global\settings 目录为空的原因:系统不让我复制文件进去

过去的 issue

你可以参考一下过去的 issue

参考网址

https://www.ionos.com/digitalguide/server/configuration/the-system-cannot-find-the-specified-path/

GPT

Q: ioutil.ReadDir 函数访问的路径是 D:\Program Files\Typora\resources\plugin\custom\plugins,会不会因为是 Program Files 导致的
A: 是的,这可能是由于路径中包含空格或者系统保护的原因导致的权限问题。在 Windows 系统中,Program Files 目录通常受到系统保护,因此可能会导致程序无法访问该目录。
Q: 可是 D: 盘不是系统路径,也会出现这个问题吗?
A: 即使 D: 盘不是系统盘,但在 Windows 系统中,Program Files 目录通常也受到一定程度的系统保护。因此,路径中包含 Program Files 也可能导致权限问题。这种情况通常会影响程序对该目录的访问权限。

解决方案

  1. 方案一:手动管理员运行 Typora\resources\app\plugin\updater\updater.exe
  2. 方案二:换个位置安装 Typora
  3. 方案三:updater.exe 写注册表(我暂时不会这么做,我希望此插件保持绿色)
  4. 方案四:去掉 updater.exe,改成 node 版本(最可行)
RiftRays commented 10 months ago

是否是因为安装目录存在空格导致?

panic: open D:\Program Files

其实是权限问题,windows 对于 Program Files 这个目录有特殊保护

我猜这也是 Typora\resources\app\plugin\global\settings 目录为空的原因:系统不让我复制文件进去

过去的 issue

你可以参考一下过去的 issue

参考网址

https://www.ionos.com/digitalguide/server/configuration/the-system-cannot-find-the-specified-path/

GPT

Q: ioutil.ReadDir 函数访问的路径是 D:\Program Files\Typora\resources\plugin\custom\plugins,会不会因为是 Program Files 导致的
A: 是的,这可能是由于路径中包含空格或者系统保护的原因导致的权限问题。在 Windows 系统中,Program Files 目录通常受到系统保护,因此可能会导致程序无法访问该目录。
Q: 可是 D: 盘不是系统路径,也会出现这个问题吗?
A: 即使 D: 盘不是系统盘,但在 Windows 系统中,Program Files 目录通常也受到一定程度的系统保护。因此,路径中包含 Program Files 也可能导致权限问题。这种情况通常会影响程序对该目录的访问权限。

解决方案

  1. 方案一:手动管理员运行 Typora\resources\app\plugin\updater\updater.exe
  2. 方案二:换个位置安装 Typora
  3. 方案三:updater.exe 写注册表(我暂时不会这么做,我希望此插件保持绿色)
  4. 方案四:去掉 updater.exe,改成 node 版本(最可行)

@obgnail 方案4?具体操作?

方案一我试了似乎还是不行。我的系统操作身份已经的管理员,并且我的Program Files目录应该是无保护的,我尝试了非管理员和管理员身份下进行复制文件到你这个目录下,都是可行的。 方案二非必要暂时不考虑。 方案三我也赞成!免得到时候清理也麻烦。

obgnail commented 10 months ago

evil = '() => this.utils.insertText(null, "javascript\n", false);'

@obgnail 收到,解决。没认真看,再熟悉插件的每个配置项。(尴尬)

https://github.com/obgnail/typora_plugin/blob/1c76cb5e0d30ec0b1035d0a7170e87ed83f56e6f/plugin/global/settings/custom_plugin.default.toml#L874C5-L874C170

高兴,项目迭代了这么久,整了四百个配置项,终于有人看了 😂

RiftRays commented 10 months ago

evil = '() => this.utils.insertText(null, "javascript\n", false);'

@obgnail 收到,解决。没认真看,再熟悉插件的每个配置项。(尴尬) https://github.com/obgnail/typora_plugin/blob/1c76cb5e0d30ec0b1035d0a7170e87ed83f56e6f/plugin/global/settings/custom_plugin.default.toml#L874C5-L874C170

高兴,项目迭代了这么久,整了四百个配置项,终于有人看了 😂

配置写的那么详细,不看浪费了。👍

obgnail commented 10 months ago

@obgnail

今天是我首次使用这个插件,所以配置文件被删除问题不大。(升级之前我有手动备份)

提一个美化相关的建议: 首次打开 typora 的时候,无 tab 时这不显示 tab 导航,如果有 tab 时在显示 tab 导航。

image 多出来这么一条线,看着非常不美观。

对于 tab 功能是否可以添加一个配置:

关闭最后一个 tab 后是关闭软件还是空白展示(取消按钮)。强制性的选择是否退出软件有点不知所措。

# 当关闭最后一个标签时,弹出弹窗确认是否退出Typora
RECONFIRM_WHEN_CLOSE_LAST_TAB = true

【关闭最后一个标签后,展示空白】这个功能其实不好做,原因:

  1. Typora 的状态机没有内设此状态流转,强行实现会引出大量 BUG。Typora 内部会维护一个 current filename,并且内部实现大量用到了此变量
  2. 整个插件系统也是偷懒地依赖这个特性
  3. 总结来说,成本太高,收益不大
RiftRays commented 10 months ago
  • 强行实现会引出大量 BUG。Typora 内部会维护一个 current filename,并且内部实现大量用到了此变量
  • 整个插件系统也是~偷懒地~依赖这个特性
  • 总结来说,成本太高,收益不大

好的。

升级问题还是否还有解决方案? 配置文件的放置问题。建议不要和主文件放一起,进行隔离,防止出现我现在这种升级失败后导致的配置文件丢失问题。 image 刚刚又尝试了一次升级,配置文件依旧丢失。

obgnail commented 10 months ago

你先把自动更新关了吧,否则会把你的配置全部撤销掉

  1. 打开文件./plugin/global/settings/custom_plugin.user.toml
  2. 添加如下内容,并保存:
    [pluginUpdater]
    [pluginUpdater.config]
    auto_update = false
RiftRays commented 10 months ago

你先把自动更新关了吧,否则会把你的配置全部撤销掉

  1. 打开文件./plugin/global/settings/custom_plugin.user.toml
  2. 添加如下内容,并保存:
 [pluginUpdater]
 [pluginUpdater.config]
 auto_update = false

好的,已经关闭了。

obgnail commented 10 months ago

目前来说,刨去网络问题,我总共收到 3 个更新失败的反馈,你这边是第 3 个。

  1. 三者的路径都包含 Program Files 目录,两个在 D 盘,一个在 C 盘。
  2. 在 C 盘的用户,更换安装路径后解决。另一个 D 盘的用户,通过在 terminal 管理员手动执行 updater.exe --action=update --proxy=http://127.0.0.1:7890 绕过,且这两个用户都没有遇到配置被删除的情况 麻烦您在 terminal 也试试?看是否真的是权限问题。
obgnail commented 10 months ago

正常输出应该是:

Snipaste_2024-01-12_23-15-53

RiftRays commented 10 months ago
D:\Program Files\Typora\resources\plugin\updater>updater.exe --action=update
[1/9] new updater
[2/9] check whether need update
[3/9] download latest version
[4/9] unzip file
[5/9] adjust files
[6/9] adjust updater.exe
[7/9] remove old dir
[8/9] sync dir
[9/9] delete useless file

Upgrade SUCCESS!
Current Plugin Version: 1.7.27
Please restart Typora

@obgnail

手动执行是成功的。配置文件也没有被删除。

D:\Program Files\Typora\resources\plugin\updater\updater.exe D:\Program Files\Typora\resources\plugin\updater\updater.go D:\Program Files\Typora\resources\plugin\updater\updater1.7.27.exe D:\Program Files\Typora\resources\plugin\updater\version.json D:\Program Files\Typora\resources\plugin\updater\报毒了怎么办.md

多了两个文件。

RiftRays commented 10 months ago

@obgnail

然后我把version删除后,再次进入软件点击升级也是成功的。 image

obgnail commented 10 months ago

windows 神奇的权限系统。

看起来就像 GPT 说的:

即使 D: 盘不是系统盘,但在 、Windows 系统中,Program Files 目录通常也受到一定程度的系统保护。因此,路径中包含 Program Files 也可能导致权限问题。这种情况通常会影响程序对该目录的访问权限。

version.json 只是用于记录当前版本信息,用于判断是否需要更新。你再次执行语句,就会出现:

$ updater.exe --action=update --proxy=http://127.0.0.1:7890
[1/9] new updater
[2/9] check whether need update

It is already the latest version. Do not need update.
Current Plugin Version: 1.7.27

那么,这种情况,我该怎么办呢?

RiftRays commented 10 months ago

@obgnail

[bug] callouts这个的插入的光标获取是否存在问题?

[callouts.config]
# 自动插入的模板
template = "> [!tip]\n> tip、bug、info、note、quote、example、caution、failure、warning、success、question、abstract、important\n"
callback = "callouts.callback" }

连续点击后变成这样。 image 并且似乎换行并没有生效 image

并且我手动换行并输入了下一行内容后再次点击还是会回到一个很奇怪的位置上去插入内容。 image

我现在有2行内容,我必须在空白区域按2次回车他的光标才会正常。如果我有4行内容我必须在空白区域按4次回车才会正常。

RiftRays commented 10 months ago

windows 神奇的权限系统。

看起来就像 GPT 说的:

即使 D: 盘不是系统盘,但在 、Windows 系统中,Program Files 目录通常也受到一定程度的系统保护。因此,路径中包含 Program Files 也可能导致权限问题。这种情况通常会影响程序对该目录的访问权限。

version.json 只是用于记录当前版本信息,用于判断是否需要更新。你再次执行语句,就会出现:

$ updater.exe --action=update --proxy=http://127.0.0.1:7890
[1/9] new updater
[2/9] check whether need update

It is already the latest version. Do not need update.
Current Plugin Version: 1.7.27

那么,这种情况,我该怎么办呢?

那就没办法~知道这么一回事就好了,配置文件在后续的版本中加入设置项修改一下存放位置?

RiftRays commented 10 months ago

@obgnail callouts的问题:

  1. 插入新的callouts“光标”问题
  2. 格式化时候的问题 #396
obgnail commented 10 months ago

【并且我手动换行并输入了下一行内容后再次点击还是会回到一个很奇怪的位置上去插入内容】这个问题是我抽了,我没有考虑到会有人疯狂连续点击插入,所以设置成了每次插入时都会恢复到最近一个光标(restoreLastCursor)

解决方案也很简单,修改 callouts 的 callback 函数,第一个参数置为 null

// 修改前
callback = anchorNode => this.utils.insertText(anchorNode, this.config.template)

// 修改后
callback = anchorNode => this.utils.insertText(null, this.config.template)
RiftRays commented 10 months ago

@obgnail

image 这个问题是不是在其他的插入也存在?

修改后依旧还是会有这个问题。 image image

obgnail commented 10 months ago

代码好神奇呀,有问题你先提,我记录一下

RiftRays commented 10 months ago

代码好神奇呀,有问题你先提,我记录一下

  1. 第一种场景是连续点击,第二种场景并不是。我换行输入了123后在换行点击也出现这个问题。光标又回到了第二行(第一个的里面)

  2. 我的模板里加入了换行符也没有生效,并没有换行。

  3. 由此我想提出一个需求

我选中某一块文字或者代码,点击右下方的按钮执行某个功能或者回调可以执行将选中的内容进行包裹操作。

a. 选中需要包裹内容 a1. 点击代码块格式包裹,光标停留到输入语言的框中 a2. 点击callouts包裹,光标停留到标题的框中

obgnail commented 10 months ago

@WilsonVincent

错了错了,说错了,艹。恢复到最近一个光标(restoreLastCursor)是第三参数,我让你改第一个参数干嘛呀,我艹。

    static insertText = (anchorNode, content, restoreLastCursor = true) => {
        if (restoreLastCursor) {
            File.editor.contextMenu.hide();
            // File.editor.writingArea.focus();
            File.editor.restoreLastCursor();
        }
        File.editor.insertText(content);
    }

不过这样的话,也不能简单的将第三参数改为true,因为 callback 函数本来是为右键菜单准备的,鼠标点击了右键后,自然会失焦,此时就需要恢复光标,但是 quickButton 的情况下,此时并没有失去焦点,使用 callback 函数的话,就会回到上一个光标了, BUG 就这样产生了。 正确的做法应该是新建一个函数,将第三参数置为 false。

RiftRays commented 10 months ago

@WilsonVincent

错了错了,说错了,艹。恢复到最近一个光标(restoreLastCursor)是第三参数,我让你改第一个参数干嘛呀,我艹。

    static insertText = (anchorNode, content, restoreLastCursor = true) => {
        if (restoreLastCursor) {
            File.editor.contextMenu.hide();
            // File.editor.writingArea.focus();
            File.editor.restoreLastCursor();
        }
        File.editor.insertText(content);
    }

不过这样的话,也不能简单的将第三参数改为true,因为 callback 函数本来是为右键菜单准备的,鼠标点击了右键后,自然会失焦,此时就需要恢复光标,但是 quickButton 的情况下,此时并没有失去焦点,使用 callback 函数的话,就会回到上一个光标了, BUG 就这样产生了。 正确的做法应该是新建一个函数,将第三参数置为 false。

好嘞,我明天试试,今日需要sleep(8h)😂。明天辛苦看看那个需求能不能帮忙实现一下呗,想写笔记的时候偷懒用。

RiftRays commented 10 months ago

@obgnail

  1. 最新的版本中我看见了已经加入新的函数
  2. callback 加入了一个false参数后,确实可以愉快的通过点击实现了插入。(下一个版本会直接更新进去?不需要每个版本都自己修改吧)
    callback = anchorNode => this.utils.insertText(anchorNode, this.config.template,false)
  3. 还是存在一个问题:如果模板结尾存在\n换行则无效,在最后并不会插入\n
[callouts.config]
# 自动插入的模板
template = "> [!tip]\n> tip、bug、info、note、quote、example、caution、failure、warning、success、question、abstract、important \n\n"

image

RiftRays commented 10 months ago

@obgnail

混排优化好在在最新版并没有修复?

obgnail commented 10 months ago

@WilsonVincent

  1. 之前这个问题之所以没有暴露,是因为是其处理方案是基于 BUG 的,前阵子修复了此 BUG,导致方案失效。现在需要直面这个问题。
  2. markdown 的原生语法并不支持 callout,所以需要另写 callout 的语法解析器,将其加入抽象语法树,后续还需测试,况且我并不擅长编译原理,需要时间。
RiftRays commented 10 months ago

@obgnail

  1. 好的,callout问题使用最新版+修改
callback = anchorNode => this.utils.insertText(anchorNode, this.config.template, false)

我个人看来是已经解决了的。

  1. 我的那个个人需求已经通过其他手段实现了。研究了2小时如何写插件没太看明白。后续在学习看看。总体来讲是值得start的项目。今天测试下来,是加快了写笔记和文章的进度了。

  2. 混排优化导致callout的问题,有没有其他方法能暂时性的修复,我把> [!tip]加入不整理也似乎无效。

obgnail commented 10 months ago

@WilsonVincent

callout 的语法解析器其实已经实现了,代码在 dev分支,没仔细测试,就没上,要不你第一个试试?

obgnail commented 10 months ago

@WilsonVincent

其实并不怪你看不懂,因为我就不是前端人员,平时也不写 JS,全部都是瞎写的,刚开始写这个项目的时候我连 js 的 for 循环语法都要 google(因为太久没写,语法都忘了)

callout

RiftRays commented 10 months ago

@WilsonVincent

其实并不怪你看不懂,因为我就不是前端人员,平时也不写 JS,全部都是瞎写的,刚开始写这个项目的时候我连 js 的 for 循环语法都要 google(因为太久没写,语法都忘了)

callout

😂我也不是前端的。。。略懂皮毛而已。

RiftRays commented 10 months ago

@WilsonVincent

callout 的语法解析器其实已经实现了,代码在 dev分支,没仔细测试,就没上,要不你第一个试试?

@obgnail 刚刚试了了。可以!

但是这个好像加进去吧?默认的情况下光标还是会回到最开始的地方。

callback = anchorNode => this.utils.insertText(anchorNode, this.config.template, false)
obgnail commented 10 months ago

@WilsonVincent

然而我已经简单测了测,发版了。明天吧,我看有没有更好的解决方案。

RiftRays commented 10 months ago

@WilsonVincent

然而我已经简单测了测,发版了。明天吧,我看有没有更好的解决方案。

好的,这个问题应该在其他右键菜单插入可能存在相同的问题(同时插入几个的时候)。

obgnail commented 10 months ago

【如果模板结尾存在 \n 换行则无效,在最后并不会插入 \n】这个问题。

我看了一下源码,不太好修复。因为 Typora 的 insertText() 函数会 trim 掉前后的 \n。

也就是说,在不修改 Typora 源码的前提下,使用 insertText 函数是无法通过字符串末尾的 \n 跳转到直接下一个 block 的。

这也说明了为什么 > [!NOTE]\n> this is note 能换行,因为 \n 在中间。

Snipaste_2024-01-14_00-31-28

obgnail commented 10 months ago

@WilsonVincent

对于这种情况,我建议使用 evil

[quickButton]
[quickButton.config]
buttons = [
    { disable = false, coordinate = [4, 0], hint = "危险操作", size = "17px", icon = "fa fa-bomb", evil = """
        () => {
            const template = this.utils.getCustomPlugin('callouts').config.template;
            this.utils.insertText(null, template, false);
            const dict = {shiftKey: false, ctrlKey: false, altKey: false, key: 'Enter', keyCode: 13, code: 'Enter', which: 13};
            const enter = () => document.activeElement.dispatchEvent(new KeyboardEvent('keydown', dict));
            enter();
            enter();
        }
        """ },
]

callout_btn

obgnail commented 10 months ago

使用 evil 的话,insertText 的光标跳转问题和自动换行问题,都迎刃而解了

RiftRays commented 10 months ago

使用 evil 的话,insertText 的光标跳转问题和自动换行问题,都迎刃而解了

6,确实。这样看上去这方面的所有的问题好像解决了。

剩下一个问题/建议:

用户自定义的配置文件是否考虑一下存储到其他位置上?避免配置文件丢失。