Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

统一块剪切粘贴逻辑为生成新块 #6807

Closed
88250 opened this issue Dec 7, 2022 · 40 comments
Closed

统一块剪切粘贴逻辑为生成新块 #6807

88250 opened this issue Dec 7, 2022 · 40 comments
Assignees
Milestone

Comments

@88250
Copy link
Member

88250 commented Dec 7, 2022

剪切粘贴保留块 ID 有逻辑缺陷,会导致 ID 重复。改进为粘贴时生成新 ID,避免 ID 重复。

@88250 88250 changed the title 标题剪切下方块块后粘贴 ID 变化问题 标题 剪切 标题及下方块 后粘贴 ID 变化问题 Dec 7, 2022
@88250 88250 changed the title 标题 剪切 标题及下方块 后粘贴 ID 变化问题 剪切 标题及下方块 后粘贴 ID 变化问题 Dec 7, 2022
@88250 88250 changed the title 剪切 标题及下方块 后粘贴 ID 变化问题 统一块剪切粘贴逻辑为生成新块 Dec 7, 2022
@88250 88250 added this to the 2.5.4 milestone Dec 7, 2022
@UFDXD
Copy link

UFDXD commented Dec 8, 2022

那我这么保留移动呢?

@UFDXD
Copy link

UFDXD commented Dec 8, 2022

别跟我说拖动,拖动大文档卡爆,而且平板便携设备,怎么拖?

@88250
Copy link
Member Author

88250 commented Dec 8, 2022

@UFDXD

  • 拖动大文档卡顿的问题后面有时间再优化
  • 平板目前不支持拖动,可以用移动功能

@UFDXD
Copy link

UFDXD commented Dec 8, 2022

移动就是直接插在末尾,如果我需要插入到容器怎么办?
暂且不提这个。
这个剪切生成新块,是只生成新块,还是新块后特别处理一下保留原有块与其他块的引用链接联系?

@88250
Copy link
Member Author

88250 commented Dec 8, 2022

生成新 ID,不处理已有引用。

@UFDXD
Copy link

UFDXD commented Dec 8, 2022

那我要剪切何用?我剪切一个块,这个块绑定了很多的引用连接,我一剪切,所有的联系都没了。剪切本来就是高频操作,现在高频操作前都要“三思一下“是否存在风险了。

@88250
Copy link
Member Author

88250 commented Dec 8, 2022

基本是这样的,我粗略看了其他几个双链笔记产品都是如此,想了下似乎也没有更好的处理方案,如果你有建议欢迎讨论。

@UFDXD
Copy link

UFDXD commented Dec 8, 2022

我看了一下问题帖子,似乎快捷键剪切和右键,没有什么问题,不知道为什么会说逻辑缺陷?

@88250
Copy link
Member Author

88250 commented Dec 8, 2022

剪切粘贴保留块 ID 有逻辑缺陷,会导致 ID 重复。

@UFDXD
Copy link

UFDXD commented Dec 8, 2022

呃……难道拖动操作的逻辑不是过程中多了一个定位然后剪切过去吗?,基本逻辑共通的吧?,如果不共通,那将拖动的逻辑改一下,模拟剪切不行吗?,

@UFDXD
Copy link

UFDXD commented Dec 8, 2022

然后第一次剪切保留ID,重复粘贴生成新块

@88250
Copy link
Member Author

88250 commented Dec 8, 2022

不行的,因为还要考虑撤销操作,比如第一次粘贴使用了原 ID,那么在剪切处撤销以后还是会导致 ID 重复。

@UFDXD
Copy link

UFDXD commented Dec 8, 2022

撤销操作难道是“先恢复”然后再“去除粘贴”吗?此时会出现两个同样ID块,这样的确是会重复。
但只要是先“去除粘贴”,再恢复,进行这个撤销过程就行了吧?

@UFDXD
Copy link

UFDXD commented Dec 8, 2022

哎……总之引用关系很重要,如果因剪切就丢掉引用,这会让人崩溃的。

@88250
Copy link
Member Author

88250 commented Dec 8, 2022

撤销操作是还原之前的操作,ID 记录下以后就不会变了。

引用关系确实重要,但是似乎主流产品中也没有解决这个问题,也许是我看漏了,如果有方案麻烦告诉我,谢谢。

@UFDXD
Copy link

UFDXD commented Dec 8, 2022

如果找不到办法,这个问题请暂时搁置,因为目前还是可以用的。因为目前已经重度用思源了,不想因为这个放弃了,不想回到txt、word文档管理时代了。

@88250
Copy link
Member Author

88250 commented Dec 8, 2022

这是个较为严重的逻辑问题,我们不能搁置,得尽快解决才行,不然会导致潜在的 ID 重复数据。

@UFDXD
Copy link

UFDXD commented Dec 8, 2022

那请右键菜单
image
这里提示用户:【生成新块】或者在操作过程中,亦或其他地方提醒用户,注意剪切后引用关系。总之那个引用计数确实会让人忽略,并且引用计数需要刷新才统计并不实时。

@88250
Copy link
Member Author

88250 commented Dec 8, 2022

剪切是比较高频的操作,频繁提示恐怕不妥。这个是否是必要的我们后面收集反馈后再看,谢谢。

@woniuxia
Copy link

woniuxia commented Dec 8, 2022

剪切是比较高频的操作,频繁提示恐怕不妥。这个是否是必要的我们后面收集反馈后再看,谢谢。

可以在第一次使用时进行提醒,并可以选择以后均不进行提示

@88250 88250 removed their assignment Dec 8, 2022
Vanessa219 added a commit that referenced this issue Dec 8, 2022
@zxhd863943427
Copy link
Contributor

zxhd863943427 commented Dec 8, 2022

如果实现了跨页面撤销,是否能够恢复剪切的这个功能?

@88250
Copy link
Member Author

88250 commented Dec 8, 2022

@zxhd863943427 实现了跨文档撤销也不能解决这个逻辑问题的。

@zxhd863943427
Copy link
Contributor

@88250 这个的逻辑问题不是需要确保 id 唯一,但是剪切粘贴时如果保留 ID,在原文档进行撤销操作后出现重复的 ID 吗?

如果能实现跨页面撤销,那么在原文档撤销后,应该能删除被剪切粘贴到另一个文档的 ID,同时在文档的原位置恢复 ID,这样 ID 不是依然唯一吗?

我并没有用过这个功能,但我认为它确实有价值,想理解它出现严重逻辑问题的原因。

因为就我自己测试,只有粘贴出去的第一个块会携带原 ID,再次粘贴会生成新的 ID,所以冲突应该只会出现在原位置和第一个粘贴的位置上。

@88250
Copy link
Member Author

88250 commented Dec 8, 2022

@zxhd863943427 即使实现了跨文档撤销也不能彻底解决这个问题,因为存在多个客户端实例的情况,比如浏览器端和桌面端同时使用一个内核伺服的情况下,浏览器端和桌面端同时剪切一个块然后粘贴,不生成新 ID 的话就重复了。所以粘贴生成新 ID 是更稳妥的做法。

@apiggg
Copy link

apiggg commented Dec 8, 2022

  • ”浏览器端和桌面端同时剪切一个块然后粘贴“这个场景,如果我没有理解错的话,应该很难发生,当我在一个客户端剪切之后,另一个客户端原则上应该已经查询不到这个块id了,没办法再做一次剪切。
  • 麻烦请D大再三考虑一下
    实际情况是,目前并没有(至少我没看到)因为出现重复id的问题出现反馈,而已经有若干人反对剪切粘贴不保留id
    这个逻辑能不能暂时不急着去修改,再多花时间和大家讨论一下,集思广益
    毕竟我们作为一款优秀的双链笔记软件,没必要一定要和其他双链笔记软件看齐

@88250
Copy link
Member Author

88250 commented Dec 8, 2022

@apiggg 优先解决稳定性相关问题,易用性后面再考虑。

@zxhd863943427
Copy link
Contributor

@zxhd863943427 即使实现了跨文档撤销也不能彻底解决这个问题,因为存在多个客户端实例的情况,比如浏览器端和桌面端同时使用一个内核伺服的情况下,浏览器端和桌面端同时剪切一个块然后粘贴,不生成新 ID 的话就重复了。所以粘贴生成新 ID 是更稳妥的做法。

这一点不得不承认是存在的,那么从稳定性考虑确实应该先去掉剪切的这个功能。

不过很多人之所以对这个功能留恋无非就是这个是目前最通用、便捷的块转移方案,之后有没有提升块转移体验的计划?

@88250
Copy link
Member Author

88250 commented Dec 8, 2022

改进计划目前没有时间考虑,欢迎大家帮忙讨论,集思广益。

@1995hanjian
Copy link

1995hanjian commented Dec 8, 2022

D大看看这个方案可不可行:

拖拽的问题在于,容易一不小心拖成一个超级块,
在大文档、跨文档的拖拽的过程中,需要长时间按住鼠标、或者先折叠再拖拽、或者分屏操作,操作上较为繁琐不便

如果用一个不用按住鼠标控制的过程来实现拖拽,操作起来就能方便得多(群里大家一起想的)
比如选中块后,按下某组按键(如ctrl+shift+x),就记录需要拖拽的块
然后到拖拽目标位置,再按下某组按键(如ctrl+shift+p),就获取拖拽目标位置的块,然后进行拖拽操作

由于是直接用的拖拽的逻辑,所以不会有重复id的问题,也不需要重做太多逻辑
这个操作就直接和剪切分开,剪切就按D大所说修复,以防止重复id的问题

@88250
Copy link
Member Author

88250 commented Dec 8, 2022

@1995hanjian 我没太看明白这个和 Ctrl+X/Ctrl+V 的区别,一样需要写入剪切板的吧?

@1995hanjian
Copy link

1995hanjian commented Dec 8, 2022

@1995hanjian 我没太看明白这个和 Ctrl+X/Ctrl+V 的区别,一样需要写入剪切板的吧?

嗯,可能需要跟D大请教一下拖拽是怎么实现的,
我简单理解是,拖拽可以通过按下鼠标左键获取选中块的id,拖动鼠标到目标位置后松开左键获取目标块id,调用拖拽相关api来实现,不需要写入剪切板

如果是这样,我希望ctrl+shift+x也是获取选中块的id,ctrl+shift+p获取目标块id并调用拖拽相关api

@zxhd863943427
Copy link
Contributor

zxhd863943427 commented Dec 8, 2022

忽然想到了一个可行的逻辑,但是需要对于思源的菜单和识别粘贴内容进行改造,加上一个“移动块”和识别类似于(move <id>)之类的标记
逻辑如下:

  1. 选中块,在右键菜单中选择“移动块”,在剪切板中写入(move <id>)
  2. 到指定位置,粘贴,思源识别到 (move <id>) 标记,完成块移动操作。

这样子是否可行?

@Zuoqiu-Yingyi
Copy link
Contributor

Zuoqiu-Yingyi commented Dec 8, 2022

我也来贡献一个方案:
剪贴时生成一个 UUID,该 UUID 保存为内核维护的一个 hash map 的一个字段(字段名为 UUID,字段值为 未粘贴),并与剪贴的内容一起写入剪贴板
粘贴时若发现剪贴板内容中存在 UUID,说明是剪贴的内容,在 hash map 中查询该 UUID,若无该 UUID 或其对应的值为 未粘贴,则保留块 id 粘贴并更新 hash map 的键值对为 UUID: 已粘贴,否则使用新块 id 粘贴
该 hash map 的变更也入撤销用的堆栈,撤销粘贴的内容时会应同时恢复该 hash map 对应的字段

@leolee9086
Copy link

忽然想到了一个可行的逻辑,但是需要对于思源的菜单和识别粘贴内容进行改造,加上一个“移动块”和识别类似于(move )之类的标记 逻辑如下:

  1. 选中块,在右键菜单中选择“移动块”,在剪切板中写入(move )
  2. 到指定位置,粘贴,思源识别到 (move ) 标记,完成块移动操作。

这样子是否可行?

大概这样?
快捷键移动块
第一次按记录 第二次按移动

@88250
Copy link
Member Author

88250 commented Dec 9, 2022

@Zuoqiu-Yingyi 这个可能可行,后续考虑下细节。

@88250
Copy link
Member Author

88250 commented Dec 9, 2022

估计得支持跨文档撤销 #4866 后再考虑改进剪切粘贴保留 ID,否则目前已知的方案在撤销操作时还是会导致 ID 重复的。

@wuyigui323
Copy link

其实类似Word处理黏贴的机制就挺好的,黏贴时给用户选择是黏贴为纯文本,还是黏贴为带格式的原文本。思源可否给一个选择,黏贴为新id块,还是新的id的块。

@88250
Copy link
Member Author

88250 commented Dec 9, 2022

@wuyigui323 加入这样的选项的话解决不了上面提到的 ID 重复问题,反而更容易重复哦。

@Geo123abc
Copy link

这个方案确实可能是目前最优解,也解答了我对于密码管理软件 keeppass 的一个功能的好奇:
双击密码,这个密码可以在“剪切板”中保留12秒(keeppass下面有一个倒计时血条),然后自动销毁,

我之前一直好奇是如何做到的,现在看来应该也是有一个类似内核的在调度:双击密码的时候其实并没有复制到系统的剪切板(我win+V键看了一下系统剪切板,没有发现对应内容),而是keeppass在后台等待着,如果在这12秒内进行Ctrl+V粘贴,可以把密码粘贴到输入框中,但是超过这个12秒之后,再Ctrl+V粘贴,什么内容也没有(即使双击密码之前复制过其它文本内容,此时Ctrl+V也是没有任何内容的),整个过程中win+V查看剪切板,没有丝毫受到keeppass的影响,这样做避免了密码泄露(比如其它可以读取剪切板内容的软件),对于这个机制,不知道思源有什么可以借鉴的没?

我有一个简单的方法:

  1. 增加一个“保留ID粘贴”的功能,这个功能其实是和Ctrl+X对应,而改变ID的Ctrl+V操作是和Ctrl+C对应,用户自己可以设置快捷键,当其进行快捷键的时候,表明他已经知道一些风险(比如产生重复ID,但就我个人而言“一次Ctrl+X,然后连续多次Ctrl+V”的操作几乎没有。)
  2. 至于撤销导致重复ID的问题,我还是有点不太明白,不知道撤销中对“保留ID粘贴”和“不保留ID粘贴”能否进行区分?如果可以进行区分的话,应该不会导致重复ID的问题吧?

Ctrl+X、Ctrl+V 是一个很频繁的使用场景。看过一些大佬讲解记笔记的理论,我对“无压”记笔记的理解是,把自己的所有想法都记下下来,不用考虑逻辑,先记下来再说(尽量按照大的专题),然后再进行逻辑整理(可以是当下,也可以是日后),这样的话,笔记软件就可以充当“硬盘+部分内存”的功能,人脑有更多的精力担任CPU的功能,在整理过程中Ctrl+X、Ctrl+V 会被高频使用。

我最初看中思源笔记的很大原因是双链功能,而 siyuan:// 使得这种双链功能不仅仅困在思源笔记内部,在整个电脑系统都可以调用,可以和其他软件联用,这就达到了“1+1>2”的目的。
在使用思源笔记之前,我尝试过很多软件(不仅仅是笔记软件),最后自己摸索到了URI、URL这样的存在,觉得这就是我想要的。前两天体验obsidian的白板功能,但是没有找到他家有类似siyuan:// 这样的URI机制,可能是我姿势不对(?)。但是现在思源笔记最大亮点出现了一点小但重要的问题,实在是不能忍受啊,我觉得这个问题是紧急且重要的。

目前为了防止已经被双链的块改变ID,可以考虑 使用 “复制该块为引用块”然后粘贴,“转换为-定义块及其子块” 这个流程,但是这个流程会让思源“转圈”、还需要把多余的双链删除,这样的话,整理笔记过程就很不丝滑了。

@Geo123abc
Copy link

思源笔记版本 v2.5.5,dark+主题进行测试

  1. Ctrl+X,Ctrl+V,ID改变

  2. 在块的右上角“Aa”标志处,“拖拽 移动位置”,进行拖拽,预释放的时候会高亮一个长方形,(以前基本没用过拖拽功能)

    1. 如果鼠标位置偏向长方形中间,长方形上或下会出现一个粗边线,粗边线代表释放的位置,释放后块类型和ID均不变
    2. 如果鼠标位置偏向长方形左边,长方形左边变成橙色,橙色代表释放之后的位置,以及释放之后会成为超级快(超级块功能我基本上没怎么使用过),超级块的ID保持不变,取消超级快之后,ID仍不变
  3. 如果是某级标题及其之后的进行移动,可以折叠加移动,这样 ID 不会变,但是存在问题

    1. 移动之后,折叠的那个标志(上箭头加下箭头)出现不及时,需要进行一次折叠、展开操作才能显现
    2. 我第一次进行的时候触发了重新索引的bug,然后被移动的那部分内容没了,不知道折叠+移动这个操作触发bug的几率大不大。
    3. 但是“拖拽 移动位置”可能会带来一个效率降低的问题,并且相对于Ctrl+X、Ctrl+V流程,对鼠标操作的精确度要求高,D大说“对于你提到的拖拽痛点可以试下分屏后拖拽”这样的话会使得屏幕利用率下降。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests