notepad4 icon indicating copy to clipboard operation
notepad4 copied to clipboard

文件无修改时自动重新载入导致无法撤销

Open Mapaler opened this issue 3 years ago • 12 comments

比如编辑 Total Commander 的设置文件 WinCMD.ini 时。 为了测试编辑效果,我需要关掉 Total Commander 再重新打开。 打开的时候,Total Commander 会对 WinCMD.ini 进行读写操作。 如果我的 Notepad2 是编辑状态,那么会提示文件有修改,是否更新,我可以选择不更新。 但是我之前已经保存了 WinCMD.ini Notepad2 直接就自动重新读取了,我的编辑记录都没有了,无法撤销。

Mapaler avatar Jan 17 '21 18:01 Mapaler

菜单 -> 设置 -> 文件变更通知

zufuliu avatar Jan 18 '21 13:01 zufuliu

能不能实现文件未变更时自动不重新加载,这样我就可以保留撤销记录又不会弹出通知。

Mapaler avatar Jan 19 '21 12:01 Mapaler

在 文件变更通知 对话框里面选择 “显示消息”,默认是重现加载。

zufuliu avatar Jan 19 '21 12:01 zufuliu

我知道这个意思。 我是说把“自动重新加载”改为“自动不重新加载”,也就是等于 “显示消息”,但是文件未修改时弹出的那个确认框自动选否。

Mapaler avatar Jan 19 '21 12:01 Mapaler

现在默认的 "自动重新加载(如未修改)" :打开的文件如果没有在Notepad2中编辑,直接重现加载,否则询问是否重新加载(第二项:显示消息)。

zufuliu avatar Jan 19 '21 13:01 zufuliu

我现在是持续编辑程序的ini文件以测试设置效果,每次编辑后都会保存,保存的时候会保留之前的编辑状态。 而如果我一打开这个程序,它会在没修改内容的情况下写入一次ini,导致notepad2重新加载ini,丢失编辑状态。

Mapaler avatar Jan 20 '21 19:01 Mapaler

INI 需要手动编辑的只有 [Settings2] 和 [Toolbar Images],其他都可以在Notepad2里面设置。Settings2有些可以在程序里面设置。程序的INI文件应该只在启动的时候加载了,取消 菜单 设置 -> 退出时保存设置 不会影响编辑的INI。

搞错了,你是编辑WinCMD.ini。

zufuliu avatar Jan 22 '21 13:01 zufuliu

我觉得你是希望重新加载文件的时候保留之前的编辑历史,你可以把EditSetNewText()函数里面的两行SciCall_EmptyUndoBuffer();注释掉看看, https://github.com/zufuliu/notepad2/blob/master/src/Edit.c#L131

这样做有个问题:UndoBuffer 里面记录的位置可能和重新加载以后的文件不一样,比如加载前你在第一行写了个1,加载后这一行变成了第二行,执行Undo会修改第一行不是第二行。

我觉得真正靠谱的办法:把WinCMD.ini加到git仓库里面,每次测试之前提交,然后测试,。。。

zufuliu avatar Jan 22 '21 14:01 zufuliu

很抱歉,我只知道C的基本语法(计算机二级VC6),这种复杂软件我搞不来

重新加载文件的时候保留之前的编辑历史

我不完全是这个想法,如果文件并没有改动的话,为什么需要重新加载呢?

希望您能理解我的意思:

编辑WinCMD.ini,保存,ini现在是已保存未修改状态,但是还留有过往编辑历史。 当ini被其他软件重新写入时

目前的情况:

  • 数据有改变=>询问是否重新加载,这个没问题。
  • 数据未改变=>自动重新加载,丢失编辑历史。

希望的情况

  • 数据有改变=>询问是否重新加载,这个不需要改。
  • 数据未改变=>
    • 有编辑历史 => 不自动加载,保留历史。
    • 无编辑历史 => 自动重新加载,保持最新。

Mapaler avatar Jan 22 '21 18:01 Mapaler

我觉得简单的改法:把“文件变更通知”改成:

  1. 显示消息
  2. 自动重新加载
  3. 文件内容改变后自动重新加载

这样勾选4的时候,如果文件内容和内存里面一样,就不重新加载,编辑历史还在;而勾选3(当前默认)的时候,文件修改时间变化后也自动加载(不论文件内容是否改变)。

zufuliu avatar Feb 18 '21 15:02 zufuliu

但是这样文件被改变后还是自动重新加载了,能不能实现改变后还是弹出提示,询问是否需要重新加载。如果文件内容和内存里面一样,就不弹出提示。

  • 文件变更处理
      • [X] 仅文件内容改变时处理

    • 询问处理方式(显示消息)
    • 自动重新加载

Mapaler avatar Feb 18 '21 15:02 Mapaler

没有好的思路,你可以调一下 Notepad2.c 里面的代码。IsCurrentFileChangedOutsideApp() 通过文件长度和修改时间判断文件是否被修改,case APPM_CHANGENOTIFY 处理是否重新加载。

zufuliu avatar Mar 08 '21 14:03 zufuliu