madedit-mod icon indicating copy to clipboard operation
madedit-mod copied to clipboard

我想到了一个实现“动态更新”的方法

Open zhulaojianke opened this issue 3 years ago • 0 comments

我看 #298 中因为MadEdit不支持“动态更新”而不能添加大纲功能——是不是指“树状列表”功能?outliner?我觉得如果MadEdit-Mod能够实现这个功能的话,那将成为有史以来对中文支持最好的树状列表文本编辑器了!——见好几年前“善用佳软”的那位老先生对十几种树状列表文本编辑器的比较和综述,可以百度查到(treepad、mempad等等)。

还有搜索结果不能跟随文本的更新而更新,我忘了是从哪个issue里看到的了……也是因为不能动态更新造成的。

我这两天因为在编写一个超大文件,经常要用“书签”功能,然后我发现当我在某个书签前添加行的时候,书签会自动下移。这给了我一些启发。

嗯,我也不知道我的这个想法是否可行哈,聊备一说。

在搜索过程中,有一个选项是“标记文本行”,如果不选的话,就不会加书签,选上了就会自动添加很多书签。这也给了我一些启发。

我想能不能这么做——建立3套书签系统:

(1)就是现在用的这种书签,可以手动添加删除,可以通过搜索添加,也可以对书签行进行编辑。

(2)是隐形的书签系统,标记所有的搜索结果所在行,不管用户是否选了“标记文本行”,都会做这个动作。当用户选择了“标记文本行”,等于是激活了第(1)种标签系统。   搜索结果中所列出的“行”并不是直接读取当前文本中的行号,也就是说不是直接生成“文本快照”,相应的搜索结果中的“行(xxx)”也不是直接读取快照后生成的——而是通过下面的过程生成的,绕了一个弯儿:     ①给所有搜索结果添加隐形书签;     ②将隐形书签所在行的行号映射到搜索结果中,也即当隐形书签所在行发生了变化时,与其关联的搜索结果行号也同时变化,此时如果搜索结果中的“行(xxx)”文本因为“快照”的原因不能随之改变也没关系,至少其链接所到的行是正确的了。     是否可以这么做——将“行(xxx)”从搜索结果文本中分离出来,单独生成一栏,格式可以是列表式的,也可以是和左侧“行号条”一样的,嗯,这样就不必加“行”字了,只列出行号——这个行号是隐形书签所在行的拷贝,其他的行号都被忽略。     用数学编程的方式说就是假设所有行号是一个单调递增的单列矩阵(等差数组),搜索结果中的行号就是submatrix,或者trim。     如此,因为书签所在行号是随着文本编辑可以改变的,那么它在搜索结果中的映射也会自动改变,相当于一种“动态更新”的效果了。     ③搜索结果中的文本部分根据“行号栏”所分配的行号读取相应行的文本,当某行的行号发生改变时,该搜索结果显示的文本行自动更新一次。

(3)也是隐形的书签系统,工作原理跟(2)相同。将这个隐形书签与.syn文件中的DirectiveLeading相关联(或者其他的标记,或者新给出一个专门用于大纲标记的标记选项),这样当出现DirectiveLeading行,便会同时加一个隐形书签,然后在大纲页面对这种隐形书签行进行索引,然后显示出来。   拉树状列表时,只显示根目录即可,不必考虑2级或2级以上级别的目录,目录号由用户自己定义,比如说定义为不同的缩进(tab键),或者不同的章节符号(一、二、三……1、2、3……等等),当定义为不同的缩进时,显示出来的效果就是树状列表了。   “大纲窗口”相当于是现在的“搜索结果窗口”的一个复制品,同样允许用户给切换显示这个窗口设置快捷键。并设置一个“更新大纲”的命令,就是说如果MadEdit不支持动态更新的话,可以让用户在需要使用或更新大纲的时候,按某个快捷键,生成一个大纲,显示在“大纲窗口”里。   按下这个“更新大纲”的快捷键之后,MadEdit同时完成2个动作:     ①清空搜索结果;     ②搜索带有DirectiveLeading标识符的行,并将搜索结果列出来,生成大纲。   举个例子:   比如说我把给DirectiveLeading指定给了“%%”;   我在书写到一定段落之后,新建章节,用%%,然后写上章节编号、章节名,或者用tab键缩进之后,写章节名;   比如说我定义“更新大纲”的命令为“Ctri+Shift+L”,我按这个快捷键,弹出“大纲窗口”,清空之前的对“%%”的搜索结果,并列出新的搜索结果。   然后我就可以从这些搜索结果中点击,跳转到我所需要看的章节位置了。

————————————————————下面说的是更容易实现的一种方法————————————————————— ————————————————————————半自动的“动态更新”————————————————————————

上面所说的方法要对MadEdit-Mod改动很大,又要新建一个“大纲窗口”,又要添加两个新的“书签系统”,确实很麻烦,而且也不一定可行。 下面这个方法只要能够实现1个功能——“从搜索结果的文本中提取出文字,并将其再次应用到一次新的搜索中”,所有问题就都可以解决。

(1)给“查找结果”页面中“查找“xxx”(在一个文件中匹配xx次)”这一行增加1个新的右键命令“更新查找结果”,同时增加几个字段,比如说“全字匹配”、“匹配大小写”、“使用正则表达式”等等,这些字段不必现实出来,应该可以放在.cfg文件中吧?(或其他的1个临时文件里)用来记录用户此次搜索所用的方法(用户删除搜索结果的同时,这几个字段也随着删除掉)。比如说我选择了“全字匹配”,在.cfg文件中就生成了类似于“全字匹配=1”这样的标识,没勾选的都是“0”,嗯,用户在搜索框中输入的文本也可以放在这个文件中,那样之后的操作就更简单了。 (2)当我需要查看修改后的文档中之前搜索过所得到的结果的更新状态时,我在“查找“xxx”(在一个文件中匹配xx次)”这一行右键点击“更新查找结果”,这个命令使MadEdit完成3个动作:     ①清空“查找“xxx”(在一个文件中匹配xx次)”这一行所属的搜索结果。     ②从“查找“xxx”(在一个文件中匹配xx次)”这段文本中提取出“xxx”,或者从.cfg文件或上文提到的新增的临时文件中提取出搜索文本,读取文件中所列的搜索条件,传递到搜索命令中,并完成一次搜索。此时搜索框在后台运行,不显示出来。     ③将搜索结果打印在“xxx”(在一个文件中匹配xx次)”这一行下方。   如此,只要动作完成的足够快,给用户的感觉就是更新了搜索结果。

大纲效果也是一样的,也不必新建“大纲窗口”了,用户如果有心的话,可以自己设置大纲标识,比如我平时就是直接用DirectiveLeading制作大纲的。需要拉树状列表的时候,直接搜索“%%”。如果再加上“更新搜索结果”的功能,那就更顺畅了,我就不必一个关键词反复的搜了,而且很容易在“查找结果窗口”里拉出很长的列单(很多时候忘记删除之前的搜索结果)。 嗯,如此,因为现在的MadEdit的查找窗口可以记录好几个搜索的结果,我可以先搜一个“大纲”挂着,折叠列表,之后我随时都可以打开这个列表看大纲,不用的时候就折叠起来,需要看最新大纲的时候“更新搜索结果”就可以了。

另外,如果能够让用户给“信息窗口”的右键命令也设置快捷键的话,那就更方便了,终归使用鼠标还是没有随手按个键盘来得痛快。我保持一个搜索栏为“选中”状态(不一定要去点击鼠标让它激活),我随时按一个快捷键,就可以看到更新的搜索结果——想想就觉得很方便。

希望能够对改进MadEdit有帮助 :)

zhulaojianke avatar Apr 25 '21 19:04 zhulaojianke